SRB2 2.1.5 release

This commit is contained in:
Alam Ed Arias 2014-03-23 12:00:29 -04:00
parent 3a5fcc58da
commit 15bd266cac
23 changed files with 344 additions and 140 deletions

View File

@ -25,36 +25,64 @@
#endif #endif
// For use if I do walls with outsides/insides // For use if I do walls with outsides/insides
static const UINT8 GREENS = (10*16); static const UINT8 REDS = (8*16);
static const UINT8 GREENRANGE = 16; static const UINT8 REDRANGE = 16;
static const UINT8 GRAYS = (0*16); static const UINT8 GRAYS = (1*16);
static const UINT8 GRAYSRANGE = 16; static const UINT8 GRAYSRANGE = 16;
static const UINT8 DBLACK = 31; static const UINT8 BROWNS = (3*16);
static const UINT8 DWHITE = 0; static const UINT8 BROWNRANGE = 16;
static const UINT8 YELLOWS = (7*16);
static const UINT8 YELLOWRANGE = 8;
static const UINT8 GREENS = (10*16);
static const UINT8 GREENRANGE = 16;
static const UINT8 DBLACK = 31;
static const UINT8 DWHITE = 0;
static const UINT8 NOCLIMBREDS = 248;
static const UINT8 NOCLIMBREDRANGE = 8;
static const UINT8 NOCLIMBGRAYS = 204;
static const UINT8 NOCLIMBGRAYSRANGE = 4;
static const UINT8 NOCLIMBBROWNS = (2*16);
static const UINT8 NOCLIMBBROWNRANGE = 16;
static const UINT8 NOCLIMBYELLOWS = (11*16);
static const UINT8 NOCLIMBYELLOWRANGE = 8;
#ifdef _NDS #ifdef _NDS
#undef BACKGROUND #undef BACKGROUND
#endif #endif
// Automap colors // Automap colors
#define BACKGROUND DBLACK #define BACKGROUND DBLACK
#define YOURCOLORS DWHITE #define YOURCOLORS DWHITE
#define YOURRANGE 0 #define YOURRANGE 0
#define WALLCOLORS REDS #define WALLCOLORS (REDS + REDRANGE/2)
#define WALLRANGE REDRANGE #define WALLRANGE (REDRANGE/2)
#define TSWALLCOLORS GRAYS #define NOCLIMBWALLCOLORS (NOCLIMBREDS + NOCLIMBREDRANGE/2)
#define TSWALLRANGE GRAYSRANGE #define NOCLIMBWALLRANGE (NOCLIMBREDRANGE/2)
#define FDWALLCOLORS BROWNS #define THOKWALLCOLORS REDS
#define FDWALLRANGE BROWNRANGE #define THOKWALLRANGE REDRANGE
#define CDWALLCOLORS YELLOWS #define NOCLIMBTHOKWALLCOLORS NOCLIMBREDS
#define CDWALLRANGE YELLOWRANGE #define NOCLIMBTHOKWALLRANGE NOCLIMBREDRANGE
#define THINGCOLORS GREENS #define TSWALLCOLORS GRAYS
#define THINGRANGE GREENRANGE #define TSWALLRANGE GRAYSRANGE
#define SECRETWALLCOLORS WALLCOLORS #define NOCLIMBTSWALLCOLORS NOCLIMBGRAYS
#define SECRETWALLRANGE WALLRANGE #define NOCLIMBTSWALLRANGE NOCLIMBGRAYSRANGE
#define GRIDCOLORS (GRAYS + GRAYSRANGE/2) #define FDWALLCOLORS BROWNS
#define GRIDRANGE 0 #define FDWALLRANGE BROWNRANGE
#define XHAIRCOLORS GRAYS #define NOCLIMBFDWALLCOLORS NOCLIMBBROWNS
#define NOCLIMBFDWALLRANGE NOCLIMBBROWNRANGE
#define CDWALLCOLORS YELLOWS
#define CDWALLRANGE YELLOWRANGE
#define NOCLIMBCDWALLCOLORS NOCLIMBYELLOWS
#define NOCLIMBCDWALLRANGE NOCLIMBYELLOWRANGE
#define THINGCOLORS GREENS
#define THINGRANGE GREENRANGE
#define SECRETWALLCOLORS WALLCOLORS
#define SECRETWALLRANGE WALLRANGE
#define GRIDCOLORS (GRAYS + GRAYSRANGE/2)
#define GRIDRANGE 0
#define XHAIRCOLORS GRAYS
// drawing stuff // drawing stuff
#define FB 0 #define FB 0
@ -1009,7 +1037,75 @@ static inline void AM_drawWalls(void)
l.b.x = lines[i].v2->x; l.b.x = lines[i].v2->x;
l.b.y = lines[i].v2->y; l.b.y = lines[i].v2->y;
AM_drawMline(&l, GRAYS + 3); // AM_drawMline(&l, GRAYS + 3); // Old, everything-is-gray automap
if (!lines[i].backsector) // 1-sided
{
if (lines[i].flags & ML_NOCLIMB)
{
AM_drawMline(&l, NOCLIMBWALLCOLORS+lightlev);
}
else
{
AM_drawMline(&l, WALLCOLORS+lightlev);
}
}
else if (lines[i].backsector->floorheight == lines[i].backsector->ceilingheight // Back is thok barrier
|| lines[i].frontsector->floorheight == lines[i].frontsector->ceilingheight) // Front is thok barrier
{
if (lines[i].backsector->floorheight == lines[i].backsector->ceilingheight
&& lines[i].frontsector->floorheight == lines[i].frontsector->ceilingheight) // BOTH are thok barriers
{
if (lines[i].flags & ML_NOCLIMB)
{
AM_drawMline(&l, NOCLIMBTSWALLCOLORS+lightlev);
}
else
{
AM_drawMline(&l, TSWALLCOLORS+lightlev);
}
}
else
{
if (lines[i].flags & ML_NOCLIMB)
{
AM_drawMline(&l, NOCLIMBTHOKWALLCOLORS+lightlev);
}
else
{
AM_drawMline(&l, THOKWALLCOLORS+lightlev);
}
}
}
else
{
if (lines[i].flags & ML_NOCLIMB) {
if (lines[i].backsector->floorheight
!= lines[i].frontsector->floorheight) {
AM_drawMline(&l, NOCLIMBFDWALLCOLORS + lightlev); // floor level change
}
else if (lines[i].backsector->ceilingheight
!= lines[i].frontsector->ceilingheight) {
AM_drawMline(&l, NOCLIMBCDWALLCOLORS+lightlev); // ceiling level change
}
else {
AM_drawMline(&l, NOCLIMBTSWALLCOLORS+lightlev);
}
}
else
{
if (lines[i].backsector->floorheight
!= lines[i].frontsector->floorheight) {
AM_drawMline(&l, FDWALLCOLORS + lightlev); // floor level change
}
else if (lines[i].backsector->ceilingheight
!= lines[i].frontsector->ceilingheight) {
AM_drawMline(&l, CDWALLCOLORS+lightlev); // ceiling level change
}
else {
AM_drawMline(&l, TSWALLCOLORS+lightlev);
}
}
}
} }
} }

