shithub: choc

Download patch

ref: 71d013a435a6801e82279acb0678a30b526d91ad
parent: bce9b6d61d5b4c9cd8f8e29ddaaf9f4084a64cae
author: Simon Howard <[email protected]>
date: Sat Nov 8 01:58:56 EST 2008

Recreate Heretic startup progress bar using textscreen library.

Subversion-branch: /branches/raven-branch
Subversion-revision: 1379

--- a/src/heretic/Makefile.am
+++ b/src/heretic/Makefile.am
@@ -1,5 +1,5 @@
 
-AM_CFLAGS=-I.. @SDL_CFLAGS@ @SDLMIXER_CFLAGS@ @SDLNET_CFLAGS@
+AM_CFLAGS=-I.. -I../../textscreen @SDL_CFLAGS@ @SDLMIXER_CFLAGS@ @SDLNET_CFLAGS@
 
 noinst_LIBRARIES=libheretic.a
 
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -27,6 +27,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "txt_main.h"
+#include "txt_io.h"
+
 #include "config.h"
 #include "ct_chat.h"
 #include "doomdef.h"
@@ -40,6 +43,9 @@
 #include "s_sound.h"
 #include "v_video.h"
 
+#define STARTUP_WINDOW_X 17
+#define STARTUP_WINDOW_Y 7
+
 GameMission_t gamemission = heretic;
 GameMode_t gamemode = indetermined;
 char *gamedescription = "unknown";
@@ -56,6 +62,8 @@
 int startepisode;
 int startmap;
 int UpdateState;
+static int graphical_startup = 1;
+static boolean using_graphical_startup;
 boolean autostart;
 extern boolean automapactive;
 
@@ -486,15 +494,11 @@
 //
 //==========================================================
 #define MSG_Y       9
-//#define THERM_X 15
-//#define THERM_Y 16
-//#define THERMCOLOR  3
 #define THERM_X     14
 #define THERM_Y     14
 
 int thermMax;
 int thermCurrent;
-char *startup;                  // * to text screen
 char smsg[80];                  // status bar line
 
 //
@@ -501,49 +505,43 @@
 //  Heretic startup screen shit
 //
 
-byte *hscreen;
+static int startup_line = STARTUP_WINDOW_Y;
 
-void hgotoxy(int x, int y)
+void hprintf(char *string)
 {
-    hscreen = (byte *) (0xb8000 + y * 160 + x * 2);
-}
+    if (using_graphical_startup)
+    {
+        TXT_BGColor(TXT_COLOR_CYAN, 0);
+        TXT_FGColor(TXT_COLOR_BRIGHT_WHITE);
 
-void hput(unsigned char c, unsigned char a)
-{
-    *hscreen++ = c;
-    *hscreen++ = a;
-}
+        TXT_GotoXY(STARTUP_WINDOW_X, startup_line);
+        ++startup_line;
+        TXT_Puts(string);
 
-void hprintf(char *string, unsigned char a)
-{
-#ifdef __WATCOMC__
-    int i;
+        TXT_UpdateScreen();
+    }
 
+#ifdef __WATCOMC__
     if (debugmode)
     {
         puts(string);
         return;
     }
-    for (i = 0; i < strlen(string); i++)
-    {
-        hput(string[i], a);
-    }
 #endif
 }
 
 void drawstatus(void)
 {
-    if (debugmode)
+    int i;
+
+    TXT_GotoXY(1, 24);
+    TXT_BGColor(TXT_COLOR_BLUE, 0);
+    TXT_FGColor(TXT_COLOR_BRIGHT_WHITE);
+
+    for (i=0; smsg[i] != '\0'; ++i) 
     {
-        return;
+        TXT_PutChar(smsg[i]);
     }
-#ifdef __WATCOMC__
-    _settextposition(25, 2);
-    _setbkcolor(1);
-    _settextcolor(15);
-    _outtext(smsg);
-    _settextposition(25, 1);
-#endif
 }
 
 void status(char *string)
@@ -554,15 +552,15 @@
 
 void DrawThermo(void)
 {
-#ifdef __WATCOMC__
-    unsigned char *screen;
+    static int last_progress = -1;
     int progress;
     int i;
 
-    if (debugmode)
+    if (!using_graphical_startup)
     {
         return;
     }
+
 #if 0
     progress = (98 * thermCurrent) / thermMax;
     screen = (char *) 0xb8000 + (THERM_Y * 160 + THERM_X * 2);
@@ -597,44 +595,74 @@
         *screen++ = 0x40 + THERMCOLOR;
     }
 #else
+
+    // No progress? Don't update the screen.
+
     progress = (50 * thermCurrent) / thermMax + 2;
