From 1c7a5d1e1b8abf82264b5801a6723a3b76697198 Mon Sep 17 00:00:00 2001 From: TotallyNot <44345987+TotallyNot@users.noreply.github.com> Date: Tue, 4 Nov 2025 18:06:29 +0100 Subject: [PATCH] feat: added special ammo --- models/src/bundle/weapon.rs | 14 ++++++ models/src/dto/weapon.rs | 89 +++++++++++++++++++++++++++++++++++-- src/player/mod.rs | 35 ++++++++++++--- 3 files changed, 128 insertions(+), 10 deletions(-) diff --git a/models/src/bundle/weapon.rs b/models/src/bundle/weapon.rs index aaaf19c..7ca3168 100644 --- a/models/src/bundle/weapon.rs +++ b/models/src/bundle/weapon.rs @@ -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, pub rate_of_fire: RateOfFire, pub ammo_control: SimpleStatBundle, + 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(), } } } diff --git a/models/src/dto/weapon.rs b/models/src/dto/weapon.rs index a2f76f0..2efe8c1 100644 --- a/models/src/dto/weapon.rs +++ b/models/src/dto/weapon.rs @@ -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, 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], }), diff --git a/src/player/mod.rs b/src/player/mod.rs index d4ab2ab..b994d1e 100644 --- a/src/player/mod.rs +++ b/src/player/mod.rs @@ -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, &RateOfFire, &SimpleStatEffective, + &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; }