From febc0f989731c06ae4d6957d6a48a5aaaa20cb4e Mon Sep 17 00:00:00 2001 From: Nox Date: Tue, 11 Nov 2025 10:49:25 -0800 Subject: [PATCH] More Resilient Grenades (#34499) * Inital commit * Balanced damage to explode instantly * Rebalanced based on suggestions * matched all grenade instant thresholds to 45 damage. Signed-off-by: Nox38 * Redid files and values Signed-off-by: Nox38 * Minor spelling mistake Signed-off-by: Nox38 * Moved abstracts and fixed typo in comments Signed-off-by: Nox38 --------- Signed-off-by: Nox38 --- .../Weapons/Throwable/base_grenades.yml | 87 ++++++++ .../Weapons/Throwable/canister_grenades.yml | 117 +++++++++++ .../Objects/Weapons/Throwable/grenades.yml | 196 +----------------- .../Weapons/Throwable/projectile_grenades.yml | 6 +- .../Weapons/Throwable/scattering_grenades.yml | 16 +- 5 files changed, 216 insertions(+), 206 deletions(-) create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml new file mode 100644 index 0000000000..8f2f7547c0 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml @@ -0,0 +1,87 @@ +- type: entity # Starts fuse after taking 10 damage. + parent: BaseItem + abstract: true + id: GrenadeBase + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/grenade.rsi + layers: + - state: icon + map: ["enum.TriggerVisualLayers.Base"] + - type: Item + size: Small + - type: Clothing + quickEquip: false + slots: + - Belt + - type: TriggerOnUse + - type: TimerTrigger + delay: 3 + - type: Damageable + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: # Start fuse + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - type: Appearance + - type: AnimationPlayer + - type: GenericVisualizer + visuals: + enum.Trigger.TriggerVisuals.VisualState: + enum.ConstructionVisuals.Layer: + Primed: { state: primed } + Unprimed: { state: icon } + - type: Tag + tags: + - HandGrenade + - type: Fixtures + fixtures: + fix1: + shape: !type:PhysShapeCircle + radius: 0.2 + density: 20 # derived from base_item + mask: + - ItemMask + restitution: 0.3 + friction: 0.2 + +- type: entity # Starts fuse after taking 10 damage, instantly detonates/activates after taking 45 damage. + abstract: true + id: VolatileGrenadeBase + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - trigger: # immediately explode + !type:DamageTrigger + damage: 45 + behaviors: + - !type:TriggerBehavior + keyOut: timer + - !type:DoActsBehavior + acts: ["Destruction"] + +- type: entity # Starts fuse after taking 10 damage, is destroyed without activating/detonating after taking 45 damage. + abstract: true + id: FragileGrenadeBase + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - trigger: # Disappear + !type:DamageTrigger + damage: 45 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml new file mode 100644 index 0000000000..31cb00f164 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml @@ -0,0 +1,117 @@ +- type: entity + parent: [VolatileGrenadeBase, GrenadeBase, BaseSecurityContraband ] + id: SmokeGrenade + name: smoke grenade + description: A tactical grenade that releases a large, long-lasting cloud of smoke when used. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/smoke.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 30 + spreadAmount: 50 + - type: EmitSoundOnTrigger + keysIn: + - timer + sound: /Audio/Items/smoke_grenade_smoke.ogg + positional: true + - type: DeleteOnTrigger + keysIn: + - timer + - type: TimerTriggerVisuals + primingSound: + path: /Audio/Items/smoke_grenade_prime.ogg + +- type: entity + parent: [ BaseCivilianContraband, SmokeGrenade ] + id: CleanerGrenade + name: cleanade + description: Special grenade for janitors, releasing large cloud of space cleaner foam. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/janitor.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 15 + spreadAmount: 50 + smokePrototype: Foam + solution: + reagents: + - ReagentId: SpaceCleaner + Quantity: 30 + +- type: entity + parent: SmokeGrenade + id: TearGasGrenade + name: tear gas grenade + description: A riot control tear gas grenade. Causes irritation, pain and makes you cry your eyes out. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/tear_gas.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 10 + spreadAmount: 30 + smokePrototype: TearGasSmokeWhite + solution: + reagents: + - ReagentId: TearGas + Quantity: 20 + +- type: entity + parent: [ BaseEngineeringContraband, SmokeGrenade ] + id: MetalFoamGrenade + name: metal foam grenade + description: An emergency tool used for patching hull breaches with special quick-set metal foam. Almost as good as real floors! + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/metalfoam.rsi + - type: TimerTrigger + delay: 5 + - type: SmokeOnTrigger + keysIn: + - timer + duration: 10 + spreadAmount: 20 + smokePrototype: AluminiumMetalFoam + - type: StaticPrice + price: 350 + +- type: entity + parent: [ BaseEngineeringContraband, VolatileGrenadeBase, GrenadeBase ] # Prevent inheriting DeleteOnTrigger from SmokeGrenade + id: AirGrenade + name: air grenade + description: A special solid state chemical grenade used for quickly releasing standard air into a spaced area. Fills up to 30 tiles! + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/airboom.rsi + - type: EmitSoundOnTrigger + keysIn: + - timer + sound: /Audio/Items/smoke_grenade_smoke.ogg + - type: TimerTriggerVisuals + primingSound: + path: /Audio/Items/smoke_grenade_prime.ogg + - type: TimerTrigger + delay: 3 + - type: ReleaseGasOnTrigger + keysIn: + - timer + removeFraction: 0.25 + air: + volume: 1000 + moles: # Target is 3117.84 mols total for filling 30 tiles (goal is 101.325 kPa @ 20C) + Oxygen: 654.7464 # oxygen + Nitrogen: 2463.0936 # nitrogen + temperature: 293.15 + - type: StaticPrice + price: 350 + - type: GenericVisualizer + visuals: + enum.ReleaseGasOnTriggerVisuals.Key: + enabled: + True: { state: active } + False: { state: spent } diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index a4c0d43b9e..6fb94e1f0a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -1,60 +1,7 @@ -- type: entity - abstract: true - parent: BaseItem - id: GrenadeBase - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/grenade.rsi - layers: - - state: icon - map: ["enum.TriggerVisualLayers.Base"] - - type: Item - size: Small - - type: Clothing - quickEquip: false - slots: - - Belt - - type: TriggerOnUse - - type: TimerTrigger - delay: 3 - - type: Damageable - damageContainer: Inorganic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TriggerBehavior - keyOut: timer # explode immediately - - !type:DoActsBehavior - acts: ["Destruction"] - - type: Appearance - - type: AnimationPlayer - - type: GenericVisualizer - visuals: - enum.Trigger.TriggerVisuals.VisualState: - enum.ConstructionVisuals.Layer: - Primed: { state: primed } - Unprimed: { state: icon } - - type: Tag - tags: - - HandGrenade - - type: Fixtures - fixtures: - fix1: - shape: !type:PhysShapeCircle - radius: 0.2 - density: 20 # derived from base_item - mask: - - ItemMask - restitution: 0.3 - friction: 0.2 - - type: entity name: explosive grenade description: Grenade that creates a small but devastating explosion. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: ExGrenade components: - type: ExplodeOnTrigger @@ -77,7 +24,7 @@ - type: entity name: flashbang description: Eeeeeeeeeeeeeeeeeeeeee. - parent: [ GrenadeBase, BaseSecurityContraband ] + parent: [ FragileGrenadeBase, GrenadeBase, BaseSecurityContraband ] id: GrenadeFlashBang components: - type: Sprite @@ -132,28 +79,13 @@ - type: entity name: syndicate minibomb description: A syndicate-manufactured explosive used to stow destruction and cause chaos. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: SyndieMiniBomb components: - type: Sprite sprite: Objects/Weapons/Grenades/syndgrenade.rsi - type: ExplosionResistance damageCoefficient: 0.1 - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TimerStartBehavior - - trigger: - !type:DamageTrigger - damage: 45 - behaviors: - - !type:TriggerBehavior - keyOut: timer # immediately explode - - !type:DoActsBehavior - acts: ["Destruction"] - type: TimerTrigger delay: 5 - type: ExplodeOnTrigger @@ -202,7 +134,7 @@ - type: entity - parent: [ GrenadeBase, BaseSyndicateContraband ] + parent: [ FragileGrenadeBase, GrenadeBase, BaseSyndicateContraband ] id: SingularityGrenade name: singularity grenade description: Grenade that simulates the power of a singularity, pulling things in a heap. @@ -416,7 +348,7 @@ - type: entity name: EMP grenade description: A grenade designed to wreak havoc on electronic systems. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: EmpGrenade components: - type: Sprite @@ -465,124 +397,6 @@ - type: StaticPrice price: 10000 -- type: entity - parent: [ GrenadeBase, BaseSecurityContraband ] - id: SmokeGrenade - name: smoke grenade - description: A tactical grenade that releases a large, long-lasting cloud of smoke when used. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/smoke.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 30 - spreadAmount: 50 - - type: EmitSoundOnTrigger - keysIn: - - timer - sound: /Audio/Items/smoke_grenade_smoke.ogg - positional: true - - type: DeleteOnTrigger - keysIn: - - timer - - type: TimerTriggerVisuals - primingSound: - path: /Audio/Items/smoke_grenade_prime.ogg - -- type: entity - parent: [ BaseCivilianContraband, SmokeGrenade ] - id: CleanerGrenade - name: cleanade - description: Special grenade for janitors, releasing large cloud of space cleaner foam. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/janitor.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 15 - spreadAmount: 50 - smokePrototype: Foam - solution: - reagents: - - ReagentId: SpaceCleaner - Quantity: 30 - -- type: entity - parent: SmokeGrenade - id: TearGasGrenade - name: tear gas grenade - description: A riot control tear gas grenade. Causes irritation, pain and makes you cry your eyes out. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/tear_gas.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 10 - spreadAmount: 30 - smokePrototype: TearGasSmokeWhite - solution: - reagents: - - ReagentId: TearGas - Quantity: 20 - -- type: entity - parent: [ BaseEngineeringContraband, SmokeGrenade ] - id: MetalFoamGrenade - name: metal foam grenade - description: An emergency tool used for patching hull breaches with special quick-set metal foam. Almost as good as real floors! - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/metalfoam.rsi - - type: TimerTrigger - delay: 5 - - type: SmokeOnTrigger - keysIn: - - timer - duration: 10 - spreadAmount: 20 - smokePrototype: AluminiumMetalFoam - - type: StaticPrice - price: 350 - -- type: entity - parent: [ BaseEngineeringContraband, GrenadeBase ] # Prevent inheriting DeleteOnTrigger from SmokeGrenade - id: AirGrenade - name: air grenade - description: A special solid state chemical grenade used for quickly releasing standard air into a spaced area. Fills up to 30 tiles! - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/airboom.rsi - - type: EmitSoundOnTrigger - keysIn: - - timer - sound: /Audio/Items/smoke_grenade_smoke.ogg - - type: TimerTriggerVisuals - primingSound: - path: /Audio/Items/smoke_grenade_prime.ogg - - type: TimerTrigger - delay: 3 - - type: ReleaseGasOnTrigger - keysIn: - - timer - removeFraction: 0.25 - air: - volume: 1000 - moles: # Target is 3117.84 mols total for filling 30 tiles (goal is 101.325 kPa @ 20C) - Oxygen: 654.7464 # oxygen - Nitrogen: 2463.0936 # nitrogen - temperature: 293.15 - - type: StaticPrice - price: 350 - - type: GenericVisualizer - visuals: - enum.ReleaseGasOnTriggerVisuals.Key: - enabled: - True: { state: active } - False: { state: spent } - # Non-explosive "dummy" grenades to use as a distraction. - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml index 0e8b758a13..5a3cedb901 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml @@ -43,7 +43,7 @@ friction: 0.2 - type: entity - parent: [ProjectileGrenadeBase, BaseSecurityContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSecurityContraband] id: GrenadeStinger name: stinger grenade description: Nothing to see here, please disperse. @@ -77,7 +77,7 @@ path: /Audio/Effects/countdown.ogg - type: entity - parent: [ProjectileGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSyndicateContraband] id: GrenadeIncendiary name: incendiary grenade description: Guaranteed to light up the mood. @@ -109,7 +109,7 @@ price: 1500 - type: entity - parent: [ProjectileGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSyndicateContraband] id: GrenadeShrapnel name: shrapnel grenade description: Releases a deadly spray of shrapnel that causes severe bleeding. diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml index ba2bdd230e..43ec57e068 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml @@ -10,14 +10,6 @@ cluster-payload: !type:Container - type: Damageable damageContainer: Inorganic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TriggerBehavior - keyOut: timer # explode immediately - type: ScatteringGrenade - type: TriggerOnUse - type: TimerTrigger @@ -37,7 +29,7 @@ friction: 0.2 - type: entity - parent: [ScatteringGrenadeBase, BaseSecurityContraband] + parent: [FragileGrenadeBase, ScatteringGrenadeBase, BaseSecurityContraband] id: ClusterBang name: clusterbang description: Can be used only with flashbangs. Explodes several times. @@ -90,7 +82,7 @@ positional: true - type: entity - parent: [ScatteringGrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, ScatteringGrenadeBase, BaseSyndicateContraband] id: ClusterGrenade name: clustergrenade description: Why use one grenade when you can use three at once! @@ -120,7 +112,7 @@ price: 2500 - type: entity - parent: [ScatteringGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ScatteringGrenadeBase, BaseSyndicateContraband] id: ClusterBananaPeel name: cluster banana peel description: Splits into 6 explosive banana peels after throwing, guaranteed fun! @@ -175,7 +167,7 @@ price: 1000 - type: entity - parent: ScatteringGrenadeBase + parent: [FragileGrenadeBase, ScatteringGrenadeBase] id: GrenadeFoamDart name: foam dart grenade description: Releases a bothersome spray of foam darts that cause severe welching. -- 2.51.2