shithub: choc

Download patch

ref: 04b25f44db67713759350981f533ebd2d5445edc
parent: 7a3748fd12f76b2c84d087f4ccec7c281cb830cb
author: James Haley <haleyjd@hotmail.com>
date: Sun Oct 3 17:05:42 EDT 2010

Eliminated the rest of the notion of an episode, added proper sky
setting, and other misc code in g_game. Also started *trying* to add new
savegame code in g_game, but this is a just about a lost cause without
any portable filepath handling support from the engine.

Subversion-branch: /branches/strife-branch
Subversion-revision: 2152

--- a/src/strife/am_map.c
+++ b/src/strife/am_map.c
@@ -552,11 +552,11 @@
 
     if (!stopped) AM_Stop();
     stopped = false;
-    if (lastlevel != gamemap || lastepisode != gameepisode)
+    if (lastlevel != gamemap  /*|| lastepisode != gameepisode*/)
     {
 	AM_LevelInit();
 	lastlevel = gamemap;
-	lastepisode = gameepisode;
+	//lastepisode = gameepisode;
     }
     AM_initVariables();
     AM_loadPics();
--- a/src/strife/d_main.c
+++ b/src/strife/d_main.c
@@ -1824,7 +1824,7 @@
     if (gameaction != ga_loadgame )
     {
 	if (autostart || netgame)
-	    G_InitNew (startskill, startepisode, startmap);
+	    G_InitNew (startskill, startmap);
 	else
 	    D_StartTitle ();                // start up intro loop
     }
--- a/src/strife/g_game.c
+++ b/src/strife/g_game.c
@@ -53,6 +53,7 @@
 #include "hu_stuff.h"
 #include "st_stuff.h"
 #include "am_map.h"
+#include "m_misc.h" // STRIFE
 
 // Needs access to LFB.
 #include "v_video.h"
@@ -82,7 +83,7 @@
 void	G_ReadDemoTiccmd (ticcmd_t* cmd); 
 void	G_WriteDemoTiccmd (ticcmd_t* cmd); 
 void	G_PlayerReborn (int player); 
-void	G_InitNew (skill_t skill, int episode, int map); 
+void	G_InitNew (skill_t skill, int map); 
  
 void	G_DoReborn (int playernum); 
  
@@ -103,7 +104,7 @@
 gamestate_t     gamestate; 
 skill_t         gameskill; 
 boolean		respawnmonsters;
-int             gameepisode; 
+//int             gameepisode; 
 int             gamemap;
 
 // haleyjd 08/24/10: [STRIFE] New variables
@@ -784,7 +785,7 @@
 	memset (players[i].frags,0,sizeof(players[i].frags)); 
     } 
 		 
-    P_SetupLevel (gameepisode, gamemap, 0, gameskill);    
+    P_SetupLevel (gamemap, 0, gameskill);    
     displayplayer = consoleplayer;		// view the guy you are playing    
     gameaction = ga_nothing; 
     Z_CheckHeap ();
@@ -1170,6 +1171,8 @@
 // Called at the start.
 // Called by the game initialization functions.
 //
+// [STRIFE] No such function.
+/*
 void G_InitPlayer (int player) 
 { 
     player_t*	p; 
@@ -1181,13 +1184,16 @@
     G_PlayerReborn (player); 
 	 
 } 
+*/
  
- 
 
 //
 // G_PlayerFinishLevel
 // Can when a player completes a level.
 //
+// [STRIFE] No such function. The equivalent to this logic was moved into
+// G_DoCompleted.
+/*
 void G_PlayerFinishLevel (int player) 
 { 
     player_t*	p; 
@@ -1202,7 +1208,7 @@
     p->damagecount = 0;			// no palette changes 
     p->bonuscount = 0; 
 } 
- 
+*/
 
 //
 // G_PlayerReborn
@@ -1209,6 +1215,9 @@
 // Called after a player dies 
 // almost everything is cleared and initialized 
 //
