diff --git a/language.def_base b/language.def_base index 4473217e6..1edb81250 100644 --- a/language.def_base +++ b/language.def_base @@ -454,6 +454,7 @@ FN_BOSSBRAIN_FUN = "YOU WERE EXPECTING JOHN ROMERO BUT IT WAS ME, MARISA!"; FN_KEEN = "Commander Keen"; FN_KEEN_FUN = "Ruined by Bethesda"; FN_VOODOO = "Voodoo doll of %s"; +FN_VOODOO_NP = "Voodoo doll"; FN_PIG = "Pig"; FN_PIG_FUN = "Porker"; FN_WOLFGUARD = "Guard"; diff --git a/language.es_base b/language.es_base index 320842def..ddbf7d46a 100644 --- a/language.es_base +++ b/language.es_base @@ -363,6 +363,7 @@ FN_HERESIARCH_FUN = "Hostia Puta"; FN_BOSSBRAIN_FUN = "¡ESPERABAS A JOHN ROMERO PERO ERA YO, MARISA!"; FN_KEEN_FUN = "Arruinado por Bethesda"; FN_VOODOO = "Muñeco Vudú de %s"; +FN_VOODOO_NP = "Muñeco Vudú"; FN_PIG = "Cerdo"; FN_PIG_FUN = "Cochinillo"; FN_WOLFGUARD_FUN1 = "Nazi de Bajo Presupuesto"; diff --git a/language.version b/language.version index 95baf16d5..2293e5117 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.2pre r139 \cu(Thu 3 Feb 21:29:32 CET 2022)\c-"; -SWWM_SHORTVER="\cw1.2pre r139 \cu(2022-02-03 21:29:32)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.2pre r140 \cu(Sun 6 Feb 02:15:05 CET 2022)\c-"; +SWWM_SHORTVER="\cw1.2pre r140 \cu(2022-02-06 02:15:05)\c-"; diff --git a/modeldef.demolitionist b/modeldef.demolitionist index d9a42de62..15555fdaa 100644 --- a/modeldef.demolitionist +++ b/modeldef.demolitionist @@ -581,16 +581,11 @@ Model "Demolitionist" Model "Demolitionist" { Path "models" - Model 1 "DemolitionistDoll_d.3d" - SurfaceSkin 1 0 "DemoTags.png" - SurfaceSkin 1 1 "DemoFace_Dead.png" - SurfaceSkin 1 2 "DemoBody.png" - SurfaceSkin 1 3 "DemoHead.png" - SurfaceSkin 1 4 "DemoArms.png" - SurfaceSkin 1 5 "DemoLegs.png" - SurfaceSkin 1 6 "DemoSoft.png" - SurfaceSkin 1 7 "DemoMisc.png" + Model 1 "VoodooDoll_d.3d" + SurfaceSkin 1 0 "VoodooDoll.png" + SurfaceSkin 1 1 "VoodooDollFace.png" Scale 0.0025 0.0025 0.0025 + AngleOffset -90 IGNORETRANSLATION // Still @@ -605,24 +600,14 @@ Model "Demolitionist" FrameIndex XZWZ G 1 8 FrameIndex XZWZ H 1 9 FrameIndex XZWZ I 1 10 - SurfaceSkin 1 1 "DemoFace_Off.png" FrameIndex XZWZ J 1 11 - SurfaceSkin 1 1 "DemoFace_Dead.png" FrameIndex XZWZ K 1 12 - SurfaceSkin 1 1 "DemoFace_Off.png" FrameIndex XZWZ L 1 13 FrameIndex XZWZ M 1 14 - SurfaceSkin 1 1 "DemoFace_Dead.png" FrameIndex XZWZ N 1 15 - SurfaceSkin 1 1 "DemoFace_Off.png" FrameIndex XZWZ O 1 16 - SurfaceSkin 1 1 "DemoFace_Dead.png" FrameIndex XZWZ P 1 17 - SurfaceSkin 1 1 "DemoFace_Off.png" FrameIndex XZWZ Q 1 18 - SurfaceSkin 1 1 "DemoFace_Dead.png" FrameIndex XZWZ R 1 19 - SurfaceSkin 1 1 "DemoFace_Off.png" FrameIndex XZWZ S 1 20 - SurfaceSkin 1 1 "DemoFace_Dead.png" } diff --git a/models/DemolitionistDoll_a.3d b/models/DemolitionistDoll_a.3d deleted file mode 100644 index 6f3b037e4..000000000 Binary files a/models/DemolitionistDoll_a.3d and /dev/null differ diff --git a/models/DemolitionistDoll_d.3d b/models/DemolitionistDoll_d.3d deleted file mode 100644 index 627b77ea8..000000000 Binary files a/models/DemolitionistDoll_d.3d and /dev/null differ diff --git a/models/VoodooDoll.blend b/models/VoodooDoll.blend new file mode 100644 index 000000000..796a9c2d7 Binary files /dev/null and b/models/VoodooDoll.blend differ diff --git a/models/VoodooDoll.png b/models/VoodooDoll.png new file mode 100644 index 000000000..bc68f40b5 Binary files /dev/null and b/models/VoodooDoll.png differ diff --git a/models/VoodooDollFace.png b/models/VoodooDollFace.png new file mode 100644 index 000000000..0785942e7 Binary files /dev/null and b/models/VoodooDollFace.png differ diff --git a/models/VoodooDoll_a.3d b/models/VoodooDoll_a.3d new file mode 100644 index 000000000..14fd66eb0 Binary files /dev/null and b/models/VoodooDoll_a.3d differ diff --git a/models/VoodooDoll_d.3d b/models/VoodooDoll_d.3d new file mode 100644 index 000000000..c9dba2dd8 Binary files /dev/null and b/models/VoodooDoll_d.3d differ diff --git a/sndinfo.txt b/sndinfo.txt index 01885b3f2..b1e57735a 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -558,6 +558,9 @@ $playersound demolitionist neutral *gasp DSEMPTY $playersound demolitionist neutral *taunt DSEMPTY $playersound demolitionist neutral *evillaugh DSEMPTY +voodoodoll/hit sounds/general/BodyHit.ogg +voodoodoll/fall sounds/general/BodyThud.ogg + deepimpact/fire sounds/deepimpact/impfire.ogg deepimpact/charge sounds/deepimpact/impaltcharge.ogg deepimpact/altfire sounds/deepimpact/impaltfire.ogg diff --git a/sounds/general/BodyHit.ogg b/sounds/general/BodyHit.ogg new file mode 100644 index 000000000..b7b559ce7 Binary files /dev/null and b/sounds/general/BodyHit.ogg differ diff --git a/sounds/general/BodyThud.ogg b/sounds/general/BodyThud.ogg new file mode 100644 index 000000000..75fee6d7a Binary files /dev/null and b/sounds/general/BodyThud.ogg differ diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index bd59d46c0..e3bca510b 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -969,7 +969,7 @@ Class Demolitionist : PlayerPawn PoisonPeriodReceived = 0; PoisonDamageReceived = 0; Super.Tick(); - if ( gamestate != GS_LEVEL ) return; + if ( (gamestate != GS_LEVEL) || !player || (player.mo != self) ) return; if ( hasteleported ) { // we just got teleported, don't count the travel distance @@ -982,7 +982,6 @@ Class Demolitionist : PlayerPawn selflight.target = self; selflight.Tick(); } - if ( !player || (player.mo != self) ) return; NearbyItemSparkles(); // double-check that we have these if ( !FindInventory("AlmasteelPlating") ) @@ -1655,7 +1654,7 @@ Class Demolitionist : PlayerPawn let hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); if ( hnd ) hnd.tookdamage[PlayerNumber()] = true; } - if ( mod == 'Crush' ) + if ( (mod == 'Crush') && player && (player.mo == self) ) { // check if we can break any active crushers // (or polyobjects) @@ -1714,7 +1713,7 @@ Class Demolitionist : PlayerPawn if ( (lastdamage > 0) && (PainChance == 0) && (level.maptime>lastmpain) ) { lastmpain = level.maptime; - A_DemoPain(); + if ( player && (player.mo == self) ) A_DemoPain(); } PainChance = oldpchance; if ( (Health <= 0) && (source == self) && (flags&DMG_EXPLOSION) ) @@ -3524,13 +3523,13 @@ Class Demolitionist : PlayerPawn Loop; VoodooPain: XZWZ A 1; - XZWZ B 1 A_DemoPain(); - XZWZ CDEF 1; + XZWZ B 2 A_StartSound("voodoodoll/hit",CHAN_BODY,CHANF_OVERLAP); + XZWZ CDEF 2; Goto VoodooSpawn; VoodooDeath: XZWZ A 2 { - A_DemoScream(); + A_StartSound("voodoodoll/fall",CHAN_BODY,CHANF_OVERLAP); A_NoBlocking(); } XZWZ GHIJKLMNO 2; diff --git a/zscript/swwm_player_fx.zsc b/zscript/swwm_player_fx.zsc index 05fc3c95d..dee6d5193 100644 --- a/zscript/swwm_player_fx.zsc +++ b/zscript/swwm_player_fx.zsc @@ -494,7 +494,7 @@ Class DemolitionistSelfLight : Actor } override void Tick() { - if ( !target || !(target is 'Demolitionist') || (Demolitionist(target).selflight != self) ) + if ( !target || !target.player || (target.player.mo != target) || !(target is 'Demolitionist') || (Demolitionist(target).selflight != self) ) { Destroy(); return; diff --git a/zscript/swwm_thinkers_hud.zsc b/zscript/swwm_thinkers_hud.zsc index 7574b394d..989e254cb 100644 --- a/zscript/swwm_thinkers_hud.zsc +++ b/zscript/swwm_thinkers_hud.zsc @@ -369,7 +369,7 @@ Class SWWMCombatTracker : Thinker realtag = mytarget.GetClassName(); SWWMUtility.BeautifyClassName(realtag); } - mytag = mytarget.player?(mytarget.player.mo!=mytarget)?String.Format(StringTable.Localize("$FN_VOODOO"),mytarget.player.GetUserName()):mytarget.player.GetUserName():realtag; + mytag = mytarget.player?(mytarget.player.mo!=mytarget)?String.Format(StringTable.Localize("$FN_VOODOO"),mytarget.player.GetUserName()):mytarget.player.GetUserName():((mytarget is 'PlayerPawn')&&(!mytarget.player))?StringTable.Localize("$FN_VOODOO_NP"):realtag; } else mytag = ""; } @@ -533,7 +533,7 @@ Class SWWMCombatTracker : Thinker mutated = true; Console.Printf(StringTable.Localize("$SWWM_LTFORM"),mytag); } - } + }// voodoo dolls don't show as friendly bFRIENDLY = mytarget.IsFriend(players[consoleplayer].mo); if ( mytarget.Health < lasthealth ) firsthit = true; lasthealth = mytarget.Health;