shithub: choc

Download patch

ref: 166e2bca936409c8ec78867bc0fc04eeba418e6e
parent: df05cd8e0e71b4e48e88f12c779484e1abac45c1
parent: eaf851e095ca15c11b26d2aa7c2589617939d2db
author: Simon Howard <fraggle@soulsphere.org>
date: Sat Jan 14 16:55:08 EST 2017

Merge remote-tracking branch 'origin/master' into sdl2-branch

--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,9 @@
+## HEAD
+
+### General
+  * A new parameter -savedir allows users to specify a directory from
+    which to load and save games. (thanks CapnClever)
+
 ## 2.3.0 (2016-12-29)
 
 ### General
--- a/man/INSTALL.template
+++ b/man/INSTALL.template
@@ -117,9 +117,9 @@
 single large file, using a command similar to the following:
 
 #if _WIN32
-   copy doom_se.1+doom_se.2+doom_se.3+doom_se.4+doom_se.5 doom_se.lha
+   copy doom_se.1+doom_se.2+doom_se.3+doom_se.4+doom_se.5 doom_se.lzh
 #else
-   cat doom_se.1 doom_se.2 doom_se.3 doom_se.4 doom_se.5 > doom_se.lha
+   cat doom_se.1 doom_se.2 doom_se.3 doom_se.4 doom_se.5 > doom_se.lzh
 #endif
 
 The resulting file is an LHA archive file, and it can be extracted
--- a/pkg/osx/GNUmakefile
+++ b/pkg/osx/GNUmakefile
@@ -17,7 +17,7 @@
 $(DMG) : tmp.dmg
 	rm -f $@
 	./dmgfix "$(realpath tmp.dmg)" "$(PACKAGE_STRING)" "$(PACKAGE_NAME).app"
-	hdiutil convert -format UDZO -o $@ tmp.dmg
+	hdiutil convert -format UDBZ -o $@ tmp.dmg
 	rm -f tmp.dmg
 
 tmp.dmg : $(STAGING_DIR)
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -1616,17 +1616,7 @@
     // we've finished loading Dehacked patches.
     D_SetGameDescription();
 
-#ifdef _WIN32
-    // In -cdrom mode, we write savegames to c:\doomdata as well as configs.
-    if (M_ParmExists("-cdrom"))
-    {
-        savegamedir = configdir;
-    }
-    else
-#endif
-    {
-        savegamedir = M_GetSaveGameDir(D_SaveGameIWADName(gamemission));
-    }
+    savegamedir = M_GetSaveGameDir(D_SaveGameIWADName(gamemission));
 
     // Check for -file in shareware
     if (modifiedgame && (gamevariant != freedoom))
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -121,6 +121,7 @@
 static int demosequence;
 static int pagetic;
 static char *pagename;
+static char *SavePathConfig;
 
 // CODE --------------------------------------------------------------------
 
@@ -166,7 +167,7 @@
     M_BindIntVariable("vanilla_savegame_limit", &vanilla_savegame_limit);
     M_BindIntVariable("vanilla_demo_limit",     &vanilla_demo_limit);
 
-    M_BindStringVariable("savedir", &SavePath);
+    M_BindStringVariable("savedir", &SavePathConfig);
 
     // Multiplayer chat macros
 
@@ -185,15 +186,31 @@
 {
     SavePath = M_GetSaveGameDir("hexen.wad");
 
-    // If we are not using a savegame path (probably because we are on
-    // Windows and not using a config dir), behave like Vanilla Hexen
-    // and use hexndata/:
-
     if (!strcmp(SavePath, ""))
     {
-        SavePath = malloc(10);
-	M_snprintf(SavePath, 10, "hexndata%c", DIR_SEPARATOR);
+        // only get hexen.cfg path if one is not already found
+
+        if (!strcmp(SavePathConfig, ""))
+        {
+            // If we are not using a savegame path (probably because we are on
+            // Windows and not using a config dir), behave like Vanilla Hexen
+            // and use hexndata/:
+
+            SavePath = malloc(10);
+            M_snprintf(SavePath, 10, "hexndata%c", DIR_SEPARATOR);
+        }
+        else
+        {
+            SavePath = M_StringDuplicate(SavePathConfig);
+        }
     }
+
+    // only set hexen.cfg path if using default handling
+
+    if (!M_ParmExists("-savedir") && !M_ParmExists("-cdrom"))
+    {
+        SavePathConfig = SavePath;
+    }
 }
 
 // The Mac version of the Hexen IWAD is different to the "normal" DOS
@@ -376,14 +393,14 @@
         M_SetConfigDir(NULL);
     }
 
-    D_SetDefaultSavePath();
     M_SetConfigFilenames("hexen.cfg", PROGRAM_PREFIX "hexen.cfg");
     M_LoadDefaults();
 