+// [STRIFE] Small changes for allegiance, inventory, health auto-use, and
+// mission objective.
+//
 void G_PlayerReborn (int player) 
 { 
     player_t*   p; 
@@ -1216,38 +1225,38 @@
     int         frags[MAXPLAYERS]; 
     int         killcount;
     int         allegiance;
-	 
+
     killcount = players[player].killcount;
     allegiance = players[player].allegiance;
 
     memcpy(frags,players[player].frags,sizeof(frags));
-	 
+
     p = &players[player]; 
     memset (p, 0, sizeof(*p)); 
 
     memcpy(p->frags, frags, sizeof(p->frags));
 
-    p->usedown              = true;                 // don't do anything immediately
-    p->attackdown           = true;
-    p->inventorydown        = true;                 // villsa [STRIFE]
-    p->playerstate          = PST_LIVE;       
-    p->health               = deh_initial_health;   // Use dehacked value
-    p->readyweapon          = wp_fist;              // villsa [STRIFE] default to fists
-    p->pendingweapon        = wp_fist;              // villsa [STRIFE] default to fists
-    p->weaponowned[wp_fist] = true;                 // villsa [STRIFE] default to fists
-    p->cheats               |= CF_AUTOHEALTH;       // villsa [STRIFE]
-    p->killcount            = killcount;
-    p->allegiance           = allegiance;           // villsa [STRIFE]
-    p->centerview           = true;                 // villsa [STRIFE]
-	 
+    p->usedown               = true;                 // don't do anything immediately
+    p->attackdown            = true;
+    p->inventorydown         = true;                 // villsa [STRIFE]
+    p->playerstate           = PST_LIVE;       
+    p->health                = deh_initial_health;   // Use dehacked value
+    p->readyweapon           = wp_fist;              // villsa [STRIFE] default to fists
+    p->pendingweapon         = wp_fist;              // villsa [STRIFE] default to fists
+    p->weaponowned[wp_fist]  = true;                 // villsa [STRIFE] default to fists
+    p->cheats               |= CF_AUTOHEALTH;        // villsa [STRIFE]
+    p->killcount             = killcount;
+    p->allegiance            = allegiance;           // villsa [STRIFE]
+    p->centerview            = true;                 // villsa [STRIFE]
+
     for(i = 0; i < NUMAMMO; i++) 
-	p->maxammo[i] = maxammo[i]; 
+        p->maxammo[i] = maxammo[i]; 
 
     for(i = 0; i < 32; i++)
         p->inventory[i].type = NUMMOBJTYPES;
 
     // villsa [STRIFE]
-    strncpy(mission_objective, "Find help", OBJECTIVE_LEN);
+    strncpy(mission_objective, DEH_String("Find help"), OBJECTIVE_LEN);
 }
 
 //
@@ -1256,6 +1265,8 @@
 // at the given mapthing_t spot  
 // because something is occupying it 
 //
+// [STRIFE] Changed to eliminate body queue and an odd error message was added.
+//
 void P_SpawnPlayer (mapthing_t* mthing); 
  
 boolean
@@ -1263,46 +1274,54 @@
 ( int		playernum,
   mapthing_t*	mthing ) 
 { 
-    fixed_t		x;
-    fixed_t		y; 
-    subsector_t*	ss; 
-    unsigned		an; 
-    mobj_t*		mo; 
-    int			i;
-	
+    fixed_t             x;
+    fixed_t             y; 
+    subsector_t*        ss; 
+    unsigned            an; 
+    mobj_t*             mo; 
+    int                 i;
+
     if (!players[playernum].mo)
     {
-	// first spawn of level, before corpses
-	for (i=0 ; i<playernum ; i++)
-	    if (players[i].mo->x == mthing->x << FRACBITS
-		&& players[i].mo->y == mthing->y << FRACBITS)
-		return false;	
-	return true;
+        // [STRIFE] weird error message added here:
+        if(leveltime > 0)
+            players[playernum].message = DEH_String("you didn't have a body!");
+
+        // first spawn of level, before corpses
+        for (i=0 ; i<playernum ; i++)
+            if (players[i].mo->x == mthing->x << FRACBITS
+                && players[i].mo->y == mthing->y << FRACBITS)
+                return false;	
+        return true;
     }
-		
+
     x = mthing->x << FRACBITS; 
     y = mthing->y << FRACBITS; 
-	 
+
     if (!P_CheckPosition (players[playernum].mo, x, y) ) 
-	return false; 
- 
-    // flush an old corpse if needed 
+        return false; 
+
+    // flush an old corpse if needed
+    // [STRIFE] player corpses remove themselves after a short time, so
+    // evidently this wasn't needed.
+    /*
     if (bodyqueslot >= BODYQUESIZE) 
-	P_RemoveMobj (bodyque[bodyqueslot%BODYQUESIZE]); 
+        P_RemoveMobj (bodyque[bodyqueslot%BODYQUESIZE]); 
     bodyque[bodyqueslot%BODYQUESIZE] = players[playernum].mo; 
     bodyqueslot++; 
-	
+    */
+
     // spawn a teleport fog 
     ss = R_PointInSubsector (x,y); 
     an = ( ANG45 * (((unsigned int) mthing->angle)/45) ) >> ANGLETOFINESHIFT; 
- 
+
     mo = P_SpawnMobj (x+20*finecosine[an], y+20*finesine[an] 
-		      , ss->sector->floorheight 
-		      , MT_TFOG); 
-	 
+                      , ss->sector->floorheight 
+                      , MT_TFOG); 
+
     if (players[consoleplayer].viewz != 1) 
-	S_StartSound (mo, sfx_telept);	// don't start sound on first frame 
- 
+        S_StartSound (mo, sfx_telept);	// don't start sound on first frame 
+
     return true; 
 } 
 
@@ -1312,6 +1331,8 @@
 // Spawns a player at one of the random death match spots 
 // called at level load and each death 
 //
