637 lines
23 KiB
Text
637 lines
23 KiB
Text
// level compatibility scripts
|
|
// sometimes stuff 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 ( uint 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);
|
|
// paint it black
|
|
for ( int i=1; i<4; i++ )
|
|
level.Sectors[13].SetSpecialColor(i,"Black");
|
|
// 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);
|
|
// paint it black
|
|
for ( int i=1; i<4; i++ )
|
|
level.Sectors[66].SetSpecialColor(i,"Black");
|
|
// 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 'A1F105211112747EE50BA520462A471E':
|
|
{
|
|
// E1M8B
|
|
level.nextsecretmap = level.nextmap; // so the handler can detect this
|
|
level.nextmap = "E2M1";
|
|
// no damage in exit sector
|
|
SetSectorSpecial(538,0);
|
|
// paint it black
|
|
for ( int i=1; i<4; i++ )
|
|
level.Sectors[538].SetSpecialColor(i,"Black");
|
|
// teleport sequence
|
|
static const int exitlines[] =
|
|
{
|
|
3048, 3055, 3073,
|
|
3074, 3075, 3076,
|
|
3077, 3078, 3079,
|
|
3080, 3081, 3082
|
|
};
|
|
for ( int i=0; i<12; i++ )
|
|
SetLineSpecial(exitlines[i],ACS_Execute,-Int('E1M8_KNOCKOUT'));
|
|
// remove enemies
|
|
for ( int i=183; i<=190; 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("E6M1") ) level.nextmap = "E6M1";
|
|
else if ( LevelInfo.MapExists("MAP01") ) level.nextmap = "MAP01";
|
|
break;
|
|
// SIGIL II E6M8
|
|
case '5BA3D00F6B64F6268E11C6851D47ECBF':
|
|
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 ( uint 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;
|
|
// Ultimate Doom 2 MAP20 (dv3.1)
|
|
case '96C5914A9B4A2383DE6BBE363940DF2F':
|
|
{
|
|
// add a "sector enter" action for reaching the exit room
|
|
// and make it trigger a dialogue
|
|
uint nt = AddThing(9998,(-9360,12768,12));
|
|
SetThingFlags(nt,MODES_ALL|MTF_STANDSTILL); // trigger once
|
|
SetThingSpecial(nt,Thing_Activate);
|
|
int tiddy = level.FindUniqueTid(9999);
|
|
SetThingArgument(nt,0,tiddy);
|
|
nt = AddThing(4206930,(0,0,0));
|
|
SetThingID(nt,tiddy);
|
|
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 ACS is just that goddamn weird
|
|
break;
|
|
// Doom 2 MAP07
|
|
case '291F24417FB3DD411339AE82EF9B3597':
|
|
// remove excess backpacks (there's 10 of them for crying out loud)
|
|
for ( uint i=0; i<GetThingCount(); i++ )
|
|
{
|
|
if ( GetThingEdNum(i) != 8 ) continue;
|
|
if ( nbackpack ) SetThingEdNum(i,0);
|
|
nbackpack++;
|
|
}
|
|
// no cheesing of the exit
|
|
AddSectorTag(3,669);
|
|
OffsetSectorPlane(3,0,-72.);
|
|
for ( uint i=149; i<=153; i++ )
|
|
{
|
|
SetLineFlags(i,Line.ML_CHECKSWITCHRANGE);
|
|
SetWallTexture(i,1,2,"BRICK4");
|
|
}
|
|
level.ExecuteSpecial(ACS_Execute,null,null,false,-Int('DIMPLE_EXITOPEN'));
|
|
// mark the DM-exclusive bfg room as a secret
|
|
SetSectorSpecial(1,0);
|
|
SetSectorSpecial(23,1024);
|
|
SetWallTexture(168,1,2,"BRICK4"); // fix gap
|
|
// remove the deathmatch exit
|
|
ClearLineSpecial(174);
|
|
SetWallTexture(174,0,1,"BRONZE3");
|
|
level.Lines[174].sidedef[0].SetTextureYOffset(1,0);
|
|
//
|
|
// ABANDON ALL HOPE YE WHO ENTER HERE
|
|
//
|
|
// we're going to recycle the exit sign linedefs to
|
|
// commit some serious crimes here, this will be fun
|
|
// (in ccw order from bottom left)
|
|
// vertexes of exit sign: 151, 152, 153, 154
|
|
// linedefs of exit sign: 184, 185, 186, 187
|
|
// vertexes of northeast pillar: 23, 0, 24, 8
|
|
// linedefs of northeast pillar: 22, 23, 24, 21
|
|
// displace vertices of exit sign inside pillar
|
|
SetVertex(151,-112,-48);
|
|
SetVertex(152,-80,-48);
|
|
SetVertex(153,-80,-16);
|
|
SetVertex(154,-112,-16);
|
|
// move pillar references
|
|
SetLineVertexes(22,151,152);
|
|
SetLineVertexes(23,152,153);
|
|
SetLineVertexes(24,153,154);
|
|
SetLineVertexes(21,154,151);
|
|
// move exit sign references
|
|
SetLineVertexes(184,23,0);
|
|
SetLineVertexes(185,0,24);
|
|
SetLineVertexes(186,24,8);
|
|
SetLineVertexes(187,8,23);
|
|
// set pillar sector refs
|
|
SetLineSectorRef(22,0,24);
|
|
SetLineSectorRef(23,0,24);
|
|
SetLineSectorRef(24,0,24);
|
|
SetLineSectorRef(21,0,24);
|
|
// set exit sign sector refs
|
|
SetLineSectorRef(184,0,0);
|
|
SetLineSectorRef(185,0,10);
|
|
SetLineSectorRef(186,0,10);
|
|
SetLineSectorRef(187,0,0);
|
|
// change the textures
|
|
SetWallTexture(184,0,0,"BROWN1");
|
|
SetWallTexture(185,0,0,"BROWN1");
|
|
SetWallTexture(186,0,0,"BROWN1");
|
|
SetWallTexture(187,0,0,"BROWN1");
|
|
SetWallTexture(184,0,2,"BROWN1");
|
|
SetWallTexture(185,0,2,"BROWN1");
|
|
SetWallTexture(186,0,2,"BROWN1");
|
|
SetWallTexture(187,0,2,"BROWN1");
|
|
level.Lines[184].sidedef[0].SetTextureXScale(0,8.);
|
|
level.Lines[185].sidedef[0].SetTextureXScale(0,2.);
|
|
level.Lines[186].sidedef[0].SetTextureXScale(0,8.);
|
|
level.Lines[187].sidedef[0].SetTextureXScale(0,2.);
|
|
level.Lines[184].sidedef[0].SetTextureXScale(2,8.);
|
|
level.Lines[185].sidedef[0].SetTextureXScale(2,2.);
|
|
level.Lines[186].sidedef[0].SetTextureXScale(2,8.);
|
|
level.Lines[187].sidedef[0].SetTextureXScale(2,2.);
|
|
level.Lines[184].sidedef[0].SetTextureXOffset(0,0);
|
|
level.Lines[185].sidedef[0].SetTextureXOffset(0,0);
|
|
level.Lines[186].sidedef[0].SetTextureXOffset(0,0);
|
|
level.Lines[187].sidedef[0].SetTextureXOffset(0,0);
|
|
level.Lines[184].sidedef[0].SetTextureYOffset(0,24);
|
|
level.Lines[185].sidedef[0].SetTextureYOffset(0,24);
|
|
level.Lines[186].sidedef[0].SetTextureYOffset(0,24);
|
|
level.Lines[187].sidedef[0].SetTextureYOffset(0,24);
|
|
level.Lines[184].sidedef[0].SetTextureXOffset(2,0);
|
|
level.Lines[185].sidedef[0].SetTextureXOffset(2,0);
|
|
level.Lines[186].sidedef[0].SetTextureXOffset(2,0);
|
|
level.Lines[187].sidedef[0].SetTextureXOffset(2,0);
|
|
level.Lines[184].sidedef[0].SetTextureYOffset(2,24);
|
|
level.Lines[185].sidedef[0].SetTextureYOffset(2,24);
|
|
level.Lines[186].sidedef[0].SetTextureYOffset(2,24);
|
|
level.Lines[187].sidedef[0].SetTextureYOffset(2,24);
|
|
SetWallTexture(22,0,1,"BROWN144");
|
|
SetWallTexture(23,0,1,"SW1DIRT");
|
|
SetWallTexture(24,0,1,"BROWN144");
|
|
SetWallTexture(21,0,1,"BROWN144");
|
|
level.Lines[22].sidedef[0].SetTextureXScale(1,.5);
|
|
level.Lines[23].sidedef[0].SetTextureXScale(1,.5);
|
|
level.Lines[24].sidedef[0].SetTextureXScale(1,.5);
|
|
level.Lines[21].sidedef[0].SetTextureXScale(1,.5);
|
|
level.Lines[22].sidedef[0].SetTextureXOffset(1,96);
|
|
level.Lines[23].sidedef[0].SetTextureXOffset(1,16);
|
|
level.Lines[24].sidedef[0].SetTextureXOffset(1,32);
|
|
level.Lines[21].sidedef[0].SetTextureXOffset(1,64);
|
|
level.Lines[22].sidedef[0].SetTextureYOffset(1,4);
|
|
level.Lines[23].sidedef[0].SetTextureYOffset(1,4);
|
|
level.Lines[24].sidedef[0].SetTextureYOffset(1,4);
|
|
level.Lines[21].sidedef[0].SetTextureYOffset(1,4);
|
|
// make the pillar openable with use
|
|
OffsetSectorPlane(24,0,24+64);
|
|
OffsetSectorPlane(24,1,8);
|
|
SetLineSpecial(184,Floor_MoveToValue,0,8,40,0);
|
|
SetLineSpecial(185,Floor_MoveToValue,0,8,40,0);
|
|
SetLineSpecial(186,Floor_MoveToValue,0,8,40,0);
|
|
SetLineSpecial(187,Floor_MoveToValue,0,8,40,0);
|
|
SetLineActivation(184,SPAC_Use);
|
|
SetLineActivation(185,SPAC_Use);
|
|
SetLineActivation(186,SPAC_Use);
|
|
SetLineActivation(187,SPAC_Use);
|
|
SetLineFlags(184,Line.ML_SECRET);
|
|
SetLineFlags(185,Line.ML_SECRET);
|
|
SetLineFlags(186,Line.ML_SECRET);
|
|
SetLineFlags(187,Line.ML_SECRET);
|
|
SetLineFlags(22,Line.ML_DONTDRAW);
|
|
SetLineFlags(23,Line.ML_DONTDRAW);
|
|
SetLineFlags(24,Line.ML_DONTDRAW);
|
|
SetLineFlags(21,Line.ML_DONTDRAW);
|
|
SetLineActivation(23,SPAC_Use);
|
|
SetLineSpecial(23,Door_Open,668,16);
|
|
AddSectorTag(25,668);
|
|
// hide the secret sector lines
|
|
for ( uint i=164; i<=175; i++ )
|
|
{
|
|
if ( i == 168 ) continue;
|
|
SetLineFlags(i,Line.ML_DONTDRAW);
|
|
}
|
|
//
|
|
// OK, THE CRIME TIME IS OVER
|
|
//
|
|
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
|
|
foreach ( l:level.Lines )
|
|
{
|
|
if ( !l.backsector ) continue;
|
|
TextureID t;
|
|
bool wolfdoor = false;
|
|
for ( int i=0; i<3; i++ )
|
|
{
|
|
t = l.sidedef[0].GetTexture(i);
|
|
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 i=0; i<3; i++ )
|
|
{
|
|
t = l.sidedef[1].GetTexture(i);
|
|
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 ( uint 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;
|
|
// Hexen MAP06
|
|
case '1B6DF1FD51FDC3D882009D287B5A28C6':
|
|
case '65EFFD49449AD3FD32A6EB347C6D923B':
|
|
// replace an Icon of the Defender with a Chancebox
|
|
SetThingEdNum(193,4206920);
|
|
SetThingSkills(193,SKILLS_ALL);
|
|
SetThingFlags(193,MTF_SINGLE|MTF_COOPERATIVE);
|
|
// replace a Mystic Ambit Incant with a Chancebox
|
|
SetThingEdNum(377,4206920);
|
|
SetThingSkills(193,SKILLS_ALL);
|
|
SetThingFlags(377,MTF_SINGLE|MTF_COOPERATIVE);
|
|
SetThingAngle(377,90); // should face north
|
|
break;
|
|
case 'A3D86F121B41320BFD1EB747D9133EF2':
|
|
// replace an Icon of the Defender with a Chancebox
|
|
SetThingEdNum(193,4206921);
|
|
SetThingSkills(193,SKILLS_ALL);
|
|
SetThingFlags(193,MTF_SINGLE|MTF_COOPERATIVE);
|
|
// this version doesn't have a Mystic Ambit Incant placed
|
|
AddThing(4206921,(-32,-3072,-456),90,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
break;
|
|
// Hexen MAP11
|
|
case 'F8DFDCBAA677F83E2CD2409F5C00505F':
|
|
case 'CC90EAF7131A1CA59F8322735C92899C':
|
|
case 'B2A1B321E56494081085E51931EB3158':
|
|
// replace Mystic Urns with Chanceboxes
|
|
SetThingEdNum(62,4206920);
|
|
SetThingEdNum(63,4206920);
|
|
SetThingEdNum(64,4206920);
|
|
SetThingSkills(62,SKILLS_ALL);
|
|
SetThingSkills(63,SKILLS_ALL);
|
|
SetThingSkills(64,SKILLS_ALL);
|
|
SetThingFlags(62,MTF_SINGLE|MTF_COOPERATIVE);
|
|
SetThingFlags(63,MTF_SINGLE|MTF_COOPERATIVE);
|
|
SetThingFlags(64,MTF_SINGLE|MTF_COOPERATIVE);
|
|
SetThingAngle(62,0);
|
|
SetThingAngle(63,270);
|
|
SetThingAngle(64,180);
|
|
break;
|
|
// Hexen MAP31
|
|
case '4A4436544EBFA930AE3C4C8C2409FD6E':
|
|
case 'D48508B92843539B4464235C2B355CC3':
|
|
case 'BF9DFE95D9351AA3A65666185BFC921C':
|
|
// place 2 Chanceboxes at the final room
|
|
AddThing(4206920,(416,-352,0),180,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
AddThing(4206920,(544,-352,0),0,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
break;
|
|
// Hexen MAP26
|
|
case '339B4B50B615BE6E1D8454F6C605A97C':
|
|
case 'BFDC70A9D445EA5B9010ABB133253D6F':
|
|
case '2CF971EECD6B790782DB44B0E917B5B2':
|
|
// place 2 Chanceboxes in the central square
|
|
AddThing(4206920,(-224,416,-128),270,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
AddThing(4206920,(-224,-672,-128),90,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
break;
|
|
// Hexen MAP39
|
|
case '2639C89B8B7052E2CE4CB9CFC63F4C53':
|
|
case 'EC5A1B294CC7FB822A6C913F811797C4':
|
|
case 'FEA83EE6BCFC899F06CBE394DFBE6707':
|
|
// replace Porkalator with a Chancebox
|
|
SetThingEdNum(179,4206920);
|
|
SetThingSkills(179,SKILLS_ALL);
|
|
SetThingFlags(179,MTF_SINGLE|MTF_COOPERATIVE);
|
|
SetThingAngle(179,270);
|
|
// add two more Chanceboxes near it
|
|
AddThing(4206920,(-32,2848,128),270,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
AddThing(4206920,(160,2848,128),270,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
break;
|
|
// Hexen MAP40
|
|
case '2A6C4235B942467D25FD50D5B313E67A':
|
|
case '1C5DE5A921DEE405E98E7E09D9829387':
|
|
case 'EFAFE59092DE5E613562ACF52B86C37F':
|
|
// place a final Chancebox behind the player start
|
|
AddThing(4206920,(2912,256,-112),180,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
break;
|
|
// Kinsie's Test Map
|
|
case 'E43C1797DFD9443D1B4C035327743588':
|
|
SetThingID(323,6666); // so this boss brain can have a healthbar
|
|
case '81033F4F11F652E9CA875CED06C7AF8C':
|
|
case '0D1CAD582F63A179BF8A5E47C12D10C6':
|
|
// add collectibles
|
|
for ( int i=0; i<13; i++ )
|
|
AddThing(4206900+i,(1472+64*i,640,0),0,SKILLS_ALL,MTF_SINGLE|MTF_COOPERATIVE);
|
|
break;
|
|
// Eviternity 2 MAP01
|
|
case '8EB38D5289C47BB68D64F2832EFA096D':
|
|
// special trigger for a bunch of dialogues
|
|
AddThing(4206931,(0,0,0));
|
|
break;
|
|
// Eviternity 2 MAP26
|
|
case '0E61C7B0E0118304B9AE74F63C11CAEC':
|
|
{
|
|
// add a "sector actor hits floor" action for going down into the hole™
|
|
// and make it trigger a dialogue
|
|
uint nt = AddThing(9999,(-576,1344,-352));
|
|
SetThingFlags(nt,MODES_ALL|MTF_STANDSTILL); // trigger once
|
|
SetThingSpecial(nt,Thing_Activate);
|
|
int tiddy = level.FindUniqueTid(9999);
|
|
SetThingArgument(nt,0,tiddy);
|
|
nt = AddThing(4206932,(0,0,0));
|
|
SetThingID(nt,tiddy);
|
|
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 ( uint 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;
|
|
}
|
|
// [Heretic] override mace spawner behavior to always guarantee
|
|
// one spawn per map
|
|
if ( gameinfo.gametype&GAME_Heretic )
|
|
{
|
|
Array<uint> Maces;
|
|
Maces.Clear();
|
|
for ( uint i=0; i<GetThingCount(); i++ )
|
|
{
|
|
if ( GetThingEdNum(i) != 2002 ) continue;
|
|
Maces.Push(i);
|
|
}
|
|
int chosen = Random[Replacements](0,Maces.Size()-1);
|
|
for ( int i=0; i<Maces.Size(); i++ )
|
|
{
|
|
if ( i == chosen ) SetThingEdNum(Maces[i],4206999);
|
|
else SetThingEdNum(Maces[i],0);
|
|
}
|
|
}
|
|
// [Hexen] force Mystic Ambit Incants to spawn outside coop
|
|
if ( gameinfo.gametype&GAME_Hexen )
|
|
{
|
|
for ( uint i=0; i<GetThingCount(); i++ )
|
|
{
|
|
if ( GetThingEdNum(i) != 10120 ) continue;
|
|
uint flg = GetThingFlags(i);
|
|
SetThingFlags(i,flg|MTF_SINGLE);
|
|
}
|
|
}
|
|
}
|
|
}
|