From 2aa0ea4680a8cad3709ba7dd8a14ec4b89d5c391 Mon Sep 17 00:00:00 2001 From: Marisa the Magician Date: Wed, 20 Aug 2025 15:50:07 +0200 Subject: [PATCH] More work towards Legacy of Rust support (with caveats). As of this commit, do not consider the experience when playing that new expansion to be complete. I've only partially written some of the mission texts and rudimentarily enhanced some boss fights. Currently there is one major limitation in that the intermission texts cannot be replaced, as they're hardcoded inside the UMAPINFO. I don't know if I can work around that. --- FuturePlans.md | 31 +++++---- id1.lst | 17 +++++ language.def_base | 51 +++++++++++++++ language.def_mission | 26 ++++++++ language.es_base | 47 +++++++++++++- language.version | 4 +- zmapinfo.txt | 51 +++++++++++++++ zscript.txt | 2 +- zscript/compat/swwm_compat.zsc | 34 ++++++++++ zscript/handler/swwm_handler_vanillaboss.zsc | 66 ++++++++++++++++++- zscript/handler/swwm_handler_worldload.zsc | 12 +++- zscript/kbase/swwm_kbase_priv.zsc | 11 ++++ zscript/kbase/swwm_kbasetab_mission.zsc | 10 +++ zscript/swwm_thinkers_player.zsc | 67 +++++++++++++------- zscript/utility/swwm_utility_compat.zsc | 6 ++ zscript/utility/swwm_utility_info.zsc | 22 +++++++ 16 files changed, 414 insertions(+), 43 deletions(-) create mode 100644 id1.lst diff --git a/FuturePlans.md b/FuturePlans.md index c6da1296b..03557fb28 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -7,26 +7,26 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add later More weapons, because we need 'em. In addition, a bunch of cleanup in base weapons to avoid redundancy. * [ ] **DLC Weaponset:** - - [x] [1] Itamex Reinforced Hammer *(UnSX 5)* + - [x] ➊ Itamex Reinforced Hammer *(UnSX 5)* - [x] HAHA DAB *(Gib 300 enemies with the Itamex Hammer)* - - [ ] [2] Plasma Blaster *(SWWM)* + - [ ] ➋ Plasma Blaster *(SWWM)* - [ ] Blastin' Plasma *(Kill an enemy at full health with a Plasma Blaster charged shot 50 times)* - - [ ] [3] Puntzer Beta *(SWWM Iridium)* + - [ ] ➌ Puntzer Beta *(SWWM Iridium)* - [ ] High Noon *(Land 6 killing shots in a single Puntzer Beta reload)* - - [ ] [4] Puntzer Gamma *(Ultra Suite 2)* + - [ ] ➍ Puntzer Gamma *(Ultra Suite 2)* - [ ] You Gained Brouzouf *(Unload an entire mag in fuller auto with the Puntzer Gamma without missing a single shot)* - - [x] [5] Sheen HMG *(SWWM Platinum Ep2)* + - [x] ➎ Sheen HMG *(SWWM Platinum Ep2)* - [x] Dakka *(Fire the Sheen HMG at 700 RPM for 30 seconds straight)* - - [x] [6] Quadravol *(UnSX)* + - [x] ➏ Quadravol *(UnSX)* - [x] Gravely Roast *(Perform 200 bayonet combos with the Quadravol)* - - [ ] [7] Sparkster x3 *(UnSX 2)* + - [ ] ➐ Sparkster x3 *(UnSX 2)* - [ ] A Fine Sparking *(Kill 30 enemies at once with a Sparkster Rifle combo shot)* - - [ ] [8] Ray-Khom *(UnSX)* + - [ ] ➑ Ray-Khom *(UnSX)* - [ ] The Most Silent Takedown *(Kill 40 enemies with the Ray-Khom primary without alerting them)* - [ ] John Romero's Curse *(Fry yourself by discharging an electric weapon in water)* - - [x] [9] Mortal Rifle *(UnSX 2)* + - [x] ➒ Mortal Rifle *(UnSX 2)* - [x] Railed Hard *(Kill 44 enemies with a single Mortal Rifle overpressure shot)* - - [ ] [0] Rafan-Kos *(UnSX 4)* + - [ ] ➓ Rafan-Kos *(UnSX 4)* - [ ] Super Laser Piss *(Melt a grand total of 5000 enemies with the Rafan-Kos)* * [x] **Additional Voice Acting:** - [x] Extra lines for item pickups/usage @@ -47,7 +47,8 @@ More weapons, because we need 'em. In addition, a bunch of cleanup in base weapo * [x] **Additional WAD Compatibility:** - [x] SIGIL 2 - [x] Eviternity 2 -* [ ] **GZDoom 4.12.x Features:** + - [ ] Legacy of Rust +* [ ] **GZDoom 4.12+ Features:** - [x] Lesser code cleanup/refactor *(new variables, functions, flags, etc.)* - [ ] Visual Thinker migration where needed *(more lightweight sprite explosions and the like)* * [ ] **VKDoom Features:** @@ -56,7 +57,7 @@ More weapons, because we need 'em. In addition, a bunch of cleanup in base weapo ## 1.4 update *(Fine Refinements)*: -Re-animation of old FK models. Plus extra score incentives and achievements. +Re-animation of old FK models. Some more items. Plus extra score incentives and achievements. Finishing touches for the mod to be considered truly done, really. * [ ] **Re-animate all base models with IK *(important for consistency)*** - [ ] Re-animate base weapon set and gestures *(won't be hard)* @@ -105,6 +106,7 @@ Re-animation of old FK models. Plus extra score incentives and achievements. - [ ] Satanic Surprise *(Beat SIGIL 2)* - [ ] Explosive Headache *(Beat Doom 2)* - [ ] Rude Awakening *(Beat No Rest For The Living)* + - [ ] Two Birds With One Nuke *(Beat Legacy of Rust)* - [ ] Doom Eviternal *(Beat all episodes of Eviternity)* - [ ] Doom Sempiternal *(Beat all episodes of Eviternity 2)* - [ ] Ding Dong The Wizard's Dead *(Beat the first three episodes of Heretic)* @@ -128,8 +130,9 @@ Things that I'm unsure when will be added *(or if they can be added)*. - [ ] Deaf to The Siren's Song *(Beat Sunder)* * [ ] **Official HELLION support *(when it comes out)*** - [ ] Romerotown Rampage *(Beat HELLION)* -* [ ] **Official Legacy of Rust support *(not sure how it'd fit in the storyline, but maybe)*** - - [ ] Two Birds With One Nuke *(Beat Legacy of Rust)* +* [ ] **Official Heretic + Hexen re-release support *(if heavy lifting is handled by the port)*** + - [ ] Absolutely Heretical *(Beat Faith Renewed)* + - [ ] Absolutely Washed *(Beat Vestiges of Grandeur)* ## Other Projects diff --git a/id1.lst b/id1.lst new file mode 100644 index 000000000..30bb42b24 --- /dev/null +++ b/id1.lst @@ -0,0 +1,17 @@ +4F9E705F55E45C1047FABF8BDF2B2399 +5FB5010F988FFAE2679A9BDD57460473 +7CABD8B043B69996D9777F7070C8BCCE +7F00D2FAA5F0B10A6028BE2FC5530EC9 +8A2C0869EAA69FB7B441CD2B648978D0 +95B94864754AC50446A456A88DA3E052 +867B6AD67389A077CE3C9E3CC896F484 +1283C3288A2F51B7455D817C5B7FCFAD +1699E255B8C0DB86EBB00E5B3C44B4AA +A3F7A58FC08C369F1360741A99F1497C +B6447217725A2A709D6D021CDE15FE10 +BF34C34C5DFC8BB47228CC304F9A6748 +C745F8D0D8824A1910F9DC8B7AB16AA2 +E2D2886FD22DC4354939E6E51690C34B +F5AED83945C8BDE642E55E72FE0D92AA +F206766043C4D9BA2C36F76106F96279 +FCF009C63BBA5F8CEE71ED5EC0B02CDA diff --git a/language.def_base b/language.def_base index d53657ac8..1f3a84848 100644 --- a/language.def_base +++ b/language.def_base @@ -347,6 +347,45 @@ FN_WOLFSS_FUNN = "3"; FN_WOLFSS_FUN1 = "Mein Lieben"; FN_WOLFSS_FUN2 = "Blondie"; FN_WOLFSS_FUN3 = "Plain Ol' Nazi"; +FN_ID24BANSHEE_FUNN = "5"; +FN_ID24BANSHEE_FUN1 = "'Splode"; +FN_ID24BANSHEE_FUN2 = "Shouty McShoutface"; +FN_ID24BANSHEE_FUN3 = "Blastface"; +FN_ID24BANSHEE_FUN4 = "We Have To Explode"; +FN_ID24BANSHEE_FUN5 = "Volatile"; +FN_ID24GHOUL_FUNN = "6"; +FN_ID24GHOUL_FUN1 = "SKULL"; +FN_ID24GHOUL_FUN2 = "Grayface"; +FN_ID24GHOUL_FUN3 = "Floaty Head"; +FN_ID24GHOUL_FUN4 = "They Shoot Now"; +FN_ID24GHOUL_FUN5 = "Lil' Head"; +FN_ID24GHOUL_FUN6 = "Skully"; +FN_ID24MINDWEAVER_FUNN = "5"; +FN_ID24MINDWEAVER_FUN1 = "Dakka Spooder"; +FN_ID24MINDWEAVER_FUN2 = "Braingunner"; +FN_ID24MINDWEAVER_FUN3 = "Adolescent Spider"; +FN_ID24MINDWEAVER_FUN4 = "Momma's Favorite"; +FN_ID24MINDWEAVER_FUN5 = "Bullet Nerd"; +FN_ID24SHOCKTROOPER_FUNN = "5"; +FN_ID24SHOCKTROOPER_FUN1 = "Plasma Bastard"; +FN_ID24SHOCKTROOPER_FUN2 = "Zap Zombie"; +FN_ID24SHOCKTROOPER_FUN3 = "Asshole"; +FN_ID24SHOCKTROOPER_FUN4 = "Oof Ouch"; +FN_ID24SHOCKTROOPER_FUN5 = "Glass Cannon"; +FN_ID24TYRANT_FUNN = "6"; +FN_ID24TYRANT_FUN1 = "Hornless Behavior"; +FN_ID24TYRANT_FUN2 = "Downgraded Cow"; +FN_ID24TYRANT_FUN3 = "Less Augmented Cow"; +FN_ID24TYRANT_FUN4 = "Green Moo"; +FN_ID24TYRANT_FUN5 = "Also Shoot At It Until It Dies"; +FN_ID24TYRANT_FUN6 = "Arse"; +FN_ID24VASSAGO_FUNN = "6"; +FN_ID24VASSAGO_FUN1 = "Skullface"; +FN_ID24VASSAGO_FUN2 = "Fiery Fuck"; +FN_ID24VASSAGO_FUN3 = "Flamer"; +FN_ID24VASSAGO_FUN4 = "Winged Goat"; +FN_ID24VASSAGO_FUN5 = "Pie-Romancer"; +FN_ID24VASSAGO_FUN6 = "Door On Fire"; FN_DOG_FUN = "Goodest Boy"; FN_CHICKEN_FUN = "PECK"; FN_BEAST_FUN = "Друг"; @@ -637,6 +676,12 @@ OB_KNIGHT = "%o was bruised by green plasma."; OB_SPIDER = "%o ate all those bullets."; OB_BABY = "%o angered the spider bab."; OB_CYBORG = "%o didn't follow the protip."; +ID24_OB_BANSHEE = "%o got ardently shouted at."; +ID24_OB_GHOUL = "%o got pelted by skullies."; +ID24_OB_MINDWEAVER = "%o did not expect the demons to give machine guns to children."; +ID24_OB_SHOCKTROOPER = "%o got plasma up the ass."; +ID24_OB_TYRANT = "%o still didn't follow the protip."; +ID24_OB_VASSAGO = "%o could not handle that much heat."; OB_DOG = "%o angered the doggo."; OB_CHICKEN = "%o got the PECK."; OB_BEAST = "%o got flamed by a big friend."; @@ -932,6 +977,9 @@ BT_SPIDER2 = "Spider Sibling"; BT_DIMPLE = "Demonic Biomech Squad"; BT_IOS = "Baramun, Icon of Sin"; BT_CYBIE2 = "Last Tyrant"; +BT_CYBIE3 = "Guardians of the Soul Silo"; +BT_TYRANT = "Child of Erebus"; +BT_TYRANT2 = "Last Children of Erebus"; BT_LICHES = "Iron Liches"; BT_MINOTAUR = "Maulotaur Servants"; BT_DSPARIL = "D'Sparil, Serpent Rider"; @@ -952,6 +1000,9 @@ BT_SPIDER2_FUN = "Big Brains Idiot Redux"; BT_DIMPLE_FUN = "Lard Lads and Spidey Squad"; BT_IOS_FUN = "Goaty McGoatface"; BT_CYBIE2_FUN = "Big Stupid Party Pooper"; +BT_CYBIE3_FUN = "An Assload of Cows"; +BT_TYRANT_FUN = "Shoot It Until It Dies, Now In Green"; +BT_TYRANT2_FUN = "Shoot Them All Until They Die, Still In Green"; BT_LICHES_FUN = "The Jolly Lad Squad"; BT_MINOTAUR_FUN = "AWAKEN MY MASTERS"; BT_DSPARIL_FUN = "Red Robed Wizard Dude and Lizard"; diff --git a/language.def_mission b/language.def_mission index f3183745d..04900822e 100644 --- a/language.def_mission +++ b/language.def_mission @@ -172,6 +172,28 @@ SWWM_MISSION_DOOM11 = "Blast 'em to bits, \cfDemolitionist\c-!\n" "\n" "Saya out."; +SWWM_MISSION_DOOM28 = +"Welcome to this unexpected side mission, \cfDemo-chan\c-. So this is going to come out of nowhere, I know, we thought that the \cfUAC\c- would finally learn their lesson while they were cleaning up their own mess. Not so sure now.\n" +"\n" +"You're getting deployed to \cf\"New Eden\"\c-, an outpost around the northern coast of Hell's mainland. Thought to be abandoned, sure, but turns out a certain group of people, certain fucking desperate sore loser generals I will not name, have seized it due to one very critical mistake: The goddamn UAC put a shitload of nukes in there.\n" +"\n" +"Now, these idiots truly did sink to a new low. They had that shit in there, at the ready for launch, \"just in case\" something happened. Well, something sure did happen, because now the \cfArchlord Generals\c- have access to weapons of mass destruction, and as soon as they figure out how to use them, we're screwed.\n" +"\n" +"So, what's the plan? First, you need to hitch a ride through a portal, and then you'll be back in the ol' land of fire and brimstone. From there, you need to blast your way through the UAC facilities, watching out for any resistance in your path. There's not really any info on the layout of this place, so we either find those nukes by chance, by process of elimination, or you happen to locate an access point where you can fetch a detailed map of the whole installation.\n" +"\n" +"Time for some more action, \cfDemolitionist\c-!\n" +"\n" +"Saya out."; +SWWM_MISSION_DOOM29 = +"OK, so that was embarrassing. Yeah, the access point was obviously rigged, you walked right into a trap, and GUESS WHO also decided that, right after that happened, he had to dispose of your entire inventory. Yup.\n" +"\n" +"Now, the info we got in the last second was very useful, with one caveat: The missiles are not on \cfNew Eden\c-, but somewhere else entirely. But guess what? I've tracked where those wacky winged weirdos took you, and they actually dropped you off not far from the missile silo.\n" +"\n" +"Of course, once you get there, expect the place to be very, very heavily guarded. But for now, you do need to get out of that cage and... Find more guns, again. *sigh*\n" +"\n" +"I really wish you the best of luck, \cfDemo\c-.\n" +"\n" +"Saya out."; SWWM_MISSION_EVITERNITY1 = "Welcome to this side mission, \cfDemolitionist\c-. So shit has hit the fan once again, after we thought all got fixed up, and guess WHO is behind it: The motherfucking \cfUAC\c-!\n" "\n" @@ -656,6 +678,10 @@ NERVETEXT = "you stretch your joints, happily clap to\n" "yourself, and set forth on your long trip\n" "back home. That reward better be good..."; +INTERTEXT_ID1_E1 = +""; +INTERTEXT_ID1_E2 = +""; HE1TEXT = "Once you've beaten up those crazy\n" "laughing heads, you can now see the\n" diff --git a/language.es_base b/language.es_base index c6616ad1a..30a3df951 100644 --- a/language.es_base +++ b/language.es_base @@ -257,6 +257,39 @@ FN_CYBER_FUN6 = "Vaca Mú"; FN_WOLFSS_FUN1 = "Votante De VOX"; FN_WOLFSS_FUN2 = "Rubito"; FN_WOLFSS_FUN3 = "Cosas Nasis"; +FN_ID24BANSHEE_FUN1 = "Esplota"; +FN_ID24BANSHEE_FUN2 = "Don Gritón"; +FN_ID24BANSHEE_FUN3 = "Bombajeta"; +FN_ID24BANSHEE_FUN4 = "Hay Que Explotar"; +FN_ID24BANSHEE_FUN5 = "Volátil"; +FN_ID24GHOUL_FUN1 = "CRÁNEO"; +FN_ID24GHOUL_FUN2 = "Caragris"; +FN_ID24GHOUL_FUN3 = "Cabeza Flotante"; +FN_ID24GHOUL_FUN4 = "Ahora Disparan"; +FN_ID24GHOUL_FUN5 = "Cabecín"; +FN_ID24GHOUL_FUN6 = "Calaverín"; +FN_ID24MINDWEAVER_FUN1 = "Araña Armada"; +FN_ID24MINDWEAVER_FUN2 = "Amenteralladora"; +FN_ID24MINDWEAVER_FUN3 = "Araña Adolescente"; +FN_ID24MINDWEAVER_FUN4 = "Favorita De Mamá"; +FN_ID24MINDWEAVER_FUN5 = "Friki Balístico"; +FN_ID24SHOCKTROOPER_FUN1 = "Bastardo De Plasma"; +FN_ID24SHOCKTROOPER_FUN2 = "Zombi Plasmado"; +FN_ID24SHOCKTROOPER_FUN3 = "Caraculo"; +FN_ID24SHOCKTROOPER_FUN4 = "Uf Ay"; +FN_ID24SHOCKTROOPER_FUN5 = "Cañón De Cristal"; +FN_ID24TYRANT_FUN1 = "Comportamiento Descornado"; +FN_ID24TYRANT_FUN2 = "Vaca Degradada"; +FN_ID24TYRANT_FUN3 = "Vaca Menos Aumentada"; +FN_ID24TYRANT_FUN4 = "Mú Verde"; +FN_ID24TYRANT_FUN5 = "Dispara También Hasta Que Muera"; +FN_ID24TYRANT_FUN6 = "Posaderas"; +FN_ID24VASSAGO_FUN1 = "Careta Calavera"; +FN_ID24VASSAGO_FUN2 = "Capullo Combustible"; +FN_ID24VASSAGO_FUN3 = "Un Quemao"; +FN_ID24VASSAGO_FUN4 = "Cabra Alada"; +FN_ID24VASSAGO_FUN5 = "Pi-Romántico"; +FN_ID24VASSAGO_FUN6 = "Puerta En Llamas"; FN_DOG_FUN = "Perrete"; FN_CHICKEN_FUN = "POLLO"; FN_CLINK_FUN1 = "Rasguñitos"; @@ -506,6 +539,12 @@ OB_KNIGHT = "%o fue churruscad@[ao_esp] por plasma verde."; OB_SPIDER = "%o se comió todas esas balas."; OB_BABY = "%o hizo enfadar al ñiño araña."; OB_CYBORG = "%o no siguió el consejo."; +ID24_OB_BANSHEE = "%o recibió un ardiente grito en toda la cara."; +ID24_OB_GHOUL = "%o fue acribillado por las calaveritas."; +ID24_OB_MINDWEAVER = "%o no esperaba que los demonios les dieran ametralladoras a los niños."; +ID24_OB_SHOCKTROOPER = "%o se llevó un plasma de través."; +ID24_OB_TYRANT = "%o aun no siguió el consejo."; +ID24_OB_VASSAGO = "%o no pudo soportar tanto calor."; OB_DOG = "%o hizo enfadar al perrete."; OB_CHICKEN = "%o recibió el PICO."; OB_BEAST = "%o fue flambead@[ao_esp] por un amigo grandote."; @@ -776,6 +815,9 @@ BT_SPIDER2 = "Hermana Arácnida"; BT_DIMPLE = "Escuadrón de Demonios Biomecánicos"; BT_IOS = "Baramún, Icono del Pecado"; BT_CYBIE2 = "El Último Tirano"; +BT_CYBIE3 = "Guardianes del Silo de Almas"; +BT_TYRANT = "Hijo de Erebus"; +BT_TYRANT2 = "Últimos Hijos de Erebus"; BT_LICHES = "Liches de Hierro"; BT_MINOTAUR = "Sirvientes Mazotauros"; BT_DSPARIL = "D'Sparil, Jinete de Serpiente"; @@ -794,7 +836,10 @@ BT_SPIDER_FUN = "Cerebrito Idiota"; BT_SPIDER2_FUN = "Cerebrito Idiota Bis"; BT_DIMPLE_FUN = "Gordos Grasientos y Armada Arácnida"; BT_IOS_FUN = "Cabra Emparedada"; -BT_CYBYE2_FUN = "Gran y Estúpido Aguafiestas"; +BT_CYBIE2_FUN = "Gran y Estúpido Aguafiestas"; +BT_CYBIE3_FUN = "La Hostia de Vacas"; +BT_TYRANT_FUN = "Dispara Hasta Que Muera, Ahora En Verde"; +BT_TYRANT2_FUN = "Dispara Hasta Que Mueran Todos, Aun En Verde"; BT_LICHES_FUN = "El Escuadrón Risitas"; BT_DSPARIL_FUN = "El Brujo Rojo Ese y Lagarto"; BT_DSPARIL2_FUN = "El Brujo Rojo Ese"; diff --git a/language.version b/language.version index 49b3cfd15..335e30359 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1233 \cu(lun 18 ago 2025 23:29:49 CEST)\c-"; -SWWM_SHORTVER="\cw1.3pre r1233 \cu(2025-08-18 23:29:49)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1235 \cu(mié 20 ago 2025 16:47:24 CEST)\c-"; +SWWM_SHORTVER="\cw1.3pre r1235 \cu(2025-08-20 16:47:24)\c-"; diff --git a/zmapinfo.txt b/zmapinfo.txt index f32658331..9ec8cf56c 100644 --- a/zmapinfo.txt +++ b/zmapinfo.txt @@ -279,4 +279,55 @@ DoomEdNums 4206993 = SWWMDog // Heretic fuckery 4206999 = Mace + // Legacy of Rust hackery + 4207007 = ID24Ghoul + 4207008 = ID24Banshee + 4207009 = ID24Mindweaver + 4207010 = ID24PlasmaGuy + 4207011 = ID24Vassago + 4207012 = ID24Tyrant + 4207013 = ID24TyrantBoss1 + 4207014 = ID24TyrantBoss2 + 4207100 = ID24GrayStalagmite + 4207101 = ID24LargeCorpsePile + 4207102 = ID24HumanBBQ1 + 4207103 = ID24HumanBBQ2 + 4207104 = ID24HangingBodyBothLegs + 4207105 = ID24HangingBodyBothLegsSolid + 4207106 = ID24HangingBodyCrucified + 4207107 = ID24HangingBodyCrucifiedSolid + 4207108 = ID24HangingBodyArmsBound + 4207109 = ID24HangingBodyArmsBoundSolid + 4207110 = ID24HangingBaronOfHell + 4207111 = ID24HangingBaronOfHellSolid + 4207112 = ID24HangingChainedBody + 4207113 = ID24HangingChainedBodySolid + 4207114 = ID24HangingChainedTorso + 4207115 = ID24HangingChainedTorsoSolid + 4207116 = ID24SkullPoleTrio + 4207117 = ID24SkullGibs + 4207118 = ID24BushShort + 4207119 = ID24BushShortBurned1 + 4207120 = ID24BushShortBurned2 + 4207121 = ID24BushTall + 4207122 = ID24BushTallBurned1 + 4207123 = ID24BushTallBurned2 + 4207124 = ID24CaveRockColumn + 4207125 = ID24CaveStalagmiteLarge + 4207126 = ID24CaveStalagmiteMedium + 4207127 = ID24CaveStalagmiteSmall + 4207128 = ID24CaveStalactiteLarge + 4207129 = ID24CaveStalactiteLargeSolid + 4207130 = ID24CaveStalactiteMedium + 4207131 = ID24CaveStalactiteMediumSolid + 4207132 = ID24CaveStalactiteSmall + 4207133 = ID24CaveStalactiteSmallSolid + 4207134 = ID24OfficeChair + 4207135 = ID24OfficeLamp + 4207137 = ID24CeilingLamp + 4207138 = ID24CandelabraShort + 4207139 = ID24AmbientKlaxon + 4207140 = ID24AmbientPortalOpen + 4207141 = ID24AmbientPortalLoop + 4207142 = ID24AmbientPortalClose } diff --git a/zscript.txt b/zscript.txt index f47a1102d..d76e63a31 100644 --- a/zscript.txt +++ b/zscript.txt @@ -1,4 +1,4 @@ -version "4.14.1" +version "4.15" /* DEMOLITIONIST Main Codebase diff --git a/zscript/compat/swwm_compat.zsc b/zscript/compat/swwm_compat.zsc index befa3d61d..3477f9fe7 100644 --- a/zscript/compat/swwm_compat.zsc +++ b/zscript/compat/swwm_compat.zsc @@ -139,6 +139,11 @@ Class SWWMLevelCompatibility : LevelPostProcessor level.nextsecretmap = level.nextmap; // so the handler can detect this if ( LevelInfo.MapExists("MAP01") ) level.nextmap = "MAP01"; break; + // Legacy of Rust E1M7 + case '7F00D2FAA5F0B10A6028BE2FC5530EC9': + level.nextsecretmap = level.nextmap; // so the handler can detect this + level.nextmap = "MAP08"; + break; // Heretic E1M8 case '27639D04F8090D57A47D354992435893': level.nextsecretmap = level.nextmap; // so the handler can detect this @@ -539,6 +544,35 @@ Class SWWMLevelCompatibility : LevelPostProcessor } switch ( checksum ) { + // ALL of Legacy of Rust + case '4F9E705F55E45C1047FABF8BDF2B2399': + case '5FB5010F988FFAE2679A9BDD57460473': + case '7CABD8B043B69996D9777F7070C8BCCE': + case '7F00D2FAA5F0B10A6028BE2FC5530EC9': + case '8A2C0869EAA69FB7B441CD2B648978D0': + case '95B94864754AC50446A456A88DA3E052': + case '867B6AD67389A077CE3C9E3CC896F484': + case '1283C3288A2F51B7455D817C5B7FCFAD': + case '1699E255B8C0DB86EBB00E5B3C44B4AA': + case 'A3F7A58FC08C369F1360741A99F1497C': + case 'B6447217725A2A709D6D021CDE15FE10': + case 'BF34C34C5DFC8BB47228CC304F9A6748': + case 'C745F8D0D8824A1910F9DC8B7AB16AA2': + case 'E2D2886FD22DC4354939E6E51690C34B': + case 'F5AED83945C8BDE642E55E72FE0D92AA': + // we need to replace the dehacked things with the + // ones defined in zscript internally, for the sake of + // script compatibility and whatnot + for ( uint i=0; i= 3007) && (ednum <= 3014)) + || ((ednum >= 3100) && (ednum <= 3142)) ) + SetThingEdNum(i,ednum+4204000); + } + break; + case 'F206766043C4D9BA2C36F76106F96279': + case 'FCF009C63BBA5F8CEE71ED5EC0B02CDA': // ALL of Equinox case '9705315427A2F951A538B23C39199236': case '54E9953A3C1A88641E00AA353BAF46E9': diff --git a/zscript/handler/swwm_handler_vanillaboss.zsc b/zscript/handler/swwm_handler_vanillaboss.zsc index 488d8446c..33fd54a6e 100644 --- a/zscript/handler/swwm_handler_vanillaboss.zsc +++ b/zscript/handler/swwm_handler_vanillaboss.zsc @@ -77,6 +77,28 @@ Class ROM3R0Death : Inventory return; } } +Class TyrantWake : Inventory +{ + override void DoEffect() + { + if ( Owner.InStateSequence(Owner.CurState,Owner.SeeState) ) + { + let hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); + if ( hnd && (hnd.bosstag != "$BT_TYRANT2") ) + { + hnd.bossactors.Clear(); + hnd.initialized = false; + let ti = ThinkerIterator.Create('Deh_Actor_157'); + Actor a; + while ( a = Actor(ti.Next()) ) + hnd.bossactors.Push(a); + hnd.bosstag = "$BT_TYRANT2"; + } + DepleteOrDestroy(); + return; + } + } +} extend Class SWWMHandler { @@ -124,7 +146,9 @@ extend Class SWWMHandler MAP_HMAP60, MAP_EVMAP30, // eviternity MAP_EVIIMAP30, // eviternity 2 - MAP_DE1M8B // "tech gone bad" + MAP_DE1M8B, // "tech gone bad" + MAP_ID24MAP13, // TODO Soul Silo cybies + MAP_ID24MAP14 // TODO Brink tyrants }; static play void AddBoss( int tid, String tag, bool endgame = false ) @@ -237,6 +261,10 @@ extend Class SWWMHandler return MAP_EVMAP30; if ( mapsum ~== "CF2B3E2589CA6FBB6EE3E3A09F19BA18" ) return MAP_EVIIMAP30; + if ( mapsum ~== "7CABD8B043B69996D9777F7070C8BCCE" ) + return MAP_ID24MAP13; + if ( mapsum ~== "A3F7A58FC08C369F1360741A99F1497C" ) + return MAP_ID24MAP14; return MAP_NONE; } private void VanillaBossSpawn( WorldEvent e ) @@ -320,6 +348,42 @@ extend Class SWWMHandler bosstag = "$BT_CYBIE2"; } } + else if ( bossmap == MAP_ID24MAP13 ) + { + if ( e.Thing is 'Cyberdemon' ) + { + bossactors.Push(e.Thing); + e.Thing.StartHealth = e.Thing.Health *= 4; + e.Thing.GiveInventory('BossMarker',1); + bosstag = "$BT_CYBIE3"; + } + } + else if ( bossmap == MAP_ID24MAP14 ) + { + if ( e.Thing is 'Deh_Actor_156' ) + { + bossactors.Push(e.Thing); + e.Thing.StartHealth = e.Thing.Health *= 4; + e.Thing.GiveInventory('BossMarker',1); + bosstag = "$BT_TYRANT"; + } + else if ( e.Thing is 'Deh_Actor_155' ) + { + e.Thing.StartHealth = e.Thing.Health *= 4; + e.Thing.GiveInventory('BossMarker',1); + } + else if ( e.Thing is 'Deh_Actor_157' ) + { + e.Thing.StartHealth = e.Thing.Health *= 4; + e.Thing.GiveInventory('BossMarker',1); + e.Thing.GiveInventory('TyrantWake',1); + } + else if ( e.Thing is 'Cyberdemon' ) + { + e.Thing.StartHealth = e.Thing.Health *= 4; + e.Thing.GiveInventory('BossMarker',1); + } + } else if ( bossmap == MAP_HE1M8_HE4M8 ) { if ( e.Thing is 'IronLich' ) diff --git a/zscript/handler/swwm_handler_worldload.zsc b/zscript/handler/swwm_handler_worldload.zsc index 9f86b4e20..56678f9ac 100644 --- a/zscript/handler/swwm_handler_worldload.zsc +++ b/zscript/handler/swwm_handler_worldload.zsc @@ -80,7 +80,8 @@ extend Class SWWMHandler else if ( SWWMUtility.IsEviternity() ) { // we have to do some heavy lifting here because episodes don't match clusters - if ( level.levelnum <= 5 ) clust = 1; + if ( level.levelnum <= 0 ) {} + else if ( level.levelnum <= 5 ) clust = 1; else if ( level.levelnum <= 10 ) clust = 2; else if ( level.levelnum <= 15 ) clust = 3; else if ( level.levelnum <= 20 ) clust = 4; @@ -93,6 +94,15 @@ extend Class SWWMHandler else clust = 8; } } + else if ( SWWMUtility.IsLegacyOfRust() ) + { + // clusters must be manually assigned + if ( level.levelnum <= 0 ) {} + if ( (level.levelnum <= 7) || (level.levelnum == 15) ) clust = 28; + else if ( (level.levelnum <= 14) || (level.levelnum == 16) ) clust = 29; + if ( (level.levelnum == 15) || (level.levelnum == 16) ) + secret = true; + } else { if ( (gameinfo.gametype&GAME_DOOM) && ((level.cluster == 9) || (level.cluster == 10)) ) diff --git a/zscript/kbase/swwm_kbase_priv.zsc b/zscript/kbase/swwm_kbase_priv.zsc index 1df2d6d0a..12f9c8090 100644 --- a/zscript/kbase/swwm_kbase_priv.zsc +++ b/zscript/kbase/swwm_kbase_priv.zsc @@ -69,6 +69,17 @@ extend Class DemolitionistMenu c_minute = 9; c_tz = "+09"; } + else if ( SWWMUtility.IsLegacyOfRust() ) + { + // August 8th 2150, 02:31 EDT + // (August 8th 2150, 11:31 JST) + c_year = 2150; + c_month = 7; + c_day = 7; + c_hour = 2; + c_minute = 31; + c_tz = "EDT"; + } else // Doom { // June 6th 2148, 18:37 EDT diff --git a/zscript/kbase/swwm_kbasetab_mission.zsc b/zscript/kbase/swwm_kbasetab_mission.zsc index 4345a3243..5ffbcc7d2 100644 --- a/zscript/kbase/swwm_kbasetab_mission.zsc +++ b/zscript/kbase/swwm_kbasetab_mission.zsc @@ -23,6 +23,7 @@ Class DemolitionistMissionTab : DemolitionistMenuTab } // saves time bool nrftl = false; + bool lor = false; bool eviternity = false; bool eviternitwo = false; bool hexdd = false; @@ -32,6 +33,7 @@ Class DemolitionistMissionTab : DemolitionistMenuTab { int clus = level.cluster; if ( clus == 11 ) nrftl = true; + lor = SWWMUtility.IsLegacyOfRust(); eviternity = SWWMUtility.IsEviternity(); eviternitwo = SWWMUtility.IsEviternityTwo(); if ( eviternitwo ) @@ -59,6 +61,14 @@ Class DemolitionistMissionTab : DemolitionistMenuTab else if ( level.levelnum <= 32 ) clus = 8; missionstr = String.Format("$SWWM_MISSION_EVITERNITY%d",clus); } + else if ( lor ) + { + // legacy of rust has its quirks, as with umapinfo there are + // technically no clusters + if ( (level.levelnum <= 7) || (level.levelnum == 15) ) clus = 28; + else if ( (level.levelnum <= 14) || (level.levelnum == 16) ) clus = 29; + missionstr = String.Format("$SWWM_MISSION_DOOM%d",clus); + } // naive method to guess if this is sigil else if ( (clus == 5) && (level.mapname.Left(2) == "E5") ) missionstr = String.Format("$SWWM_MISSION_SIGIL"); diff --git a/zscript/swwm_thinkers_player.zsc b/zscript/swwm_thinkers_player.zsc index baba9d128..f8cbad11c 100644 --- a/zscript/swwm_thinkers_player.zsc +++ b/zscript/swwm_thinkers_player.zsc @@ -223,42 +223,63 @@ Class SWWMStats : SWWMStaticThinker return null; } + // we doin' that thing again, yup + int ClusterRemap( int clus, int levelnum ) + { + if ( SWWMUtility.IsEviternityTwo() ) + { + // clusters in eviternity 2 have to be remapped + if ( clus == 5 ) return 1; + if ( (clus == 6) || (clus == 13) ) return 2; + if ( (clus == 7) || (clus == 14) ) return 3; + if ( (clus == 8) || (clus == 15) ) return 4; + if ( (clus == 9) || (clus == 16) ) return 5; + if ( (clus == 10) || (clus == 17) ) return 6; + if ( (clus == 11) || (clus == 12) || (clus == 18) || (clus == 19) ) return 7; + } + else if ( SWWMUtility.IsEviternity() ) + { + // we have to do some heavy lifting here because episodes don't match clusters + if ( levelnum <= 0 ) return clus; + if ( levelnum <= 5 ) return 1; + if ( levelnum <= 10 ) return 2; + if ( levelnum <= 15 ) return 3; + if ( levelnum <= 20 ) return 4; + if ( levelnum <= 25 ) return 5; + if ( levelnum <= 30 ) return 6; + if ( levelnum <= 31 ) return 7; + if ( levelnum <= 32 ) return 8; + } + else if ( SWWMUtility.IsLegacyOfRust() ) + { + // legacy of rust has its quirks, as with umapinfo there are + // technically no clusters + if ( levelnum <= 0 ) return clus; + if ( (levelnum <= 7) || (levelnum == 15) ) return 28; + else if ( (levelnum <= 14) || (levelnum == 16) ) return 29; + } + return clus; + } + void PreloadLevelStats() { // pre-adds all unvisited levels from the current cluster int nlevels = LevelInfo.GetLevelInfoCount(); + int ourcluster = ClusterRemap(level.cluster,level.levelnum); for ( int i=0; i= 2150) && (mlog.month >= 5)) ) + if ( (gameinfo.gametype&GAME_Raven) || SWWMUtility.IsEviternity() || SWWMUtility.IsEviternityTwo() || SWWMUtility.IsLegacyOfRust() || (mlog && (mlog.year >= 2150) && (mlog.month >= 5)) ) { if ( text ~== "SWWM_LORETXT_AKARILABS" ) text = "SWWM_LORETXT_AKARILABS2"; // demo won, akari project announced diff --git a/zscript/utility/swwm_utility_compat.zsc b/zscript/utility/swwm_utility_compat.zsc index f5c9f335f..13f59bd48 100644 --- a/zscript/utility/swwm_utility_compat.zsc +++ b/zscript/utility/swwm_utility_compat.zsc @@ -52,10 +52,16 @@ extend Class SWWMUtility if ( IsEviternity() ) return true; if ( IsEviternityTwo() ) return true; if ( IsUltDoom2() ) return true; + if ( IsLegacyOfRust() ) return true; } return false; } + static bool IsLegacyOfRust() + { + return CheckMD5List("id1.lst"); + } + // detect ultimate doom 2 static bool IsUltDoom2() { diff --git a/zscript/utility/swwm_utility_info.zsc b/zscript/utility/swwm_utility_info.zsc index 3a436a8c2..5368d43ff 100644 --- a/zscript/utility/swwm_utility_info.zsc +++ b/zscript/utility/swwm_utility_info.zsc @@ -84,6 +84,26 @@ extend Class SWWMUtility case 'CyberdemonMAP24': basetag = "CYBER"; break; + case 'ID24Banshee': + basetag = "ID24BANSHEE"; + break; + case 'ID24Ghoul': + basetag = "ID24GHOUL"; + break; + case 'ID24Mindweaver': + basetag = "ID24MINDWEAVER"; + break; + case 'ID24PlasmaGuy': + basetag = "ID24SHOCKTROOPER"; + break; + case 'ID24Vassago': + basetag = "ID24VASSAGO"; + break; + case 'ID24Tyrant': + case 'ID24TyrantBoss1': + case 'ID24TyrantBoss2': + basetag = "ID24TYRANT"; + break; case 'SWWMBossBrain': basetag = "BOSSBRAIN"; break; @@ -303,6 +323,8 @@ extend Class SWWMUtility Class rescls = res; return rescls; } + // special boss tyrants in LoR final map + if ( (a == 'ID24TyrantBoss1') || (a == 'ID24TyrantBoss2') ) return 'ID24Tyrant'; // stealth monsters, the worst thing ever invented if ( a == 'StealthArachnotron' ) return 'Arachnotron'; if ( a == 'StealthArchvile' ) return 'Archvile';