+// [STRIFE] Verified unmodified
+//
 void G_DeathMatchSpawnPlayer (int playernum) 
 { 
     int             i,j; 
@@ -1337,50 +1358,67 @@
 } 
 
 //
-// G_DoReborn 
+// G_LoadPath
+//
+// haleyjd 10/03/10: [STRIFE] New function
+// Sets loadpath based on the map and "savepath2"
+//
+void G_LoadPath(int map)
+{
+    // STRIFE-TODO:
+    // sprintf(loadpath, "%s%d", savepath2, map)
+}
+
+//
+// G_DoReborn
 // 
 void G_DoReborn (int playernum) 
 { 
     int                             i; 
-	 
+
     if (!netgame)
     {
-	// reload the level from scratch
-	gameaction = ga_loadlevel;  
+        // reload the level from scratch
+        // STRIFE-TODO: HUB REBORN
+        // G_LoadPath(gamemap);
+        // gameaction = 3;
+        gameaction = ga_loadlevel;  // STRIFE-TODO: temporary
     }
     else 
     {
-	// respawn at the start
+        // respawn at the start
 
-	// first dissasociate the corpse 
-	players[playernum].mo->player = NULL;   
-		 
-	// spawn at random spot if in death match 
-	if (deathmatch) 
-	{ 
-	    G_DeathMatchSpawnPlayer (playernum); 
-	    return; 
-	} 
-		 
-	if (G_CheckSpot (playernum, &playerstarts[playernum]) ) 
-	{ 
-	    P_SpawnPlayer (&playerstarts[playernum]); 
-	    return; 
-	}
-	
-	// try to spawn at one of the other players spots 
-	for (i=0 ; i<MAXPLAYERS ; i++)
-	{
-	    if (G_CheckSpot (playernum, &playerstarts[i]) ) 
-	    { 
-		playerstarts[i].type = playernum+1;	// fake as other player 
-		P_SpawnPlayer (&playerstarts[i]); 
-		playerstarts[i].type = i+1;		// restore 
-		return; 
-	    }	    
-	    // he's going to be inside something.  Too bad.
-	}
-	P_SpawnPlayer (&playerstarts[playernum]); 
+        // first dissasociate the corpse 
+        // [STRIFE] Checks for NULL first
+        if(players[playernum].mo)
+            players[playernum].mo->player = NULL;
+
+        // spawn at random spot if in death match 
+        if (deathmatch) 
+        { 
+            G_DeathMatchSpawnPlayer (playernum); 
+            return; 
+        } 
+
+        if (G_CheckSpot (playernum, &playerstarts[playernum]) ) 
+        { 
+            P_SpawnPlayer (&playerstarts[playernum]); 
+            return; 
+        }
+
+        // try to spawn at one of the other players spots 
+        for (i=0 ; i<MAXPLAYERS ; i++)
+        {
+            if (G_CheckSpot (playernum, &playerstarts[i]) ) 
+            { 
+                playerstarts[i].type = playernum+1;     // fake as other player 
+                P_SpawnPlayer (&playerstarts[i]);
+                playerstarts[i].type = i+1;             // restore 
+                return; 
+            }
+            // he's going to be inside something.  Too bad.
+        }
+        P_SpawnPlayer (&playerstarts[playernum]); 
     } 
 } 
  
@@ -1428,6 +1466,21 @@
 }
 
 //
+// G_Exit2
+//
+// haleyjd 10/03/10: [STRIFE] New function.
+// No xrefs to this, doesn't seem to be used. Could have gotten inlined
+// somewhere but I haven't seen it.
+//
+void G_Exit2(int dest, angle_t angle)
+{
+    riftdest = dest;
+    gameaction = ga_completed;
+    riftangle = angle;
+    destmap = gamemap;
+}
+
+//
 // G_ExitLevel
 //
 // haleyjd 08/24/10: [STRIFE]:
@@ -1474,7 +1527,7 @@
 // G_DoCompleted
 //
 // haleyjd 08/23/10: [STRIFE]:
-// * Removed G_PlayerFinishLevel call for now... STRIFE-TODO
+// * Removed G_PlayerFinishLevel and just sets some powerup states.
 // * Removed Chex, as not relevant to Strife.
 // * Removed DOOM level transfer logic 
 // * Removed intermission code.
@@ -1482,10 +1535,25 @@
 //
 void G_DoCompleted (void) 
 {
-    // STRIFE-TODO: save automap powerup state (possibly inlined from G_PlayerFinishLevel);
-    // set stonecold to 0
+    int i;
 
+    // deal with powerup states
+    for(i = 0; i < MAXPLAYERS; i++)
+    {
+        if(playeringame[i])
+        {
+            // STRIFE-TODO: not quite sure why it does this
+            if(destmap < 40)
+                players[i].powers[pw_allmap] = players[i].mapstate[destmap];
+
+            // Shadowarmor doesn't persist between maps in netgames
+            if(netgame)
+                players[i].powers[pw_invisibility] = 0;
+        }
+    }
+
     stonecold = false;  // villsa [STRIFE]
+
     if (automapactive) 
         AM_Stop (); 
 
@@ -1596,8 +1664,8 @@
         G_RiftPlayer();
 
         // STRIFE-TODO:
-        // G_DoSaveGame(...);
-        // M_SaveMisObj();
+        // G_DoSaveGame(savepath2);
+        // M_SaveMisObj(savepath2, v6);
     }
 
     gameaction = ga_nothing; 