View File

@ -759,7 +759,10 @@ static inline void resynch_write_ctf(resynchend_pak *rst)
// Should be held by a player // Should be held by a player
for (j = 0; j < MAXPLAYERS; ++j) for (j = 0; j < MAXPLAYERS; ++j)
{ {
if (!playeringame[j] || players[j].gotflag != i) // GF_REDFLAG is 1, GF_BLUEFLAG is 2
// redflag handling is i=0, blueflag is i=1
// so check for gotflag == (i+1)
if (!playeringame[j] || players[j].gotflag != (i+1))
continue; continue;
rst->flagplayer[i] = (SINT8)j; rst->flagplayer[i] = (SINT8)j;
break; break;
@ -2229,7 +2232,11 @@ static void CL_RemovePlayer(INT32 playernum)
void CL_Reset(void) void CL_Reset(void)
{ {
if (demorecording || metalrecording) if (metalrecording)
G_StopMetalRecording();
if (metalplayback)
G_StopMetalDemo();
if (demorecording)
G_CheckDemoStatus(); G_CheckDemoStatus();
// reset client/server code // reset client/server code
@ -2954,8 +2961,10 @@ boolean Playing(void)
boolean SV_SpawnServer(void) boolean SV_SpawnServer(void)
{ {
if (demoplayback || metalplayback) if (demoplayback)
G_StopDemo(); // reset engine parameter G_StopDemo(); // reset engine parameter
if (metalplayback)
G_StopMetalDemo();
if (!serverrunning) if (!serverrunning)
{ {

View File

@ -1090,14 +1090,14 @@ void D_SRB2Main(void)
#endif #endif
D_CleanFile(); D_CleanFile();
#if 1 // md5s last updated 3/18/14 #if 1 // md5s last updated 3/22/14
// Check MD5s of autoloaded files // Check MD5s of autoloaded files
W_VerifyFileMD5(0, "ac309fb3c7d4b5b685e2cd26beccf0e8"); // srb2.srb/srb2.wad W_VerifyFileMD5(0, "ac309fb3c7d4b5b685e2cd26beccf0e8"); // srb2.srb/srb2.wad
W_VerifyFileMD5(1, "a894044b555dfcc71865cee16a996e88"); // zones.dta W_VerifyFileMD5(1, "a894044b555dfcc71865cee16a996e88"); // zones.dta
W_VerifyFileMD5(2, "4c410c1de6e0440cc5b2858dcca80c3e"); // player.dta W_VerifyFileMD5(2, "4c410c1de6e0440cc5b2858dcca80c3e"); // player.dta
W_VerifyFileMD5(3, "85901ad4bf94637e5753d2ac2c03ea26"); // rings.dta W_VerifyFileMD5(3, "85901ad4bf94637e5753d2ac2c03ea26"); // rings.dta
W_VerifyFileMD5(4, "e868046d2d2da1d8c706c900edfb03f8"); // patch.dta W_VerifyFileMD5(4, "4d56695e194a6fd3bc5c87610a215186"); // patch.dta
// don't check music.dta because people like to modify it, and it doesn't matter if they do // don't check music.dta because people like to modify it, and it doesn't matter if they do
// ...except it does if they slip maps in there, and that's what W_VerifyNMUSlumps is for. // ...except it does if they slip maps in there, and that's what W_VerifyNMUSlumps is for.

View File

@ -129,10 +129,10 @@ boolean Net_GetNetStat(void)
// ----------------------------------------------------------------- // -----------------------------------------------------------------
// Some structs and functions for acknowledgement of packets // Some structs and functions for acknowledgement of packets
// ----------------------------------------------------------------- // -----------------------------------------------------------------
#define MAXACKPACKETS 64 // minimum number of nodes #define MAXACKPACKETS 96 // minimum number of nodes
#define MAXACKTOSEND 64 #define MAXACKTOSEND 96
#define URGENTFREESLOTENUM 6 #define URGENTFREESLOTENUM 10
#define ACKTOSENDTIMEOUT (TICRATE/17) #define ACKTOSENDTIMEOUT (TICRATE/11)
#ifndef NONET #ifndef NONET
typedef struct typedef struct

View File

@ -1575,15 +1575,18 @@ static void Command_Playdemo_f(void)
return; return;
} }
// disconnect from server here?
if (demoplayback || metalplayback)
G_StopDemo();
if (netgame) if (netgame)
{ {
CONS_Printf(M_GetText("You can't play a demo while in a netgame.\n")); CONS_Printf(M_GetText("You can't play a demo while in a netgame.\n"));
return; return;
} }
// disconnect from server here?
if (demoplayback)
G_StopDemo();
if (metalplayback)
G_StopMetalDemo();
// open the demo file // open the demo file
strcpy(name, COM_Argv(1)); strcpy(name, COM_Argv(1));
// dont add .lmp so internal game demos can be played // dont add .lmp so internal game demos can be played
@ -1603,15 +1606,18 @@ static void Command_Timedemo_f(void)
return; return;
} }
// disconnect from server here?
if (demoplayback || metalplayback)
G_StopDemo();
if (netgame) if (netgame)
{ {
CONS_Printf(M_GetText("You can't play a demo while in a netgame.\n")); CONS_Printf(M_GetText("You can't play a demo while in a netgame.\n"));
return; return;
} }
// disconnect from server here?
if (demoplayback)
G_StopDemo();
if (metalplayback)
G_StopMetalDemo();
// open the demo file // open the demo file
strcpy (name, COM_Argv(1)); strcpy (name, COM_Argv(1));
// dont add .lmp so internal game demos can be played // dont add .lmp so internal game demos can be played
@ -1970,6 +1976,7 @@ static void Got_Mapcmd(UINT8 **cp, INT32 playernum)
if (demorecording) // Okay, level loaded, character spawned and skinned, if (demorecording) // Okay, level loaded, character spawned and skinned,
G_BeginRecording(); // I AM NOW READY TO RECORD. G_BeginRecording(); // I AM NOW READY TO RECORD.
demo_start = true; demo_start = true;
metal_start = true;
} }
static void Command_Pause(void) static void Command_Pause(void)

View File

@ -36,8 +36,11 @@ typedef enum
BT_CAMRIGHT = 1<<9, // turn camera right BT_CAMRIGHT = 1<<9, // turn camera right
BT_TOSSFLAG = 1<<10, BT_TOSSFLAG = 1<<10,
BT_JUMP = 1<<11, BT_JUMP = 1<<11,
BT_FIRENORMAL = 1<<12 // Fire a normal ring no matter what BT_FIRENORMAL = 1<<12, // Fire a normal ring no matter what
// free: up to and including 1<<15
BT_CUSTOM1 = 1<<13,
BT_CUSTOM2 = 1<<14,
BT_CUSTOM3 = 1<<15,
} buttoncode_t; } buttoncode_t;
// The data sampled per tick (single player) // The data sampled per tick (single player)