+    D_SetDefaultSavePath();
+
     I_AtExit(M_SaveDefaults, false);
 
-
-    // Now that the savedir is loaded from .CFG, make sure it exists
+    // Now that the savedir is loaded, make sure it exists
     CreateSavePath();
 
     ST_Message("Z_Init: Init zone memory allocation daemon.\n");
--- a/src/m_config.c
+++ b/src/m_config.c
@@ -2184,11 +2184,41 @@
 {
     char *savegamedir;
     char *topdir;
+    int p;
 
+    //!
+    // @arg <directory>
+    //
+    // Specify a path from which to load and save games. If the directory
+    // does not exist then it will automatically be created.
+    //
+
+    p = M_CheckParmWithArgs("-savedir", 1);
+    if (p)
+    {
+        savegamedir = myargv[p + 1];
+        if (!M_FileExists(savegamedir))
+        {
+            M_MakeDirectory(savegamedir);
+        }
+
+        // add separator at end just in case
+        savegamedir = M_StringJoin(savegamedir, DIR_SEPARATOR_S, NULL);
+
+        printf("Save directory changed to %s.\n", savegamedir);
+    }
+#ifdef _WIN32
+    // In -cdrom mode, we write savegames to a specific directory
+    // in addition to configs.
+
+    else if (M_ParmExists("-cdrom"))
+    {
+        savegamedir = configdir;
+    }
+#endif
     // If not "doing" a configuration directory (Windows), don't "do"
     // a savegame directory, either.
-
-    if (!strcmp(configdir, ""))
+    else if (!strcmp(configdir, ""))
     {
 	savegamedir = M_StringDuplicate("");
     }
--- a/src/setup/multiplayer.c
+++ b/src/setup/multiplayer.c
@@ -340,7 +340,7 @@
             {
                 skillbutton->values = hexen_fighter_skills;
             }
-            else if (character_class == 2)
+            else if (character_class == 1)
             {
                 skillbutton->values = hexen_cleric_skills;
             }
--- a/src/strife/Makefile.am
+++ b/src/strife/Makefile.am
@@ -1,4 +1,6 @@
-AM_CFLAGS = -I$(top_srcdir)/src @SDL_CFLAGS@ @SDLMIXER_CFLAGS@ @SDLNET_CFLAGS@
+AM_CFLAGS=-I$(top_srcdir)/src                           \
+          -I$(top_srcdir)/textscreen                    \
+          @SDL_CFLAGS@ @SDLMIXER_CFLAGS@ @SDLNET_CFLAGS@
 
 noinst_LIBRARIES=libstrife.a
 
--- a/src/strife/d_main.c
+++ b/src/strife/d_main.c
@@ -34,6 +34,9 @@
 #include "doomfeatures.h"
 #include "sounds.h"
 
+#include "txt_main.h"
+#include "txt_io.h"
+
 #include "d_iwad.h"
 
 #include "z_zone.h"
@@ -145,6 +148,7 @@
 int             show_endoom = 1;
 int             show_diskicon = 1;
 int             graphical_startup = 1;
+static boolean  using_text_startup;
 
 // If true, startup has completed and the main game loop has started.
 
@@ -510,7 +514,6 @@
 
     if (!showintro)
     {
-        I_SetWindowTitle(gamedescription);
         I_InitGraphics();
     }
 
@@ -922,8 +925,28 @@
 }
 
 //      print title for every printed line
-char            title[128];
+static char title[128] = "";
 
+static void InitTitleString(void)
+{
+    switch (gameversion)
+    {
+    case exe_strife_1_2:
+        DEH_snprintf(title, sizeof(title), "                      "
+                                           "STRIFE:  Quest for the Sigil v1.2"
+                                           "                                  "
+                                           );
+        break;
+    case exe_strife_1_31:
+    default:
+        DEH_snprintf(title, sizeof(title), "                      "
+                                           "STRIFE:  Quest for the Sigil v1.31"
+                                           "                                 "
+                                           );
+        break;
+    }
+}
+
 static boolean D_AddFile(char *filename)
 {
     wad_file_t *handle;
@@ -1082,6 +1105,85 @@
     I_Endoom(endoom);
 }
 