@@ -1604,8 +1672,57 @@
     viewactive = true; 
 } 
 
+//
+// G_DoWorldDone2
+//
+// haleyjd 10/03/10: [STRIFE] New function. No xrefs; unused.
+//
+void G_DoWorldDone2(void)
+{
+    gamestate = GS_LEVEL;
+    gameaction = ga_nothing;
+    viewactive = true;
+}
 
+//
+// G_ReadCurrent
+//
+// haleyjd 10/03/10: [STRIFE] New function.
+// Reads the "CURRENT" file from the given path and then sets it to
+// gamemap.
+//
+void G_ReadCurrent(const char *path)
+{
+    // STRIFE-TODO: Can't go live. Too much bullshit.
+    // Without any kind of framework to work with file paths and directories
+    // this stuff is nearly hopeless, and I am already getting fed up with the
+    // idea of trying to make this work on 200 different platforms when there
+    // is nothing I can find in this thing to facilitate portable programming!
+#if 0
+    char temppath[108]; // WARNING: not big enough for modern file paths!
 
+    // STRIFE-TODO: SYSTEM SPECIFIC DIRECTORY SEPARATORS!!!!!!!!!!!!!!!!
+    // What takes precedence? SeHackEd or Linux support?
+    // Where is the godforsaken global that will tell me what character to
+    // use in the first place?????
+    DEH_snprintf(temppath, "%s\\current", path);
+    
+    // STRIFE-TODO: MOVE TO P_SAVEG.C ???? NO SAVEBUFFER OR SAVE_P HERE!
+    // STRIFE-TODO: Read int from file with an appropriate routine
+    if(M_ReadFile(temppath, &savebuffer) <= 0)
+        gameaction = ga_newgame;
+    else
+    {
+        save_p = savebuffer;
+        gamemap = *(int *)savebuffer;
+        gameaction = 3;
+        Z_Free(savebuffer);
+    }
+#endif
+
+    G_LoadPath(gamemap);
+}
+
 //
 // G_InitFromSavegame
 // Can be called by the startup code or the menu task. 
@@ -1622,7 +1739,7 @@
 } 
  
 // haleyjd 09/28/10: [STRIFE] VERSIONSIZE == 8
-#define VERSIONSIZE		8 
+#define VERSIONSIZE             8
 
 
 void G_DoLoadGame (void) 
@@ -1629,8 +1746,11 @@
 { 
     int savedleveltime;
 
-    gameaction = ga_nothing; 
+    gameaction = ga_nothing;
 
+    // STRIFE-TODO: If the file does not exist OR cannot be read in its entirety, 
+    // G_DoLoadLevel is called.
+
     save_stream = fopen(savename, "rb");
 
     if (save_stream == NULL)
@@ -1649,7 +1769,12 @@
     savedleveltime = leveltime;
     
     // load a base level 
-    G_InitNew (gameskill, gameepisode, gamemap); 
+
+    // STRIFE-TODO: ????
+    // if(v4)
+         G_InitNew (gameskill, gamemap); 
+    // else
+    //   G_DoLoadLevel();
  
     leveltime = savedleveltime;
 
@@ -1670,9 +1795,49 @@
     // draw the pattern into the back screen
     R_FillBackScreen ();   
 } 
- 
 
 //
+// G_WriteSaveName
+//
+// haleyjd 10/03/10: [STRIFE] New function
+//
+// Writes the character name to the NAME file.
+//
+boolean G_WriteSaveName()
+{
+    // STRIFE-TODO: Yeah right. This is gonna happen really soon...
+#if 0
+    const char *dirstr;
+
+    dword_86280 = eax0;
+
+    // STRIFE-TODO: yeah good luck making THIS work on Linux.
+    if(M_CheckParm(DEH_String("-cdrom")))
+    {
+        sprintf(savepath2, "c:\\strife.cd\\strfsav%d.ssg\\", 6);
+        v5 = dword_86280;
+        dirstr = "c:\\strife.cd\\strfsav%d.ssg\\";
+    }
+    else
+    {
+        sprintf(savepath2, "strfsav%d.ssg\\", 6);
+        v5 = dword_86280;
+        dirstr = "strfsav%d.ssg\\";
+    }
+
+    sprintf(savepath, dirstr, v5);
+
+    *character_name = 0;
+    strcpy(character_name, edx);
+
+    sprintf(hellifiknow, "%sname", savepath2);
+
+    return M_WriteFile(hellifiknow, character_name, 32);
+#endif
+    return false;
+}
+
+//
 // G_SaveGame
 // Called by the menu task.
 // Description is a 24 byte text string 
