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.
This commit is contained in:
Mari the Deer 2025-08-20 15:50:07 +02:00
commit 2aa0ea4680
16 changed files with 414 additions and 43 deletions

View file

@ -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

17
id1.lst Normal file
View file

@ -0,0 +1,17 @@
4F9E705F55E45C1047FABF8BDF2B2399
5FB5010F988FFAE2679A9BDD57460473
7CABD8B043B69996D9777F7070C8BCCE
7F00D2FAA5F0B10A6028BE2FC5530EC9
8A2C0869EAA69FB7B441CD2B648978D0
95B94864754AC50446A456A88DA3E052
867B6AD67389A077CE3C9E3CC896F484
1283C3288A2F51B7455D817C5B7FCFAD
1699E255B8C0DB86EBB00E5B3C44B4AA
A3F7A58FC08C369F1360741A99F1497C
B6447217725A2A709D6D021CDE15FE10
BF34C34C5DFC8BB47228CC304F9A6748
C745F8D0D8824A1910F9DC8B7AB16AA2
E2D2886FD22DC4354939E6E51690C34B
F5AED83945C8BDE642E55E72FE0D92AA
F206766043C4D9BA2C36F76106F96279
FCF009C63BBA5F8CEE71ED5EC0B02CDA

View file

@ -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";

View file

@ -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 =
"<insert text here>";
INTERTEXT_ID1_E2 =
"<insert text here>";
HE1TEXT =
"Once you've beaten up those crazy\n"
"laughing heads, you can now see the\n"

View file

@ -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";

View file

@ -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-";

View file

@ -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
}

View file

@ -1,4 +1,4 @@
version "4.14.1"
version "4.15"
/*
DEMOLITIONIST Main Codebase

View file

@ -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<GetThingCount(); i++ )
{
int ednum = GetThingEdNum(i);
if ( ((ednum >= 3007) && (ednum <= 3014))
|| ((ednum >= 3100) && (ednum <= 3142)) )
SetThingEdNum(i,ednum+4204000);
}
break;
case 'F206766043C4D9BA2C36F76106F96279':
case 'FCF009C63BBA5F8CEE71ED5EC0B02CDA':
// ALL of Equinox
case '9705315427A2F951A538B23C39199236':
case '54E9953A3C1A88641E00AA353BAF46E9':

View file

@ -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' )

View file

@ -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)) )

View file

@ -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

View file

@ -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");

View file

@ -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<nlevels; i++ )
{
let li = LevelInfo.GetLevelInfo(i);
if ( !li.isValid() || !LevelInfo.MapExists(li.mapname)
|| (li.cluster != level.cluster)
|| FindLevelStats(li.mapname) )
continue;
// wadfusion hack for E1M4B and E1M8B
bool wf_hack = false;
if ( (li.mapname == "E1M4") && LevelInfo.MapExists("E1M4B") )
{
let cv = CVar.GetCVar('wf_blackroomswap_e1m4b');
if ( cv && cv.GetBool() )
{
wf_hack = true;
li = LevelInfo.FindLevelInfo("E1M4B");
}
}
else if ( (li.mapname == "E1M8") && LevelInfo.MapExists("E1M8B") )
{
let cv = CVar.GetCVar('wf_blackroomswap_e1m8b');
if ( cv && cv.GetBool() )
{
wf_hack = true;
li = LevelInfo.FindLevelInfo("E1M8B");
}
}
int theircluster = ClusterRemap(li.cluster,li.levelnum);
if ( theircluster != ourcluster )
continue;
let ls = new('LevelStat');
// we can automatically assume that all levels from the same cluster will have this flag as well
ls.hub = !!(level.clusterflags&level.CLUSTER_HUB);
ls.visited = false;
ls.cluster = wf_hack?1:li.cluster; // force cluster to be 1 for Romero's extra maps
ls.cluster = theircluster;
ls.levelname = li.LookupLevelName();
// level name may contain trailing whitespace due to DEHACKED nonsense, so strip it
ls.levelname.StripRight();
@ -614,7 +635,7 @@ Class SWWMLoreLibrary : SWWMStaticThinker
else if ( text ~== "SWWM_LORETXT_MARISA" )
text = "SWWM_LORETXT_MARISA2"; // post-invasion update
}
if ( (gameinfo.gametype&GAME_Raven) || SWWMUtility.IsEviternity() || SWWMUtility.IsEviternityTwo() || (mlog && (mlog.year >= 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

View file

@ -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()
{

View file

@ -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<Actor> 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';