345 lines
12 KiB
Text
345 lines
12 KiB
Text
// level compatibility scripts
|
|
// sometimes shit breaks, or certain changes are needed for balance or to mesh
|
|
// with the mod's mechanics better, this is here for that
|
|
|
|
Class SWWMLevelCompatibility : LevelPostProcessor
|
|
{
|
|
private void EquinoxBossBrainHandle( uint lineno, int sectortag )
|
|
{
|
|
// don't spawn boss brains until it's time to crush them
|
|
for ( int i=0; i<GetThingCount(); i++ )
|
|
{
|
|
if ( GetThingEdNum(i) != 88 ) continue;
|
|
SetThingEdNum(i,9001);
|
|
SetThingID(i,666);
|
|
}
|
|
// change the crusher line
|
|
SetLineSpecial(lineno,ACS_Execute,-Int('EQUINOX_BRAINCRUSH'),0,sectortag);
|
|
}
|
|
|
|
protected void Apply( Name checksum, String mapname )
|
|
{
|
|
int ncellsa = 0, ncellsb = 0;
|
|
int nbackpack = 0;
|
|
bool wolfmap31 = false;
|
|
switch ( checksum )
|
|
{
|
|
case 'none':
|
|
return;
|
|
// okuplok
|
|
case 'F7F353146676920238935A8D0D1B6E8E':
|
|
// add 7 more backpacks on top of existing one, for a full embiggening
|
|
// (players will need it)
|
|
for ( int i=0; i<7; i++ ) AddThing(8,(11808,-2016,0));
|
|
break;
|
|
// holy hell revealed
|
|
case '83569A062B5261C6BB4A034BA8245D24':
|
|
// remove boss brain and re-spawn it when end is reached, prevents cheesing the map with the ynykron
|
|
SetThingEdNum(50183,9001);
|
|
SetThingID(50183,666);
|
|
SetLineSpecial(21964,ACS_Execute,-Int('HHR_BRAINWALL'));
|
|
break;
|
|
// NRFTL MAP08
|
|
case '7EB864A03948C3F918F9223B2D1F8911':
|
|
// prevent easy cheesing of the exit teleporter
|
|
AddSectorTag(155,24);
|
|
OffsetSectorPlane(155,1,-80.);
|
|
SetLineSpecial(652,ACS_Execute,-Int('NERVE_EXITOPEN'));
|
|
// remove the mp cyberdemon entirely as it disrupts the vanilla boss handler
|
|
SetThingEdNum(202,0);
|
|
break;
|
|
// INTER-EPISODE PROGRESSION STUFF
|
|
// Doom E1M8
|
|
case '97079958C7E89C1908890730B8B9FEB7':
|
|
// 1.1-1.2
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
level.nextmap = "E2M1";
|
|
// no damage in exit sector
|
|
SetSectorSpecial(13,0);
|
|
// teleport sequence
|
|
for ( int i=299; i<=306; i++ )
|
|
SetLineSpecial(i,ACS_Execute,-Int('E1M8_KNOCKOUT'));
|
|
// remove enemies
|
|
for ( int i=106; i<=112; i++ )
|
|
SetThingEdNum(i,0);
|
|
for ( int i=118; i<=125; i++ )
|
|
SetThingEdNum(i,0);
|
|
break;
|
|
case '058FB092EA1B70DA1E3CBF501C4A91A1':
|
|
// 1.666-1.9
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
level.nextmap = "E2M1";
|
|
// no damage in exit sector
|
|
SetSectorSpecial(66,0);
|
|
// teleport sequence
|
|
for ( int i=299; i<=306; i++ )
|
|
SetLineSpecial(i,ACS_Execute,-Int('E1M8_KNOCKOUT'));
|
|
// remove enemies
|
|
for ( int i=106; i<=112; i++ )
|
|
SetThingEdNum(i,0);
|
|
for ( int i=118; i<=125; i++ )
|
|
SetThingEdNum(i,0);
|
|
break;
|
|
// Doom E2M8
|
|
case 'EFFE91DF41AD41F6973C06F0AD67DDB9':
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
level.nextmap = "E3M1";
|
|
break;
|
|
// Doom E3M8
|
|
case 'EF128313112110ED6C1549AF96AF26C9':
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
if ( LevelInfo.MapExists("E4M1") ) level.nextmap = "E4M1";
|
|
else if ( LevelInfo.MapExists("MAP01") ) level.nextmap = "MAP01";
|
|
break;
|
|
// Doom E4M8
|
|
case '2DC939E508AB8EB68AF79D5B60568711':
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
if ( LevelInfo.MapExists("E5M1") ) level.nextmap = "E5M1";
|
|
else if ( LevelInfo.MapExists("MAP01") ) level.nextmap = "MAP01";
|
|
break;
|
|
// SIGIL E5M8
|
|
case '6EAD80DA1F30B4B3546FA294EEF9F87C':
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
if ( LevelInfo.MapExists("MAP01") ) level.nextmap = "MAP01";
|
|
break;
|
|
// Heretic E1M8
|
|
case '27639D04F8090D57A47D354992435893':
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
level.nextmap = "E2M1";
|
|
break;
|
|
// Heretic E2M8
|
|
case '5158C22A0F30CE5E558FD2A05D67685E':
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
level.nextmap = "E3M1";
|
|
break;
|
|
// Heretic E3M8
|
|
case '4719C2C71EF28F52310B889DD5A9778B':
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
if ( LevelInfo.MapExists("E4M1") ) level.nextmap = "E4M1";
|
|
break;
|
|
// Heretic E4M8
|
|
case '30D1480A6D4F3A3153739D4CCF659C4E':
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
level.nextmap = "E5M1";
|
|
break;
|
|
// Micro Slaughter Community Project MAP13 (beta) / MAP14 (v1)
|
|
case 'E45AA3BE411845AA0DEE7CA5DAAB65FE':
|
|
case 'CDF12AAE960E6BD11D98E1F0A1782B7B':
|
|
// reduce OBSCENELY EXCESSIVE number of cell packs in voodoo doll conveyors (400), which will cause immense lag when replaced with mod ammo
|
|
// unsurprisingly, this actually makes the map go from completely unplayable to having perfectly smooth performance (gee, I wonder why)
|
|
for ( int i=0; i<GetThingCount(); i++ )
|
|
{
|
|
if ( GetThingEdNum(i) != 17 ) continue;
|
|
Vector3 pos = GetThingPos(i);
|
|
if ( pos.y != 480. ) continue;
|
|
if ( pos.x == -5472. )
|
|
{
|
|
ncellsa++;
|
|
if ( ncellsa > 20 ) SetThingEdNum(i,0);
|
|
}
|
|
else if ( pos.x == -5344. )
|
|
{
|
|
ncellsb++;
|
|
if ( ncellsb > 20 ) SetThingEdNum(i,0);
|
|
}
|
|
}
|
|
break;
|
|
// EQUINOX: various boss brain setups that could be cheesed with the Ynykron or silver bullet
|
|
// Equinox MAP04
|
|
case 'E66BCCFAD7AC40EFB21E2A19131E1522':
|
|
EquinoxBossBrainHandle(2406,27);
|
|
// raise floor by 10 units so its untextured lower lines don't glitch out at eye level
|
|
OffsetSectorPlane(248,0,10.);
|
|
break;
|
|
// Equinox MAP07
|
|
case 'A0B6B83DC8BD50FC84170572840DE585':
|
|
EquinoxBossBrainHandle(3423,31);
|
|
break;
|
|
// Equinox MAP10
|
|
case 'F91E3FE225F10EECBE21486E1BB14834':
|
|
EquinoxBossBrainHandle(2813,29);
|
|
break;
|
|
// Equinox MAP13
|
|
case '3805A661D5C4523AFF7BF86991071043':
|
|
EquinoxBossBrainHandle(4106,60);
|
|
break;
|
|
// DOOM VACATION: this wad is weird
|
|
// Doom Vacation MAP01 (1.4)
|
|
case 'F286BABF0D152259CD6B996E8920CA70':
|
|
// Doom Vacation MAP01 (1.5)
|
|
case 'A52BD2038CF814101AAB7D9C78F9ACE2':
|
|
// two girls shouldn't be headpattable, as they have use lines around them
|
|
SetThingArgument(314,0,1);
|
|
SetThingArgument(315,0,1);
|
|
SetThingID(314,666);
|
|
SetThingID(315,667);
|
|
// unfortunately the line special wrangling has to be done one tic after map load
|
|
// because fuck absolutely everything about how ACS works
|
|
break;
|
|
// Doom 2 MAP07
|
|
case '291F24417FB3DD411339AE82EF9B3597':
|
|
// remove excess backpacks (there's 10 of them for fuck's sake)
|
|
for ( int i=0; i<GetThingCount(); i++ )
|
|
{
|
|
if ( GetThingEdNum(i) != 8 ) continue;
|
|
if ( nbackpack ) SetThingEdNum(i,0);
|
|
nbackpack++;
|
|
}
|
|
break;
|
|
// Doom 2 MAP31
|
|
case '0BB515B79E0A6C42C4846C4E6F5F1D73':
|
|
case '3FF94E27423F91C1585B3396F0C03459':
|
|
case 'F2235342F1591B59154022E1DAF3EB2F':
|
|
case '3FF94E27423F91C1585B3396F0C03459':
|
|
wolfmap31 = true;
|
|
// Doom 2 MAP32
|
|
case '34A8DB0B341A32267CB461D8C219DF0A':
|
|
case 'AA4CA3FC891D13821ACCABD836E29EB5':
|
|
case '9AA7780B46EC4471F630572798943D71':
|
|
// sound sequence handling
|
|
for ( int i=0; i<level.Lines.Size(); i++ )
|
|
{
|
|
Line l = level.Lines[i];
|
|
if ( !l.backsector ) continue;
|
|
TextureID t;
|
|
bool wolfdoor = false;
|
|
for ( int k=0; k<3; k++ )
|
|
{
|
|
t = l.sidedef[0].GetTexture(k);
|
|
if ( t.IsValid() && ((TexMan.GetName(t) == "ZDOORF1") || (TexMan.GetName(t) == "ZDOORB1") || (TexMan.GetName(t) == "ZELDOOR")) )
|
|
{
|
|
wolfdoor = true;
|
|
break;
|
|
}
|
|
}
|
|
if ( !wolfdoor && l.sidedef[1] ) for ( int k=0; k<3; k++ )
|
|
{
|
|
t = l.sidedef[1].GetTexture(k);
|
|
if ( t.IsValid() && ((TexMan.GetName(t) == "ZDOORF1") || (TexMan.GetName(t) == "ZDOORB1") || (TexMan.GetName(t) == "ZELDOOR")) )
|
|
{
|
|
wolfdoor = true;
|
|
break;
|
|
}
|
|
}
|
|
if ( wolfdoor )
|
|
l.backsector.SeqName = 'DoorWolf3D';
|
|
else if ( (l.special == Door_Open) || (l.special == Door_Raise) )
|
|
l.backsector.SeqName = 'PushwallWolf3D';
|
|
}
|
|
// enemy replacements
|
|
for ( int i=0; i<GetThingCount(); i++ )
|
|
{
|
|
int ednum = GetThingEdNum(i);
|
|
if ( (ednum == 84) || (ednum == 3004) )
|
|
SetThingEdNum(i,wolfmap31?4206990:4206992); // guard / ss
|
|
else if ( ednum == 3002 )
|
|
SetThingEdNum(i,4206993); // dog
|
|
else if ( ednum == 16 )
|
|
SetThingEdNum(i,4206991); // hans grosse
|
|
}
|
|
break;
|
|
// Doom 2 Redux MAP20
|
|
case 'C9FFFD855FCF9BD6BC3ABCCA5DC2240A':
|
|
// move boss brain so the player telefrags it (lets the mod know this is a death exit)
|
|
SetThingXY(497,3296,-96);
|
|
AddThing(2035,(3360,-96,0),315); // put a barrel in the hole that was left
|
|
break;
|
|
// Doom 2 Redux MAP31
|
|
case '4A8EAAB2B29CB438ED6EE972D3EEE951':
|
|
// contribute to Aximal's illusion by putting a single WolfSS facing away from the player start
|
|
// we can re-use thing 0, which is a shotgunner corpse
|
|
SetThingEdNum(0,4206992);
|
|
SetThingAngle(0,0);
|
|
break;
|
|
// Kinsie's Test Map
|
|
case '0EADB2F82732A968B8513E4DC6138439':
|
|
case 'D70250F93C6B6072DA39D9672B37F236':
|
|
case '959A613006CC3AA912C4A22908B7566A':
|
|
// add collectibles
|
|
for ( int i=0; i<12; i++ )
|
|
AddThing(4206900+i,(1472+64*i,640,0));
|
|
// add some chance boxes
|
|
for ( int i=0; i<3; i++ )
|
|
AddThing(4206920,(3616,1824-64*i,0),180);
|
|
break;
|
|
}
|
|
switch ( checksum )
|
|
{
|
|
// ALL of Equinox
|
|
case '9705315427A2F951A538B23C39199236':
|
|
case '54E9953A3C1A88641E00AA353BAF46E9':
|
|
case 'DD3986E184829DAB73160F4C122155F9':
|
|
case 'B3E6CAE9983EA1DC4D9544DA26118569':
|
|
case '3E4DFC55EAE85A7FE02DD21ED33AABCA':
|
|
case 'ECCB69F1BBF91D8F67D8583EA2546863':
|
|
case 'E66BCCFAD7AC40EFB21E2A19131E1522':
|
|
case 'A0B6B83DC8BD50FC84170572840DE585':
|
|
case '9BA1ACB72D878AFA3CB22B810D6CCD9A':
|
|
case 'A26749D9B9CD70ECED5C7B6BAB6D859E':
|
|
case '3805A661D5C4523AFF7BF86991071043':
|
|
case 'F91E3FE225F10EECBE21486E1BB14834':
|
|
case '838BA30EB0B003C070414093BFDFA72A':
|
|
// replace certain animated flats with duplicates
|
|
// this avoids unintended TERRAIN defs from applying to them
|
|
level.ReplaceTextures("SLIME01","EQNXSL01",0);
|
|
level.ReplaceTextures("SLIME02","EQNXSL02",0);
|
|
level.ReplaceTextures("SLIME03","EQNXSL03",0);
|
|
level.ReplaceTextures("SLIME04","EQNXSL04",0);
|
|
level.ReplaceTextures("SLIME09","EQNXSL09",0);
|
|
level.ReplaceTextures("SLIME10","EQNXSL10",0);
|
|
level.ReplaceTextures("SLIME11","EQNXSL11",0);
|
|
level.ReplaceTextures("SLIME12","EQNXSL12",0);
|
|
level.ReplaceTextures("BLOOD1","EQNXBLD1",0);
|
|
level.ReplaceTextures("BLOOD2","EQNXBLD2",0);
|
|
level.ReplaceTextures("BLOOD3","EQNXBLD3",0);
|
|
level.ReplaceTextures("RROCK05","EQNXRR05",0);
|
|
level.ReplaceTextures("RROCK06","EQNXRR06",0);
|
|
level.ReplaceTextures("RROCK07","EQNXRR07",0);
|
|
level.ReplaceTextures("RROCK08","EQNXRR08",0);
|
|
break;
|
|
// ALL of Doom Vacation
|
|
case 'D07842872226058F93D0957EA46ED782':
|
|
case 'F286BABF0D152259CD6B996E8920CA70':
|
|
case '7E2707328B6BCF0ACDC2E80049E21167':
|
|
case '8AA3E9B8E816E72A04368404402DD8E3':
|
|
case '8B28736D01492F3701CCD736C97EF125':
|
|
case '10D3C12050518E806801B12057437403':
|
|
case '48A7FC1AF2D1CCBFE7C6EFB4EEE97A50':
|
|
case '73B317A0DA2C75BD903E895A27EEEDB9':
|
|
case '62158F76FC56B62007C1F167A7921304':
|
|
case '0D33878E4C8164A792AECCDA56F08D60':
|
|
case 'A52BD2038CF814101AAB7D9C78F9ACE2':
|
|
case 'F6413AFAEB73B3848A82F70C2A01E47D':
|
|
case 'F8CBDC96A7E08CAFC5D7C0E711551E40':
|
|
case '3E821CC90C38B7D71DDEB0324D3900CC':
|
|
case '05D0AA06742B3C7DCD79E5F659267656':
|
|
case '8F6710E3570C2056FDCA591EF89B31A9':
|
|
case '382E99BBFA9301110630CD5F8F8056DA':
|
|
case '480F6AD2D2E266DA745FD8FA75EC327D':
|
|
case '968D97F5952E55DB2464274A8EE5F529':
|
|
case '5669E396BEDDEA6D90EF5AF5EC892811':
|
|
// get rid of these dumb skulltag ctf actors
|
|
for ( int i=0; i<GetThingCount(); i++ )
|
|
{
|
|
int ednum = GetThingEdNum(i);
|
|
if ( (ednum == 5130) || (ednum == 5131)
|
|
|| (ednum == 5080) || (ednum == 5081) )
|
|
SetThingEdNum(i,0);
|
|
}
|
|
// get rid of moan switches
|
|
level.ReplaceTextures("SW1ZIM","-noflat-",0);
|
|
level.ReplaceTextures("SW1TEK","-noflat-",0);
|
|
break;
|
|
}
|
|
// [Hexen] force Mystic Ambit Incants to spawn outside coop
|
|
if ( gameinfo.gametype&GAME_Hexen )
|
|
{
|
|
for ( int i=0; i<GetThingCount(); i++ )
|
|
{
|
|
if ( GetThingEdNum(i) != 10120 ) continue;
|
|
uint flg = GetThingFlags(i);
|
|
SetThingFlags(i,flg|MTF_SINGLE);
|
|
}
|
|
}
|
|
}
|
|
}
|