@@ -1695,6 +1860,8 @@
     temp_savegame_file = P_TempSaveGameFile();
     savegame_file = P_SaveGameFile(savegameslot);
 
+    // STRIFE-TODO: save the "current" file?
+
     // Open the savegame file for writing.  We write to a temporary file
     // and then rename it at the end if it was successfully written.
     // This prevents an existing savegame from being overwritten by 
@@ -1767,7 +1934,11 @@
     gameaction = ga_newgame; 
 } 
 
-
+//
+// G_DoNewGame
+//
+// [STRIFE] Code added to turn off the stonecold effect.
+//
 void G_DoNewGame (void) 
 {
     demoplayback = false; 
@@ -1780,7 +1951,7 @@
     stonecold = false;      // villsa [STRIFE]
     nomonsters = false;
     consoleplayer = 0;
-    G_InitNew (d_skill, d_episode, d_map); 
+    G_InitNew (d_skill, d_map);
     gameaction = ga_nothing; 
 } 
 
@@ -1792,98 +1963,60 @@
 //
 // haleyjd 08/24/10: [STRIFE]:
 // * Added riftdest initialization
+// * Removed episode parameter
 //
 void
 G_InitNew
-( skill_t	skill,
-  int		episode,
-  int		map ) 
+( skill_t       skill,
+  int           map ) 
 { 
     char *skytexturename;
     int             i; 
-	 
+
     if (paused) 
     { 
-	paused = false; 
-	S_ResumeSound (); 
+        paused = false; 
+        S_ResumeSound (); 
     } 
-	
 
+
     if (skill > sk_nightmare) 
-	skill = sk_nightmare;
+        skill = sk_nightmare;
 
+    // [STRIFE] Removed episode nonsense and gamemap clipping
 
-    // 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; 
+    M_ClearRandom (); 
 
-    if ( gamemode == retail )
-    {
-      if (episode > 4)
-	episode = 4;
-    }
-    else if ( gamemode == shareware )
-    {
-      if (episode > 1) 
-	   episode = 1;	// only start episode 1 on shareware
-    }  
+    if (skill == sk_nightmare || respawnparm )
+        respawnmonsters = true;
     else
+        respawnmonsters = false;
+
+    // STRIFE-TODO: Strife skill level mobjinfo/states tweaking
+    // BUG: None of this code runs properly when loading save games, so
+    // basically it's impossible to play any skill level properly unless
+    // you never quit and reload from the command line.
+#if 0
+    if(!skill && gameskill)
     {
-      if (episode > 3)
-	episode = 3;
+        // Setting to Baby skill... make things easier.
     }
-    
+#endif
 
-  
-    if (map < 1) 
-	map = 1;
-    
-    if ( (map > 9)
-	 && ( gamemode != commercial) )
-      map = 9; 
-		 
-    M_ClearRandom (); 
-	 
-    if (skill == sk_nightmare || respawnparm )
-	respawnmonsters = true;
-    else
-	respawnmonsters = false;
-
-    // STRIFE-TODO: (broken) Strife skill level mobjinfo/states tweaking
-    /*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         
+    // force players to be initialized upon first level load
     for (i=0 ; i<MAXPLAYERS ; i++) 
-	players[i].playerstate = PST_REBORN; 
- 
+        players[i].playerstate = PST_REBORN; 
+
     usergame = true;                // will be set false if a demo 
     paused = false; 
     demoplayback = false; 
     automapactive = false; 
     viewactive = true; 
-    gameepisode = episode; 
+    //gameepisode = episode; 
     gamemap = map; 
     gameskill = skill; 
     riftdest = 0; // haleyjd 08/24/10: [STRIFE] init riftdest to zero on new game
- 
+
     viewactive = true;
 
     // Set the sky to use.
@@ -1896,36 +2029,11 @@
     // restore from a saved game.  This was fixed before the Doom
     // source release, but this IS the way Vanilla DOS Doom behaves.
 
-    // STRIFE-TODO: Strife skies (of which there are but two)
-    // villsa [STRIFE] setting all skies to SKY03 as a placeholder
-    if (gamemode == commercial)
-    {
-        if (gamemap < 12)
-            skytexturename = "SKY03";
-        else if (gamemap < 21)
-            skytexturename = "SKY03";
-        else
-            skytexturename = "SKY03";
-    }
+    // [STRIFE] Strife skies (of which there are but two)
+    if(gamemap >= 9 && gamemap < 32)
+        skytexturename = "skymnt01";
     else
-    {
-        switch (gameepisode) 
-        { 
-          default:
-          case 1: 
-            skytexturename = "SKY03"; 
-            break; 
-          case 2: 
-            skytexturename = "SKY03"; 
-            break; 
-          case 3: 
-            skytexturename = "SKY03"; 
-            break; 
-          case 4:        // Special Edition sky
-            skytexturename = "SKY03";
-            break;
-        } 
-    }
+        skytexturename = "skymnt02";
 
     skytexturename = DEH_String(skytexturename);
 
@@ -1933,7 +2041,7 @@
 
     // STRIFE-TODO:
     // G_LoadPath(gamemap)
-    G_DoLoadLevel (); 
+    G_DoLoadLevel ();
 } 
  
 
@@ -1942,32 +2050,26 @@
 // 
 #define DEMOMARKER		0x80
 
-
+//
+// G_ReadDemoTiccmd
+//
+// [STRIFE] Modified for Strife ticcmd_t
+//
 void G_ReadDemoTiccmd (ticcmd_t* cmd) 
 { 
     if (*demo_p == DEMOMARKER) 
     {
-	// end of demo data stream 
-	G_CheckDemoStatus (); 
-	return; 
-    } 
+        // end of demo data stream 
+        G_CheckDemoStatus (); 
+        return; 
+    }
     cmd->forwardmove = ((signed char)*demo_p++); 
     cmd->sidemove = ((signed char)*demo_p++); 
-
-    // If this is a longtics demo, read back in higher resolution
-
-    if (longtics)
-    {
-        cmd->angleturn = *demo_p++;
-        cmd->angleturn |= (*demo_p++) << 8;
-    }
-    else
-    {
-        cmd->angleturn = ((unsigned char) *demo_p++)<<8; 
-    }
-
+    cmd->angleturn = ((unsigned char) *demo_p++)<<8; 
     cmd->buttons = (unsigned char)*demo_p++; 
-} 
+    cmd->buttons2 = (unsigned char)*demo_p++; // [STRIFE]
+    cmd->inventory = (int)*demo_p++;          // [STRIFE]
+}
 
 // Increase the size of the demo buffer to allow unlimited demos
 
@@ -2001,31 +2103,26 @@
     demoend = demobuffer + new_length;
 }
 
+//
+// G_WriteDemoTiccmd
+//
+// [STRIFE] Modified for Strife ticcmd_t.
+//
 void G_WriteDemoTiccmd (ticcmd_t* cmd) 
 { 
     byte *demo_start;
 
     if (gamekeydown[key_demo_quit])           // press q to end demo recording 
-	G_CheckDemoStatus (); 
+        G_CheckDemoStatus (); 
 
     demo_start = demo_p;
 
     *demo_p++ = cmd->forwardmove; 
     *demo_p++ = cmd->sidemove; 
-
-    // If this is a longtics demo, record in higher resolution
- 
-    if (longtics)
-    {
-        *demo_p++ = (cmd->angleturn & 0xff);
-        *demo_p++ = (cmd->angleturn >> 8) & 0xff;
-    }
-    else
-    {
-        *demo_p++ = cmd->angleturn >> 8; 
-    }
-
+    *demo_p++ = cmd->angleturn >> 8; 
     *demo_p++ = cmd->buttons; 
+    *demo_p++ = cmd->buttons2;                 // [STRIFE]
+    *demo_p++ = (byte)(cmd->inventory & 0xff); // [STRIFE]
 
     // reset demo pointer back
     demo_p = demo_start;
@@ -2046,7 +2143,7 @@
             IncreaseDemoBuffer();
         }
     } 
-	
+
     G_ReadDemoTiccmd (cmd);         // make SURE it is exactly the same 
 } 
  
@@ -2055,11 +2152,13 @@
 //
 // G_RecordDemo 
 // 
+// [STRIFE] Verified unmodified
+//
 void G_RecordDemo (char* name) 
 { 
     int             i; 
-    int				maxsize;
-	
+    int             maxsize;
+
     usergame = false; 
     strcpy (demoname, name); 
     strcat (demoname, ".lmp"); 
@@ -2075,10 +2174,10 @@
 
     i = M_CheckParm ("-maxdemo");
     if (i && i<myargc-1)
-	maxsize = atoi(myargv[i+1])*1024;
+        maxsize = atoi(myargv[i+1])*1024;
     demobuffer = Z_Malloc (maxsize,PU_STATIC,NULL); 
     demoend = demobuffer + maxsize;
-	
+
     demorecording = true; 
 } 
  
@@ -2092,28 +2191,23 @@
     //
     // Record a high resolution "Doom 1.91" demo.
     //
-
+    
+    // STRIFE-TODO: if somebody makes a "Strife Plus", we could add this.
+    /*
     longtics = M_CheckParm("-longtics") != 0;
+    */
+    longtics = false;
 
     // If not recording a longtics demo, record in low res
-
     lowres_turn = !longtics;
-    
+
     demo_p = demobuffer;
-	
+
     // Save the right version code for this demo
- 
-    if (longtics)
-    {
-        *demo_p++ = DOOM_191_VERSION;
-    }
-    else
-    {
-        *demo_p++ = STRIFE_VERSION;
-    }
+    *demo_p++ = STRIFE_VERSION;
 
     *demo_p++ = gameskill; 
-    *demo_p++ = gameepisode; 
+    //*demo_p++ = gameepisode; [STRIFE] Doesn't have episodes.
     *demo_p++ = gamemap; 
     *demo_p++ = deathmatch; 
     *demo_p++ = respawnparm;
@@ -2120,9 +2214,14 @@
     *demo_p++ = fastparm;
     *demo_p++ = nomonsters;
     *demo_p++ = consoleplayer;
-	 
+ 
     for (i=0 ; i<MAXPLAYERS ; i++) 
-	*demo_p++ = playeringame[i]; 		 
+        *demo_p++ = playeringame[i]; 
+
+    // STRIFE-TODO: TEMPORARY: fill out the rest of playeringame until
+    // MAXPLAYERS == 8
+    for (; i < 8; i++)
+        *demo_p++ = 0;
 } 
  
 
