mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-17 17:41:57 +00:00
SRB2 2.1.5 release
This commit is contained in:
parent
3a5fcc58da
commit
15bd266cac
23 changed files with 344 additions and 140 deletions
146
src/am_map.c
146
src/am_map.c
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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},
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
118
src/g_game.c
118
src/g_game.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -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},
|
||||||
|
|
26
src/m_menu.c
26
src/m_menu.c
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
36
src/p_mobj.c
36
src/p_mobj.c
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
23
src/p_user.c
23
src/p_user.c
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue