swwmgz_m/zscript/compat/swwm_compat.zsc

568 lines
21 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 ( 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;
// 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 ( 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 (dv2.9)
case 'CC53CFFCB30E873669AA2F09DA0D3566':
// 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);
SetThingArgument(nt,0,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 ( 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 ( int 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
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 ( 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':
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;
}
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;
}
// [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);
}
}
}
}