-//  screen = (char *)0xb8000 + (THERM_Y*160 + THERM_X*2);
-    hgotoxy(THERM_X, THERM_Y);
+
+    if (last_progress == progress)
+    {
+        return;
+    }
+
+    last_progress = progress;
+
+    TXT_GotoXY(THERM_X, THERM_Y);
+
+    TXT_FGColor(TXT_COLOR_BRIGHT_GREEN);
+    TXT_BGColor(TXT_COLOR_GREEN, 0);
+
     for (i = 0; i < progress; i++)
     {
-//      *screen++ = 0xdb;
-//      *screen++ = 0x2a;
-        hput(0xdb, 0x2a);
+        TXT_PutChar(0xdb);
     }
+
+    TXT_UpdateScreen();
 #endif
-#endif
 }
 
-#ifdef __WATCOMC__
-void blitStartup(void)
+void initStartup(void)
 {
     byte *textScreen;
+    byte *loading;
 
-    if (debugmode)
+    if (!graphical_startup || debugmode)
     {
+        using_graphical_startup = false;
         return;
     }
 
+    if (!TXT_Init()) 
+    {
+        using_graphical_startup = false;
+        return;
+    }
+
     // Blit main screen
-    textScreen = (byte *) 0xb8000;
-    memcpy(textScreen, startup, 4000);
+    textScreen = TXT_GetScreenData();
+    loading = W_CacheLumpName("LOADING", PU_CACHE);
+    memcpy(textScreen, loading, 4000);
 
     // Print version string
-    _setbkcolor(4);             // Red
-    _settextcolor(14);          // Yellow
-    _settextposition(3, 47);
-    _outtext(HERETIC_VERSION_TEXT);
 
-    // Hide cursor
-    _settextcursor(0x2000);
+    TXT_BGColor(TXT_COLOR_RED, 0);
+    TXT_FGColor(TXT_COLOR_YELLOW);
+    TXT_GotoXY(46, 2);
+    TXT_Puts(HERETIC_VERSION_TEXT);
+
+    TXT_UpdateScreen();
+
+    using_graphical_startup = true;
 }
-#endif
 
+static void finishStartup(void)
+{
+    if (using_graphical_startup)
+    {
+        TXT_Shutdown();
+    }
+}
+
 char tmsg[300];
 void tprintf(char *msg, int initflag)
 {
@@ -726,6 +754,7 @@
     M_BindVariable("screenblocks",           &screenblocks);
     M_BindVariable("snd_channels",           &snd_Channels);
     M_BindVariable("show_endoom",            &show_endoom);
+    M_BindVariable("graphical_startup",      &graphical_startup);
 
     for (i=0; i<10; ++i)
     {
@@ -909,10 +938,7 @@
     I_StartupKeyboard();
     I_StartupJoystick();
 #endif
-    startup = W_CacheLumpName("LOADING", PU_CACHE);
-#ifdef __WATCOMC__
-    blitStartup();
-#endif
+    initStartup();
 
     //
     //  Build status bar line!
@@ -939,14 +965,12 @@
     CT_Init();
 
     tprintf("R_Init: Init Heretic refresh daemon.", 1);
-    hgotoxy(17, 7);
-    hprintf("Loading graphics", 0x3f);
+    hprintf("Loading graphics");
     R_Init();
     tprintf("\n", 0);
 
     tprintf("P_Init: Init Playloop state.\n", 1);
-    hgotoxy(17, 8);
-    hprintf("Init game engine.", 0x3f);
+    hprintf("Init game engine.");
     P_Init();
     IncThermo();
 
@@ -960,8 +984,7 @@
     S_Start();
 
     tprintf("D_CheckNetGame: Checking network game status.\n", 1);
-    hgotoxy(17, 9);
-    hprintf("Checking network game status.", 0x3f);
+    hprintf("Checking network game status.");
     D_CheckNetGame();
     IncThermo();
 
@@ -1038,8 +1061,8 @@
             D_StartTitle();
         }
     }
-#ifdef __WATCOMC__
-    _settextcursor(0x0607);     // bring the cursor back
-#endif
+
+    finishStartup();
+
     D_DoomLoop();               // Never returns
 }
--- a/src/m_config.c
+++ b/src/m_config.c
@@ -494,6 +494,13 @@
 static default_t extra_defaults_list[] = 
 {
     //!
+    // If non-zero, use the graphical startup mode for Heretic and
+    // Hexen.
+    //
+
+    CONFIG_VARIABLE_INT(graphical_startup),
+
+    //!
     // If non-zero, video settings will be autoadjusted to a valid 
     // configuration when the screen_width and screen_height variables
     // do not match any valid configuration.