View File

@ -7101,6 +7101,7 @@ static const char *const MOBJFLAG_LIST[] = {
"STICKY", "STICKY",
"NIGHTSITEM", "NIGHTSITEM",
"NOCLIPTHING", "NOCLIPTHING",
"GRENADEBOUNCE",
"RUNSPAWNFUNC", "RUNSPAWNFUNC",
NULL NULL
}; };
@ -7648,6 +7649,9 @@ struct {
{"BT_TOSSFLAG",BT_TOSSFLAG}, {"BT_TOSSFLAG",BT_TOSSFLAG},
{"BT_JUMP",BT_JUMP}, {"BT_JUMP",BT_JUMP},
{"BT_FIRENORMAL",BT_FIRENORMAL}, // Fire a normal ring no matter what {"BT_FIRENORMAL",BT_FIRENORMAL}, // Fire a normal ring no matter what
{"BT_CUSTOM1",BT_CUSTOM1}, // Lua customizable
{"BT_CUSTOM2",BT_CUSTOM2}, // Lua customizable
{"BT_CUSTOM3",BT_CUSTOM3}, // Lua customizable
// cvflags_t // cvflags_t
{"CV_SAVE",CV_SAVE}, {"CV_SAVE",CV_SAVE},

View File

@ -144,8 +144,8 @@ extern FILE *logstream;
#define VERSIONSTRING "Trunk" #define VERSIONSTRING "Trunk"
#else #else
#define VERSION 201 // Game version #define VERSION 201 // Game version
#define SUBVERSION 4 // more precise version number #define SUBVERSION 5 // more precise version number
#define VERSIONSTRING "v2.1.4" #define VERSIONSTRING "v2.1.5"
#endif #endif
// Modification options // Modification options
@ -201,7 +201,7 @@ extern FILE *logstream;
// it's only for detection of the version the player is using so the MS can alert them of an update. // it's only for detection of the version the player is using so the MS can alert them of an update.
// Only set it higher, not lower, obviously. // Only set it higher, not lower, obviously.
// Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1". // Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1".
#define MODVERSION 9 #define MODVERSION 10

View File

@ -231,14 +231,17 @@ boolean demorecording;
boolean demoplayback; boolean demoplayback;
boolean titledemo; // Title Screen demo can be cancelled by any key boolean titledemo; // Title Screen demo can be cancelled by any key
static UINT8 *demobuffer = NULL; static UINT8 *demobuffer = NULL;
static UINT8 *metalbuffer = NULL; static UINT8 *demo_p, *demotime_p;
static UINT8 *demo_p, *metal_p, *demotime_p;
static UINT8 *demoend; static UINT8 *demoend;
static UINT8 demoflags; static UINT8 demoflags;
boolean singledemo; // quit after playing a demo from cmdline boolean singledemo; // quit after playing a demo from cmdline
boolean demo_start; // don't start playing demo right away
boolean metalrecording; // recording as metal sonic boolean metalrecording; // recording as metal sonic
mobj_t *metalplayback; mobj_t *metalplayback;
boolean demo_start; // don't start playing demo right away static UINT8 *metalbuffer = NULL;
static UINT8 *metal_p;
boolean metal_start;
// extra data stuff (events registered this frame while recording) // extra data stuff (events registered this frame while recording)
static struct { static struct {
@ -1046,8 +1049,16 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
if (PLAYER1INPUTDOWN(gc_tossflag)) if (PLAYER1INPUTDOWN(gc_tossflag))
cmd->buttons |= BT_TOSSFLAG; cmd->buttons |= BT_TOSSFLAG;
// Lua scriptable buttons
if (PLAYER1INPUTDOWN(gc_custom1))
cmd->buttons |= BT_CUSTOM1;
if (PLAYER1INPUTDOWN(gc_custom2))
cmd->buttons |= BT_CUSTOM2;
if (PLAYER1INPUTDOWN(gc_custom3))
cmd->buttons |= BT_CUSTOM3;
// use with any button/key // use with any button/key
if (PLAYER1INPUTDOWN(gc_use) && !(player->pflags & PF_MACESPIN)) if (PLAYER1INPUTDOWN(gc_use))
cmd->buttons |= BT_USE; cmd->buttons |= BT_USE;
// Camera Controls // Camera Controls
@ -1315,6 +1326,14 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
if (PLAYER2INPUTDOWN(gc_tossflag)) if (PLAYER2INPUTDOWN(gc_tossflag))
cmd->buttons |= BT_TOSSFLAG; cmd->buttons |= BT_TOSSFLAG;
// Lua scriptable buttons
if (PLAYER2INPUTDOWN(gc_custom1))
cmd->buttons |= BT_CUSTOM1;
if (PLAYER2INPUTDOWN(gc_custom2))
cmd->buttons |= BT_CUSTOM2;
if (PLAYER2INPUTDOWN(gc_custom3))
cmd->buttons |= BT_CUSTOM3;
// use with any button/key // use with any button/key
if (PLAYER2INPUTDOWN(gc_use)) if (PLAYER2INPUTDOWN(gc_use))
cmd->buttons |= BT_USE; cmd->buttons |= BT_USE;
@ -2645,8 +2664,10 @@ static void G_DoCompleted(void)
gameaction = ga_nothing; gameaction = ga_nothing;
if (metalrecording || metalplayback) if (metalplayback)
G_CheckDemoStatus(); G_StopMetalDemo();
if (metalrecording)
G_StopMetalRecording();
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
if (playeringame[i]) if (playeringame[i])
@ -4200,7 +4221,7 @@ void G_ReadMetalTic(mobj_t *metal)
UINT16 speed; UINT16 speed;
UINT8 statetype; UINT8 statetype;
if (!metal_p || !demo_start) if (!metal_p || !metal_start)
return; return;
ziptic = READUINT8(metal_p); ziptic = READUINT8(metal_p);
@ -4289,7 +4310,7 @@ void G_ReadMetalTic(mobj_t *metal)
if (*metal_p == DEMOMARKER) if (*metal_p == DEMOMARKER)
{ {
// end of demo data stream // end of demo data stream
G_CheckDemoStatus(); G_StopMetalDemo();
return; return;
} }
} }
@ -4396,7 +4417,7 @@ void G_WriteMetalTic(mobj_t *metal)
// latest demos with mouse aiming byte in ticcmd // latest demos with mouse aiming byte in ticcmd
if (demo_p >= demoend - 32) if (demo_p >= demoend - 32)
{ {
G_CheckDemoStatus(); // no more space G_StopMetalRecording(); // no more space
return; return;
} }
} }
@ -4871,6 +4892,7 @@ void G_DoPlayDemo(char *defdemoname)
// didn't start recording right away. // didn't start recording right away.
demo_start = false; demo_start = false;
metal_start = false;
#ifdef HAVE_BLUA #ifdef HAVE_BLUA
LUAh_MapChange(); LUAh_MapChange();
@ -4916,6 +4938,7 @@ void G_DoPlayDemo(char *defdemoname)
players[0].jumpfactor = jumpfactor; players[0].jumpfactor = jumpfactor;
demo_start = true; demo_start = true;
metal_start = true;
} }
void G_AddGhost(char *defdemoname) void G_AddGhost(char *defdemoname)
@ -5168,6 +5191,7 @@ void G_DoPlayMetal(void)
if (!mo) if (!mo)
{ {
CONS_Alert(CONS_ERROR, M_GetText("Failed to find bot entity.\n")); CONS_Alert(CONS_ERROR, M_GetText("Failed to find bot entity.\n"));
Z_Free(metalbuffer);
return; return;
} }
@ -5215,18 +5239,46 @@ void G_DoneLevelLoad(void)
=================== ===================
*/ */
// Stops metal sonic's demo. Separate from other functions because metal + replays can coexist
void G_StopMetalDemo(void)
{
// Metal Sonic finishing doesn't end the game, dammit.
Z_Free(metalbuffer);
metalbuffer = NULL;
metalplayback = NULL;
metal_p = NULL;
}
// Stops metal sonic recording.
ATTRNORETURN void FUNCNORETURN G_StopMetalRecording(void)
{
boolean saved = false;
if (demo_p)
{
UINT8 *p = demobuffer+16; // checksum position
#ifdef NOMD5
UINT8 i;
WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker
for (i = 0; i < 16; i++, p++)
*p = P_Random(); // This MD5 was chosen by fair dice roll and most likely < 50% correct.
#else
WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker
md5_buffer((char *)p+16, demo_p - (p+16), (void *)p); // make a checksum of everything after the checksum in the file.
#endif
saved = FIL_WriteFile(va("%sMS.LMP", G_BuildMapName(gamemap)), demobuffer, demo_p - demobuffer); // finally output the file.
}
free(demobuffer);
metalrecording = false;
if (saved)
I_Error("Saved to %sMS.LMP", G_BuildMapName(gamemap));
I_Error("Failed to save demo!");
}
// reset engine variable set for the demos // reset engine variable set for the demos
// called from stopdemo command, map command, and g_checkdemoStatus. // called from stopdemo command, map command, and g_checkdemoStatus.
void G_StopDemo(void) void G_StopDemo(void)
{ {
if (metalplayback)
{ // Metal Sonic finishing doesn't end the game, dammit.
Z_Free(metalbuffer);
metalbuffer = NULL;
metalplayback = NULL;
if (!demoplayback)
return;
}
Z_Free(demobuffer); Z_Free(demobuffer);
demobuffer = NULL; demobuffer = NULL;
demoplayback = false; demoplayback = false;
@ -5250,31 +5302,7 @@ boolean G_CheckDemoStatus(void)
if(ghosts) // ... ... ... if(ghosts) // ... ... ...
ghosts = NULL; // :) ghosts = NULL; // :)
if (metalrecording) // DO NOT end metal sonic demos here
{
saved = false;
if (demo_p)
{
UINT8 *p = demobuffer+16; // checksum position
#ifdef NOMD5
UINT8 i;
WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker
for (i = 0; i < 16; i++, p++)
*p = P_Random(); // This MD5 was chosen by fair dice roll and most likely < 50% correct.
#else
WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker
md5_buffer((char *)p+16, demo_p - (p+16), (void *)p); // make a checksum of everything after the checksum in the file.
#endif
saved = FIL_WriteFile(va("%sMS.LMP", G_BuildMapName(gamemap)), demobuffer, demo_p - demobuffer); // finally output the file.
}
free(demobuffer);
metalrecording = false;
if (saved)
I_Error("Saved to %sMS.LMP", G_BuildMapName(gamemap));
else
I_Error("Failed to save demo!");
return true;
}
if (timingdemo) if (timingdemo)
{ {
@ -5334,12 +5362,6 @@ boolean G_CheckDemoStatus(void)
return true; return true;
} }
if (metalplayback)
{
G_StopDemo();
return false;
}
return false; return false;
} }

