ref: 808f6fd842f581f31aa0d91617a759af46fdc732
parent: 17333436188f63319625b007489c7b70029bfaba
author: James Haley <[email protected]>
date: Sun Feb 6 20:50:40 EST 2011
Added graphical intro loading screen, and -nograph parameter which disables it. Made most D_DoomMain messages dependent on -devparm. wipegamestate should start == 1, which is currently GS_UNKNOWN. Changed -wart behavior. Verified *no* changes in Strife to p_sight.c. Subversion-branch: /branches/strife-branch Subversion-revision: 2251
--- a/src/strife/d_main.c
+++ b/src/strife/d_main.c
@@ -105,12 +105,13 @@
char * iwadfile;
-boolean devparm; // started game with -devparm
-boolean nomonsters; // checkparm of -nomonsters
-boolean respawnparm; // checkparm of -respawn
-boolean fastparm; // checkparm of -fast
+boolean devparm; // started game with -devparm
+boolean nomonsters; // checkparm of -nomonsters
+boolean respawnparm; // checkparm of -respawn
+boolean fastparm; // checkparm of -fast
-boolean singletics = false; // debug flag to cancel adaptiveness
+boolean showintro = true; // [STRIFE] checkparm of -nograph, disables intro
+boolean singletics = false; // debug flag to cancel adaptiveness
//extern int soundVolume;
@@ -144,7 +145,7 @@
//boolean storedemo;
-char wadfile[1024]; // primary wad file
+char wadfile[1024]; // primary wad file
char mapdir[1024]; // directory of development maps
int show_endoom = 1;
@@ -162,7 +163,7 @@
//
void D_ProcessEvents (void)
{
- event_t* ev;
+ event_t* ev;
// haleyjd 08/22/2010: [STRIFE] there is no such thing as a "store demo"
// version of Strife
@@ -190,9 +191,10 @@
//
// haleyjd 08/23/10: [STRIFE]:
// * Changes to eliminate intermission and change timing of screenwipe
-// * 9/01/10: Added ST_DrawExternal and popupactivestate static variable
+// * 20100901: Added ST_DrawExternal and popupactivestate static variable
+// * 20110206: Start wipegamestate at GS_UNKNOWN (STRIFE-TODO: rename?)
//
-gamestate_t wipegamestate = GS_DEMOSCREEN;
+gamestate_t wipegamestate = GS_UNKNOWN;
extern boolean setsizeneeded;
extern int showMessages;
void R_ExecuteSetViewSize (void);
@@ -483,8 +485,11 @@
TryRunTics();
- I_SetWindowTitle(gamedescription);
- I_InitGraphics();
+ if(!showintro) // [STRIFE]
+ {
+ I_SetWindowTitle(gamedescription);
+ I_InitGraphics();
+ }
I_EnableLoadingDisk();
I_SetGrabMouseCallback(D_GrabMouseCallback);
@@ -892,8 +897,7 @@
if(disable_voices) // voices disabled?
{
- // STRIFE-FIXME:
- // if(debugmode)
+ if(devparm)
printf("Voices disabled\n");
return;
}
@@ -1248,7 +1252,164 @@
V_SetPatchClipCallback(D_PatchClipCallback);
}
+
//
+// STRIFE Graphical Intro Sequence
+//
+
+#define MAXINTROPROGRESS 69
+
+static int introprogress; // track the progress of the intro
+
+static byte *rawgfx_startup0; // raw linear gfx for intro
+static byte *rawgfx_startp[4];
+static byte *rawgfx_startlz[2];
+static byte *rawgfx_startbot;
+
+//
+// D_IntroBackground
+//
+// [STRIFE] New function
+// haleyjd 20110206: Strife only drew this once, but for supporting double-
+// buffered or page-flipped surfaces it is best to redraw the entire screen
+// every frame.
+//
+static void D_IntroBackground(void)
+{
+ // Slam up PANEL0 to fill the background entirely (wasn't needed in vanilla)
+ patch_t *panel0 = W_CacheLumpName("PANEL0", PU_CACHE);
+ V_DrawPatch(0, 0, panel0);
+
+ // Strife cleared the screen somewhere in the low-level code between the
+ // intro and the titlescreen, so this is to take care of that and get
+ // proper fade-in behavior on the titlescreen
+ if(introprogress >= MAXINTROPROGRESS)
+ {
+ I_FinishUpdate();
+ return;
+ }
+
+ // Draw a 95-pixel rect from STARTUP0 starting at y=57 to (0,41) on the
+ // screen (this was a memcpy directly to 0xA3340 in low DOS memory)
+ V_DrawBlock(0, 41, 320, 95, rawgfx_startup0 + (320*57));
+}
+
+//
+// D_InitIntroSequence
+//
+// [STRIFE] New function
+// haleyjd 20110206: Initialize the graphical introduction sequence
+//
+static void D_InitIntroSequence(void)
+{
+ 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_InitGraphics();
+ V_RestoreBuffer(); // make the V_ routines work
+
+ // Load all graphics
+ rawgfx_startup0 = W_CacheLumpName("STARTUP0", PU_STATIC);
+ rawgfx_startp[0] = W_CacheLumpName("STRTPA1", PU_STATIC);
+ rawgfx_startp[1] = W_CacheLumpName("STRTPB1", PU_STATIC);
+ rawgfx_startp[2] = W_CacheLumpName("STRTPC1", PU_STATIC);
+ rawgfx_startp[3] = W_CacheLumpName("STRTPD1", PU_STATIC);
+ rawgfx_startlz[0] = W_CacheLumpName("STRTLZ1", PU_STATIC);
+ rawgfx_startlz[1] = W_CacheLumpName("STRTLZ2", PU_STATIC);
+ rawgfx_startbot = W_CacheLumpName("STRTBOT", PU_STATIC);
+
+ // Draw the background
+ D_IntroBackground();
+ }
+ else
+ {
+ puts(DEH_String("Conversation ON"));
+ puts("\n");
+ puts(DEH_String("Rogue Entertainment"));
+ puts("\n");
+ puts(DEH_String("and"));
+ puts("\n");
+ puts(DEH_String("Velocity Games"));
+ puts("\n");
+ puts(DEH_String("present"));
+ puts("\n");
+ puts(DEH_String("S T R I F E"));
+ puts("\n");
+ puts(DEH_String("Loading..."));
+ puts("\n");
+ }
+}
+
+//
+// D_DrawIntroSequence
+//
+// [STRIFE] New function
+// haleyjd 20110206: Refresh the intro sequence
+//
+static void D_DrawIntroSequence(void)
+{
+ int laserpos;
+ int robotpos;
+
+ if(!showintro)
+ return;
+
+ D_IntroBackground(); // haleyjd: refresh the background
+
+ // 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;
+
+ // 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;
+
+ // 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]);
+
+ I_FinishUpdate();
+}
+
+//
+// D_IntroTick
+//
+// Advance the intro sequence
+//
+void D_IntroTick(void)
+{
+ if(devparm)
+ return;
+
+ ++introprogress;
+ if(introprogress >= MAXINTROPROGRESS)
+ {
+ D_IntroBackground(); // haleyjd: clear the bg anyway
+ S_StartSound(NULL, sfx_psdtha);
+ }
+ else
+ D_DrawIntroSequence();
+}
+
+//
// End Chocolate Strife Specifics
//
//=============================================================================
@@ -1266,11 +1427,33 @@
M_FindResponseFile ();
+ // haleyjd 20110206 [STRIFE]: -nograph parameter
+
+ //!
+ // @vanilla
+ //
+ // Disable graphical introduction sequence
+ //
+
+ if (M_CheckParm("-nograph") > 0)
+ showintro = false;
+
+ // haleyjd 20110206: Moved up -devparm for max visibility
+
+ //!
+ // @vanilla
+ //
+ // Developer mode. F1 saves a screenshot in the current working
+ // directory.
+ //
+
+ devparm = M_CheckParm ("-devparm");
+
// print banner
I_PrintBanner(PACKAGE_STRING);
- DEH_printf("Z_Init: Init zone memory allocation daemon. \n");
+ //DEH_printf("Z_Init: Init zone memory allocation daemon. \n"); [STRIFE] removed
Z_Init ();
#ifdef FEATURE_MULTIPLAYER
@@ -1316,7 +1499,8 @@
#endif
#ifdef FEATURE_DEHACKED
- printf("DEH_Init: Init Dehacked support.\n");
+ if(devparm)
+ printf("DEH_Init: Init Dehacked support.\n");
DEH_Init();
#endif
@@ -1337,7 +1521,7 @@
//
// Disable monsters.
//
-
+
nomonsters = M_CheckParm ("-nomonsters");
//!
@@ -1356,17 +1540,12 @@
fastparm = M_CheckParm ("-fast");
- //!
- // @vanilla
- //
- // Developer mode. F1 saves a screenshot in the current working
- // directory.
- //
-
- devparm = M_CheckParm ("-devparm");
-
I_DisplayFPSDots(devparm);
+ // haleyjd 20110206 [STRIFE]: -devparm implies -nograph
+ if(devparm)
+ showintro = false;
+
//!
// @category net
// @vanilla
@@ -1375,7 +1554,7 @@
//
if (M_CheckParm ("-deathmatch"))
- deathmatch = 1;
+ deathmatch = 1;
//!
// @category net
@@ -1386,10 +1565,10 @@
//
if (M_CheckParm ("-altdeath"))
- deathmatch = 2;
+ deathmatch = 2;
if (devparm)
- DEH_printf(D_DEVSTR);
+ DEH_printf(D_DEVSTR);
// find which dir to use for config files
@@ -1428,30 +1607,30 @@
if ( (p=M_CheckParm ("-turbo")) )
{
- int scale = 200;
- extern int forwardmove[2];
- extern int sidemove[2];
-
- if (p<myargc-1)
- scale = atoi (myargv[p+1]);
- if (scale < 10)
- scale = 10;
- if (scale > 400)
- scale = 400;
+ int scale = 200;
+ extern int forwardmove[2];
+ extern int sidemove[2];
+
+ if (p<myargc-1)
+ scale = atoi (myargv[p+1]);
+ if (scale < 10)
+ scale = 10;
+ if (scale > 400)
+ scale = 400;
DEH_printf("turbo scale: %i%%\n", scale);
- forwardmove[0] = forwardmove[0]*scale/100;
- forwardmove[1] = forwardmove[1]*scale/100;
- sidemove[0] = sidemove[0]*scale/100;
- sidemove[1] = sidemove[1]*scale/100;
+ forwardmove[0] = forwardmove[0]*scale/100;
+ forwardmove[1] = forwardmove[1]*scale/100;
+ sidemove[0] = sidemove[0]*scale/100;
+ sidemove[1] = sidemove[1]*scale/100;
}
// init subsystems
- DEH_printf("V_Init: allocate screens.\n");
+ // DEH_printf("V_Init: allocate screens.\n"); [STRIFE] removed
V_Init ();
// Load configuration files before initialising other subsystems.
// haleyjd 08/22/2010: [STRIFE] - use strife.cfg
- DEH_printf("M_LoadDefaults: Load system defaults.\n");
+ // DEH_printf("M_LoadDefaults: Load system defaults.\n"); [STRIFE] removed
M_SetConfigFilenames("strife.cfg", PROGRAM_PREFIX "strife.cfg");
D_BindVariables();
M_LoadDefaults();
@@ -1459,10 +1638,22 @@
// Save configuration at exit.
I_AtExit(M_SaveDefaults, false);
- DEH_printf("W_Init: Init WADfiles.\n");
+ if(devparm) // [STRIFE] Devparm only
+ DEH_printf("W_Init: Init WADfiles.\n");
D_AddFile(iwadfile);
modifiedgame = W_ParseCommandLine();
+ // [STRIFE] serial number output
+ if(devparm)
+ {
+ char msgbuf[80];
+ char *serial = W_CacheLumpName("SERIAL", PU_CACHE);
+ int serialnum = atoi(serial);
+
+ DEH_snprintf(msgbuf, sizeof(msgbuf), "Wad Serial Number: %d:", serialnum);
+ printf("%s\n", msgbuf);
+ }
+
// add any files specified on the command line with -file wadfile
// to the wad list
//
@@ -1471,30 +1662,17 @@
p = M_CheckParm ("-wart");
if (p)
{
- myargv[p][4] = 'p'; // big hack, change to -warp
+ myargv[p][4] = 'p'; // big hack, change to -warp
- // Map name handling.
- switch (gamemode )
- {
- case shareware:
- case retail:
- case registered:
- sprintf (file,"~"DEVMAPS"E%cM%c.wad",
- myargv[p+1][0], myargv[p+2][0]);
- printf("Warping to Episode %s, Map %s.\n",
- myargv[p+1],myargv[p+2]);
- break;
-
- case commercial:
- default:
- p = atoi (myargv[p+1]);
- if (p<10)
- sprintf (file,"~"DEVMAPS"cdata/map0%i.wad", p);
- else
- sprintf (file,"~"DEVMAPS"cdata/map%i.wad", p);
- break;
- }
- D_AddFile (file);
+ // Map name handling.
+ // [STRIFE]: looks for f:/st/data
+ p = atoi (myargv[p+1]);
+ if (p<10)
+ sprintf (file,"~f:/st/data/map0%i.wad", p);
+ else
+ sprintf (file,"~f:/st/data/map%i.wad", p);
+
+ D_AddFile (file);
}
//!
@@ -1517,7 +1695,7 @@
// Play back the demo named demo.lmp, determining the framerate
// of the screen.
//
- p = M_CheckParm ("-timedemo");
+ p = M_CheckParm ("-timedemo");
}
@@ -1529,10 +1707,10 @@
}
else
{
- sprintf (file,"%s.lmp", myargv[p+1]);
+ sprintf (file,"%s.lmp", myargv[p+1]);
}
- if (D_AddFile (file))
+ if (D_AddFile (file))
{
strncpy(demolumpname, lumpinfo[numlumps - 1].name, 8);
demolumpname[8] = '\0';
@@ -1563,6 +1741,10 @@
D_SetGameDescription();
SetSaveGameDir(iwadfile);
+ // haleyjd 20110206 [STRIFE] Startup the introduction sequence
+ D_InitIntroSequence();
+ D_IntroTick();
+
// Check for -file in shareware
if (modifiedgame)
{
@@ -1590,6 +1772,8 @@
I_Error(DEH_String("\nThis is not the registered version."));
}
+ D_IntroTick(); // [STRIFE]
+
// get skill / episode / map from parms
startskill = sk_medium;
startepisode = 1;
@@ -1608,8 +1792,8 @@
if (p && p < myargc-1)
{
- startskill = myargv[p+1][0]-'1';
- autostart = true;
+ startskill = myargv[p+1][0]-'1';
+ autostart = true;
}
//!
@@ -1623,11 +1807,11 @@
if (p && p < myargc-1)
{
- startepisode = myargv[p+1][0]-'0';
- startmap = 1;
- autostart = true;
+ startepisode = myargv[p+1][0]-'0';
+ startmap = 1;
+ autostart = true;
}
-
+
timelimit = 0;
//!
@@ -1642,8 +1826,8 @@
if (p && p < myargc-1 && deathmatch)
{
- timelimit = atoi(myargv[p+1]);
- printf("timer: %i\n", timelimit);
+ timelimit = atoi(myargv[p+1]);
+ printf("timer: %i\n", timelimit);
}
//!
@@ -1659,7 +1843,7 @@
{
DEH_printf("Austin Virtual Gaming: Levels will end "
"after 20 minutes\n");
- timelimit = 20;
+ timelimit = 20;
}
//!
@@ -1743,40 +1927,60 @@
// haleyjd 08/28/10: Init Choco Strife stuff.
D_InitChocoStrife();
- DEH_printf("M_Init: Init miscellaneous info.\n");
- M_Init ();
-
// haleyjd 08/22/2010: [STRIFE] Modified string to match binary
- DEH_printf("R_Init: Loading Graphics - ");
+ if(devparm) // [STRIFE]
+ DEH_printf("R_Init: Loading Graphics - ");
R_Init ();
+ D_IntroTick(); // [STRIFE]
- DEH_printf("\nP_Init: Init Playloop state.\n");
+ if(devparm) // [STRIFE]
+ DEH_printf("\nP_Init: Init Playloop state.\n");
P_Init ();
+ D_IntroTick(); // [STRIFE]
- DEH_printf("I_Init: Setting up machine state.\n");
+ if(devparm) // [STRIFE]
+ DEH_printf("I_Init: Setting up machine state.\n");
I_CheckIsScreensaver();
I_InitTimer();
I_InitJoystick();
+ D_IntroTick(); // [STRIFE]
#ifdef FEATURE_MULTIPLAYER
- printf ("NET_Init: Init network subsystem.\n");
+ if(devparm) // [STRIFE]
+ printf ("NET_Init: Init network subsystem.\n");
NET_Init ();
#endif
+ D_IntroTick(); // [STRIFE]
- DEH_printf("S_Init: Setting up sound.\n");
+ if(devparm) // [STRIFE]
+ DEH_printf("M_Init: Init Menu.\n");
+ M_Init ();
+ D_IntroTick(); // [STRIFE]
+
+ if(devparm) // [STRIFE]
+ DEH_printf("S_Init: Setting up sound.\n");
S_Init (sfxVolume * 8, musicVolume * 8, voiceVolume * 8); // [STRIFE]: voice
+ D_IntroTick(); // [STRIFE]
- DEH_printf("D_CheckNetGame: Checking network game status.\n");
+ if(devparm) // [STRIFE]
+ DEH_printf("D_CheckNetGame: Checking network game status.\n");
D_CheckNetGame ();
PrintGameVersion();
- DEH_printf("HU_Init: Setting up heads up display.\n");
+ if(devparm)
+ DEH_printf("HU_Init: Setting up heads up display.\n");
HU_Init ();
+ D_IntroTick(); // [STRIFE]
- DEH_printf("ST_Init: Init status bar.\n");
+ if(devparm)
+ DEH_printf("ST_Init: Init status bar.\n");
ST_Init ();
+ D_IntroTick(); // [STRIFE]
+ // haleyjd [STRIFE] -statcopy used to be here...
+ D_IntroTick();
+
// If Doom II without a MAP01 lump, this is a store demo.
// Moved this here so that MAP01 isn't constantly looked up
// in the main loop.
@@ -1798,37 +2002,41 @@
if (p && p < myargc-1)
{
- G_RecordDemo (myargv[p+1]);
- autostart = true;
+ G_RecordDemo (myargv[p+1]);
+ autostart = true;
}
+ D_IntroTick(); // [STRIFE]
p = M_CheckParm ("-playdemo");
if (p && p < myargc-1)
{
- singledemo = true; // quit after one demo
- G_DeferedPlayDemo (demolumpname);
- D_DoomLoop (); // never returns
+ singledemo = true; // quit after one demo
+ G_DeferedPlayDemo (demolumpname);
+ D_DoomLoop (); // never returns
}
-
+ D_IntroTick(); // [STRIFE]
+
p = M_CheckParm ("-timedemo");
if (p && p < myargc-1)
{
- G_TimeDemo (demolumpname);
- D_DoomLoop (); // never returns
+ G_TimeDemo (demolumpname);
+ D_DoomLoop (); // never returns
}
-
+ D_IntroTick(); // [STRIFE]
+
if (startloadgame >= 0)
{
strcpy(file, P_SaveGameFile(startloadgame));
- G_LoadGame (file);
+ G_LoadGame (file);
}
-
+ D_IntroTick(); // [STRIFE]
+
if (gameaction != ga_loadgame )
{
- if (autostart || netgame)
- G_InitNew (startskill, startmap);
- else
- D_StartTitle (); // start up intro loop
+ if (autostart || netgame)
+ G_InitNew (startskill, startmap);
+ else
+ D_StartTitle (); // start up intro loop
}
D_DoomLoop (); // never returns
--- a/src/strife/d_main.h
+++ b/src/strife/d_main.h
@@ -47,6 +47,8 @@
void D_DoAdvanceDemo (void);
void D_StartTitle (void);
void D_QuitGame (void); // [STRIFE]
+
+void D_IntroTick(void); // [STRIFE]
//
// GLOBAL VARIABLES
--- a/src/strife/p_inter.c
+++ b/src/strife/p_inter.c
@@ -1209,8 +1209,8 @@
if (inflictor
&& !(target->flags & MF_NOCLIP)
&& (!source
- || !source->player
- || source->player->readyweapon != wp_flame))
+ || !source->player
+ || source->player->readyweapon != wp_flame))
{
ang = R_PointToAngle2(inflictor->x,
inflictor->y,
--- a/src/strife/p_map.c
+++ b/src/strife/p_map.c
@@ -1285,14 +1285,14 @@
//
void
P_LineAttack
-( mobj_t* t1,
- angle_t angle,
- fixed_t distance,
- fixed_t slope,
- int damage )
+( mobj_t* t1,
+ angle_t angle,
+ fixed_t distance,
+ fixed_t slope,
+ int damage )
{
- fixed_t x2;
- fixed_t y2;
+ fixed_t x2;
+ fixed_t y2;
int traverseflags;
angle >>= ANGLETOFINESHIFT;
--- a/src/strife/p_sight.c
+++ b/src/strife/p_sight.c
@@ -37,15 +37,15 @@
//
// P_CheckSight
//
-fixed_t sightzstart; // eye z of looker
-fixed_t topslope;
-fixed_t bottomslope; // slopes to top and bottom of target
+fixed_t sightzstart; // eye z of looker
+fixed_t topslope;
+fixed_t bottomslope; // slopes to top and bottom of target
-divline_t strace; // from t1 to t2
-fixed_t t2x;
-fixed_t t2y;
+divline_t strace; // from t1 to t2
+fixed_t t2x;
+fixed_t t2y;
-int sightcounts[2];
+int sightcounts[2];
//
@@ -52,51 +52,53 @@
// P_DivlineSide
// Returns side 0 (front), 1 (back), or 2 (on).
//
+// [STRIFE] Verified unmodified
+//
int
P_DivlineSide
-( fixed_t x,
- fixed_t y,
- divline_t* node )
+( fixed_t x,
+ fixed_t y,
+ divline_t* node )
{
- fixed_t dx;
- fixed_t dy;
- fixed_t left;
- fixed_t right;
+ fixed_t dx;
+ fixed_t dy;
+ fixed_t left;
+ fixed_t right;
if (!node->dx)
{
- if (x==node->x)
- return 2;
-
- if (x <= node->x)
- return node->dy > 0;
+ if (x==node->x)
+ return 2;
- return node->dy < 0;
+ if (x <= node->x)
+ return node->dy > 0;
+
+ return node->dy < 0;
}
-
+
if (!node->dy)
{
- if (x==node->y)
- return 2;
+ if (x==node->y)
+ return 2;
- if (y <= node->y)
- return node->dx < 0;
+ if (y <= node->y)
+ return node->dx < 0;
- return node->dx > 0;
+ return node->dx > 0;
}
-
+
dx = (x - node->x);
dy = (y - node->y);
left = (node->dy>>FRACBITS) * (dx>>FRACBITS);
right = (dy>>FRACBITS) * (node->dx>>FRACBITS);
-
+
if (right < left)
- return 0; // front side
-
+ return 0; // front side
+
if (left == right)
- return 2;
- return 1; // back side
+ return 2;
+ return 1; // back side
}
@@ -106,23 +108,25 @@
// along the first divline.
// This is only called by the addthings and addlines traversers.
//
+// [STRIFE] Verified unmodified
+//
fixed_t
P_InterceptVector2
-( divline_t* v2,
- divline_t* v1 )
+( divline_t* v2,
+ divline_t* v1 )
{
fixed_t frac;
fixed_t num;
fixed_t den;
-
+
den = FixedMul (v1->dy>>8,v2->dx) - FixedMul(v1->dx>>8,v2->dy);
if (den == 0)
- return 0;
+ return 0;
// I_Error ("P_InterceptVector: parallel");
-
+
num = FixedMul ( (v1->x - v2->x)>>8 ,v1->dy) +
- FixedMul ( (v2->y - v1->y)>>8 , v1->dx);
+ FixedMul ( (v2->y - v1->y)>>8 , v1->dx);
frac = FixedDiv (num , den);
return frac;
@@ -133,29 +137,31 @@
// Returns true
// if strace crosses the given subsector successfully.
//
+// [STRIFE] Verified unmodified
+//
boolean P_CrossSubsector (int num)
{
- seg_t* seg;
- line_t* line;
- int s1;
- int s2;
- int count;
- subsector_t* sub;
- sector_t* front;
- sector_t* back;
- fixed_t opentop;
- fixed_t openbottom;
- divline_t divl;
- vertex_t* v1;
- vertex_t* v2;
- fixed_t frac;
- fixed_t slope;
-
+ seg_t* seg;
+ line_t* line;
+ int s1;
+ int s2;
+ int count;
+ subsector_t* sub;
+ sector_t* front;
+ sector_t* back;
+ fixed_t opentop;
+ fixed_t openbottom;
+ divline_t divl;
+ vertex_t* v1;
+ vertex_t* v2;
+ fixed_t frac;
+ fixed_t slope;
+
#ifdef RANGECHECK
if (num>=numsubsectors)
- I_Error ("P_CrossSubsector: ss %i with numss = %i",
- num,
- numsubsectors);
+ I_Error ("P_CrossSubsector: ss %i with numss = %i",
+ num,
+ numsubsectors);
#endif
sub = &subsectors[num];
@@ -166,34 +172,34 @@
for ( ; count ; seg++, count--)
{
- line = seg->linedef;
+ line = seg->linedef;
- // allready checked other side?
- if (line->validcount == validcount)
- continue;
-
- line->validcount = validcount;
+ // allready checked other side?
+ if (line->validcount == validcount)
+ continue;
- v1 = line->v1;
- v2 = line->v2;
- s1 = P_DivlineSide (v1->x,v1->y, &strace);
- s2 = P_DivlineSide (v2->x, v2->y, &strace);
+ line->validcount = validcount;
- // line isn't crossed?
- if (s1 == s2)
- continue;
-
- divl.x = v1->x;
- divl.y = v1->y;
- divl.dx = v2->x - v1->x;
- divl.dy = v2->y - v1->y;
- s1 = P_DivlineSide (strace.x, strace.y, &divl);
- s2 = P_DivlineSide (t2x, t2y, &divl);
+ v1 = line->v1;
+ v2 = line->v2;
+ s1 = P_DivlineSide (v1->x, v1->y, &strace);
+ s2 = P_DivlineSide (v2->x, v2->y, &strace);
- // line isn't crossed?
- if (s1 == s2)
- continue;
+ // line isn't crossed?
+ if (s1 == s2)
+ continue;
+ divl.x = v1->x;
+ divl.y = v1->y;
+ divl.dx = v2->x - v1->x;
+ divl.dy = v2->y - v1->y;
+ s1 = P_DivlineSide (strace.x, strace.y, &divl);
+ s2 = P_DivlineSide (t2x, t2y, &divl);
+
+ // line isn't crossed?
+ if (s1 == s2)
+ continue;
+
// Backsector may be NULL if this is an "impassible
// glass" hack line.
@@ -202,58 +208,58 @@
return false;
}
- // stop because it is not two sided anyway
- // might do this after updating validcount?
- if ( !(line->flags & ML_TWOSIDED) )
- return false;
-
- // crosses a two sided line
- front = seg->frontsector;
- back = seg->backsector;
+ // stop because it is not two sided anyway
+ // might do this after updating validcount?
+ if ( !(line->flags & ML_TWOSIDED) )
+ return false;
- // no wall to block sight with?
- if (front->floorheight == back->floorheight
- && front->ceilingheight == back->ceilingheight)
- continue;
+ // crosses a two sided line
+ front = seg->frontsector;
+ back = seg->backsector;
- // possible occluder
- // because of ceiling height differences
- if (front->ceilingheight < back->ceilingheight)
- opentop = front->ceilingheight;
- else
- opentop = back->ceilingheight;
+ // no wall to block sight with?
+ if (front->floorheight == back->floorheight
+ && front->ceilingheight == back->ceilingheight)
+ continue;
- // because of ceiling height differences
- if (front->floorheight > back->floorheight)
- openbottom = front->floorheight;
- else
- openbottom = back->floorheight;
-
- // quick test for totally closed doors
- if (openbottom >= opentop)
- return false; // stop
-
- frac = P_InterceptVector2 (&strace, &divl);
-
- if (front->floorheight != back->floorheight)
- {
- slope = FixedDiv (openbottom - sightzstart , frac);
- if (slope > bottomslope)
- bottomslope = slope;
- }
-
- if (front->ceilingheight != back->ceilingheight)
- {
- slope = FixedDiv (opentop - sightzstart , frac);
- if (slope < topslope)
- topslope = slope;
- }
-
- if (topslope <= bottomslope)
- return false; // stop
+ // possible occluder
+ // because of ceiling height differences
+ if (front->ceilingheight < back->ceilingheight)
+ opentop = front->ceilingheight;
+ else
+ opentop = back->ceilingheight;
+
+ // because of ceiling height differences
+ if (front->floorheight > back->floorheight)
+ openbottom = front->floorheight;
+ else
+ openbottom = back->floorheight;
+
+ // quick test for totally closed doors
+ if (openbottom >= opentop)
+ return false; // stop
+
+ frac = P_InterceptVector2 (&strace, &divl);
+
+ if (front->floorheight != back->floorheight)
+ {
+ slope = FixedDiv (openbottom - sightzstart , frac);
+ if (slope > bottomslope)
+ bottomslope = slope;
+ }
+
+ if (front->ceilingheight != back->ceilingheight)
+ {
+ slope = FixedDiv (opentop - sightzstart , frac);
+ if (slope < topslope)
+ topslope = slope;
+ }
+
+ if (topslope <= bottomslope)
+ return false; // stop
}
// passed the subsector ok
- return true;
+ return true;
}
@@ -263,38 +269,40 @@
// Returns true
// if strace crosses the given node successfully.
//
+// [STRIFE] Verified unmodified
+//
boolean P_CrossBSPNode (int bspnum)
{
- node_t* bsp;
- int side;
+ node_t* bsp;
+ int side;
if (bspnum & NF_SUBSECTOR)
{
- if (bspnum == -1)
- return P_CrossSubsector (0);
- else
- return P_CrossSubsector (bspnum&(~NF_SUBSECTOR));
+ if (bspnum == -1)
+ return P_CrossSubsector (0);
+ else
+ return P_CrossSubsector (bspnum&(~NF_SUBSECTOR));
}
-
+
bsp = &nodes[bspnum];
-
+
// decide which side the start point is on
side = P_DivlineSide (strace.x, strace.y, (divline_t *)bsp);
if (side == 2)
- side = 0; // an "on" should cross both sides
+ side = 0; // an "on" should cross both sides
// cross the starting side
if (!P_CrossBSPNode (bsp->children[side]) )
- return false;
-
+ return false;
+
// the partition plane is crossed here
if (side == P_DivlineSide (t2x, t2y,(divline_t *)bsp))
{
- // the line doesn't touch the other side
- return true;
+ // the line doesn't touch the other side
+ return true;
}
-
- // cross the ending side
+
+ // cross the ending side
return P_CrossBSPNode (bsp->children[side^1]);
}
@@ -305,16 +313,18 @@
// if a straight line between t1 and t2 is unobstructed.
// Uses REJECT.
//
+// [STRIFE] Verified unmodified
+//
boolean
P_CheckSight
-( mobj_t* t1,
- mobj_t* t2 )
+( mobj_t* t1,
+ mobj_t* t2 )
{
- int s1;
- int s2;
- int pnum;
- int bytenum;
- int bitnum;
+ int s1;
+ int s2;
+ int pnum;
+ int bytenum;
+ int bitnum;
// First check for trivial rejection.
@@ -328,10 +338,10 @@
// Check in REJECT table.
if (rejectmatrix[bytenum]&bitnum)
{
- sightcounts[0]++;
+ sightcounts[0]++;
- // can't possibly be connected
- return false;
+ // can't possibly be connected
+ return false;
}
// An unobstructed LOS is possible.
@@ -339,11 +349,11 @@
sightcounts[1]++;
validcount++;
-
+
sightzstart = t1->z + t1->height - (t1->height>>2);
topslope = (t2->z+t2->height) - sightzstart;
bottomslope = (t2->z) - sightzstart;
-
+
strace.x = t1->x;
strace.y = t1->y;
t2x = t2->x;
--- a/src/strife/r_data.c
+++ b/src/strife/r_data.c
@@ -27,6 +27,7 @@
#include <stdio.h>
+#include "d_main.h"
#include "deh_main.h"
#include "i_swap.h"
#include "i_system.h"
@@ -483,8 +484,8 @@
for (i=0 ; i<nummappatches ; i++)
{
- strncpy (name,name_p+i*8, 8);
- patchlookup[i] = W_CheckNumForName (name);
+ strncpy (name,name_p+i*8, 8);
+ patchlookup[i] = W_CheckNumForName (name);
}
W_ReleaseLumpName(DEH_String("PNAMES"));
@@ -495,21 +496,21 @@
numtextures1 = LONG(*maptex);
maxoff = W_LumpLength (W_GetNumForName (DEH_String("TEXTURE1")));
directory = maptex+1;
-
+
if (W_CheckNumForName (DEH_String("TEXTURE2")) != -1)
{
- maptex2 = W_CacheLumpName (DEH_String("TEXTURE2"), PU_STATIC);
- numtextures2 = LONG(*maptex2);
- maxoff2 = W_LumpLength (W_GetNumForName (DEH_String("TEXTURE2")));
+ maptex2 = W_CacheLumpName (DEH_String("TEXTURE2"), PU_STATIC);
+ numtextures2 = LONG(*maptex2);
+ maxoff2 = W_LumpLength (W_GetNumForName (DEH_String("TEXTURE2")));
}
else
{
- maptex2 = NULL;
- numtextures2 = 0;
- maxoff2 = 0;
+ maptex2 = NULL;
+ numtextures2 = 0;
+ maxoff2 = 0;
}
numtextures = numtextures1 + numtextures2;
-
+
textures = Z_Malloc (numtextures * sizeof(*textures), PU_STATIC, 0);
texturecolumnlump = Z_Malloc (numtextures * sizeof(*texturecolumnlump), PU_STATIC, 0);
texturecolumnofs = Z_Malloc (numtextures * sizeof(*texturecolumnofs), PU_STATIC, 0);
@@ -529,7 +530,8 @@
// up the box" effect, which uses backspace to "step back" inside
// the box. If stdout is a file, don't draw the box.
- if (I_ConsoleStdout())
+ // haleyjd 20110206 [STRIFE]: box is in devparm only
+ if (devparm && I_ConsoleStdout())
{
printf("[");
for (i = 0; i < temp3 + 9; i++)
@@ -538,62 +540,68 @@
for (i = 0; i < temp3 + 10; i++)
printf("\b");
}
-
+
for (i=0 ; i<numtextures ; i++, directory++)
{
- if (!(i&63))
- printf (".");
+ if (!(i&63))
+ {
+ // [STRIFE]: tick intro if not in devparm
+ if(devparm)
+ printf (".");
+ else
+ D_IntroTick();
+ }
- if (i == numtextures1)
- {
- // Start looking in second texture file.
- maptex = maptex2;
- maxoff = maxoff2;
- directory = maptex+1;
- }
-
- offset = LONG(*directory);
+ if (i == numtextures1)
+ {
+ // Start looking in second texture file.
+ maptex = maptex2;
+ maxoff = maxoff2;
+ directory = maptex+1;
+ }
- if (offset > maxoff)
- I_Error ("R_InitTextures: bad texture directory");
-
- mtexture = (maptexture_t *) ( (byte *)maptex + offset);
+ offset = LONG(*directory);
- texture = textures[i] =
- Z_Malloc (sizeof(texture_t)
- + sizeof(texpatch_t)*(SHORT(mtexture->patchcount)-1),
- PU_STATIC, 0);
-
- texture->width = SHORT(mtexture->width);
- texture->height = SHORT(mtexture->height);
- texture->patchcount = SHORT(mtexture->patchcount);
-
- memcpy (texture->name, mtexture->name, sizeof(texture->name));
- mpatch = &mtexture->patches[0];
- patch = &texture->patches[0];
+ if (offset > maxoff)
+ I_Error ("R_InitTextures: bad texture directory");
- for (j=0 ; j<texture->patchcount ; j++, mpatch++, patch++)
- {
- patch->originx = SHORT(mpatch->originx);
- patch->originy = SHORT(mpatch->originy);
- patch->patch = patchlookup[SHORT(mpatch->patch)];
- if (patch->patch == -1)
- {
- I_Error ("R_InitTextures: Missing patch in texture %s",
- texture->name);
- }
- }
- texturecolumnlump[i] = Z_Malloc (texture->width*sizeof(**texturecolumnlump), PU_STATIC,0);
- texturecolumnofs[i] = Z_Malloc (texture->width*sizeof(**texturecolumnofs), PU_STATIC,0);
+ mtexture = (maptexture_t *) ( (byte *)maptex + offset);
- j = 1;
- while (j*2 <= texture->width)
- j<<=1;
+ texture = textures[i] =
+ Z_Malloc (sizeof(texture_t)
+ + sizeof(texpatch_t)*(SHORT(mtexture->patchcount)-1),
+ PU_STATIC, 0);
- texturewidthmask[i] = j-1;
- textureheight[i] = texture->height<<FRACBITS;
-
- totalwidth += texture->width;
+ texture->width = SHORT(mtexture->width);
+ texture->height = SHORT(mtexture->height);
+ texture->patchcount = SHORT(mtexture->patchcount);
+
+ memcpy (texture->name, mtexture->name, sizeof(texture->name));
+ mpatch = &mtexture->patches[0];
+ patch = &texture->patches[0];
+
+ for (j=0 ; j<texture->patchcount ; j++, mpatch++, patch++)
+ {
+ patch->originx = SHORT(mpatch->originx);
+ patch->originy = SHORT(mpatch->originy);
+ patch->patch = patchlookup[SHORT(mpatch->patch)];
+ if (patch->patch == -1)
+ {
+ I_Error ("R_InitTextures: Missing patch in texture %s",
+ texture->name);
+ }
+ }
+ texturecolumnlump[i] = Z_Malloc (texture->width*sizeof(**texturecolumnlump), PU_STATIC,0);
+ texturecolumnofs[i] = Z_Malloc (texture->width*sizeof(**texturecolumnofs), PU_STATIC,0);
+
+ j = 1;
+ while (j*2 <= texture->width)
+ j<<=1;
+
+ texturewidthmask[i] = j-1;
+ textureheight[i] = texture->height<<FRACBITS;
+
+ totalwidth += texture->width;
}
Z_Free(patchlookup);
@@ -601,17 +609,22 @@
W_ReleaseLumpName(DEH_String("TEXTURE1"));
if (maptex2)
W_ReleaseLumpName(DEH_String("TEXTURE2"));
-
+
// Precalculate whatever possible.
for (i=0 ; i<numtextures ; i++)
- R_GenerateLookup (i);
-
+ {
+ // [STRIFE]: tick intro
+ if(!(i & 63))
+ D_IntroTick();
+ R_GenerateLookup (i);
+ }
+
// Create translation table for global animation.
texturetranslation = Z_Malloc ((numtextures+1)*sizeof(*texturetranslation), PU_STATIC, 0);
-
+
for (i=0 ; i<numtextures ; i++)
- texturetranslation[i] = i;
+ texturetranslation[i] = i;
GenerateTextureHashTable();
}
@@ -647,24 +660,30 @@
{
int i;
patch_t *patch;
-
+
firstspritelump = W_GetNumForName (DEH_String("S_START")) + 1;
lastspritelump = W_GetNumForName (DEH_String("S_END")) - 1;
-
+
numspritelumps = lastspritelump - firstspritelump + 1;
spritewidth = Z_Malloc (numspritelumps*sizeof(*spritewidth), PU_STATIC, 0);
spriteoffset = Z_Malloc (numspritelumps*sizeof(*spriteoffset), PU_STATIC, 0);
spritetopoffset = Z_Malloc (numspritelumps*sizeof(*spritetopoffset), PU_STATIC, 0);
-
+
for (i=0 ; i< numspritelumps ; i++)
{
- if (!(i&63))
- printf (".");
+ if(!(i&63))
+ {
+ // [STRIFE] tick intro if not in devparm
+ if(devparm)
+ printf (".");
+ else
+ D_IntroTick();
+ }
- patch = W_CacheLumpNum (firstspritelump+i, PU_CACHE);
- spritewidth[i] = SHORT(patch->width)<<FRACBITS;
- spriteoffset[i] = SHORT(patch->leftoffset)<<FRACBITS;
- spritetopoffset[i] = SHORT(patch->topoffset)<<FRACBITS;
+ patch = W_CacheLumpNum (firstspritelump+i, PU_CACHE);
+ spritewidth[i] = SHORT(patch->width)<<FRACBITS;
+ spriteoffset[i] = SHORT(patch->leftoffset)<<FRACBITS;
+ spritetopoffset[i] = SHORT(patch->topoffset)<<FRACBITS;
}
}
@@ -695,11 +714,23 @@
void R_InitData (void)
{
R_InitTextures ();
- printf (".");
+ if(devparm)
+ printf (".");
+ else
+ D_IntroTick(); // [STRIFE] tick intro
+
R_InitFlats ();
- printf (".");
+ if(devparm)
+ printf (".");
+ else
+ D_IntroTick();
+
R_InitSpriteLumps ();
- printf (".");
+ if(devparm)
+ printf (".");
+ else
+ D_IntroTick();
+
R_InitColormaps ();
}
--- a/src/strife/r_main.c
+++ b/src/strife/r_main.c
@@ -36,6 +36,7 @@
#include "doomdef.h"
#include "doomstat.h" // villsa [STRIFE]
+#include "d_main.h"
#include "d_net.h"
#include "m_bbox.h"
@@ -782,22 +783,41 @@
void R_Init (void)
{
R_InitData ();
- printf (".");
+ if(devparm)
+ printf (".");
+ else
+ D_IntroTick(); // [STRIFE] tick intro
+
R_InitPointToAngle ();
- printf (".");
+ if(devparm)
+ printf (".");
+
R_InitTables ();
// viewwidth / viewheight / detailLevel are set by the defaults
- printf (".");
+ if(devparm)
+ printf (".");
R_SetViewSize (screenblocks, detailLevel);
R_InitPlanes ();
- printf (".");
+ if(devparm)
+ printf (".");
+
R_InitLightTables ();
- printf (".");
+ if(devparm)
+ printf (".");
+ else
+ D_IntroTick();
+
R_InitSkyMap ();
+ if(!devparm)
+ D_IntroTick();
+
R_InitTranslationTables ();
- printf (".");
-
+ if(devparm)
+ printf (".");
+ else
+ D_IntroTick();
+
framecount = 0;
}
--- a/src/strife/st_stuff.c
+++ b/src/strife/st_stuff.c
@@ -556,8 +556,8 @@
// STRIFE-TODO: "dev" cheat - is this the "DOTS" cheat?
else if (cht_CheckCheat(&cheat_dev, ev->data2))
{
- debugmode = !debugmode;
- if (debugmode)
+ devparm = !devparm;
+ if (devparm)
plyr->message = DEH_String("devparm ON");
else
plyr->message = DEH_String("devparm OFF");