@@ -2139,49 +2238,40 @@
 } 
 
 // Generate a string describing a demo version
-
+// [STRIFE] Modified to handle the one and only Strife demo version.
 static char *DemoVersionDescription(int version)
 {
     static char resultbuf[16];
+ 
+    // [STRIFE] All versions of Strife 1.1 and later use 101 as their 
+    // internal version number. Brilliant, huh? So we can't discern much
+    // here.
 
     switch (version)
     {
-        case 104:
-            return "v1.4";
-        case 105:
-            return "v1.5";
-        case 106:
-            return "v1.6/v1.666";
-        case 107:
-            return "v1.7/v1.7a";
-        case 108:
-            return "v1.8";
-        case 109:
-            return "v1.9";
-        default:
-            break;
+    case 100: 
+        return "v1.0"; // v1.0 would be the ancient demo version
+    default:
+        break;
     }
 
-    // Unknown version.  Perhaps this is a pre-v1.4 IWAD?  If the version
-    // byte is in the range 0-4 then it can be a v1.0-v1.2 demo.
+    // Unknown version. Who knows?
+    sprintf(resultbuf, "%i.%i (unknown)", version / 100, version % 100);
 
-    if (version >= 0 && version <= 4)
-    {
-        return "v1.0/v1.1/v1.2";
-    }
-    else
-    {
-        sprintf(resultbuf, "%i.%i (unknown)", version / 100, version % 100);
-        return resultbuf;
-    }
+    return resultbuf;
 }
 