View File

@ -37,12 +37,14 @@ extern boolean playeringame[MAXPLAYERS];
// demoplaying back and demo recording // demoplaying back and demo recording
extern boolean demoplayback, titledemo, demorecording, timingdemo; extern boolean demoplayback, titledemo, demorecording, timingdemo;
extern mobj_t *metalplayback;
// Quit after playing a demo from cmdline. // Quit after playing a demo from cmdline.
extern boolean singledemo; extern boolean singledemo;
extern boolean demo_start; extern boolean demo_start;
extern mobj_t *metalplayback;
extern boolean metal_start;
// gametic at level start // gametic at level start
extern tic_t levelstarttic; extern tic_t levelstarttic;
@ -150,6 +152,8 @@ void G_TimeDemo(const char *name);
void G_AddGhost(char *defdemoname); void G_AddGhost(char *defdemoname);
void G_DoPlayMetal(void); void G_DoPlayMetal(void);
void G_DoneLevelLoad(void); void G_DoneLevelLoad(void);
void G_StopMetalDemo(void);
ATTRNORETURN void FUNCNORETURN G_StopMetalRecording(void);
void G_StopDemo(void); void G_StopDemo(void);
boolean G_CheckDemoStatus(void); boolean G_CheckDemoStatus(void);

View File