+//
+// D_GetCursorColumn
+//
+static int D_GetCursorColumn(void)
+{
+    int x, y;
+    TXT_GetXY(&x, &y);
+    return x;
+}
+
+//
+// D_GetCursorRow
+//
+static int D_GetCursorRow(void)
+{
+    int x, y;
+    TXT_GetXY(&x, &y);
+    return y;
+}
+
+//
+// D_SetCursorPosition
+//
+static void D_SetCursorPosition(int column, int row)
+{
+    TXT_GotoXY(column, row);
+}
+
+//
+// D_SetChar
+//
+static void D_SetChar(char c)
+{
+    int x, y;
+    // Backup position
+    TXT_GetXY(&x, &y);
+    TXT_PutChar(c);
+    // Restore position
+    TXT_GotoXY(x, y);
+}
+
+//
+// D_DrawText
+//
+static void D_DrawText(char *string, int bc, int fc)
+{
+    int column;
+    int row;
+    int i;
+
+    if (!using_text_startup)
+    {
+        return;
+    }
+
+    // Set text color
+    TXT_BGColor(bc, 0);
+    TXT_FGColor(fc);
+
+    // Get column position
+    column = D_GetCursorColumn();
+
+    // Get row position
+    row = D_GetCursorRow();
+
+    for (i = 0; i < strlen(string); i++)
+    {
+        // Set character
+        D_SetChar(string[i]);
+
+        // Check cursor position
+        if (++column >= 80)
+            column = 0;
+
+        // Set postition
+        D_SetCursorPosition(column, row);
+    }
+}
+
 //=============================================================================
 //
 // haleyjd: Chocolate Strife Specifics
@@ -1169,11 +1271,20 @@
 
 static void D_InitIntroSequence(void)
 {
+    byte *textScreen;
+    char string[80];
+
+    if (devparm || !graphical_startup || testcontrols)
+    {
+        using_text_startup = false;
+        showintro = false;
+        return;
+    }
+
     if(showintro)
     {
         // In vanilla Strife, Mode 13h was initialized directly in D_DoomMain.
         // We have to be a little more courteous of the low-level code here.
-        I_SetWindowTitle(gamedescription);
         I_SetGrabMouseCallback(D_StartupGrabCallback);
         I_InitGraphics();
         V_RestoreBuffer(); // make the V_ routines work
@@ -1190,22 +1301,62 @@
 
         // Draw the background
         D_IntroBackground();
+
+        using_text_startup = false;
     }
-    /*
-    // STRIFE-FIXME: This was actually displayed on a special textmode
-    // screen with ANSI color codes... would require use of textlib to
-    // emulate properly...
     else
     {
-        puts(DEH_String("Conversation ON"));
-        puts(DEH_String("Rogue Entertainment"));
-        puts(DEH_String("and"));
-        puts(DEH_String("Velocity Games"));
-        puts(DEH_String("present"));
-        puts(DEH_String("S T R I F E"));
-        puts(DEH_String("Loading..."));
+        if (!TXT_Init())
+        {
+            using_text_startup = false;
+            return;
+        }
+
+        I_InitWindowTitle();
+        I_InitWindowIcon();
+
+        // Clear screen
+        textScreen = TXT_GetScreenData();
+        memset(textScreen, 0, 4000);
+
+        using_text_startup = true;
+
+        // Print title
+
+        D_SetCursorPosition(0, 0);
+        D_DrawText(title, TXT_COLOR_GREEN, TXT_COLOR_BLACK);
+
+        DEH_snprintf(string, sizeof(string), "Rogue Entertainment");
+        D_SetCursorPosition(40 - strlen(string) / 2, 5);
+        D_DrawText(string, TXT_COLOR_BLUE, TXT_COLOR_GREEN);
+
+        DEH_snprintf(string, sizeof(string), "and");
+        D_SetCursorPosition(40 - strlen(string) / 2, 7);
+        D_DrawText(string, TXT_COLOR_BLUE, TXT_COLOR_GREEN);
+
+        DEH_snprintf(string, sizeof(string), "Velocity Games");
+        D_SetCursorPosition(40 - strlen(string) / 2, 9);
+        D_DrawText(string, TXT_COLOR_BLUE, TXT_COLOR_GREEN);
+
+        DEH_snprintf(string, sizeof(string), "present");
+        D_SetCursorPosition(40 - strlen(string) / 2, 11);
+        D_DrawText(string, TXT_COLOR_BLUE, TXT_COLOR_GREEN);
+
+        DEH_snprintf(string, sizeof(string), "S T R I F E");
+        D_SetCursorPosition(40 - strlen(string) / 2, 14);
+        D_DrawText(string, TXT_COLOR_BLUE, TXT_COLOR_GREEN);
+
+        DEH_snprintf(string, sizeof(string), "Loading...");
+        D_SetCursorPosition(40 - strlen(string) / 2, 17);
+        D_DrawText(string, TXT_COLOR_BLUE, TXT_COLOR_GREEN);
+
+        DEH_snprintf(string, sizeof(string),
+                    "[                                                  ]");
+        D_SetCursorPosition(14, 18);
+        D_DrawText(string, TXT_COLOR_BLUE, TXT_COLOR_GREEN);
+
+        TXT_UpdateScreen();
     }
-    */
 }
 
 //
