diff --git a/language.def_voice b/language.def_voice index 5d5a068d7..d099b892f 100644 --- a/language.def_voice +++ b/language.def_voice @@ -110,7 +110,7 @@ SWWM_SUBS_DEFAULT_FINDSECRET11 = "That was good, wasn't it?"; SWWM_SUBS_DEFAULT_FINDSECRET12 = "Lucky me, huh?"; SWWM_SUBS_DEFAULT_FINDSECRET13 = "Well, I mean, I'm pretty good at this."; // frag taunts -SWWM_SUBS_DEFAULT_NSCOREKILL = "27"; +SWWM_SUBS_DEFAULT_NSCOREKILL = "28"; SWWM_SUBS_DEFAULT_SCOREKILL1 = "Get out."; SWWM_SUBS_DEFAULT_SCOREKILL2 = "One done."; SWWM_SUBS_DEFAULT_SCOREKILL3 = "Bye bye."; @@ -138,6 +138,7 @@ SWWM_SUBS_DEFAULT_SCOREKILL24 = "Here's your special serving of DIE."; SWWM_SUBS_DEFAULT_SCOREKILL25 = "Want more?"; SWWM_SUBS_DEFAULT_SCOREKILL26 = "Get rekt."; SWWM_SUBS_DEFAULT_SCOREKILL27 = "Now that's what I call a BRUH moment."; +SWWM_SUBS_DEFAULT_SCOREKILL28 = "Ded!"; // oopsies SWWM_SUBS_DEFAULT_NFRIENDKILL = "4"; SWWM_SUBS_DEFAULT_FRIENDKILL1 = "Oh no! No no no no I'm sorry oh my god!"; @@ -414,9 +415,10 @@ SWWM_SUBS_DEFAULT_BUTTONPUSH3 = "Bop."; SWWM_SUBS_DEFAULT_FALLING = "Wheeeeeeeeeee~!"; /// Special kill messages (rare) // Buttslam -SWWM_SUBS_DEFAULT_NASSKILL = "2"; +SWWM_SUBS_DEFAULT_NASSKILL = "3"; SWWM_SUBS_DEFAULT_ASSKILL1 = "It's ASS time!"; SWWM_SUBS_DEFAULT_ASSKILL2 = "Putting the ASS in mASSacre!"; +SWWM_SUBS_DEFAULT_ASSKILL3 = "Alright, who wants to eat ASS?"; // Lead ball crit SWWM_SUBS_DEFAULT_NBALLSKILL = "2"; SWWM_SUBS_DEFAULT_BALLSKILL1 = "Dangerous Ball Action!"; @@ -429,6 +431,10 @@ SWWM_SUBS_DEFAULT_BLAST3 = "Pew!"; SWWM_SUBS_DEFAULT_BLAST4 = "Boom!"; SWWM_SUBS_DEFAULT_BLAST5 = "Kapow!"; SWWM_SUBS_DEFAULT_BLAST6 = "Kaboom."; +// Wall busting +SWWM_SUBS_DEFAULT_BUSTKILL = "Bustin' makes me feel good~ ♪"; +// Cyberdemon killed by parrying +SWWM_SUBS_DEFAULT_CYBULLY = "I'm just doing some cyberbullying..."; // Cacodemon petting SWWM_SUBS_DEFAULT_NPETCACO = "3"; SWWM_SUBS_DEFAULT_PETCACO1 = "Caco!"; @@ -450,6 +456,8 @@ SWWM_SUBS_DEFAULT_HURTFLOOR2 = "Huff oof..."; SWWM_SUBS_DEFAULT_HURTFLOOR3 = "Oooo ooo... Aaa aaah ooh..."; SWWM_SUBS_DEFAULT_HURTFLOOR4 = "Ooh ah aahh... Ooh..."; SWWM_SUBS_DEFAULT_HURTFLOOR5 = "Hot..."; +// Map Start but only for nuts +SWWM_SUBS_DEFAULT_NUTSTART = "Aw, nuts..."; //// LEGACY VOICE - Fallout 4 JP Sole Survivor SWWM_VOICENAME_LEGACY = "Classic"; // new weapon received diff --git a/language.es_voice b/language.es_voice index d151d48e9..9cee04f5a 100644 --- a/language.es_voice +++ b/language.es_voice @@ -123,6 +123,7 @@ SWWM_SUBS_DEFAULT_SCOREKILL24 = "Aquí tienes tu ración especial de MUERE."; SWWM_SUBS_DEFAULT_SCOREKILL25 = "¿Quieres más?"; SWWM_SUBS_DEFAULT_SCOREKILL26 = "A joderse."; SWWM_SUBS_DEFAULT_SCOREKILL27 = "Eso si que lo llamo un momento BRUH."; +SWWM_SUBS_DEFAULT_SCOREKILL27 = "Muerto!"; // oopsies SWWM_SUBS_DEFAULT_FRIENDKILL1 = "¡Oh no! ¡No no no no lo siento oh dios mío!"; SWWM_SUBS_DEFAULT_FRIENDKILL2 = "¡Oh dios mío! Lo siento mucho..."; @@ -374,6 +375,7 @@ SWWM_SUBS_DEFAULT_FALLING = "¡Wiiiiiiiiiiii~!"; SWWM_SUBS_DEFAULT_NASSKILL = "2"; SWWM_SUBS_DEFAULT_ASSKILL1 = "¡Es hora del CULO!"; SWWM_SUBS_DEFAULT_ASSKILL2 = "¡Masacrando con las nalgas!"; +SWWM_SUBS_DEFAULT_ASSKILL3 = "Muy bien, ¿Quien quiere comer CULO?"; // Lead ball crit SWWM_SUBS_DEFAULT_NBALLSKILL = "2"; SWWM_SUBS_DEFAULT_BALLSKILL1 = "¡Peligrosa Acción de Pelotas!"; @@ -386,6 +388,9 @@ SWWM_SUBS_DEFAULT_BLAST3 = "¡Píu!"; SWWM_SUBS_DEFAULT_BLAST4 = "¡Bum!"; SWWM_SUBS_DEFAULT_BLAST5 = "¡Kapow!"; SWWM_SUBS_DEFAULT_BLAST6 = "Kabúm."; +// Wall busting +// Cyberdemon killed by parrying +SWWM_SUBS_DEFAULT_CYBULLY = "Solo estoy haciendo un poco de cyberbullying..."; // Cacodemon petting SWWM_SUBS_DEFAULT_NPETCACO = "3"; SWWM_SUBS_DEFAULT_PETCACO1 = "¡Caco!"; @@ -405,6 +410,8 @@ SWWM_SUBS_DEFAULT_HURTFLOOR2 = "Buf uf..."; SWWM_SUBS_DEFAULT_HURTFLOOR3 = "Uuuu uuu... Aaa aaaa ooo..."; SWWM_SUBS_DEFAULT_HURTFLOOR4 = "Uuu aa aaaa... Ooo..."; SWWM_SUBS_DEFAULT_HURTFLOOR5 = "Quema..."; +// Map Start but only for nuts +SWWM_SUBS_DEFAULT_NUTSTART = "Oh, nueces..."; //// LEGACY VOICE - Fallout 4 JP Sole Survivor // voice name SWWM_VOICENAME_DEFAULT = "Clásico"; diff --git a/language.version b/language.version index 7f3d6cc64..987663978 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r100 \cu(Tue 7 Jun 16:56:41 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r100 \cu(2022-06-07 16:56:41)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r101 \cu(Tue 7 Jun 18:27:52 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r101 \cu(2022-06-07 18:27:52)\c-"; diff --git a/sndinfo.txt b/sndinfo.txt index a1b2e3ebb..e49cebf88 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -208,6 +208,7 @@ voice/default/scorekill24 sounds/voice/default/va/demoscorekill24.ogg voice/default/scorekill25 sounds/voice/default/va/demoscorekill25.ogg voice/default/scorekill26 sounds/voice/default/va/demoscorekill26.ogg voice/default/scorekill27 sounds/voice/default/va/demoscorekill27.ogg +voice/default/scorekill28 sounds/voice/default/va/demoscorekill28.ogg voice/default/friendkill1 sounds/voice/default/va/demofriendkill1.ogg voice/default/friendkill2 sounds/voice/default/va/demofriendkill2.ogg voice/default/friendkill3 sounds/voice/default/va/demofriendkill3.ogg @@ -446,8 +447,11 @@ voice/default/buttonpush3 sounds/voice/default/va/demobuttonpush3.ogg voice/default/falling sounds/voice/default/va/demofalling.ogg voice/default/asskill1 sounds/voice/default/va/demoasskill1.ogg voice/default/asskill2 sounds/voice/default/va/demoasskill2.ogg +voice/default/asskill3 sounds/voice/default/va/demoasskill3.ogg voice/default/ballskill1 sounds/voice/default/va/demoballskill1.ogg voice/default/ballskill2 sounds/voice/default/va/demoballskill2.ogg +voice/default/bustkill sounds/voice/default/va/demobustkill.ogg +voice/default/cybully sounds/voice/default/va/democybully.ogg voice/default/blast1 sounds/voice/default/va/demoblast1.ogg voice/default/blast2 sounds/voice/default/va/demoblast2.ogg voice/default/blast3 sounds/voice/default/va/demoblast3.ogg @@ -468,6 +472,7 @@ voice/default/hurtfloor2 sounds/voice/default/va/demohurtfloor2.ogg voice/default/hurtfloor3 sounds/voice/default/va/demohurtfloor3.ogg voice/default/hurtfloor4 sounds/voice/default/va/demohurtfloor4.ogg voice/default/hurtfloor5 sounds/voice/default/va/demohurtfloor5.ogg +voice/default/nutstart sounds/voice/default/va/demonutstart.ogg voice/legacy/death1 sounds/voice/legacy/demodeath1.ogg voice/legacy/death2 sounds/voice/legacy/demodeath2.ogg diff --git a/sounds/voice/default/va/demoasskill3.ogg b/sounds/voice/default/va/demoasskill3.ogg new file mode 100644 index 000000000..b5ca75e9b Binary files /dev/null and b/sounds/voice/default/va/demoasskill3.ogg differ diff --git a/sounds/voice/default/va/demobustkill.ogg b/sounds/voice/default/va/demobustkill.ogg new file mode 100644 index 000000000..64f5a22cf Binary files /dev/null and b/sounds/voice/default/va/demobustkill.ogg differ diff --git a/sounds/voice/default/va/democybully.ogg b/sounds/voice/default/va/democybully.ogg new file mode 100644 index 000000000..e940d1180 Binary files /dev/null and b/sounds/voice/default/va/democybully.ogg differ diff --git a/sounds/voice/default/va/demonutstart.ogg b/sounds/voice/default/va/demonutstart.ogg new file mode 100644 index 000000000..751dff2e4 Binary files /dev/null and b/sounds/voice/default/va/demonutstart.ogg differ diff --git a/sounds/voice/default/va/demoscorekill28.ogg b/sounds/voice/default/va/demoscorekill28.ogg new file mode 100644 index 000000000..f8534c097 Binary files /dev/null and b/sounds/voice/default/va/demoscorekill28.ogg differ diff --git a/zscript/handler/swwm_handler_damage.zsc b/zscript/handler/swwm_handler_damage.zsc index 1cd36ad86..18b76816a 100644 --- a/zscript/handler/swwm_handler_damage.zsc +++ b/zscript/handler/swwm_handler_damage.zsc @@ -183,7 +183,9 @@ extend Class SWWMHandler else if ( (!lastcombat || (gametic > lastcombat+50)) && !SWWMHDoomHandler.IsCuteGirl(e.Thing) ) // [HDoom] don't shout at the girls { int lc = 0; - if ( !Random[DemoLines](0,(e.Thing.bBOSS||e.Thing.FindInventory("BossMarker"))?1:2) && (e.DamageType == 'CriticalConcussion') ) lc = AddOneliner("ballskill",1,15); + Inventory buff = e.Inflictor?e.Inflictor.FindInventory('ParriedBuff'):null; + if ( !Random[DemoLines](0,3) && buff && (e.Thing is 'Cyberdemon') && (e.Inflictor is 'Rocket') && (buff.tracer == e.Thing) ) lc = AddOneliner("cybully",1,15); + else if ( !Random[DemoLines](0,(e.Thing.bBOSS||e.Thing.FindInventory("BossMarker"))?1:2) && (e.DamageType == 'CriticalConcussion') ) lc = AddOneliner("ballskill",1,15); else if ( !Random[DemoLines](0,(e.Thing.bBOSS||e.Thing.FindInventory("BossMarker"))?2:5) && (e.DamageType == 'Buttslam') ) lc = AddOneliner("asskill",1,15); if ( !lc ) { diff --git a/zscript/handler/swwm_handler_worldload.zsc b/zscript/handler/swwm_handler_worldload.zsc index 61e32e681..e17f380c1 100644 --- a/zscript/handler/swwm_handler_worldload.zsc +++ b/zscript/handler/swwm_handler_worldload.zsc @@ -225,7 +225,17 @@ extend Class SWWMHandler override void WorldLoaded( WorldEvent e ) { if ( e.IsReopen ) return; - if ( gamestate != GS_TITLELEVEL ) AddOneliner("mapstart",3); + if ( gamestate != GS_TITLELEVEL ) + { + if ( (level.GetChecksum() ~== "D0E5ECD94BD38DF33F25515C00148693") + || (level.GetChecksum() ~== "D20297AE8447232F6DBE4851E3104668") + || (level.GetChecksum() ~== "EBBB8663AD4AB22294A8A1D211A026CD") ) + { + if ( !AddOneliner("nutstart",3) ) + AddOneliner("mapstart",3); + } + else AddOneliner("mapstart",3); + } if ( level.levelname ~== "Modder Test Map" ) { level.ReplaceTextures("-noflat-","kinstile",0); diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index a143bd05e..763316a29 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -88,6 +88,8 @@ Class Demolitionist : PlayerPawn int invwipe; // inventory wipe flags for next level + transient int lastbang; + transient bool ingivecheat; Property DashFuel : dashfuel; diff --git a/zscript/utility/swwm_utility.zsc b/zscript/utility/swwm_utility.zsc index 4f2316a4c..193c76b76 100644 --- a/zscript/utility/swwm_utility.zsc +++ b/zscript/utility/swwm_utility.zsc @@ -1179,6 +1179,7 @@ Class SWWMUtility Actor Instigator = (flags&DE_NOTMISSILE)?Source:Source.target; BlockThingsIterator bi = BlockThingsIterator.Create(Source,ExplosionRadius); int nhit = 0, nkill = 0; + bool haskilled = false; Array washit; washit.Clear(); while ( bi.Next() ) @@ -1241,12 +1242,22 @@ Class SWWMUtility int ndmg = a.DamageMobj(Source,Instigator,dmg,(DamageType=='')?Source.DamageType:DamageType,DMG_EXPLOSION|dmgflags,atan2(-dir.y,-dir.x)); if ( a && !(flags&DE_NOBLEED) ) a.TraceBleed((ndmg>0)?ndmg:dmg,Source); if ( (flags&DE_HOWL) && a && (a.Health > 0) && a.bISMONSTER && !Random[DoBlast](0,3) ) a.Howl(); + if ( hostile && (!a || (a.Health <= 0)) ) haskilled = true; if ( (flags&DE_COUNTFHKILLS) && (oldhp < basehp) ) continue; // was not at full health if ( (!a || (a.Health <= 0)) && (!(flags&DE_COUNTENEMIES) || hostile) && (!(flags&DE_COUNTSTEALTH) || inactive) ) nkill++; } // traverse portals (needed since BlockThingsIterator can't properly cross sector portals in both vertical directions) let hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); - if ( !hnd || (hnd.psectors.Size() <= 1) ) return nhit, nkill; + if ( !hnd || (hnd.psectors.Size() <= 1) ) + { + if ( (Instigator is 'Demolitionist') && haskilled ) + { + let demo = Demolitionist(Instigator); + if ( (gametic > demo.lastbang+30) && (!hnd || (gametic > hnd.lastcombat+10)) && !Random[DemoLines](0,1) ) + demo.lastbang = SWWMHandler.AddOneLiner("blast",2,10); + } + return nhit, nkill; + } int thisgroup = Source.CurSector.portalgroup; for ( int i=0; i0)?ndmg:dmg,Source); if ( (flags&DE_HOWL) && a && (a.Health > 0) && a.bISMONSTER && !Random[DoBlast](0,3) ) a.Howl(); + if ( hostile && (!a || (a.Health <= 0)) ) haskilled = true; if ( (flags&DE_COUNTFHKILLS) && (oldhp < basehp) ) continue; // was not at full health if ( (!a || (a.Health <= 0)) && (!(flags&DE_COUNTENEMIES) || hostile) && (!(flags&DE_COUNTSTEALTH) || inactive) ) nkill++; } } + if ( (Instigator is 'Demolitionist') && haskilled ) + { + let demo = Demolitionist(Instigator); + if ( (gametic > demo.lastbang+30) && (gametic > hnd.lastcombat+10) && !Random[DemoLines](0,1) ) + demo.lastbang = SWWMHandler.AddOneLiner("blast",2,10); + } return nhit, nkill; } diff --git a/zscript/weapons/swwm_cbt_fx.zsc b/zscript/weapons/swwm_cbt_fx.zsc index 41bea2c8b..3bb7c4633 100644 --- a/zscript/weapons/swwm_cbt_fx.zsc +++ b/zscript/weapons/swwm_cbt_fx.zsc @@ -352,6 +352,8 @@ Class BusterWall : Thinker let s = SWWMStats.Find(Instigator.player); if ( s ) s.busts++; SWWMUtility.AchievementProgressInc("bustin",1,Instigator.player); + if ( (Instigator is 'Demolitionist') && !Random[DemoLines](0,3) && (int(girthitude**.15) >= 3) ) + SWWMHandler.AddOneliner("bustkill",2,50); } // call hit fx for devastation sigil (if any) AngeryPower as = instigator?AngeryPower(instigator.FindInventory("AngeryPower")):null; @@ -523,6 +525,8 @@ Class BusterWall : Thinker let s = SWWMStats.Find(Instigator.player); if ( s ) s.busts++; SWWMUtility.AchievementProgressInc("bustin",1,Instigator.player); + if ( (Instigator is 'Demolitionist') && !Random[DemoLines](0,3) && (int(girthitude**.15) >= 3) ) + SWWMHandler.AddOneliner("bustkill",2,50); } // call hit fx for devastation sigil (if any) AngeryPower as = instigator?AngeryPower(instigator.FindInventory("AngeryPower")):null;