+//
+// G_DoPlayDemo
+//
+// [STRIFE] Modified for Strife demo format.
+//
 void G_DoPlayDemo (void) 
 { 
     skill_t skill; 
-    int             i, episode, map; 
-    int demoversion;
-	 
+    int     i, map; 
+    int     demoversion;
+
     gameaction = ga_nothing; 
     demobuffer = demo_p = W_CacheLumpName (defdemoname, PU_STATIC); 
 
@@ -2191,11 +2281,13 @@
     {
         longtics = false;
     }
+    /* STRIFE-TODO: Not until/unless somebody makes a Strife-Plus :P
     else if (demoversion == DOOM_191_VERSION)
     {
         // demo recorded with cph's modified "v1.91" doom exe
         longtics = true;
     }
+    */
     else
     {
         char *message = "Demo is from a different game version!\n"
@@ -2202,7 +2294,7 @@
                         "(read %i, should be %i)\n"
                         "\n"
                         "*** You may need to upgrade your version "
-                            "of Doom to v1.9. ***\n"
+                            "of Strife to v1.1 or later. ***\n"
                         "    See: http://doomworld.com/files/patches.shtml\n"
                         "    This appears to be %s.";
 
@@ -2211,7 +2303,7 @@
     }
     
     skill = *demo_p++; 
-    episode = *demo_p++; 
+    //episode = *demo_p++; [STRIFE] No episodes
     map = *demo_p++; 
     deathmatch = *demo_p++;
     respawnparm = *demo_p++;
@@ -2218,10 +2310,15 @@
     fastparm = *demo_p++;
     nomonsters = *demo_p++;
     consoleplayer = *demo_p++;
-	
+
     for (i=0 ; i<MAXPLAYERS ; i++) 
-	playeringame[i] = *demo_p++; 
+        playeringame[i] = *demo_p++; 
 
+    // STRIFE-TODO: read out the rest of playeringame until
+    // MAXPLAYERS is bumped to 8
+    for(; i < 8; i++)
+        ++demo_p;
+
     //!
     // @category demo
     // 
@@ -2230,13 +2327,13 @@
 
     if (playeringame[1] || M_CheckParm("-netdemo") > 0) 
     { 
-	netgame = true; 
-	netdemo = true; 
+        netgame = true; 
+        netdemo = true; 
     }
 
     // don't spend a lot of time in loadlevel 
     precache = false;
-    G_InitNew (skill, episode, map); 
+    G_InitNew(skill, map); 
     precache = true; 
     starttime = I_GetTime (); 
 
@@ -2247,6 +2344,8 @@
 //
 // G_TimeDemo 
 //
+// [STRIFE] Verified unmodified
+//
 void G_TimeDemo (char* name) 
 {
     //!
@@ -2274,17 +2373,17 @@
 = Returns true if a new demo loop action will take place 
 =================== 
 */ 
- 
+// [STRIFE] Verified unmodified
 boolean G_CheckDemoStatus (void) 
 { 
     int             endtime; 
-	 
+
     if (timingdemo) 
     { 
         float fps;
         int realtics;
 
-	endtime = I_GetTime (); 
+        endtime = I_GetTime (); 
         realtics = endtime - starttime;
         fps = ((float) gametic * TICRATE) / realtics;
 
@@ -2292,22 +2391,22 @@
         timingdemo = false;
         demoplayback = false;
 
-	I_Error ("timed %i gametics in %i realtics (%f fps)",
+        I_Error ("timed %i gametics in %i realtics (%f fps)",
                  gametic, realtics, fps);
     } 
-	 
+
     if (demoplayback) 
     { 
         W_ReleaseLumpName(defdemoname);
-	demoplayback = false; 
-	netdemo = false;
-	netgame = false;
-	deathmatch = false;
-	playeringame[1] = playeringame[2] = playeringame[3] = 0;
-	respawnparm = false;
-	fastparm = false;
-	nomonsters = false;
-	consoleplayer = 0;
+        demoplayback = false; 
+        netdemo = false;
+        netgame = false;
+        deathmatch = false;
+        playeringame[1] = playeringame[2] = playeringame[3] = 0;
+        respawnparm = false;
+        fastparm = false;
+        nomonsters = false;
+        consoleplayer = 0;
         
         if (singledemo) 
             I_Quit (); 
@@ -2314,20 +2413,20 @@
         else 
             D_AdvanceDemo (); 
 
-	return true; 
+        return true; 
     } 
  
     if (demorecording) 
     { 
-	*demo_p++ = DEMOMARKER; 
-	M_WriteFile (demoname, demobuffer, demo_p - demobuffer); 
-	Z_Free (demobuffer); 
-	demorecording = false; 
-	I_Error ("Demo %s recorded",demoname); 
+        *demo_p++ = DEMOMARKER; 
+        M_WriteFile (demoname, demobuffer, demo_p - demobuffer); 
+        Z_Free (demobuffer); 
+        demorecording = false; 
+        I_Error ("Demo %s recorded",demoname); 
     } 
-	 
+
     return false; 
 } 
  
- 
+  
  
--- a/src/strife/g_game.h
+++ b/src/strife/g_game.h
@@ -38,7 +38,8 @@
 //
 void G_DeathMatchSpawnPlayer (int playernum);
 
-void G_InitNew (skill_t skill, int episode, int map);
+// [STRIFE] Removed episode parameter
+void G_InitNew (skill_t skill, int map);
 
 // Can be called by the startup code or M_Responder.
 // A normal game starts at map 1,
--- a/src/strife/p_setup.c
+++ b/src/strife/p_setup.c
@@ -751,8 +751,7 @@
 //
 void
 P_SetupLevel
-( int		episode,
-  int		map,
+( int		map,
   int		playermask,
   skill_t	skill)
 {
@@ -789,28 +788,17 @@
 
     // UNUSED W_Profile ();
     P_InitThinkers ();
-	   
-    // find map name
-    if ( gamemode == commercial)
-    {
-	if (map<10)
-	    DEH_snprintf(lumpname, 9, "map0%i", map);
-	else
-	    DEH_snprintf(lumpname, 9, "map%i", map);
-    }
+
+    // [STRIFE] Removed ExMy map support
+    if (map<10)
+        DEH_snprintf(lumpname, 9, "map0%i", map);
     else
-    {
-	lumpname[0] = 'E';
-	lumpname[1] = '0' + episode;
-	lumpname[2] = 'M';
-	lumpname[3] = '0' + map;
-	lumpname[4] = 0;
-    }
+        DEH_snprintf(lumpname, 9, "map%i", map);
 
     lumpnum = W_GetNumForName (lumpname);
-	
+
     leveltime = 0;
-	
+
     // note: most of this ordering is important	
     P_LoadBlockMap (lumpnum+ML_BLOCKMAP);
     P_LoadVertexes (lumpnum+ML_VERTEXES);
--- a/src/strife/p_setup.h
+++ b/src/strife/p_setup.h
@@ -32,10 +32,10 @@
 
 
 // NOT called by W_Ticker. Fixme.
+// [STRIFE] Removed episode parameter
 void
 P_SetupLevel
-( int		episode,
-  int		map,
+( int		map,
   int		playermask,
   skill_t	skill);