@@ -1218,41 +1369,62 @@
 {
     int laserpos;
     int robotpos;
+    int i;
 
-    if(!showintro)
-        return;
+    if (showintro)
+    {
+        D_IntroBackground(); // haleyjd: refresh the background
 
-    D_IntroBackground(); // haleyjd: refresh the background
+        // Laser position
+        laserpos = (200 * introprogress / MAXINTROPROGRESS) + 60;
 
-    // Laser position
-    laserpos = (200 * introprogress / MAXINTROPROGRESS) + 60;
+        // BUG: (?) Due to this clip, the laser never even comes close to
+        // touching the peasant; confirmed with vanilla. This MAY have been
+        // intentional, for effect, however, since no death frames are shown 
+        // either... kind of a black-out death.
+        if (laserpos > 200)
+            laserpos = 200;
 
-    // BUG: (?) Due to this clip, the laser never even comes close to
-    // touching the peasant; confirmed with vanilla. This MAY have been
-    // intentional, for effect, however, since no death frames are shown 
-    // either... kind of a black-out death.
-    if(laserpos > 200)
-        laserpos = 200;
+        // Draw the laser
+        // Blitted 16 bytes for 16 rows starting at 705280 + laserpos
+        // (705280 - 0xA0000) / 320 == 156
+        V_DrawBlock(laserpos, 156, 16, 16, rawgfx_startlz[laserpos % 2]);
 
-    // Draw the laser
-    // Blitted 16 bytes for 16 rows starting at 705280 + laserpos
-    // (705280 - 0xA0000) / 320 == 156
-    V_DrawBlock(laserpos, 156, 16, 16, rawgfx_startlz[laserpos % 2]);
+        // Robot position
+        robotpos = laserpos % 5 - 2;
 
-    // Robot position
-    robotpos = laserpos % 5 - 2;
+        // Draw the robot
+        // Blitted 48 bytes for 48 rows starting at 699534 + (320*robotpos)
+        // 699534 - 0xA0000 == 44174, which % 320 == 14, / 320 == 138
+        V_DrawBlock(14, 138 + robotpos, 48, 48, rawgfx_startbot);
 
-    // Draw the robot
-    // Blitted 48 bytes for 48 rows starting at 699534 + (320*robotpos)
-    // 699534 - 0xA0000 == 44174, which % 320 == 14, / 320 == 138
-    V_DrawBlock(14, 138 + robotpos, 48, 48, rawgfx_startbot);
+        // Draw the peasant
+        // Blitted 32 bytes for 64 rows starting at 699142
+        // 699142 - 0xA0000 == 43782, which % 320 == 262, / 320 == 136
+        V_DrawBlock(262, 136, 32, 64, rawgfx_startp[laserpos % 4]);
 
-    // Draw the peasant
-    // Blitted 32 bytes for 64 rows starting at 699142
-    // 699142 - 0xA0000 == 43782, which % 320 == 262, / 320 == 136
-    V_DrawBlock(262, 136, 32, 64, rawgfx_startp[laserpos % 4]);
+        I_FinishUpdate();
+    }
+    else if (using_text_startup)
+    {
+        // Laser position
+        laserpos = 50 * introprogress / MAXINTROPROGRESS;
 
-    I_FinishUpdate();
+        if (laserpos > 50)
+        {
+            laserpos = 50;
+        }
+
+        for (i = 0; i < laserpos; i++)
+        {
+            D_SetCursorPosition(15 + i, 18);
+            D_DrawText("#", TXT_COLOR_GREEN, TXT_COLOR_BLUE);
+        }
+
+        I_Sleep(10);
+
+        TXT_UpdateScreen();
+    }
 }
 
 //
@@ -1541,11 +1713,6 @@
     D_BindVariables();
     M_LoadDefaults();
 
-    if (!graphical_startup)
-    {
-        showintro = false;
-    }
-
     // Save configuration at exit.
     I_AtExit(M_SaveDefaults, false);
 
@@ -1659,7 +1826,9 @@
     
     D_IdentifyVersion();
     InitGameVersion();
+    InitTitleString();
     D_SetGameDescription();
+    I_SetWindowTitle(gamedescription);
     savegamedir = M_GetSaveGameDir("strife1.wad");
 
     // fraggle 20130405: I_InitTimer is needed here for the netgame
@@ -1985,6 +2154,11 @@
             G_InitNew (startskill, startmap);
         else
             D_StartTitle ();                // start up intro loop
+    }
+
+    if (using_text_startup)
+    {
+        TXT_Shutdown();
     }
 
     D_DoomLoop ();  // never returns