From 409d6a046d14cdf9865cf08c86ce5e7c769bf098 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Wed, 27 Aug 2014 23:10:35 +0200 Subject: [PATCH] Rename CrushableInfantry to Crushable, adapt to WithDeathAnimation. Make Crushable compatible with non-mobile actors. Change RA, TD and TS infantry die-crushed sequence ZOffsets in preparation for future engine changes. Add descriptions and CrushedByFriendlies to Crushable. Adapt code to factor in whether the palette is a player palette. --- OpenRA.Mods.RA/Crushable.cs | 74 +++++++++++++++ OpenRA.Mods.RA/CrushableInfantry.cs | 61 ------------ OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 2 +- mods/cnc/rules/defaults.yaml | 4 +- mods/cnc/sequences/infantry.yaml | 7 ++ mods/d2k/rules/defaults.yaml | 2 +- mods/ra/rules/defaults.yaml | 2 +- mods/ra/sequences/infantry.yaml | 27 +++++- mods/ts/rules/defaults.yaml | 2 +- mods/ts/rules/infantry.yaml | 16 ++-- mods/ts/sequences/infantry.yaml | 137 +++++++++++++++++++++++++-- 11 files changed, 251 insertions(+), 83 deletions(-) create mode 100644 OpenRA.Mods.RA/Crushable.cs delete mode 100644 OpenRA.Mods.RA/CrushableInfantry.cs diff --git a/OpenRA.Mods.RA/Crushable.cs b/OpenRA.Mods.RA/Crushable.cs new file mode 100644 index 0000000000..15f7595724 --- /dev/null +++ b/OpenRA.Mods.RA/Crushable.cs @@ -0,0 +1,74 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.RA.Move; +using OpenRA.Mods.RA.Render; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA +{ + [Desc("This actor is crushable.")] + class CrushableInfo : ITraitInfo + { + [Desc("Sound to play when being crushed.")] + public readonly string CrushSound = null; + [Desc("Which crush classes does this actor belong to.")] + public readonly string[] CrushClasses = { "infantry" }; + [Desc("Probability of mobile actors noticing and evading a crush attempt.")] + public readonly int WarnProbability = 75; + [Desc("Will friendly units just crush me instead of pathing around.")] + public readonly bool CrushedByFriendlies = false; + + public object Create(ActorInitializer init) { return new Crushable(init.self, this); } + } + + class Crushable : ICrushable + { + readonly Actor self; + readonly CrushableInfo info; + + public Crushable(Actor self, CrushableInfo info) + { + this.self = self; + this.info = info; + } + + public void WarnCrush(Actor crusher) + { + var mobile = self.TraitOrDefault(); + if (mobile != null && self.World.SharedRandom.Next(100) <= info.WarnProbability) + mobile.Nudge(self, crusher, true); + } + + public void OnCrush(Actor crusher) + { + Sound.Play(info.CrushSound, crusher.CenterPosition); + var wda = self.TraitOrDefault(); + if (wda != null) + { + var palette = wda.Info.DeathSequencePalette; + if (wda.Info.DeathPaletteIsPlayerPalette) + palette += self.Owner.InternalName; + + wda.SpawnDeathAnimation(self, wda.Info.CrushedSequence, palette); + } + self.Kill(crusher); + } + + public bool CrushableBy(string[] crushClasses, Player crushOwner) + { + if (!info.CrushedByFriendlies && crushOwner.IsAlliedWith(self.Owner)) + return false; + + return info.CrushClasses.Intersect(crushClasses).Any(); + } + } +} diff --git a/OpenRA.Mods.RA/CrushableInfantry.cs b/OpenRA.Mods.RA/CrushableInfantry.cs deleted file mode 100644 index 52ec8b843a..0000000000 --- a/OpenRA.Mods.RA/CrushableInfantry.cs +++ /dev/null @@ -1,61 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System.Linq; -using OpenRA.Mods.RA.Move; -using OpenRA.Mods.RA.Render; -using OpenRA.Traits; - -namespace OpenRA.Mods.RA -{ - class CrushableInfantryInfo : ITraitInfo, Requires, Requires - { - public readonly string CrushSound = null; - public readonly string CorpseSequence = "die-crushed"; - public readonly string[] CrushClasses = { "infantry" }; - public readonly int WarnProbability = 75; - public object Create(ActorInitializer init) { return new CrushableInfantry(init.self, this); } - } - - class CrushableInfantry : ICrushable - { - readonly Actor self; - readonly CrushableInfantryInfo Info; - readonly RenderInfantry ri; - - public CrushableInfantry(Actor self, CrushableInfantryInfo info) - { - this.self = self; - this.Info = info; - ri = self.Trait(); - } - - public void WarnCrush(Actor crusher) - { - if (self.World.SharedRandom.Next(100) <= Info.WarnProbability) - self.Trait().Nudge(self, crusher, true); - } - - public void OnCrush(Actor crusher) - { - Sound.Play(Info.CrushSound, crusher.CenterPosition); - ri.SpawnCorpse(self, Info.CorpseSequence); - self.Kill(crusher); - } - - public bool CrushableBy(string[] crushClasses, Player crushOwner) - { - if (crushOwner.Stances[self.Owner] == Stance.Ally) - return false; - - return Info.CrushClasses.Intersect(crushClasses).Any(); - } - } -} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index b693f68d15..0073e0ac83 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -209,7 +209,7 @@ - + diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index 8584e3a96e..0599a14ecf 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -165,7 +165,7 @@ ActorLostNotification: SpawnViceroid: Probability: 10 - CrushableInfantry: + Crushable: WarnProbability: 67 CrushSound: squish2.aud CombatDebugOverlay: @@ -220,7 +220,7 @@ Notification: CivilianKilled NotifyAll: true ScaredyCat: - CrushableInfantry: + Crushable: CrushSound: squish2.aud ^DINO: diff --git a/mods/cnc/sequences/infantry.yaml b/mods/cnc/sequences/infantry.yaml index 9b0014155f..ac22b42387 100644 --- a/mods/cnc/sequences/infantry.yaml +++ b/mods/cnc/sequences/infantry.yaml @@ -171,6 +171,7 @@ e1: Start: 16 Length: 4 Tick: 1600 + ZOffset: -511 icon: e1icnh Start: 0 @@ -260,6 +261,7 @@ e2: Start: 16 Length: 4 Tick: 1600 + ZOffset: -511 icon: e2icnh Start: 0 @@ -349,6 +351,7 @@ e3: Start: 16 Length: 4 Tick: 1600 + ZOffset: -511 icon: e3icnh Start: 0 @@ -438,6 +441,7 @@ e4: Start: 16 Length: 4 Tick: 1600 + ZOffset: -511 muzzle0: flame-n Start: 0 Length: * @@ -559,6 +563,7 @@ e5: Start: 16 Length: 4 Tick: 1600 + ZOffset: -511 muzzle0: chem-n Start: 0 Length: * @@ -672,6 +677,7 @@ e6: Start: 16 Length: 4 Tick: 1600 + ZOffset: -511 icon: e6icnh Start: 0 @@ -765,5 +771,6 @@ rmbo: Start: 16 Length: 4 Tick: 1600 + ZOffset: -511 icon: rmboicnh Start: 0 \ No newline at end of file diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 69cab675bf..cb8c86655b 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -186,7 +186,7 @@ ProximityCaptor: Types: Infantry GivesBounty: - CrushableInfantry: + Crushable: CrushSound: CRUSH1.WAV RepairableNear: Buildings: barra, barro diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 941f2c7f6d..7b85139ba5 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -154,7 +154,7 @@ GivesBounty: GpsDot: String: Infantry - CrushableInfantry: + Crushable: CrushSound: squishy2.aud UpdatesPlayerStatistics: CombatDebugOverlay: diff --git a/mods/ra/sequences/infantry.yaml b/mods/ra/sequences/infantry.yaml index 849b87b42d..705dce0c1f 100644 --- a/mods/ra/sequences/infantry.yaml +++ b/mods/ra/sequences/infantry.yaml @@ -64,6 +64,7 @@ e1: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 garrison-muzzle: minigun Start: 0 Length: 6 @@ -136,6 +137,7 @@ sniper: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 garrison-muzzle: minigun Start: 0 Length: 3 @@ -190,6 +192,7 @@ e3: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 prone-stand: Start: 144 Length: 4 @@ -248,6 +251,7 @@ e6: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 prone-stand: Start: 82 Length: 4 @@ -310,6 +314,7 @@ medi: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 prone-stand: Start: 130 Length: 4 @@ -372,6 +377,7 @@ mech: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 prone-stand: Start: 130 Length: 4 @@ -430,6 +436,7 @@ e2: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 prone-stand: Start: 240 Length: 4 @@ -488,6 +495,7 @@ dog: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 shoot: dogbullt Start: 0 Length: 4 @@ -541,6 +549,7 @@ spy: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 prone-stand: Start: 144 Length: 4 @@ -591,6 +600,7 @@ thf: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 crawl: Start: 72 Length: 4 @@ -632,6 +642,7 @@ hijacker: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 crawl: thf Start: 72 Length: 4 @@ -685,6 +696,7 @@ e7: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 prone-stand: Start: 128 Length: 4 @@ -752,6 +764,7 @@ e4: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 prone-stand: Start: 208 Length: 4 @@ -826,6 +839,7 @@ gnrl: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 shok: stand: @@ -893,6 +907,7 @@ shok: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 icon: shokicon Start: 0 @@ -937,6 +952,7 @@ c1: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 run: Start: 56 Length: 6 @@ -984,6 +1000,7 @@ c2: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 run: Start: 56 Length: 6 @@ -1031,6 +1048,7 @@ c3: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 run: Start: 56 Length: 6 @@ -1079,6 +1097,7 @@ einstein: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 delphi: stand: @@ -1122,6 +1141,7 @@ delphi: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 chan: stand: @@ -1165,6 +1185,7 @@ chan: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 zombie: stand: @@ -1207,6 +1228,7 @@ zombie: Start: 0 Length: 6 Tick: 1600 + ZOffset: -511 icon: zombicon Start: 0 @@ -1252,6 +1274,7 @@ ant: die-crushed: Start: 104 Length: 8 - Tick: 300 + Tick: 400 + ZOffset: -511 icon: anticon - Start: 0 \ No newline at end of file + Start: 0 diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index 4d0dee2028..11021d52bd 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -130,7 +130,7 @@ ProximityCaptor: Types: Infantry GivesBounty: - CrushableInfantry: + Crushable: CrushSound: squish6.aud PoisonedByTiberium: SpawnViceroid: diff --git a/mods/ts/rules/infantry.yaml b/mods/ts/rules/infantry.yaml index a1ea5e7d01..2c0e29d4f4 100644 --- a/mods/ts/rules/infantry.yaml +++ b/mods/ts/rules/infantry.yaml @@ -93,7 +93,7 @@ WEEDGUY: Speed: 42 Health: HP: 130 - CrushableInfantry: + Crushable: CrushSound: squishy2.aud Armament: Weapon: FireballLauncher @@ -120,7 +120,7 @@ MEDIC: Speed: 56 Health: HP: 125 - CrushableInfantry: + Crushable: CrushSound: squishy2.aud Armament: Weapon: Heal @@ -220,7 +220,7 @@ GHOST: Armament: Weapon: LtRail LocalOffset: 85,0,384 - CrushableInfantry: + Crushable: CrushSound: squishy2.aud AttackFrontal: C4Demolition: @@ -254,7 +254,7 @@ JUMPJET: Range: 6c0 Armament: Weapon: JumpCannon - -CrushableInfantry: + -Crushable: AttackFrontal: TakeCover: RenderInfantry: @@ -302,7 +302,7 @@ CYBORG: Queue: Infantry BuildPaletteOrder: 50 Owner: nod - -CrushableInfantry: + -Crushable: Selectable: Bounds: 14,30,0,-7 Voice: Cyborg @@ -335,7 +335,7 @@ CYC2: Queue: Infantry BuildPaletteOrder: 50 Owner: nod - -CrushableInfantry: + -Crushable: Selectable: Bounds: 14,30,0,-7 Voice: CyborgCommando @@ -595,7 +595,7 @@ VISSML: Mobile: Speed: 113 ROT: 16 - -CrushableInfantry: + -Crushable: Selectable: Voice: Fiend TargetableUnit: @@ -625,7 +625,7 @@ VISLRG: Mobile: Speed: 113 ROT: 16 - -CrushableInfantry: + -Crushable: Selectable: Voice: Fiend TargetableUnit: diff --git a/mods/ts/sequences/infantry.yaml b/mods/ts/sequences/infantry.yaml index 26130fbda1..7da2bf6246 100644 --- a/mods/ts/sequences/infantry.yaml +++ b/mods/ts/sequences/infantry.yaml @@ -45,6 +45,12 @@ e1: Start: 0 Length: * Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -122,6 +128,12 @@ e2: Start: 0 Length: * Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -199,6 +211,12 @@ e3: Start: 0 Length: * Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -267,19 +285,19 @@ weedguy: Facings: 8 Stride: 6 ShadowStart: 288 - die2: weed - Start: 160 - Length: 6 - ShadowStart: 362 - Tick: 80 die1: weed Start: 149 Length: 11 ShadowStart: 351 Tick: 80 + die2: weed + Start: 160 + Length: 6 + ShadowStart: 362 + Tick: 80 die3: weed Start: 166 - Length: 10 + Length: 11 ShadowStart: 368 Tick: 80 die4: weed @@ -296,6 +314,11 @@ weedguy: Start: 0 Length: * Tick: 80 + die-crushed: weed + Start: 174 + Length: 3 + ShadowStart: 376 + Tick: 1000 icon: weaticon Start: 0 @@ -347,6 +370,12 @@ medic: Length: 15 ShadowStart: 455 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -427,6 +456,12 @@ engineer: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 standup-0: Start: 260 Length: 2 @@ -493,6 +528,12 @@ umagon: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -571,6 +612,12 @@ ghost: # TODO unused GUNFIRE.SHP Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -647,6 +694,12 @@ jumpjet: # TODO: ShadowStart: Length: 15 ShadowStart: 887 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -725,6 +778,12 @@ mhijack: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -803,6 +862,12 @@ chamspy: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -1036,6 +1101,12 @@ mutant: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -1114,6 +1185,12 @@ mwmn: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -1192,6 +1269,12 @@ mutant3: # TODO unused MGUN-N,MGUN-NE,MGUN-E,MGUN-SE,MGUN-S,MGUN-SW,MGUN-W,MGUN- Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -1270,6 +1353,12 @@ tratos: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -1348,6 +1437,12 @@ oxanna: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -1426,6 +1521,12 @@ slav: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 shoot: Start: 164 Length: 6 @@ -1482,6 +1583,12 @@ doggie: # TODO: not sure what frame 88 and following is Length: 10 ShadowStart: 218 Tick: 80 + die-crushed: + Start: 105 + Length: 4 + ShadowStart: 224 + Tick: 800 + ZOffset: -511 shoot: Start: 56 Length: 4 @@ -1566,6 +1673,12 @@ civ1: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 die5: flameguy # TODO: walking animation unused Start: 42 Length: 104 @@ -1622,6 +1735,12 @@ civ2: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 die5: flameguy # TODO: walking animation unused Start: 42 Length: 104 @@ -1678,6 +1797,12 @@ civ3: Length: 15 ShadowStart: 441 Tick: 80 + die-crushed: + Start: 159 + Length: 5 + ShadowStart: 451 + Tick: 800 + ZOffset: -511 die5: flameguy # TODO: walking animation unused Start: 42 Length: 104