feat: added special ammo

This commit is contained in:
TotallyNot 2025-11-04 18:06:29 +01:00
parent 9550cd2bbb
commit 1c7a5d1e1b
Signed by: pyrite
GPG key ID: 7F1BA9170CD35D15
3 changed files with 128 additions and 10 deletions

View file

@ -86,6 +86,18 @@ impl Default for Uses {
}
}
#[derive(Clone, Copy, PartialEq, Eq, Default, Component)]
#[cfg_attr(feature = "json", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "json", serde(rename_all = "snake_case"))]
pub enum AmmoType {
#[default]
Standard,
HollowPoint,
Incindiary,
Tracer,
Piercer,
}
#[derive(Clone, Copy)]
#[cfg_attr(feature = "json", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "json", serde(rename_all = "snake_case"))]
@ -181,6 +193,7 @@ pub struct AmmoWeaponBundle {
pub clip_size: SimpleStatBundle<ClipSize>,
pub rate_of_fire: RateOfFire,
pub ammo_control: SimpleStatBundle<AmmoControl>,
pub kind: AmmoType,
}
impl WeaponBundle {
@ -211,6 +224,7 @@ impl AmmoWeaponBundle {
clip_size: SimpleStatBundle::new(weapon_ammo.clip_size),
rate_of_fire: RateOfFire(weapon_ammo.rate_of_fire),
ammo_control: SimpleStatBundle::new(0.0),
kind: weapon_ammo.ammo_kind.unwrap_or_default(),
}
}
}

View file