@ -989,6 +989,9 @@ static const char *gamecontrolname[num_gamecontrols] =
"jump", "jump",
"console", "console",
"pause", "pause",
"custom1",
"custom2",
"custom3",
}; };
#define NUMKEYNAMES (sizeof (keynames)/sizeof (keyname_t)) #define NUMKEYNAMES (sizeof (keynames)/sizeof (keyname_t))

View File

@ -118,6 +118,9 @@ typedef enum
gc_jump, gc_jump,
gc_console, gc_console,
gc_pause, gc_pause,
gc_custom1, // Lua scriptable
gc_custom2, // Lua scriptable
gc_custom3, // Lua scriptable
num_gamecontrols num_gamecontrols
} gamecontrols_e; } gamecontrols_e;

View File

@ -1714,19 +1714,19 @@ static void HU_DrawCoopOverlay(void)
#endif #endif
if (emeralds & EMERALD1) if (emeralds & EMERALD1)
V_DrawScaledPatch((BASEVIDWIDTH/2)-8 , (BASEVIDHEIGHT/3)-32, V_TRANSLUCENT, emeraldpics[0]); V_DrawScaledPatch((BASEVIDWIDTH/2)-8 , (BASEVIDHEIGHT/3)-32, 0, emeraldpics[0]);
if (emeralds & EMERALD2) if (emeralds & EMERALD2)
V_DrawScaledPatch((BASEVIDWIDTH/2)-8+24, (BASEVIDHEIGHT/3)-16, V_TRANSLUCENT, emeraldpics[1]); V_DrawScaledPatch((BASEVIDWIDTH/2)-8+24, (BASEVIDHEIGHT/3)-16, 0, emeraldpics[1]);
if (emeralds & EMERALD3) if (emeralds & EMERALD3)
V_DrawScaledPatch((BASEVIDWIDTH/2)-8+24, (BASEVIDHEIGHT/3)+16, V_TRANSLUCENT, emeraldpics[2]); V_DrawScaledPatch((BASEVIDWIDTH/2)-8+24, (BASEVIDHEIGHT/3)+16, 0, emeraldpics[2]);
if (emeralds & EMERALD4) if (emeralds & EMERALD4)
V_DrawScaledPatch((BASEVIDWIDTH/2)-8 , (BASEVIDHEIGHT/3)+32, V_TRANSLUCENT, emeraldpics[3]); V_DrawScaledPatch((BASEVIDWIDTH/2)-8 , (BASEVIDHEIGHT/3)+32, 0, emeraldpics[3]);
if (emeralds & EMERALD5) if (emeralds & EMERALD5)
V_DrawScaledPatch((BASEVIDWIDTH/2)-8-24, (BASEVIDHEIGHT/3)+16, V_TRANSLUCENT, emeraldpics[4]); V_DrawScaledPatch((BASEVIDWIDTH/2)-8-24, (BASEVIDHEIGHT/3)+16, 0, emeraldpics[4]);
if (emeralds & EMERALD6) if (emeralds & EMERALD6)
V_DrawScaledPatch((BASEVIDWIDTH/2)-8-24, (BASEVIDHEIGHT/3)-16, V_TRANSLUCENT, emeraldpics[5]); V_DrawScaledPatch((BASEVIDWIDTH/2)-8-24, (BASEVIDHEIGHT/3)-16, 0, emeraldpics[5]);
if (emeralds & EMERALD7) if (emeralds & EMERALD7)
V_DrawScaledPatch((BASEVIDWIDTH/2)-8 , (BASEVIDHEIGHT/3) , V_TRANSLUCENT, emeraldpics[6]); V_DrawScaledPatch((BASEVIDWIDTH/2)-8 , (BASEVIDHEIGHT/3) , 0, emeraldpics[6]);
} }
static void HU_DrawNetplayCoopOverlay(void) static void HU_DrawNetplayCoopOverlay(void)
@ -1741,7 +1741,7 @@ static void HU_DrawNetplayCoopOverlay(void)
for (i = 0; i < 7; ++i) for (i = 0; i < 7; ++i)
{ {
if (emeralds & (1 << i)) if (emeralds & (1 << i))
V_DrawScaledPatch(20 + (i * 20), 6, V_TRANSLUCENT, emeraldpics[i]); V_DrawScaledPatch(20 + (i * 20), 6, 0, emeraldpics[i]);
} }
} }

View File

@ -4817,10 +4817,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
24*FRACUNIT, // radius 24*FRACUNIT, // radius
24*FRACUNIT, // height 24*FRACUNIT, // height
0, // display offset 0, // display offset
100, // mass 20*TICRATE, // mass
48*FRACUNIT, // damage 48*FRACUNIT, // damage
sfx_s3k5d, // activesound sfx_s3k5d, // activesound
MF_NOBLOCKMAP|MF_MISSILE|MF_BOUNCE, // flags MF_NOBLOCKMAP|MF_MISSILE|MF_BOUNCE|MF_GRENADEBOUNCE, // flags
S_NULL // raisestate S_NULL // raisestate
}, },
@ -11936,7 +11936,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
6*TICRATE, // mass (<-- Looking for the Grenade Ring's fuse? It's right here!) 6*TICRATE, // mass (<-- Looking for the Grenade Ring's fuse? It's right here!)
1, // damage 1, // damage
sfx_s3k5d, // activesound sfx_s3k5d, // activesound
MF_NOBLOCKMAP|MF_MISSILE|MF_BOUNCE, // flags MF_NOBLOCKMAP|MF_MISSILE|MF_BOUNCE|MF_GRENADEBOUNCE, // flags
S_NULL // raisestate S_NULL // raisestate
}, },

View File

