diff options
author | Simon Howard | 2014-10-08 00:52:03 -0400 |
---|---|---|
committer | Simon Howard | 2014-10-08 00:52:03 -0400 |
commit | 63e1c884911f9e3382936f84a388e941b29343e6 (patch) | |
tree | 17440b07a0dea8d65b89c2ce2a828c908b18bb57 /src | |
parent | 16eb65970747541102beb0b8343b158a740c75d0 (diff) | |
download | chocolate-doom-63e1c884911f9e3382936f84a388e941b29343e6.tar.gz chocolate-doom-63e1c884911f9e3382936f84a388e941b29343e6.tar.bz2 chocolate-doom-63e1c884911f9e3382936f84a388e941b29343e6.zip |
Allow -warp to episodes beyond episode 4.
Vanilla Doom's -warp parameter allows warping to episodes beyond E4.
This didn't work in Chocolate Doom because of some changes made
to the G_InitNew code before the source release. Actual decompilation
of that function in Vanilla Doom shows that the episode/map sanity
checking is not present:
http://pastie.org/8140437
There is at least one known WAD (2002ado) that has a map on E5M1
that is playable in Vanilla, and this stops that map from being
possible to play. Comment out that code because it obviously
doesn't deserve to be there.
This fixes #426. Thanks plumsinus.
Diffstat (limited to 'src')
-rw-r--r-- | src/doom/g_game.c | 143 |
1 files changed, 73 insertions, 70 deletions
diff --git a/src/doom/g_game.c b/src/doom/g_game.c index 6aab081d..0b9dda08 100644 --- a/src/doom/g_game.c +++ b/src/doom/g_game.c @@ -1683,27 +1683,32 @@ void G_InitNew ( skill_t skill, int episode, - int map ) -{ + int map ) +{ char *skytexturename; - int i; - - if (paused) - { - paused = false; - S_ResumeSound (); - } - + int i; - if (skill > sk_nightmare) - skill = sk_nightmare; + if (paused) + { + paused = false; + S_ResumeSound (); + } + /* + // Note: This commented-out block of code was added at some point + // between the DOS version(s) and the Doom source release. It isn't + // found in disassemblies of the DOS version and causes IDCLEV and + // the -warp command line parameter to behave differently. + // This is left here for posterity. + + if (skill > sk_nightmare) + skill = sk_nightmare; // This was quite messy with SPECIAL and commented parts. // Supposedly hacks to make the latest edition work. // It might not work properly. if (episode < 1) - episode = 1; + episode = 1; if ( gamemode == retail ) { @@ -1712,62 +1717,60 @@ G_InitNew } else if ( gamemode == shareware ) { - if (episode > 1) + if (episode > 1) episode = 1; // only start episode 1 on shareware - } + } else { if (episode > 3) episode = 3; } - + */ - - if (map < 1) + if (map < 1) map = 1; - + if ( (map > 9) && ( gamemode != commercial) ) - map = 9; - - M_ClearRandom (); - + map = 9; + + M_ClearRandom (); + if (skill == sk_nightmare || respawnparm ) respawnmonsters = true; else respawnmonsters = false; - + if (fastparm || (skill == sk_nightmare && gameskill != sk_nightmare) ) - { - for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++) - states[i].tics >>= 1; - mobjinfo[MT_BRUISERSHOT].speed = 20*FRACUNIT; - mobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT; - mobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT; - } - else if (skill != sk_nightmare && gameskill == sk_nightmare) - { - for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++) - states[i].tics <<= 1; - mobjinfo[MT_BRUISERSHOT].speed = 15*FRACUNIT; - mobjinfo[MT_HEADSHOT].speed = 10*FRACUNIT; - mobjinfo[MT_TROOPSHOT].speed = 10*FRACUNIT; - } - - - // force players to be initialized upon first level load - for (i=0 ; i<MAXPLAYERS ; i++) - players[i].playerstate = PST_REBORN; - - usergame = true; // will be set false if a demo - paused = false; - demoplayback = false; - automapactive = false; - viewactive = true; - gameepisode = episode; - gamemap = map; - gameskill = skill; - + { + for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++) + states[i].tics >>= 1; + mobjinfo[MT_BRUISERSHOT].speed = 20*FRACUNIT; + mobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT; + mobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT; + } + else if (skill != sk_nightmare && gameskill == sk_nightmare) + { + for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++) + states[i].tics <<= 1; + mobjinfo[MT_BRUISERSHOT].speed = 15*FRACUNIT; + mobjinfo[MT_HEADSHOT].speed = 10*FRACUNIT; + mobjinfo[MT_TROOPSHOT].speed = 10*FRACUNIT; + } + + // force players to be initialized upon first level load + for (i=0 ; i<MAXPLAYERS ; i++) + players[i].playerstate = PST_REBORN; + + usergame = true; // will be set false if a demo + paused = false; + demoplayback = false; + automapactive = false; + viewactive = true; + gameepisode = episode; + gamemap = map; + gameskill = skill; + viewactive = true; // Set the sky to use. @@ -1791,32 +1794,32 @@ G_InitNew } else { - switch (gameepisode) - { + switch (gameepisode) + { default: - case 1: - skytexturename = "SKY1"; - break; - case 2: - skytexturename = "SKY2"; - break; - case 3: - skytexturename = "SKY3"; - break; + case 1: + skytexturename = "SKY1"; + break; + case 2: + skytexturename = "SKY2"; + break; + case 3: + skytexturename = "SKY3"; + break; case 4: // Special Edition sky skytexturename = "SKY4"; break; - } + } } skytexturename = DEH_String(skytexturename); skytexture = R_TextureNumForName(skytexturename); - - G_DoLoadLevel (); -} - + + G_DoLoadLevel (); +} + // // DEMO RECORDING |