@ -6,9 +6,9 @@ use crate::{
bundle::{
bonus::{WeaponBonusBundle, WeaponBonusType},
weapon::{
AmmoWeaponBundle, BuffingTemp, DamagingWeaponBundle, DebuffingTemp, EquippedMods,
Japanese, NonTargeted, Temporary, Uses, WeaponBundle, WeaponCategory, WeaponMod,
WeaponSlot, WeaponVerb,
AmmoType, AmmoWeaponBundle, BuffingTemp, DamagingWeaponBundle, DebuffingTemp,
EquippedMods, Japanese, NonTargeted, Temporary, Uses, WeaponBundle, WeaponCategory,
WeaponMod, WeaponSlot, WeaponVerb,
},
},
dto::draw_id,
@ -17,6 +17,7 @@ use crate::{
#[cfg_attr(feature = "json", derive(serde::Deserialize, serde::Serialize))]
pub struct WeaponAmmo {
pub ammo_kind: Option<AmmoType>,
pub clip_size: u16,
pub rate_of_fire: [u16; 2],
}
@ -707,6 +708,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 20,
rate_of_fire: [3, 6],
}),
@ -752,6 +754,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 6,
rate_of_fire: [3, 5],
}),
@ -797,6 +800,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 20,
rate_of_fire: [3, 4],
}),
@ -842,6 +846,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 17,
rate_of_fire: [4, 5],
}),
@ -887,6 +892,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 15,
rate_of_fire: [4, 5],
}),
@ -932,6 +938,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 20,
rate_of_fire: [3, 6],
}),
@ -977,6 +984,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 20,
rate_of_fire: [6, 7],
}),
@ -1022,6 +1030,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 6,
rate_of_fire: [1, 2],
}),
@ -1065,6 +1074,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 8,
rate_of_fire: [2, 3],
}),
@ -1110,6 +1120,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 46,
rate_of_fire: [5, 15],
}),
@ -1147,6 +1158,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 2,
rate_of_fire: [1, 2],
}),
@ -1184,6 +1196,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 7,
rate_of_fire: [2, 3],
}),
@ -1221,6 +1234,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [5, 8],
}),
@ -1266,6 +1280,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 50,
rate_of_fire: [10, 30],
}),
@ -1311,6 +1326,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [4, 8],
}),
@ -1359,6 +1375,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [4, 9],
}),
@ -1407,6 +1424,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 7,
rate_of_fire: [2, 3],
}),
@ -1444,6 +1462,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [5, 9],
}),
@ -1492,6 +1511,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [5, 8],
}),
@ -1540,6 +1560,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 100,
rate_of_fire: [15, 25],
}),
@ -1582,6 +1603,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 200,
rate_of_fire: [20, 30],
}),
@ -1624,6 +1646,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 950,
rate_of_fire: [3, 10],
}),
@ -1653,6 +1676,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1000,
rate_of_fire: [233, 533],
}),
@ -1695,6 +1719,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 8,
rate_of_fire: [2, 3],
}),
@ -1740,6 +1765,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1000,
rate_of_fire: [255, 555],
}),
@ -1769,6 +1795,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [15, 25],
}),
@ -1814,6 +1841,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -1945,6 +1973,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [5, 20],
}),
@ -1993,6 +2022,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 2,
rate_of_fire: [1, 1],
}),
@ -2023,6 +2053,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 2,
rate_of_fire: [1, 2],
}),
@ -2066,6 +2097,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 6,
rate_of_fire: [1, 2],
}),
@ -2126,6 +2158,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -2146,6 +2179,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [2, 5],
}),
@ -2245,6 +2279,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 10,
rate_of_fire: [5, 10],
}),
@ -2299,6 +2334,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 5,
rate_of_fire: [2, 4],
}),
@ -2370,6 +2406,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 20,
rate_of_fire: [7, 8],
}),
@ -2435,6 +2472,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -2478,6 +2516,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 10,
rate_of_fire: [2, 9],
}),
@ -2526,6 +2565,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 20,
rate_of_fire: [4, 7],
}),
@ -2574,6 +2614,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [2, 25],
}),
@ -2721,6 +2762,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -2750,6 +2792,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [2, 28],
}),
@ -2812,6 +2855,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 13,
rate_of_fire: [1, 12],
}),
@ -2857,6 +2901,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -2928,6 +2973,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 15,
rate_of_fire: [2, 12],
}),
@ -2973,6 +3019,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 10,
rate_of_fire: [1, 8],
}),
@ -3055,6 +3102,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 4,
rate_of_fire: [1, 4],
}),
@ -3092,6 +3140,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 6,
rate_of_fire: [1, 5],
}),
@ -3137,6 +3186,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 6,
rate_of_fire: [2, 5],
}),
@ -3180,6 +3230,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -3362,6 +3413,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 45,
rate_of_fire: [4, 6],
}),
@ -3427,6 +3479,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 120,
rate_of_fire: [10, 15],
}),
@ -3506,6 +3559,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -3577,6 +3631,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [4, 7],
}),
@ -3625,6 +3680,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 15,
rate_of_fire: [3, 5],
}),
@ -3826,6 +3882,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 15,
rate_of_fire: [5, 7],
}),
@ -3871,6 +3928,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [4, 6],
}),
@ -3916,6 +3974,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 20,
rate_of_fire: [3, 5],
}),
@ -3961,6 +4020,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 15,
rate_of_fire: [3, 6],
}),
@ -4006,6 +4066,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 20,
rate_of_fire: [3, 5],
}),
@ -4051,6 +4112,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 32,
rate_of_fire: [3, 5],
}),
@ -4096,6 +4158,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 8,
rate_of_fire: [1, 3],
}),
@ -4141,6 +4204,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -4194,6 +4258,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [15, 25],
}),
@ -4231,6 +4296,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 60,
rate_of_fire: [4, 30],
}),
@ -4268,6 +4334,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 60,
rate_of_fire: [10, 16],
}),
@ -4305,6 +4372,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 100,
rate_of_fire: [10, 20],
}),
@ -4342,6 +4410,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 60,
rate_of_fire: [15, 25],
}),
@ -4481,6 +4550,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 30,
rate_of_fire: [4, 8],
}),
@ -4529,6 +4599,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -4702,6 +4773,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 7,
rate_of_fire: [7, 7],
}),
@ -4738,6 +4810,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 6,
rate_of_fire: [1, 2],
}),
@ -4800,6 +4873,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 100,
rate_of_fire: [20, 30],
}),
@ -4842,6 +4916,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -4912,6 +4987,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -5027,6 +5103,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 15,
rate_of_fire: [3, 5],
}),
@ -5160,6 +5237,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 1,
rate_of_fire: [1, 1],
}),
@ -5189,6 +5267,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 3,
rate_of_fire: [1, 1],
}),
@ -5218,6 +5297,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 6,
rate_of_fire: [1, 1],
}),
@ -5247,6 +5327,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 50,
rate_of_fire: [9, 17],
}),
@ -5289,6 +5370,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 200,
rate_of_fire: [18, 27],
}),
@ -5331,6 +5413,7 @@ impl WeaponDto {
dmg: None,
acc: None,
ammo: Some(WeaponAmmo {
ammo_kind: Some(AmmoType::Standard),
clip_size: 100,
rate_of_fire: [9, 14],
}),

View file

@ -11,7 +11,8 @@ use proxisim_models::bundle::{
SimpleStatEffective, Speed, Strength, WeaponAccuracy,
},
weapon::{
Ammo, DamageStat, NeedsReload, NonTargeted, RateOfFire, Usable, Uses, Weapon, WeaponSlot,
Ammo, AmmoType, DamageStat, NeedsReload, NonTargeted, RateOfFire, Usable, Uses, Weapon,
WeaponSlot,
},
};
use rand::Rng as _;
@ -201,6 +202,7 @@ pub fn use_damaging_weapon(
&SimpleStatEffective<Clips>,
&RateOfFire,
&SimpleStatEffective<AmmoControl>,
&AmmoType,
)>,
Query<&mut Uses>,
),
@ -279,10 +281,13 @@ pub fn use_damaging_weapon(
let mut ammo = ammo_q
.get_mut(weapon)
.ok()
.map(|(ammo, clips, rof, ammo_ctrl)| {
.map(|(ammo, clips, rof, ammo_ctrl, kind)| {
let ammo_ctrl = 1.0 - (ammo_ctrl).value;
let rof_eff = ((rof.0[0] as f32) * ammo_ctrl)..=((rof.0[1] as f32) * ammo_ctrl);
(ammo, clips, rof_eff)
if *kind == AmmoType::Tracer {
acc_eff.value += 10.0 / 50.0;
}
(ammo, clips, rof_eff, kind)
});
enum MultiAttack {
@ -308,7 +313,7 @@ pub fn use_damaging_weapon(
+ 30.0;
loop {
let rounds = ammo.as_mut().map(|(ammo, clips, rof)| {
let rounds = ammo.as_mut().map(|(ammo, clips, rof, _)| {
let rounds = (rng.random_range(rof.clone()).round() as u16).clamp(1, ammo.0);
metrics.increment_counter(Some(player), "rounds_fired", rounds.into());
metrics.increment_counter(Some(weapon), "rounds_fired", rounds.into());
@ -465,11 +470,27 @@ pub fn use_damaging_weapon(
}
};
let spammo_bonus = ammo
.as_ref()
.map(|(_, _, _, kind)| match kind {
AmmoType::HollowPoint if piece.is_none() => {
armour_mitigation *= 1.5;
0.0
}
AmmoType::HollowPoint => 0.50,
AmmoType::Incindiary => 0.40,
AmmoType::Piercer => {
armour_mitigation *= 0.5;
0.0
}
_ => 0.0,
})
.unwrap_or_default();
// TODO: special ammo
let mut dmg = dmg_intrinsic
* w_dmg.0
* (1.0 + dmg_bonus.value)
* (1.0 + dmg_bonus.value + spammo_bonus)
* (1.0 - armour_mitigation)
* (1.0 - def_mitigation)
* (1.0 - bonus_mitigation)
@ -538,7 +559,7 @@ pub fn use_damaging_weapon(
if chance >= 1.0 || rng.random_bool(chance as f64) {
dmg = dmg_intrinsic
* w_dmg.0
* (1.0 + dmg_bonus.value + 5.0)
* (1.0 + dmg_bonus.value + spammo_bonus + 5.0)
* (1.0 - armour_mitigation)
* (1.0 - def_mitigation)
* (1.0 - bonus_mitigation)
@ -619,7 +640,7 @@ pub fn use_damaging_weapon(
// Technically only douple tap and blindfire have this condition, but we can run into
// panics with invalid bonus/weapon combinations without checking this for all bonuses
if ammo.as_ref().is_some_and(|(a, _, _)| a.0 == 0) {
if ammo.as_ref().is_some_and(|(a, _, _, _)| a.0 == 0) {
break;
}