@ -195,6 +195,15 @@ static int patch_set(lua_State *L)
// lib_draw // lib_draw
// //
static int libd_patchExists(lua_State *L)
{
if (!hud_running)
return luaL_error(L, "HUD rendering code should not be called outside of rendering hooks!");
lua_pushboolean(L, W_CheckNumForName(luaL_checkstring(L, 1)) != LUMPERROR);
return 1;
}
static int libd_cachePatch(lua_State *L) static int libd_cachePatch(lua_State *L)
{ {
if (!hud_running) if (!hud_running)
@ -342,6 +351,7 @@ static int libd_stringWidth(lua_State *L)
} }
static luaL_Reg lib_draw[] = { static luaL_Reg lib_draw[] = {
{"patchExists", libd_patchExists},
{"cachePatch", libd_cachePatch}, {"cachePatch", libd_cachePatch},
{"draw", libd_draw}, {"draw", libd_draw},
{"drawScaled", libd_drawScaled}, {"drawScaled", libd_drawScaled},

View File

@ -1037,6 +1037,10 @@ static menuitem_t OP_CameraControlsMenu[] =
static menuitem_t OP_MiscControlsMenu[] = static menuitem_t OP_MiscControlsMenu[] =
{ {
{IT_CALL | IT_STRING2, NULL, "Custom Action 1", M_ChangeControl, gc_custom1 },
{IT_CALL | IT_STRING2, NULL, "Custom Action 2", M_ChangeControl, gc_custom2 },
{IT_CALL | IT_STRING2, NULL, "Custom Action 3", M_ChangeControl, gc_custom3 },
{IT_CALL | IT_STRING2, NULL, "Pause", M_ChangeControl, gc_pause }, {IT_CALL | IT_STRING2, NULL, "Pause", M_ChangeControl, gc_pause },
{IT_CALL | IT_STRING2, NULL, "Console", M_ChangeControl, gc_console }, {IT_CALL | IT_STRING2, NULL, "Console", M_ChangeControl, gc_console },
}; };
@ -3764,8 +3768,8 @@ static void M_Options(INT32 choice)
// if the player is not admin or server, disable server options // if the player is not admin or server, disable server options
OP_MainMenu[5].status = (Playing() && !(server || adminplayer == consoleplayer)) ? (IT_GRAYEDOUT) : (IT_STRING|IT_SUBMENU); OP_MainMenu[5].status = (Playing() && !(server || adminplayer == consoleplayer)) ? (IT_GRAYEDOUT) : (IT_STRING|IT_SUBMENU);
// if the player is playing _at all_, disable data options // if the player is playing _at all_, disable the erase data options
OP_MainMenu[3].status = (Playing()) ? (IT_GRAYEDOUT) : (IT_STRING|IT_SUBMENU); OP_DataOptionsMenu[1].status = (Playing()) ? (IT_GRAYEDOUT) : (IT_STRING|IT_SUBMENU);
OP_MainDef.prevMenu = currentMenu; OP_MainDef.prevMenu = currentMenu;
M_SetupNextMenu(&OP_MainDef); M_SetupNextMenu(&OP_MainDef);
@ -5709,7 +5713,7 @@ static void M_DrawConnectMenu(void)
// Room name // Room name
if (ms_RoomId < 0) if (ms_RoomId < 0)
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + MP_ConnectMenu[mp_connect_room].alphaKey, V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + MP_ConnectMenu[mp_connect_room].alphaKey,
V_YELLOWMAP, "<Offline Mode>"); V_YELLOWMAP, (itemOn == mp_connect_room) ? "<Select to change>" : "<Offline Mode>");
else else
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + MP_ConnectMenu[mp_connect_room].alphaKey, V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + MP_ConnectMenu[mp_connect_room].alphaKey,
V_YELLOWMAP, room_list[menuRoomIndex].name); V_YELLOWMAP, room_list[menuRoomIndex].name);
@ -5963,8 +5967,10 @@ static void M_StartServer(INT32 choice)
// Still need to reset devmode // Still need to reset devmode
cv_debug = 0; cv_debug = 0;
if (demoplayback || metalplayback) if (demoplayback)
G_StopDemo(); G_StopDemo();
if (metalrecording)
G_StopMetalDemo();
if (!StartSplitScreenGame) if (!StartSplitScreenGame)
{ {
@ -5999,7 +6005,7 @@ static void M_DrawServerMenu(void)
{ {
if (ms_RoomId < 0) if (ms_RoomId < 0)
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + MP_ServerMenu[mp_server_room].alphaKey, V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + MP_ServerMenu[mp_server_room].alphaKey,
V_YELLOWMAP, "<Offline Mode>"); V_YELLOWMAP, (itemOn == mp_server_room) ? "<Select to change>" : "<Offline Mode>");
else else
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + MP_ServerMenu[mp_server_room].alphaKey, V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + MP_ServerMenu[mp_server_room].alphaKey,
V_YELLOWMAP, room_list[menuRoomIndex].name); V_YELLOWMAP, room_list[menuRoomIndex].name);
@ -6560,8 +6566,9 @@ static void M_Setup1PControlsMenu(INT32 choice)
OP_MPControlsMenu[0].status = IT_CALL|IT_STRING2; OP_MPControlsMenu[0].status = IT_CALL|IT_STRING2;
OP_MPControlsMenu[1].status = IT_CALL|IT_STRING2; OP_MPControlsMenu[1].status = IT_CALL|IT_STRING2;
OP_MPControlsMenu[2].status = IT_CALL|IT_STRING2; OP_MPControlsMenu[2].status = IT_CALL|IT_STRING2;
// Unhide the entire misc menu // Unide the pause/console controls too
OP_ControlListMenu[3].status = IT_SUBMENU | IT_STRING; OP_MiscControlsMenu[3].status = IT_CALL|IT_STRING2;
OP_MiscControlsMenu[4].status = IT_CALL|IT_STRING2;
OP_ControlListDef.prevMenu = &OP_P1ControlsDef; OP_ControlListDef.prevMenu = &OP_P1ControlsDef;
M_SetupNextMenu(&OP_ControlListDef); M_SetupNextMenu(&OP_ControlListDef);
@ -6578,8 +6585,9 @@ static void M_Setup2PControlsMenu(INT32 choice)
OP_MPControlsMenu[0].status = IT_GRAYEDOUT2; OP_MPControlsMenu[0].status = IT_GRAYEDOUT2;
OP_MPControlsMenu[1].status = IT_GRAYEDOUT2; OP_MPControlsMenu[1].status = IT_GRAYEDOUT2;
OP_MPControlsMenu[2].status = IT_GRAYEDOUT2; OP_MPControlsMenu[2].status = IT_GRAYEDOUT2;
// Hide the entire misc menu // Hide the pause/console controls too
OP_ControlListMenu[3].status = IT_GRAYEDOUT; OP_MiscControlsMenu[3].status = IT_GRAYEDOUT2;
OP_MiscControlsMenu[4].status = IT_GRAYEDOUT2;
OP_ControlListDef.prevMenu = &OP_P2ControlsDef; OP_ControlListDef.prevMenu = &OP_P2ControlsDef;
M_SetupNextMenu(&OP_ControlListDef); M_SetupNextMenu(&OP_ControlListDef);

View File

@ -1861,7 +1861,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
if (target->player && !target->player->spectator) if (target->player && !target->player->spectator)
{ {
if (metalrecording) // Ack! Metal Sonic shouldn't die! Cut the tape, end recording! if (metalrecording) // Ack! Metal Sonic shouldn't die! Cut the tape, end recording!
G_CheckDemoStatus(); G_StopMetalRecording();
#ifdef CHAOSISNOTDEADYET #ifdef CHAOSISNOTDEADYET
if (gametype == GT_CHAOS) if (gametype == GT_CHAOS)
target->player->score /= 2; // Halve the player's score in Chaos Mode target->player->score /= 2; // Halve the player's score in Chaos Mode

View File

@ -1669,16 +1669,21 @@ static boolean P_ZMovement(mobj_t *mo)
// another to prevent them from turning into hockey pucks. // another to prevent them from turning into hockey pucks.
// I'm sorry in advance. -SH // I'm sorry in advance. -SH
// PS: Oh, and Brak's napalm bombs too, now. // PS: Oh, and Brak's napalm bombs too, now.
if (mo->type == MT_THROWNGRENADE || mo->type == MT_CYBRAKDEMON_NAPALM_BOMB_LARGE) if (mo->flags & MF_GRENADEBOUNCE)
{ {
if (mo->momz <= 0) // Going down? (Or up in reverse gravity?)
if (mo->momz*P_MobjFlip(mo) < 0)
{ {
if (mo->momz >= -FixedMul(FRACUNIT, mo->scale)) // If going slower than a fracunit, just stop.
if (abs(mo->momz) < FixedMul(FRACUNIT, mo->scale))
{ {
mo->momx = mo->momy = mo->momz = 0; mo->momx = mo->momy = mo->momz = 0;
if (mo->type == MT_CYBRAKDEMON_NAPALM_BOMB_LARGE)
P_SetMobjState(mo, mo->info->deathstate); // Napalm hack
if (mo->type == MT_CYBRAKDEMON_NAPALM_BOMB_LARGE && mo->fuse)
mo->fuse = 1;
} }
// Otherwise bounce up at half speed.
else else
mo->momz = -FixedMul(mo->momz, FRACUNIT/2); mo->momz = -FixedMul(mo->momz, FRACUNIT/2);
S_StartSound(mo, mo->info->activesound); S_StartSound(mo, mo->info->activesound);
@ -4595,7 +4600,7 @@ static void P_Boss9Thinker(mobj_t *mobj)
// This is below threshold because we don't want to bob while zipping around // This is below threshold because we don't want to bob while zipping around
// Ohh you're in for it now.. // Ohh you're in for it now..
if (mobj->flags2 & MF2_FRET && mobj->health <= 3) if (mobj->flags2 & MF2_FRET && mobj->health <= mobj->info->damage)
mobj->fuse = 0; mobj->fuse = 0;
// reactiontime is used for delays. // reactiontime is used for delays.
@ -4657,11 +4662,13 @@ static void P_Boss9Thinker(mobj_t *mobj)
case 1: { case 1: {
// Okay, we're up? Good, time to gather energy... // Okay, we're up? Good, time to gather energy...
if (mobj->health > mobj->info->damage) { // No more bubble if we're broken (pinch phase) if (mobj->health > mobj->info->damage)
{ // No more bubble if we're broken (pinch phase)
mobj_t *shield = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_MSSHIELD_FRONT); mobj_t *shield = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_MSSHIELD_FRONT);
P_SetTarget(&mobj->tracer, shield); P_SetTarget(&mobj->tracer, shield);
P_SetTarget(&shield->target, mobj); P_SetTarget(&shield->target, mobj);
} else }
else
P_LinedefExecute(LE_PINCHPHASE, mobj, NULL); P_LinedefExecute(LE_PINCHPHASE, mobj, NULL);
mobj->fuse = 4*TICRATE; mobj->fuse = 4*TICRATE;
mobj->flags |= MF_PAIN; mobj->flags |= MF_PAIN;
@ -4673,8 +4680,12 @@ static void P_Boss9Thinker(mobj_t *mobj)
case 2: case 2:
// We're all charged and ready now! Unleash the fury!! // We're all charged and ready now! Unleash the fury!!
P_RemoveMobj(mobj->tracer); if (mobj->health > mobj->info->damage)
P_SetTarget(&mobj->tracer, mobj->hnext); {
mobj_t *removemobj = mobj->tracer;
P_SetTarget(&mobj->tracer, mobj->hnext);
P_RemoveMobj(removemobj);
}
if (mobj->health <= mobj->info->damage) { if (mobj->health <= mobj->info->damage) {
// Attack 1: Pinball dash! // Attack 1: Pinball dash!
if (mobj->health == 1) if (mobj->health == 1)
@ -6483,6 +6494,7 @@ void P_MobjThinker(mobj_t *mobj)
{ {
// gargoyle and snowman handled in P_PushableThinker, not here // gargoyle and snowman handled in P_PushableThinker, not here
case MT_THROWNGRENADE: case MT_THROWNGRENADE:
case MT_CYBRAKDEMON_NAPALM_BOMB_LARGE:
P_SetMobjState(mobj, mobj->info->deathstate); P_SetMobjState(mobj, mobj->info->deathstate);
break; break;
case MT_BLUEFLAG: case MT_BLUEFLAG:
@ -7231,6 +7243,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
#endif #endif
switch (mobj->type) switch (mobj->type)
{ {
case MT_CYBRAKDEMON_NAPALM_BOMB_LARGE:
mobj->fuse = mobj->info->mass;
case MT_BLACKEGGMAN: case MT_BLACKEGGMAN:
{ {
mobj_t *spawn = P_SpawnMobj(mobj->x, mobj->z, mobj->z+mobj->height-16*FRACUNIT, MT_BLACKEGGMAN_HELPER); mobj_t *spawn = P_SpawnMobj(mobj->x, mobj->z, mobj->z+mobj->height-16*FRACUNIT, MT_BLACKEGGMAN_HELPER);
@ -9445,7 +9459,7 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing)
boolean P_CheckMissileSpawn(mobj_t *th) boolean P_CheckMissileSpawn(mobj_t *th)
{ {
// move a little forward so an angle can be computed if it immediately explodes // move a little forward so an angle can be computed if it immediately explodes
if (th->type != MT_THROWNGRENADE) // hack: bad! should be a flag. if (th->flags & MF_GRENADEBOUNCE) // hack: bad! should be a flag.
{ {
th->x += th->momx>>1; th->x += th->momx>>1;
th->y += th->momy>>1; th->y += th->momy>>1;

View File

@ -156,9 +156,11 @@ typedef enum
// for chase camera, don't be blocked by things (partial clipping) // for chase camera, don't be blocked by things (partial clipping)
// (need comma at end of this for SOC editor) // (need comma at end of this for SOC editor)
MF_NOCLIPTHING = 1<<27, MF_NOCLIPTHING = 1<<27,
// Missile bounces like a grenade.
MF_GRENADEBOUNCE = 1<<28,
// Run the action thinker on spawn. // Run the action thinker on spawn.
MF_RUNSPAWNFUNC = 1<<28, MF_RUNSPAWNFUNC = 1<<29,
// free: to and including 1<<31 // free: 1<<30 and 1<<31
} mobjflag_t; } mobjflag_t;
typedef enum typedef enum

View File

@ -2315,7 +2315,7 @@ boolean P_SetupLevel(boolean skipprecip)
cv_debug = botskin = 0; cv_debug = botskin = 0;
if (metalplayback) if (metalplayback)
G_StopDemo(); G_StopMetalDemo();
// Clear CECHO messages // Clear CECHO messages
HU_ClearCEcho(); HU_ClearCEcho();

View File

@ -3178,12 +3178,26 @@ static void P_DoSuperStuff(player_t *player)
P_SetPlayerMobjState(player->mo, S_PLAY_STND); P_SetPlayerMobjState(player->mo, S_PLAY_STND);
P_RestoreMusic(player); P_RestoreMusic(player);
P_SpawnShieldOrb(player); P_SpawnShieldOrb(player);
// Restore color
if (player->powers[pw_shield] & SH_FIREFLOWER)
{
player->mo->color = SKINCOLOR_WHITE;
G_GhostAddColor(GHC_FIREFLOWER);
}
else
{
player->mo->color = player->skincolor;
G_GhostAddColor(GHC_NORMAL);
}
if (gametype != GT_COOP) if (gametype != GT_COOP)
{ {
HU_SetCEchoFlags(0); HU_SetCEchoFlags(0);
HU_SetCEchoDuration(5); HU_SetCEchoDuration(5);
HU_DoCEcho(va("%s\\is no longer super.\\\\\\\\", player_names[player-players])); HU_DoCEcho(va("%s\\is no longer super.\\\\\\\\", player_names[player-players]));
} }
return;
} }
// Deplete one ring every second while super // Deplete one ring every second while super
@ -3200,7 +3214,7 @@ static void P_DoSuperStuff(player_t *player)
G_GhostAddColor(GHC_SUPER); G_GhostAddColor(GHC_SUPER);
// Ran out of rings while super! // Ran out of rings while super!
if ((player->powers[pw_super]) && (player->health <= 1 || player->exiting)) if (player->powers[pw_super] && (player->health <= 1 || player->exiting))
{ {
player->powers[pw_emeralds] = 0; // lost the power stones player->powers[pw_emeralds] = 0; // lost the power stones
P_SpawnGhostMobj(player->mo); P_SpawnGhostMobj(player->mo);
@ -9194,7 +9208,7 @@ void P_PlayerAfterThink(player_t *player)
} }
} }
} }
else if ((player->pflags & PF_MACESPIN) && player->mo->tracer) else if ((player->pflags & PF_MACESPIN) && player->mo->tracer && player->mo->tracer->target)
{ {
player->mo->height = P_GetPlayerSpinHeight(player); player->mo->height = P_GetPlayerSpinHeight(player);
// tracer is what you're hanging onto.... // tracer is what you're hanging onto....
@ -9214,11 +9228,6 @@ void P_PlayerAfterThink(player_t *player)
if (!(player->mo->tracer->target->flags & MF_SLIDEME) // Noclimb on chain parameters gives this if (!(player->mo->tracer->target->flags & MF_SLIDEME) // Noclimb on chain parameters gives this
&& !(twodlevel || player->mo->flags2 & MF2_TWOD)) // why on earth would you want to turn them in 2D mode? && !(twodlevel || player->mo->flags2 & MF2_TWOD)) // why on earth would you want to turn them in 2D mode?
{ {
if (cmd->buttons & BT_USE) // do we actually still want this?
{
player->mo->tracer->target->health += 50;
player->mo->angle += 50<<ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX
}
player->mo->tracer->target->health += cmd->sidemove; player->mo->tracer->target->health += cmd->sidemove;
player->mo->angle += cmd->sidemove<<ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX player->mo->angle += cmd->sidemove<<ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX

View File

@ -2278,8 +2278,12 @@ void I_Quit(void)
G_SaveGameData(); // Tails 12-08-2002 G_SaveGameData(); // Tails 12-08-2002
//added:16-02-98: when recording a demo, should exit using 'q' key, //added:16-02-98: when recording a demo, should exit using 'q' key,
// but sometimes we forget and use 'F10'.. so save here too. // but sometimes we forget and use 'F10'.. so save here too.
if (demorecording || metalrecording)
if (demorecording)
G_CheckDemoStatus(); G_CheckDemoStatus();
if (metalrecording)
G_StopMetalRecording();
D_QuitNetGame(); D_QuitNetGame();
I_ShutdownMusic(); I_ShutdownMusic();
I_ShutdownSound(); I_ShutdownSound();
@ -2431,8 +2435,10 @@ void I_Error(const char *error, ...)
G_SaveGameData(); // Tails 12-08-2002 G_SaveGameData(); // Tails 12-08-2002
// Shutdown. Here might be other errors. // Shutdown. Here might be other errors.
if (demorecording || metalrecording) if (demorecording)
G_CheckDemoStatus(); G_CheckDemoStatus();
if (metalrecording)
G_StopMetalRecording();
D_QuitNetGame(); D_QuitNetGame();
I_ShutdownMusic(); I_ShutdownMusic();

View File

@ -665,8 +665,10 @@ void I_Error(const char *error, ...)
// save demo, could be useful for debug // save demo, could be useful for debug
// NOTE: demos are normally not saved here. // NOTE: demos are normally not saved here.
if (demorecording || metalrecording) if (demorecording)
G_CheckDemoStatus(); G_CheckDemoStatus();
if (metalrecording)
G_StopMetalRecording();
D_QuitNetGame(); D_QuitNetGame();
@ -749,8 +751,10 @@ void I_Quit(void)
DWORD mode; DWORD mode;
// when recording a demo, should exit using 'q', // when recording a demo, should exit using 'q',
// but sometimes we forget and use Alt+F4, so save here too. // but sometimes we forget and use Alt+F4, so save here too.
if (demorecording || metalrecording) if (demorecording)
G_CheckDemoStatus(); G_CheckDemoStatus();
if (metalrecording)
G_StopMetalRecording();
M_SaveConfig(NULL); // save game config, cvars.. M_SaveConfig(NULL); // save game config, cvars..
#ifndef NONET #ifndef NONET