mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 01:01:33 +00:00
Merge branch 'next'
This commit is contained in:
commit
2b2b23efab
47 changed files with 1619 additions and 2034 deletions
|
@ -1,4 +1,4 @@
|
|||
Here it is! SRB2 v2.1.12 source code!
|
||||
Here it is! SRB2 v2.1.14 source code!
|
||||
(why do we keep the version number up to date
|
||||
when everything else in this file is hilariously old?
|
||||
- Inuyasha)
|
||||
|
|
|
@ -379,11 +379,13 @@ void COM_AddCommand(const char *name, com_func_t func)
|
|||
{
|
||||
if (!stricmp(name, cmd->name)) //case insensitive now that we have lower and uppercase!
|
||||
{
|
||||
#ifdef HAVE_BLUA
|
||||
// don't I_Error for Lua commands
|
||||
// Lua commands can replace game commands, and they have priority.
|
||||
// BUT, if for some reason we screwed up and made two console commands with the same name,
|
||||
// it's good to have this here so we find out.
|
||||
if (cmd->function != COM_Lua_f)
|
||||
#endif
|
||||
I_Error("Command %s already exists\n", name);
|
||||
|
||||
return;
|
||||
|
@ -397,6 +399,7 @@ void COM_AddCommand(const char *name, com_func_t func)
|
|||
com_commands = cmd;
|
||||
}
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
/** Adds a console command for Lua.
|
||||
* No I_Errors allowed; return a negative code instead.
|
||||
*
|
||||
|
@ -429,6 +432,7 @@ int COM_AddLuaCommand(const char *name)
|
|||
com_commands = cmd;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/** Tests if a command exists.
|
||||
*
|
||||
|
@ -1284,6 +1288,8 @@ void CV_LoadNetVars(UINT8 **p)
|
|||
serverloading = false;
|
||||
}
|
||||
|
||||
static void CV_SetCVar(consvar_t *var, const char *value, boolean stealth);
|
||||
|
||||
void CV_ResetCheatNetVars(void)
|
||||
{
|
||||
consvar_t *cvar;
|
||||
|
@ -1291,7 +1297,7 @@ void CV_ResetCheatNetVars(void)
|
|||
// Stealthset everything back to default.
|
||||
for (cvar = consvar_vars; cvar; cvar = cvar->next)
|
||||
if (cvar->flags & CV_CHEAT)
|
||||
Setvalue(cvar, cvar->defaultvalue, true);
|
||||
CV_SetCVar(cvar, cvar->defaultvalue, true);
|
||||
}
|
||||
|
||||
// Returns true if the variable's current value is its default value
|
||||
|
@ -1428,11 +1434,7 @@ void CV_AddValue(consvar_t *var, INT32 increment)
|
|||
INT32 newvalue, max;
|
||||
|
||||
// count pointlimit better
|
||||
if (var == &cv_pointlimit && (gametype == GT_MATCH
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
|| gametype == GT_CHAOS
|
||||
#endif
|
||||
))
|
||||
if (var == &cv_pointlimit && (gametype == GT_MATCH))
|
||||
increment *= 50;
|
||||
newvalue = var->value + increment;
|
||||
|
||||
|
|
|
@ -823,7 +823,7 @@ static inline void resynch_read_ctf(resynchend_pak *p)
|
|||
{
|
||||
if (!playeringame[p->flagplayer[1]])
|
||||
I_Error("Invalid blue flag player %d who isn't in the game!", (INT32)p->flagplayer[1]);
|
||||
players[p->flagplayer[1]].gotflag = GF_REDFLAG;
|
||||
players[p->flagplayer[1]].gotflag = GF_BLUEFLAG;
|
||||
if (blueflag)
|
||||
{
|
||||
P_RemoveMobj(blueflag);
|
||||
|
|
37
src/d_main.c
37
src/d_main.c
|
@ -90,6 +90,9 @@ int snprintf(char *str, size_t n, const char *fmt, ...);
|
|||
#include "hardware/hw3sound.h"
|
||||
#endif
|
||||
|
||||
// platform independant focus loss
|
||||
UINT8 window_notinfocus = false;
|
||||
|
||||
//
|
||||
// DEMO LOOP
|
||||
//
|
||||
|
@ -437,6 +440,17 @@ static void D_Display(void)
|
|||
CON_Drawer();
|
||||
|
||||
M_Drawer(); // menu is drawn even on top of everything
|
||||
|
||||
// focus lost notification goes on top of everything, even the former everything
|
||||
if (window_notinfocus)
|
||||
{
|
||||
M_DrawTextBox((BASEVIDWIDTH/2) - (60), (BASEVIDHEIGHT/2) - (16), 13, 2);
|
||||
if (gamestate == GS_LEVEL && (P_AutoPause() || paused))
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2) - (4), V_YELLOWMAP, "Game Paused");
|
||||
else
|
||||
V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2) - (4), V_YELLOWMAP, "Focus Lost");
|
||||
}
|
||||
|
||||
NetUpdate(); // send out any new accumulation
|
||||
|
||||
// It's safe to end the game now.
|
||||
|
@ -635,6 +649,7 @@ void D_AdvanceDemo(void)
|
|||
//
|
||||
void D_StartTitle(void)
|
||||
{
|
||||
INT32 i;
|
||||
if (netgame)
|
||||
{
|
||||
if (gametype == GT_COOP)
|
||||
|
@ -661,6 +676,16 @@ void D_StartTitle(void)
|
|||
SV_StopServer();
|
||||
SV_ResetServer();
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
CL_ClearPlayer(i);
|
||||
|
||||
splitscreen = false;
|
||||
SplitScreen_OnChange();
|
||||
botingame = false;
|
||||
botskin = 0;
|
||||
cv_debug = 0;
|
||||
emeralds = 0;
|
||||
|
||||
// In case someone exits out at the same time they start a time attack run,
|
||||
// reset modeattacking
|
||||
modeattacking = ATTACKING_NONE;
|
||||
|
@ -803,7 +828,7 @@ static void IdentifyVersion(void)
|
|||
D_AddFile(va(pandf,srb2waddir,"rings.dta"));
|
||||
|
||||
// Add our crappy patches to fix our bugs
|
||||
D_AddFile(va(pandf,srb2waddir,"patch.dta"));
|
||||
// D_AddFile(va(pandf,srb2waddir,"patch.dta"));
|
||||
|
||||
#if !defined (HAVE_SDL) || defined (HAVE_MIXER)
|
||||
{
|
||||
|
@ -1087,19 +1112,19 @@ void D_SRB2Main(void)
|
|||
#endif
|
||||
D_CleanFile();
|
||||
|
||||
#if 1 // md5s last updated 11/10/14
|
||||
#if 1 // md5s last updated 12/14/14
|
||||
|
||||
// Check MD5s of autoloaded files
|
||||
W_VerifyFileMD5(0, "ac309fb3c7d4b5b685e2cd26beccf0e8"); // srb2.srb/srb2.wad
|
||||
W_VerifyFileMD5(1, "f39b6c849295e3c81875726e8cc0e2c7"); // zones.dta
|
||||
W_VerifyFileMD5(0, "c1b9577687f8a795104aef4600720ea7"); // srb2.srb/srb2.wad
|
||||
W_VerifyFileMD5(1, "303838c6c534d9540288360fa49cca60"); // zones.dta
|
||||
W_VerifyFileMD5(2, "cfca0f1c73023cbbd8f844f45480f799"); // player.dta
|
||||
W_VerifyFileMD5(3, "85901ad4bf94637e5753d2ac2c03ea26"); // rings.dta
|
||||
W_VerifyFileMD5(4, "a45cc59d13dce924f2112b3e4201d0ae"); // patch.dta
|
||||
//W_VerifyFileMD5(4, "0c66790502e648bfce90fdc5bb15722e"); // patch.dta
|
||||
// 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.
|
||||
#endif
|
||||
|
||||
mainwads = 5; // there are 5 wads not to unload
|
||||
mainwads = 4; // there are 5 wads not to unload
|
||||
|
||||
cht_Init();
|
||||
|
||||
|
|
|
@ -277,21 +277,6 @@ consvar_t cv_matchboxes = {"matchboxes", "Normal", CV_NETVAR|CV_CHEAT, matchboxe
|
|||
consvar_t cv_specialrings = {"specialrings", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_powerstones = {"powerstones", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
consvar_t cv_chaos_bluecrawla = {"chaos_bluecrawla", "8", CV_NETVAR, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chaos_redcrawla = {"chaos_redcrawla", "8", CV_NETVAR, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chaos_crawlacommander = {"chaos_crawlacommander", "2", CV_NETVAR, chances_cons_t,
|
||||
NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chaos_jettysynbomber = {"chaos_jettysynbomber", "5", CV_NETVAR, chances_cons_t,
|
||||
NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chaos_jettysyngunner = {"chaos_jettysyngunner", "2", CV_NETVAR, chances_cons_t,
|
||||
NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chaos_eggmobile1 = {"chaos_eggmobile1", "2", CV_NETVAR, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chaos_eggmobile2 = {"chaos_eggmobile2", "2", CV_NETVAR, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chaos_skim = {"chaos_skim", "5", CV_NETVAR, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_chaos_spawnrate = {"chaos_spawnrate", "30",CV_NETVAR, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
#endif
|
||||
|
||||
consvar_t cv_recycler = {"tv_recycler", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_teleporters = {"tv_teleporter", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_superring = {"tv_superring", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
@ -498,18 +483,6 @@ void D_RegisterServerCommands(void)
|
|||
CV_RegisterVar(&cv_competitionboxes);
|
||||
CV_RegisterVar(&cv_matchboxes);
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
CV_RegisterVar(&cv_chaos_bluecrawla);
|
||||
CV_RegisterVar(&cv_chaos_redcrawla);
|
||||
CV_RegisterVar(&cv_chaos_crawlacommander);
|
||||
CV_RegisterVar(&cv_chaos_jettysynbomber);
|
||||
CV_RegisterVar(&cv_chaos_jettysyngunner);
|
||||
CV_RegisterVar(&cv_chaos_eggmobile1);
|
||||
CV_RegisterVar(&cv_chaos_eggmobile2);
|
||||
CV_RegisterVar(&cv_chaos_skim);
|
||||
CV_RegisterVar(&cv_chaos_spawnrate);
|
||||
#endif
|
||||
|
||||
CV_RegisterVar(&cv_recycler);
|
||||
CV_RegisterVar(&cv_teleporters);
|
||||
CV_RegisterVar(&cv_superring);
|
||||
|
@ -699,6 +672,8 @@ void D_RegisterClientCommands(void)
|
|||
CV_RegisterVar(&cv_invertmouse2);
|
||||
CV_RegisterVar(&cv_mousesens);
|
||||
CV_RegisterVar(&cv_mousesens2);
|
||||
CV_RegisterVar(&cv_mouseysens);
|
||||
CV_RegisterVar(&cv_mouseysens2);
|
||||
CV_RegisterVar(&cv_mousemove);
|
||||
CV_RegisterVar(&cv_mousemove2);
|
||||
|
||||
|
@ -734,9 +709,6 @@ void D_RegisterClientCommands(void)
|
|||
CV_RegisterVar(&cv_scr_width);
|
||||
CV_RegisterVar(&cv_scr_height);
|
||||
|
||||
// p_fab.c
|
||||
CV_RegisterVar(&cv_translucency);
|
||||
|
||||
CV_RegisterVar(&cv_soundtest);
|
||||
|
||||
// ingame object placing
|
||||
|
@ -3374,18 +3346,6 @@ void D_GameTypeChanged(INT32 lastgametype)
|
|||
|
||||
switch (gametype)
|
||||
{
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
case GT_CHAOS:
|
||||
if (!cv_timelimit.changed && !cv_pointlimit.changed) // user hasn't changed limits
|
||||
{
|
||||
// default settings for chaos: timelimit 2 mins, no pointlimit
|
||||
CV_SetValue(&cv_pointlimit, 0);
|
||||
CV_SetValue(&cv_timelimit, 2);
|
||||
}
|
||||
if (!cv_itemrespawntime.changed)
|
||||
CV_SetValue(&cv_itemrespawntime, 90); // respawn sparingly in chaos
|
||||
break;
|
||||
#endif
|
||||
case GT_MATCH:
|
||||
case GT_TEAMMATCH:
|
||||
if (!cv_timelimit.changed && !cv_pointlimit.changed) // user hasn't changed limits
|
||||
|
@ -3905,6 +3865,9 @@ static void Command_Cheats_f(void)
|
|||
{
|
||||
if (COM_CheckParm("off"))
|
||||
{
|
||||
if (!(server || (adminplayer == consoleplayer)))
|
||||
CONS_Printf(M_GetText("Only the server or a remote admin can use this.\n"));
|
||||
else
|
||||
CV_ResetCheatNetVars();
|
||||
return;
|
||||
}
|
||||
|
@ -3912,6 +3875,7 @@ static void Command_Cheats_f(void)
|
|||
if (CV_CheatsEnabled())
|
||||
{
|
||||
CONS_Printf(M_GetText("At least one CHEAT-marked variable has been changed -- Cheats are enabled.\n"));
|
||||
if (server || (adminplayer == consoleplayer))
|
||||
CONS_Printf(M_GetText("Type CHEATS OFF to reset all cheat variables to default.\n"));
|
||||
}
|
||||
else
|
||||
|
|
|
@ -44,6 +44,7 @@ extern consvar_t cv_invertmouse2;
|
|||
extern consvar_t cv_alwaysfreelook2;
|
||||
extern consvar_t cv_mousemove2;
|
||||
extern consvar_t cv_mousesens2;
|
||||
extern consvar_t cv_mouseysens2;
|
||||
|
||||
// normally in p_mobj but the .h is not read
|
||||
extern consvar_t cv_itemrespawntime;
|
||||
|
@ -80,7 +81,6 @@ extern consvar_t cv_useranalog, cv_useranalog2;
|
|||
extern consvar_t cv_analog, cv_analog2;
|
||||
|
||||
extern consvar_t cv_netstat;
|
||||
extern consvar_t cv_translucency;
|
||||
extern consvar_t cv_splats;
|
||||
|
||||
extern consvar_t cv_countdowntime;
|
||||
|
@ -113,12 +113,6 @@ extern consvar_t cv_ringslinger, cv_soundtest;
|
|||
|
||||
extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionboxes;
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
extern consvar_t cv_chaos_spawnrate, cv_chaos_bluecrawla, cv_chaos_redcrawla;
|
||||
extern consvar_t cv_chaos_crawlacommander, cv_chaos_jettysynbomber, cv_chaos_jettysyngunner;
|
||||
extern consvar_t cv_chaos_eggmobile1, cv_chaos_eggmobile2, cv_chaos_skim;
|
||||
#endif
|
||||
|
||||
#ifdef NEWPING
|
||||
extern consvar_t cv_maxping;
|
||||
#endif
|
||||
|
|
|
@ -5052,7 +5052,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
|||
"S_ARROWDOWN",
|
||||
|
||||
// Trapgoyle Demon fire
|
||||
"S_DEMONFIRE",
|
||||
"S_DEMONFIRE1",
|
||||
"S_DEMONFIRE2",
|
||||
"S_DEMONFIRE3",
|
||||
"S_DEMONFIRE4",
|
||||
"S_DEMONFIRE5",
|
||||
"S_DEMONFIRE6",
|
||||
|
||||
"S_GFZFLOWERA",
|
||||
"S_GFZFLOWERA2",
|
||||
|
@ -7062,7 +7067,6 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
|||
"MT_NIGHTOPIANHELPER", // the actual helper object that orbits you
|
||||
|
||||
// Utility Objects
|
||||
"MT_CHAOSSPAWNER",
|
||||
"MT_TELEPORTMAN",
|
||||
"MT_ALTVIEWMAN",
|
||||
"MT_CRUMBLEOBJ", // Sound generator for crumbling platform
|
||||
|
@ -7453,6 +7457,17 @@ struct {
|
|||
{"FF_FULLBRIGHT",FF_FULLBRIGHT},
|
||||
{"FF_TRANSMASK",FF_TRANSMASK},
|
||||
{"FF_TRANSSHIFT",FF_TRANSSHIFT},
|
||||
// new preshifted translucency (used in source)
|
||||
{"FF_TRANS10",FF_TRANS10},
|
||||
{"FF_TRANS20",FF_TRANS20},
|
||||
{"FF_TRANS30",FF_TRANS30},
|
||||
{"FF_TRANS40",FF_TRANS40},
|
||||
{"FF_TRANS50",FF_TRANS50},
|
||||
{"FF_TRANS60",FF_TRANS60},
|
||||
{"FF_TRANS70",FF_TRANS70},
|
||||
{"FF_TRANS80",FF_TRANS80},
|
||||
{"FF_TRANS90",FF_TRANS90},
|
||||
// compatibility
|
||||
// Transparency for SOCs is pre-shifted
|
||||
{"TR_TRANS10",tr_trans10<<FF_TRANSSHIFT},
|
||||
{"TR_TRANS20",tr_trans20<<FF_TRANSSHIFT},
|
||||
|
@ -8047,7 +8062,7 @@ static fixed_t find_const(const char **rword)
|
|||
return r;
|
||||
}
|
||||
if (!*(word+1) && // Turn a single A-z symbol into numbers, like sprite frames.
|
||||
(*word >= 'A' && *word <= 'Z') || (*word >= 'a' && *word <= 'z')) {
|
||||
((*word >= 'A' && *word <= 'Z') || (*word >= 'a' && *word <= 'z'))) {
|
||||
r = R_Char2Frame(*word);
|
||||
free(word);
|
||||
return r;
|
||||
|
|
|
@ -144,8 +144,8 @@ extern FILE *logstream;
|
|||
#define VERSIONSTRING "Trunk"
|
||||
#else
|
||||
#define VERSION 201 // Game version
|
||||
#define SUBVERSION 12 // more precise version number
|
||||
#define VERSIONSTRING "v2.1.12"
|
||||
#define SUBVERSION 14 // more precise version number
|
||||
#define VERSIONSTRING "v2.1.14"
|
||||
// Hey! If you change this, add 1 to the MODVERSION below!
|
||||
// Otherwise we can't force updates!
|
||||
#endif
|
||||
|
@ -203,7 +203,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.
|
||||
// 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".
|
||||
#define MODVERSION 17
|
||||
#define MODVERSION 19
|
||||
|
||||
|
||||
|
||||
|
@ -449,10 +449,6 @@ extern const char *compdate, *comptime, *comprevision;
|
|||
/// Dumps the contents of a network save game upon consistency failure for debugging.
|
||||
//#define DUMPCONSISTENCY
|
||||
|
||||
/// Pre-1.08 Chaos gametype code
|
||||
/// \note Code severely out of date, does not take new enemies/bosses into account.
|
||||
//#define CHAOSISNOTDEADYET
|
||||
|
||||
/// Polyobject fake flat code
|
||||
#define POLYOBJECTS_PLANES
|
||||
|
||||
|
|
|
@ -103,6 +103,7 @@ extern boolean digital_disabled;
|
|||
|
||||
extern boolean menuactive; // Menu overlaid?
|
||||
extern UINT8 paused; // Game paused?
|
||||
extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message)
|
||||
|
||||
extern boolean nodrawers;
|
||||
extern boolean noblit;
|
||||
|
|
13
src/g_game.c
13
src/g_game.c
|
@ -967,7 +967,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
|
|||
|
||||
// why build a ticcmd if we're paused?
|
||||
// Or, for that matter, if we're being reborn.
|
||||
if (paused || P_MenuActivePause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN))
|
||||
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN))
|
||||
{
|
||||
cmd->angleturn = (INT16)(localangle >> 16);
|
||||
cmd->aiming = G_ClipAimingPitch(&localaiming);
|
||||
|
@ -1257,7 +1257,7 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics)
|
|||
|
||||
//why build a ticcmd if we're paused?
|
||||
// Or, for that matter, if we're being reborn.
|
||||
if (paused || P_MenuActivePause() || player->playerstate == PST_REBORN)
|
||||
if (paused || P_AutoPause() || player->playerstate == PST_REBORN)
|
||||
{
|
||||
cmd->angleturn = (INT16)(localangle2 >> 16);
|
||||
cmd->aiming = G_ClipAimingPitch(&localaiming2);
|
||||
|
@ -2299,11 +2299,7 @@ void G_SpawnPlayer(INT32 playernum, boolean starpost)
|
|||
// -- DM/Tag/CTF-spectator/etc --
|
||||
// Order: DM->CTF->Coop
|
||||
else if (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF
|
||||
|| ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK) && !(players[playernum].pflags & PF_TAGIT))
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
|| gametype == GT_CHAOS
|
||||
#endif
|
||||
)
|
||||
|| ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK) && !(players[playernum].pflags & PF_TAGIT)))
|
||||
{
|
||||
if (!(spawnpoint = G_FindMatchStart(playernum)) // find a DM start
|
||||
&& !(spawnpoint = G_FindCTFStart(playernum))) // find a CTF start
|
||||
|
@ -2709,9 +2705,6 @@ INT16 G_TOLFlag(INT32 pgametype)
|
|||
if (pgametype == GT_RACE) return TOL_RACE;
|
||||
if (pgametype == GT_MATCH) return TOL_MATCH;
|
||||
if (pgametype == GT_TEAMMATCH) return TOL_MATCH;
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (pgametype == GT_CHAOS) return TOL_CHAOS;
|
||||
#endif
|
||||
if (pgametype == GT_TAG) return TOL_TAG;
|
||||
if (pgametype == GT_HIDEANDSEEK) return TOL_TAG;
|
||||
if (pgametype == GT_CTF) return TOL_CTF;
|
||||
|
|
|
@ -28,6 +28,8 @@ static CV_PossibleValue_t onecontrolperkey_cons_t[] = {{1, "One"}, {2, "Several"
|
|||
// mouse values are used once
|
||||
consvar_t cv_mousesens = {"mousesens", "35", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mousesens2 = {"mousesens2", "35", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mouseysens = {"mouseysens", "35", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_mouseysens2 = {"mouseysens2", "35", CV_SAVE, mousesens_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_controlperkey = {"controlperkey", "One", CV_SAVE, onecontrolperkey_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
INT32 mousex, mousey;
|
||||
|
@ -99,7 +101,7 @@ void G_MapEventsToControls(event_t *ev)
|
|||
case ev_mouse: // buttons are virtual keys
|
||||
mousex = (INT32)(ev->data2*((cv_mousesens.value*cv_mousesens.value)/110.0f + 0.1f));
|
||||
mousey = (INT32)(ev->data3*((cv_mousesens.value*cv_mousesens.value)/110.0f + 0.1f));
|
||||
mlooky = mousey;
|
||||
mlooky = (INT32)(ev->data3*((cv_mouseysens.value*cv_mousesens.value)/110.0f + 0.1f));
|
||||
break;
|
||||
|
||||
case ev_joystick: // buttons are virtual keys
|
||||
|
@ -121,7 +123,7 @@ void G_MapEventsToControls(event_t *ev)
|
|||
case ev_mouse2: // buttons are virtual keys
|
||||
mouse2x = (INT32)(ev->data2*((cv_mousesens2.value*cv_mousesens2.value)/110.0f + 0.1f));
|
||||
mouse2y = (INT32)(ev->data3*((cv_mousesens2.value*cv_mousesens2.value)/110.0f + 0.1f));
|
||||
mlook2y = mouse2y;
|
||||
mlook2y = (INT32)(ev->data3*((cv_mouseysens2.value*cv_mousesens2.value)/110.0f + 0.1f));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -125,7 +125,7 @@ typedef enum
|
|||
} gamecontrols_e;
|
||||
|
||||
// mouse values are used once
|
||||
extern consvar_t cv_mousesens;
|
||||
extern consvar_t cv_mousesens, cv_mouseysens;
|
||||
|
||||
extern INT32 mousex, mousey;
|
||||
extern INT32 mlooky; //mousey with mlookSensitivity
|
||||
|
|
|
@ -278,6 +278,7 @@ light_t *t_lspr[NUMSPRITES] =
|
|||
&lspr[SMALLREDBALL_L], // SPR_TRLS
|
||||
&lspr[NOLIGHT], // SPR_CBLL
|
||||
&lspr[NOLIGHT], // SPR_AROW
|
||||
&lspr[NOLIGHT], // SPR_CFIR
|
||||
|
||||
// Greenflower Scenery
|
||||
&lspr[NOLIGHT], // SPR_FWR1
|
||||
|
|
|
@ -3796,7 +3796,9 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
|
|||
}*/
|
||||
|
||||
// shadow is always half as translucent as the sprite itself
|
||||
if (spr->mobj->flags2 & MF2_SHADOW)
|
||||
if (!cv_translucency.value)
|
||||
; // translucency disabled
|
||||
else if (spr->mobj->flags2 & MF2_SHADOW)
|
||||
sSurf.FlatColor.s.alpha = 0x20;
|
||||
else if (spr->mobj->frame & FF_TRANSMASK)
|
||||
{
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#ifdef DEBUG_TO_FILE
|
||||
static unsigned long nb_frames = 0;
|
||||
static clock_t my_clock;
|
||||
FILE *logstream;
|
||||
FILE *gllogstream;
|
||||
#endif
|
||||
|
||||
static HDC hDC = NULL; // the window's device context
|
||||
|
@ -81,8 +81,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module
|
|||
// Initialize once for each new process.
|
||||
// Return FALSE to fail DLL load.
|
||||
#ifdef DEBUG_TO_FILE
|
||||
logstream = fopen("ogllog.txt", "wt");
|
||||
if (logstream == NULL)
|
||||
gllogstream = fopen("ogllog.txt", "wt");
|
||||
if (gllogstream == NULL)
|
||||
return FALSE;
|
||||
#endif
|
||||
DisableThreadLibraryCalls(hinstDLL);
|
||||
|
@ -99,10 +99,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module
|
|||
case DLL_PROCESS_DETACH:
|
||||
// Perform any necessary cleanup.
|
||||
#ifdef DEBUG_TO_FILE
|
||||
if (logstream)
|
||||
if (gllogstream)
|
||||
{
|
||||
fclose(logstream);
|
||||
logstream = NULL;
|
||||
fclose(gllogstream);
|
||||
gllogstream = NULL;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
|
|
@ -168,7 +168,6 @@ static boolean gl13 = false; // whether we can use opengl 1.3 functions
|
|||
// : else do nothing
|
||||
// Returns :
|
||||
// -----------------+
|
||||
#if !(defined (HAVE_SDL) && defined (STATIC3DS))
|
||||
FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
|
||||
{
|
||||
#ifdef DEBUG_TO_FILE
|
||||
|
@ -178,13 +177,12 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
|
|||
va_start (arglist, lpFmt);
|
||||
vsnprintf (str, 4096, lpFmt, arglist);
|
||||
va_end (arglist);
|
||||
if (logstream)
|
||||
fwrite(str, strlen(str), 1, logstream);
|
||||
if (gllogstream)
|
||||
fwrite(str, strlen(str), 1, gllogstream);
|
||||
#else
|
||||
(void)lpFmt;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef STATIC_OPENGL
|
||||
/* 1.0 functions */
|
||||
|
@ -673,7 +671,7 @@ static void GLProject(GLdouble objX, GLdouble objY, GLdouble objZ,
|
|||
// -----------------+
|
||||
void SetModelView(GLint w, GLint h)
|
||||
{
|
||||
DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h);
|
||||
// DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h);
|
||||
|
||||
screen_width = w;
|
||||
screen_height = h;
|
||||
|
@ -714,7 +712,7 @@ void SetStates(void)
|
|||
GLfloat LightDiffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||
#endif
|
||||
|
||||
DBG_Printf("SetStates()\n");
|
||||
// DBG_Printf("SetStates()\n");
|
||||
|
||||
// Hurdler: not necessary, is it?
|
||||
pglShadeModel(GL_SMOOTH); // iterate vertice colors
|
||||
|
|
|
@ -57,9 +57,19 @@
|
|||
|
||||
#undef DEBUG_TO_FILE // maybe defined in previous *.h
|
||||
#define DEBUG_TO_FILE // output debugging msgs to ogllog.txt
|
||||
#if defined ( HAVE_SDL ) && !defined ( LOGMESSAGES )
|
||||
|
||||
// todo: find some way of getting SDL to log to ogllog.txt, without
|
||||
// interfering with r_opengl.dll
|
||||
#ifdef HAVE_SDL
|
||||
#undef DEBUG_TO_FILE
|
||||
#endif
|
||||
//#if defined(HAVE_SDL) && !defined(_DEBUG)
|
||||
//#undef DEBUG_TO_FILE
|
||||
//#endif
|
||||
|
||||
#ifdef DEBUG_TO_FILE
|
||||
extern FILE *gllogstream;
|
||||
#endif
|
||||
|
||||
#ifndef DRIVER_STRING
|
||||
// #define USE_PALETTED_TEXTURE
|
||||
|
@ -117,9 +127,6 @@ extern PFNglGetString pglGetString;
|
|||
|
||||
extern const GLubyte *gl_extensions;
|
||||
extern RGBA_t myPaletteData[];
|
||||
#ifndef HAVE_SDL
|
||||
extern FILE *logstream;
|
||||
#endif
|
||||
extern GLint screen_width;
|
||||
extern GLint screen_height;
|
||||
extern GLbyte screen_depth;
|
||||
|
|
783
src/info.c
783
src/info.c
File diff suppressed because it is too large
Load diff
|
@ -355,6 +355,7 @@ typedef enum sprite
|
|||
SPR_TRLS,
|
||||
SPR_CBLL, // Cannonball
|
||||
SPR_AROW, // Arrow
|
||||
SPR_CFIR, // Colored fire of various sorts
|
||||
|
||||
// Greenflower Scenery
|
||||
SPR_FWR1,
|
||||
|
@ -1907,7 +1908,12 @@ typedef enum state
|
|||
S_ARROWDOWN,
|
||||
|
||||
// Trapgoyle Demon fire
|
||||
S_DEMONFIRE,
|
||||
S_DEMONFIRE1,
|
||||
S_DEMONFIRE2,
|
||||
S_DEMONFIRE3,
|
||||
S_DEMONFIRE4,
|
||||
S_DEMONFIRE5,
|
||||
S_DEMONFIRE6,
|
||||
|
||||
S_GFZFLOWERA,
|
||||
S_GFZFLOWERA2,
|
||||
|
@ -3934,7 +3940,6 @@ typedef enum mobj_type
|
|||
MT_NIGHTOPIANHELPER, // the actual helper object that orbits you
|
||||
|
||||
// Utility Objects
|
||||
MT_CHAOSSPAWNER,
|
||||
MT_TELEPORTMAN,
|
||||
MT_ALTVIEWMAN,
|
||||
MT_CRUMBLEOBJ, // Sound generator for crumbling platform
|
||||
|
|
19
src/m_menu.c
19
src/m_menu.c
|
@ -387,9 +387,6 @@ CV_PossibleValue_t gametype_cons_t[] =
|
|||
{GT_HIDEANDSEEK, "Hide and Seek"},
|
||||
|
||||
{GT_CTF, "CTF"},
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
{GT_CHAOS, "Chaos"},
|
||||
#endif
|
||||
{0, NULL}
|
||||
};
|
||||
consvar_t cv_newgametype = {"newgametype", "Co-op", CV_HIDEN|CV_CALL, gametype_cons_t, Newgametype_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
@ -1129,7 +1126,9 @@ static menuitem_t OP_MouseOptionsMenu[] =
|
|||
{IT_STRING | IT_CVAR, NULL, "Mouse Move", &cv_mousemove, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Invert Mouse", &cv_invertmouse, 50},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Mouse Speed", &cv_mousesens, 60},
|
||||
NULL, "Mouse X Speed", &cv_mousesens, 60},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Mouse Y Speed", &cv_mouseysens, 70},
|
||||
};
|
||||
|
||||
static menuitem_t OP_Mouse2OptionsMenu[] =
|
||||
|
@ -1141,7 +1140,9 @@ static menuitem_t OP_Mouse2OptionsMenu[] =
|
|||
{IT_STRING | IT_CVAR, NULL, "Mouse Move", &cv_mousemove2, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Invert Mouse", &cv_invertmouse2, 50},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Mouse Speed", &cv_mousesens2, 60},
|
||||
NULL, "Mouse X Speed", &cv_mousesens2, 60},
|
||||
{IT_STRING | IT_CVAR | IT_CV_SLIDER,
|
||||
NULL, "Mouse Y Speed", &cv_mouseysens2, 70},
|
||||
};
|
||||
|
||||
static menuitem_t OP_VideoOptionsMenu[] =
|
||||
|
@ -1901,9 +1902,6 @@ static void Newgametype_OnChange(void)
|
|||
(cv_newgametype.value == GT_COMPETITION && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_COMPETITION)) ||
|
||||
(cv_newgametype.value == GT_RACE && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_RACE)) ||
|
||||
((cv_newgametype.value == GT_MATCH || cv_newgametype.value == GT_TEAMMATCH) && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_MATCH)) ||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
(cv_newgametype.value == GT_CHAOS && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_CHAOS)) ||
|
||||
#endif
|
||||
((cv_newgametype.value == GT_TAG || cv_newgametype.value == GT_HIDEANDSEEK) && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_TAG)) ||
|
||||
(cv_newgametype.value == GT_CTF && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_CTF)))
|
||||
{
|
||||
|
@ -3468,11 +3466,6 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
|
|||
if (gt == GT_RACE && (mapheaderinfo[mapnum]->typeoflevel & TOL_RACE))
|
||||
return true;
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gt == GT_CHAOS && (mapheaderinfo[mapnum]->typeoflevel & TOL_CHAOS))
|
||||
return true;
|
||||
#endif
|
||||
|
||||
return false;
|
||||
|
||||
case LLM_LEVELSELECT:
|
||||
|
|
164
src/p_enemy.c
164
src/p_enemy.c
|
@ -2715,14 +2715,6 @@ void A_BossDeath(mobj_t *mo)
|
|||
P_LinedefExecute(LE_BOSSDEAD, mo, NULL);
|
||||
mo->health = 0;
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (mo->flags2 & MF2_CHAOSBOSS)
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Boss is dead (but not necessarily fleeing...)
|
||||
// Lua may use this to ignore bosses after they start fleeing
|
||||
mo->flags2 |= MF2_BOSSDEAD;
|
||||
|
@ -5635,10 +5627,11 @@ void A_MixUp(mobj_t *actor)
|
|||
//
|
||||
void A_RecyclePowers(mobj_t *actor)
|
||||
{
|
||||
#ifdef WEIGHTEDRECYCLER
|
||||
INT32 i, j, k, numplayers = 0;
|
||||
|
||||
#ifdef WEIGHTEDRECYCLER
|
||||
UINT8 beneficiary = 255;
|
||||
#endif
|
||||
UINT8 playerslist[MAXPLAYERS];
|
||||
UINT8 postscramble[MAXPLAYERS];
|
||||
|
||||
|
@ -5651,6 +5644,11 @@ void A_RecyclePowers(mobj_t *actor)
|
|||
return;
|
||||
#endif
|
||||
|
||||
#if !defined(WEIGHTEDRECYCLER) && !defined(HAVE_BLUA)
|
||||
// actor is used in all scenarios but this one, funny enough
|
||||
(void)actor;
|
||||
#endif
|
||||
|
||||
if (!multiplayer)
|
||||
return;
|
||||
|
||||
|
@ -5665,9 +5663,11 @@ void A_RecyclePowers(mobj_t *actor)
|
|||
numplayers++;
|
||||
postscramble[j] = playerslist[j] = (UINT8)i;
|
||||
|
||||
#ifdef WEIGHTEDRECYCLER
|
||||
// The guy who started the recycle gets the best result
|
||||
if (actor && actor->target && actor->target->player && &players[i] == actor->target->player)
|
||||
beneficiary = (UINT8)i;
|
||||
#endif
|
||||
|
||||
// Save powers
|
||||
for (k = 0; k < NUMPOWERS; k++)
|
||||
|
@ -5684,6 +5684,13 @@ void A_RecyclePowers(mobj_t *actor)
|
|||
return; //nobody to touch!
|
||||
|
||||
//shuffle the post scramble list, whee!
|
||||
// hardcoded 0-1 to 1-0 for two players
|
||||
if (numplayers == 2)
|
||||
{
|
||||
postscramble[0] = playerslist[1];
|
||||
postscramble[1] = playerslist[0];
|
||||
}
|
||||
else
|
||||
for (j = 0; j < numplayers; j++)
|
||||
{
|
||||
UINT8 tempint;
|
||||
|
@ -5694,6 +5701,7 @@ void A_RecyclePowers(mobj_t *actor)
|
|||
postscramble[i] = tempint;
|
||||
}
|
||||
|
||||
#ifdef WEIGHTEDRECYCLER
|
||||
//the joys of qsort...
|
||||
if (beneficiary != 255) {
|
||||
qsort(playerslist, numplayers, sizeof(UINT8), P_RecycleCompare);
|
||||
|
@ -5710,6 +5718,7 @@ void A_RecyclePowers(mobj_t *actor)
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// now assign!
|
||||
for (i = 0; i < numplayers; i++)
|
||||
|
@ -5737,137 +5746,6 @@ void A_RecyclePowers(mobj_t *actor)
|
|||
P_RestoreMusic(&players[recv_pl]);
|
||||
P_FlashPal(&players[recv_pl], PAL_RECYCLE, 10);
|
||||
}
|
||||
#else
|
||||
INT32 i, numplayers = 0;
|
||||
|
||||
#ifdef HAVE_BLUA
|
||||
if (LUA_CallAction("A_RecyclePowers", actor))
|
||||
return;
|
||||
#endif
|
||||
if (!multiplayer)
|
||||
return;
|
||||
|
||||
numplayers = 0;
|
||||
|
||||
// Count the number of players in the game
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
|
||||
&& !players[i].exiting && !players[i].powers[pw_super] && !((netgame || multiplayer) && players[i].spectator))
|
||||
numplayers++;
|
||||
|
||||
if (numplayers <= 1)
|
||||
return; //nobody to touch!
|
||||
|
||||
else if (numplayers == 2) //simple swap is all that's needed
|
||||
{
|
||||
UINT16 temp[NUMPOWERS];
|
||||
INT32 weapons;
|
||||
INT32 weaponheld;
|
||||
|
||||
INT32 one = -1, two = 0; // default value 0 to make the compiler shut up
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
|
||||
&& !players[i].exiting && !players[i].powers[pw_super] && !((netgame || multiplayer) && players[i].spectator))
|
||||
{
|
||||
if (one == -1)
|
||||
one = i;
|
||||
else
|
||||
two = i;
|
||||
}
|
||||
for (i = 0; i < NUMPOWERS; i++)
|
||||
{
|
||||
if (i == pw_flashing || i == pw_underwater || i == pw_spacetime
|
||||
|| i == pw_tailsfly || i == pw_extralife || i == pw_super || i == pw_nocontrol)
|
||||
continue;
|
||||
temp[i] = players[one].powers[i];
|
||||
players[one].powers[i] = players[two].powers[i];
|
||||
players[two].powers[i] = temp[i];
|
||||
}
|
||||
//1.1: weapons need to be swapped too
|
||||
weapons = players[one].ringweapons;
|
||||
players[one].ringweapons = players[two].ringweapons;
|
||||
players[two].ringweapons = weapons;
|
||||
|
||||
weaponheld = players[one].currentweapon;
|
||||
players[one].currentweapon = players[two].currentweapon;
|
||||
players[two].currentweapon = weaponheld;
|
||||
|
||||
P_SpawnShieldOrb(players[one].mo->player);
|
||||
P_SpawnShieldOrb(players[two].mo->player);
|
||||
P_FlashPal(&players[one], PAL_RECYCLE, 10);
|
||||
P_FlashPal(&players[two], PAL_RECYCLE, 10);
|
||||
//piece o' cake, eh?
|
||||
}
|
||||
else
|
||||
{
|
||||
//well, the cake is a LIE!
|
||||
UINT16 temp[MAXPLAYERS][NUMPOWERS];
|
||||
INT32 weapons[MAXPLAYERS];
|
||||
INT32 weaponheld[MAXPLAYERS];
|
||||
INT32 counter = 0, j = 0, prandom = 0, recyclefrom = 0;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i] && players[i].playerstate == PST_LIVE
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super]
|
||||
&& !((netgame || multiplayer) && players[i].spectator))
|
||||
{
|
||||
for (j = 0; j < NUMPOWERS; j++)
|
||||
temp[counter][j] = players[i].powers[j];
|
||||
//1.1: ring weapons too
|
||||
weapons[counter] = players[i].ringweapons;
|
||||
weaponheld[counter] = players[i].currentweapon;
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
counter = 0;
|
||||
|
||||
// Mix them up!
|
||||
for (;;)
|
||||
{
|
||||
if (counter > 255) // fail-safe to avoid endless loop
|
||||
break;
|
||||
prandom = P_Random();
|
||||
prandom %= numplayers; // I love modular arithmetic, don't you?
|
||||
if (prandom) // Make sure it's not a useless mix
|
||||
break;
|
||||
counter++;
|
||||
}
|
||||
|
||||
counter = 0;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i] && players[i].playerstate == PST_LIVE
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super]
|
||||
&& !((netgame || multiplayer) && players[i].spectator))
|
||||
{
|
||||
recyclefrom = (counter + prandom) % numplayers;
|
||||
for (j = 0; j < NUMPOWERS; j++)
|
||||
{
|
||||
if (j == pw_flashing || j == pw_underwater || j == pw_spacetime
|
||||
|| j == pw_tailsfly || j == pw_extralife || j == pw_super || j == pw_nocontrol)
|
||||
continue;
|
||||
players[i].powers[j] = temp[recyclefrom][j];
|
||||
}
|
||||
//1.1: weapon rings too
|
||||
players[i].ringweapons = weapons[recyclefrom];
|
||||
players[i].currentweapon = weaponheld[recyclefrom];
|
||||
|
||||
P_SpawnShieldOrb(players[i].mo->player);
|
||||
P_FlashPal(&players[i], PAL_RECYCLE, 10);
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i = 0; i < MAXPLAYERS; i++) //just for sneakers/invinc.
|
||||
if (playeringame[i] && players[i].playerstate == PST_LIVE
|
||||
&& players[i].mo && players[i].mo->health > 0 && !players[i].exiting && !players[i].powers[pw_super]
|
||||
&& !((netgame || multiplayer) && players[i].spectator))
|
||||
if (P_IsLocalPlayer(players[i].mo->player))
|
||||
P_RestoreMusic(players[i].mo->player);
|
||||
#endif
|
||||
|
||||
S_StartSound(NULL, sfx_gravch); //heh, the sound effect I used is already in
|
||||
}
|
||||
|
@ -6160,12 +6038,6 @@ void A_Boss2Pogo(mobj_t *actor)
|
|||
goop->momy = FixedMul(FINESINE(fa),ns);
|
||||
goop->momz = FixedMul(4*FRACUNIT, actor->scale);
|
||||
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS)
|
||||
goop->fuse = 5*TICRATE;
|
||||
else
|
||||
#endif
|
||||
goop->fuse = 10*TICRATE;
|
||||
}
|
||||
actor->reactiontime = 0; // we already shot goop, so don't do it again!
|
||||
|
|
123
src/p_fab.c
123
src/p_fab.c
|
@ -11,124 +11,5 @@
|
|||
/// \brief some new action routines, separated from the original doom
|
||||
/// sources, so that you can include it or remove it easy.
|
||||
|
||||
#include "doomdef.h"
|
||||
#include "g_game.h"
|
||||
#include "p_local.h"
|
||||
#include "m_random.h"
|
||||
|
||||
static void Translucency_OnChange(void);
|
||||
|
||||
/** \brief cv_translucency
|
||||
console variables to turn on and off translucency
|
||||
*/
|
||||
consvar_t cv_translucency = {"translucency", "On", CV_CALL|CV_SAVE, CV_OnOff,
|
||||
Translucency_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
/** \brief Reset Translucency
|
||||
*/
|
||||
|
||||
static boolean resettrans = false;
|
||||
|
||||
/** \brief The R_SetTrans function
|
||||
Set the translucency map for each frame state of mobj
|
||||
|
||||
\param state1 1st state
|
||||
\param state2 last state
|
||||
\param transmap translucency
|
||||
|
||||
\return void
|
||||
|
||||
|
||||
*/
|
||||
static void R_SetTrans(statenum_t state1, statenum_t state2, transnum_t transmap)
|
||||
{
|
||||
state_t *state = &states[state1];
|
||||
|
||||
do
|
||||
{
|
||||
state->frame &= ~FF_TRANSMASK;
|
||||
if (!resettrans)
|
||||
state->frame |= (transmap<<FF_TRANSSHIFT);
|
||||
state++;
|
||||
} while (state1++ < state2);
|
||||
}
|
||||
|
||||
/** \brief The P_SetTranslucencies function
|
||||
hack the translucency in the states for a set of standard doom sprites
|
||||
|
||||
\return void
|
||||
|
||||
|
||||
*/
|
||||
static void P_SetTranslucencies(void)
|
||||
{
|
||||
R_SetTrans(S_SMOKE1, S_SMOKE5, tr_trans50);
|
||||
R_SetTrans(S_SPLASH1, 0, tr_trans50);
|
||||
R_SetTrans(S_SPLASH2, 0, tr_trans70);
|
||||
R_SetTrans(S_SPLASH3, 0, tr_trans90);
|
||||
|
||||
R_SetTrans(S_DRIPA1, S_DRIPC2, tr_trans30);
|
||||
|
||||
R_SetTrans(S_BLUECRYSTAL1, S_BLUECRYSTAL1, tr_trans30);
|
||||
|
||||
R_SetTrans(S_THOK, 0, tr_trans50); // Thok! mobj
|
||||
|
||||
R_SetTrans(S_FLAME1, S_FLAME4, tr_trans50); // Flame
|
||||
|
||||
R_SetTrans(S_PARTICLE, S_PARTICLE, tr_trans70);
|
||||
|
||||
// Flame jet
|
||||
R_SetTrans(S_FLAMEJETFLAME1, S_FLAMEJETFLAME1, tr_trans50);
|
||||
R_SetTrans(S_FLAMEJETFLAME2, S_FLAMEJETFLAME2, tr_trans60);
|
||||
R_SetTrans(S_FLAMEJETFLAME3, S_FLAMEJETFLAME3, tr_trans70);
|
||||
|
||||
R_SetTrans(S_BLACKEGG_GOOP1, S_BLACKEGG_GOOP3, tr_trans50);
|
||||
R_SetTrans(S_BLACKEGG_GOOP4, 0, tr_trans60);
|
||||
R_SetTrans(S_BLACKEGG_GOOP5, 0, tr_trans70);
|
||||
R_SetTrans(S_BLACKEGG_GOOP6, 0, tr_trans80);
|
||||
R_SetTrans(S_BLACKEGG_GOOP7, 0, tr_trans90);
|
||||
|
||||
R_SetTrans(S_CYBRAKDEMONFLAMESHOT_FLY1, S_CYBRAKDEMONFLAMESHOT_DIE, tr_trans50); // Flame
|
||||
R_SetTrans(S_CYBRAKDEMONFLAMEREST, 0, tr_trans50); // Flame
|
||||
R_SetTrans(S_CYBRAKDEMONTARGETRETICULE1, S_CYBRAKDEMONTARGETRETICULE14, tr_trans50); // Target
|
||||
R_SetTrans(S_CYBRAKDEMONTARGETDOT, S_CYBRAKDEMONTARGETDOT, tr_trans50); // Target
|
||||
|
||||
R_SetTrans(S_FOG1, S_FOG14, tr_trans50);
|
||||
|
||||
// if higher translucency needed, toy around with the other tr_trans variables
|
||||
|
||||
// shield translucencies
|
||||
R_SetTrans(S_ARMA1, S_ARMA16, tr_trans40);
|
||||
R_SetTrans(S_WIND1, S_WIND8, tr_trans70);
|
||||
R_SetTrans(S_MAGN1, S_MAGN12, tr_trans40);
|
||||
R_SetTrans(S_FORC1, S_FORC20, tr_trans50);
|
||||
R_SetTrans(S_ELEM1, S_ELEM12, tr_trans50);
|
||||
R_SetTrans(S_PITY1, S_PITY10, tr_trans20); // Not sure if Pity Shield should be translucent or not; I mean, the Genesis sprite it's based off of wasn't...
|
||||
|
||||
// translucent spark
|
||||
R_SetTrans(S_SPRK1, S_SPRK1, tr_trans40);
|
||||
R_SetTrans(S_SPRK2, S_SPRK4, tr_trans50);
|
||||
R_SetTrans(S_SPRK5, S_SPRK7, tr_trans60);
|
||||
R_SetTrans(S_SPRK8, S_SPRK10, tr_trans70);
|
||||
R_SetTrans(S_SPRK11, S_SPRK13, tr_trans80);
|
||||
R_SetTrans(S_SPRK14, S_SPRK16, tr_trans90);
|
||||
|
||||
R_SetTrans(S_SMALLBUBBLE, S_SMALLBUBBLE1, tr_trans50);
|
||||
R_SetTrans(S_MEDIUMBUBBLE, S_MEDIUMBUBBLE1, tr_trans50);
|
||||
R_SetTrans(S_LARGEBUBBLE, S_EXTRALARGEBUBBLE, tr_trans50);
|
||||
|
||||
R_SetTrans(S_SPLISH1, S_SPLISH9, tr_trans50);
|
||||
R_SetTrans(S_TOKEN, S_MOVINGTOKEN, tr_trans50);
|
||||
R_SetTrans(S_RAIN1, 0, tr_trans50);
|
||||
}
|
||||
|
||||
/** \brief The Translucency_OnChange function
|
||||
executed when cv_translucency changed
|
||||
*/
|
||||
static void Translucency_OnChange(void)
|
||||
{
|
||||
if (!cv_translucency.value)
|
||||
resettrans = true;
|
||||
P_SetTranslucencies();
|
||||
resettrans = false;
|
||||
}
|
||||
/// \todo
|
||||
/// This file is now unused, please remove at some point
|
||||
|
|
|
@ -1590,33 +1590,6 @@ static void P_HitDeathMessages(player_t *player, mobj_t *inflictor, mobj_t *sour
|
|||
case MT_SPIKE:
|
||||
str = M_GetText("%s was %s by spikes.\n");
|
||||
break;
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
/* These were obviously made for Chaos, and they're extremely out of date.
|
||||
We either need to keep them out of the EXE or update them to contain
|
||||
proper text for all enemies we currently have in the game.
|
||||
*/
|
||||
case MT_BLUECRAWLA:
|
||||
str = M_GetText("%s was %s by a blue crawla!\n");
|
||||
break;
|
||||
case MT_REDCRAWLA:
|
||||
str = M_GetText("%s was %s by a red crawla!\n");
|
||||
break;
|
||||
case MT_JETTGUNNER:
|
||||
str = M_GetText("%s was %s by a jetty-syn gunner!\n");
|
||||
break;
|
||||
case MT_JETTBOMBER:
|
||||
str = M_GetText("%s was %s by a jetty-syn bomber!\n");
|
||||
break;
|
||||
case MT_CRAWLACOMMANDER:
|
||||
str = M_GetText("%s was %s by a crawla commander!\n");
|
||||
break;
|
||||
case MT_EGGMOBILE:
|
||||
str = M_GetText("%s was %s by the Egg Mobile!\n");
|
||||
break;
|
||||
case MT_EGGMOBILE2:
|
||||
str = M_GetText("%s was %s by the Egg Slimer!\n");
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
str = M_GetText("%s was %s by an environmental hazard.\n");
|
||||
break;
|
||||
|
@ -1864,11 +1837,6 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
|||
{
|
||||
if (metalrecording) // Ack! Metal Sonic shouldn't die! Cut the tape, end recording!
|
||||
G_StopMetalRecording();
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS)
|
||||
target->player->score /= 2; // Halve the player's score in Chaos Mode
|
||||
else
|
||||
#endif
|
||||
if (gametype == GT_MATCH && cv_match_scoring.value == 0 // note, no team match suicide penalty
|
||||
&& ((target == source) || (source == NULL && inflictor == NULL) || (source && !source->player)))
|
||||
{ // Suicide penalty
|
||||
|
@ -1896,39 +1864,6 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
|||
{
|
||||
INT32 score = 0;
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS)
|
||||
{
|
||||
if ((target->flags & MF_ENEMY)
|
||||
&& !(target->flags & MF_MISSILE))
|
||||
source->player->scoreadd++;
|
||||
|
||||
switch (target->type)
|
||||
{
|
||||
case MT_BLUECRAWLA:
|
||||
case MT_GOOMBA:
|
||||
score = 100*source->player->scoreadd;
|
||||
break;
|
||||
case MT_REDCRAWLA:
|
||||
case MT_BLUEGOOMBA:
|
||||
score = 150*source->player->scoreadd;
|
||||
break;
|
||||
case MT_JETTBOMBER:
|
||||
score = 400*source->player->scoreadd;
|
||||
break;
|
||||
case MT_JETTGUNNER:
|
||||
score = 500*source->player->scoreadd;
|
||||
break;
|
||||
case MT_CRAWLACOMMANDER:
|
||||
score = 300*source->player->scoreadd;
|
||||
break;
|
||||
default:
|
||||
score = 100*source->player->scoreadd;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (maptol & TOL_NIGHTS) // Enemies always worth 200, bosses don't do anything.
|
||||
{
|
||||
if ((target->flags & MF_ENEMY) && !(target->flags & (MF_MISSILE|MF_BOSS)))
|
||||
|
@ -2089,9 +2024,6 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
|||
// This determines the kind of object spawned
|
||||
// during the death frame of a thing.
|
||||
if (!mariomode // Don't show birds, etc. in Mario Mode Tails 12-23-2001
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
&& gametype != GT_CHAOS // Or Chaos Mode!
|
||||
#endif
|
||||
&& target->flags & MF_ENEMY)
|
||||
{
|
||||
if (cv_soniccd.value)
|
||||
|
@ -2512,11 +2444,7 @@ static inline boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj
|
|||
return false;
|
||||
|
||||
// In COOP/RACE/CHAOS, you can't hurt other players unless cv_friendlyfire is on
|
||||
if (!cv_friendlyfire.value && (G_PlatformGametype()
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
|| gametype == GT_CHAOS
|
||||
#endif
|
||||
))
|
||||
if (!cv_friendlyfire.value && (G_PlatformGametype()))
|
||||
return false;
|
||||
|
||||
// Tag handling
|
||||
|
@ -2843,17 +2771,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
|
||||
if (target->health > 1)
|
||||
{
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS && source && source->player)
|
||||
{
|
||||
player = source->player;
|
||||
if (!((player->pflags & PF_USEDOWN) && player->dashspeed
|
||||
&& (player->pflags & PF_STARTDASH) && (player->pflags & PF_SPINNING)))
|
||||
player->scoreadd++;
|
||||
P_AddPlayerScore(player, 300*player->scoreadd);
|
||||
}
|
||||
#endif
|
||||
if (target->info->painsound)
|
||||
S_StartSound(target, target->info->painsound);
|
||||
|
||||
|
@ -2882,14 +2799,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
|
||||
if (target->health > 1)
|
||||
target->flags2 |= MF2_FRET;
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS && source && source->player)
|
||||
{
|
||||
source->player->scoreadd++;
|
||||
P_AddPlayerScore(source->player, 300*source->player->scoreadd);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#ifdef HAVE_BLUA
|
||||
else if (target->flags & MF_ENEMY)
|
||||
|
|
|
@ -144,7 +144,7 @@ void P_GivePlayerLives(player_t *player, INT32 numlives);
|
|||
UINT8 P_GetNextEmerald(void);
|
||||
void P_GiveEmerald(boolean spawnObj);
|
||||
void P_ResetScore(player_t *player);
|
||||
boolean P_MenuActivePause(void);
|
||||
boolean P_AutoPause(void);
|
||||
|
||||
void P_DoJumpShield(player_t *player);
|
||||
void P_BlackOw(player_t *player);
|
||||
|
|
543
src/p_mobj.c
543
src/p_mobj.c
|
@ -1354,6 +1354,133 @@ static void P_SceneryXYMovement(mobj_t *mo)
|
|||
P_SceneryXYFriction(mo, oldx, oldy);
|
||||
}
|
||||
|
||||
//
|
||||
// P_AdjustMobjFloorZ_FFloors
|
||||
//
|
||||
// Utility function for P_ZMovement and related
|
||||
// Adjusts mo->floorz/mo->ceiling accordingly for FFloors
|
||||
//
|
||||
// "motype" determines what behaviour to use exactly
|
||||
// This is to keep things consistent in case these various object types NEED to be different
|
||||
//
|
||||
// motype options:
|
||||
// 0 - normal
|
||||
// 1 - forces false check for water (rings)
|
||||
// 2 - forces false check for water + different quicksand behaviour (scenery)
|
||||
//
|
||||
static void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motype)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t delta1, delta2, thingtop;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
thingtop = mo->z + mo->height;
|
||||
|
||||
for (rover = sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS))
|
||||
continue;
|
||||
|
||||
if (mo->player && (P_CheckSolidLava(mo, rover) || P_CanRunOnWater(mo->player, rover))) // only the player should be affected
|
||||
;
|
||||
else if (motype != 0 && rover->flags & FF_SWIMMABLE) // "scenery" only
|
||||
continue;
|
||||
else if (rover->flags & FF_QUICKSAND) // quicksand
|
||||
;
|
||||
else if (!((rover->flags & FF_BLOCKPLAYER && mo->player) // solid to players?
|
||||
|| (rover->flags & FF_BLOCKOTHERS && !mo->player))) // solid to others?
|
||||
continue;
|
||||
if (rover->flags & FF_QUICKSAND)
|
||||
{
|
||||
switch (motype)
|
||||
{
|
||||
case 2: // scenery does things differently for some reason
|
||||
if (mo->z < *rover->topheight && *rover->bottomheight < thingtop)
|
||||
{
|
||||
mo->floorz = mo->z;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (mo->z < *rover->topheight && *rover->bottomheight < thingtop)
|
||||
{
|
||||
if (mo->floorz < mo->z)
|
||||
mo->floorz = mo->z;
|
||||
}
|
||||
continue; // This is so you can jump/spring up through quicksand from below.
|
||||
}
|
||||
}
|
||||
|
||||
delta1 = mo->z - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
delta2 = thingtop - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
if (*rover->topheight > mo->floorz && abs(delta1) < abs(delta2)
|
||||
&& !(rover->flags & FF_REVERSEPLATFORM))
|
||||
{
|
||||
mo->floorz = *rover->topheight;
|
||||
}
|
||||
if (*rover->bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
|
||||
&& !(rover->flags & FF_PLATFORM))
|
||||
{
|
||||
mo->ceilingz = *rover->bottomheight;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_AdjustMobjFloorZ_PolyObjs
|
||||
//
|
||||
// Utility function for P_ZMovement and related
|
||||
// Adjusts mo->floorz/mo->ceiling accordingly for PolyObjs
|
||||
//
|
||||
static void P_AdjustMobjFloorZ_PolyObjs(mobj_t *mo, subsector_t *subsec)
|
||||
{
|
||||
polyobj_t *po = subsec->polyList;
|
||||
sector_t *polysec;
|
||||
fixed_t delta1, delta2, thingtop;
|
||||
fixed_t polytop, polybottom;
|
||||
|
||||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
thingtop = mo->z + mo->height;
|
||||
|
||||
while(po)
|
||||
{
|
||||
if (!P_MobjInsidePolyobj(po, mo) || !(po->flags & POF_SOLID))
|
||||
{
|
||||
po = (polyobj_t *)(po->link.next);
|
||||
continue;
|
||||
}
|
||||
|
||||
// We're inside it! Yess...
|
||||
polysec = po->lines[0]->backsector;
|
||||
|
||||
if (po->flags & POF_CLIPPLANES)
|
||||
{
|
||||
polytop = polysec->ceilingheight;
|
||||
polybottom = polysec->floorheight;
|
||||
}
|
||||
else
|
||||
{
|
||||
polytop = INT32_MAX;
|
||||
polybottom = INT32_MIN;
|
||||
}
|
||||
|
||||
delta1 = mo->z - (polybottom + ((polytop - polybottom)/2));
|
||||
delta2 = thingtop - (polybottom + ((polytop - polybottom)/2));
|
||||
|
||||
if (polytop > mo->floorz && abs(delta1) < abs(delta2))
|
||||
mo->floorz = polytop;
|
||||
|
||||
if (polybottom < mo->ceilingz && abs(delta1) >= abs(delta2))
|
||||
mo->ceilingz = polybottom;
|
||||
|
||||
po = (polyobj_t *)(po->link.next);
|
||||
}
|
||||
}
|
||||
|
||||
static void P_RingZMovement(mobj_t *mo)
|
||||
{
|
||||
I_Assert(mo != NULL);
|
||||
|
@ -1361,43 +1488,9 @@ static void P_RingZMovement(mobj_t *mo)
|
|||
|
||||
// Intercept the stupid 'fall through 3dfloors' bug
|
||||
if (mo->subsector->sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t delta1, delta2;
|
||||
INT32 thingtop = mo->z + mo->height;
|
||||
|
||||
for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS))
|
||||
continue;
|
||||
|
||||
if ((!(rover->flags & FF_BLOCKOTHERS || rover->flags & FF_QUICKSAND) || (rover->flags & FF_SWIMMABLE)))
|
||||
continue;
|
||||
|
||||
if (rover->flags & FF_QUICKSAND)
|
||||
{
|
||||
if (mo->z < *rover->topheight && *rover->bottomheight < thingtop)
|
||||
{
|
||||
if (mo->floorz < mo->z)
|
||||
mo->floorz = mo->z;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
delta1 = mo->z - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
delta2 = thingtop - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
if (*rover->topheight > mo->floorz && abs(delta1) < abs(delta2)
|
||||
&& (!(rover->flags & FF_REVERSEPLATFORM)))
|
||||
{
|
||||
mo->floorz = *rover->topheight;
|
||||
}
|
||||
if (*rover->bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
|
||||
&& (/*mo->z + mo->height <= *rover->bottomheight ||*/ !(rover->flags & FF_PLATFORM)))
|
||||
{
|
||||
mo->ceilingz = *rover->bottomheight;
|
||||
}
|
||||
}
|
||||
}
|
||||
P_AdjustMobjFloorZ_FFloors(mo, mo->subsector->sector, 1);
|
||||
if (mo->subsector->polyList)
|
||||
P_AdjustMobjFloorZ_PolyObjs(mo, mo->subsector);
|
||||
|
||||
// adjust height
|
||||
if (mo->pmomz && mo->z != mo->floorz)
|
||||
|
@ -1443,7 +1536,7 @@ boolean P_CheckSolidLava(mobj_t *mo, ffloor_t *rover)
|
|||
I_Assert(mo != NULL);
|
||||
I_Assert(!P_MobjWasRemoved(mo));
|
||||
|
||||
if ((rover->flags & FF_SWIMMABLE) && GETSECSPECIAL(rover->master->frontsector->special, 1) == 3
|
||||
if (rover->flags & FF_SWIMMABLE && GETSECSPECIAL(rover->master->frontsector->special, 1) == 3
|
||||
&& !(rover->master->flags & ML_BLOCKMONSTERS)
|
||||
&& ((rover->master->flags & ML_EFFECT3) || mo->z-mo->momz > *rover->topheight - FixedMul(16*FRACUNIT, mo->scale)))
|
||||
return true;
|
||||
|
@ -1464,55 +1557,9 @@ static boolean P_ZMovement(mobj_t *mo)
|
|||
|
||||
// Intercept the stupid 'fall through 3dfloors' bug
|
||||
if (mo->subsector->sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t delta1, delta2, thingtop = mo->z + mo->height;
|
||||
|
||||
for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
#if 0 // I question the utility of having four seperate z movement functions.
|
||||
if (!(rover->flags & FF_EXISTS)
|
||||
|| (!((((rover->flags & FF_BLOCKPLAYER) && mo->player)
|
||||
|| ((rover->flags & FF_BLOCKOTHERS) && !mo->player)) || rover->flags & FF_QUICKSAND)
|
||||
|| (rover->flags & FF_SWIMMABLE)))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
#else
|
||||
if (!(rover->flags & FF_EXISTS))
|
||||
continue;
|
||||
|
||||
if (mo->player && P_CheckSolidLava(mo, rover)) // only the player should be affected
|
||||
;
|
||||
else if (!((((rover->flags & FF_BLOCKPLAYER) && mo->player)
|
||||
|| ((rover->flags & FF_BLOCKOTHERS) && !mo->player))
|
||||
|| rover->flags & FF_QUICKSAND))
|
||||
continue;
|
||||
#endif
|
||||
if (rover->flags & FF_QUICKSAND)
|
||||
{
|
||||
if (mo->z < *rover->topheight && *rover->bottomheight < thingtop)
|
||||
{
|
||||
if (mo->floorz < mo->z)
|
||||
mo->floorz = mo->z;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
delta1 = mo->z - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
delta2 = thingtop - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
if (*rover->topheight > mo->floorz && abs(delta1) < abs(delta2)
|
||||
&& (!(rover->flags & FF_REVERSEPLATFORM)))
|
||||
{
|
||||
mo->floorz = *rover->topheight;
|
||||
}
|
||||
if (*rover->bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
|
||||
&& (/*mo->z + mo->height <= *rover->bottomheight ||*/ !(rover->flags & FF_PLATFORM)))
|
||||
{
|
||||
mo->ceilingz = *rover->bottomheight;
|
||||
}
|
||||
}
|
||||
}
|
||||
P_AdjustMobjFloorZ_FFloors(mo, mo->subsector->sector, 0);
|
||||
if (mo->subsector->polyList)
|
||||
P_AdjustMobjFloorZ_PolyObjs(mo, mo->subsector);
|
||||
|
||||
// adjust height
|
||||
if (mo->pmomz && mo->z != mo->floorz)
|
||||
|
@ -1922,45 +1969,9 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
|
||||
// Intercept the stupid 'fall through 3dfloors' bug
|
||||
if (mo->subsector->sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t delta1, delta2;
|
||||
INT32 thingtop = mo->z + mo->height;
|
||||
|
||||
for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS))
|
||||
continue;
|
||||
|
||||
if (P_CheckSolidLava(mo, rover) || P_CanRunOnWater(mo->player, rover))
|
||||
;
|
||||
else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND))
|
||||
continue;
|
||||
|
||||
if (rover->flags & FF_QUICKSAND)
|
||||
{
|
||||
if (mo->z < *rover->topheight && *rover->bottomheight < thingtop)
|
||||
{
|
||||
if (mo->floorz < mo->z)
|
||||
mo->floorz = mo->z;
|
||||
}
|
||||
continue; // This is so you can jump/spring up through quicksand from below.
|
||||
}
|
||||
|
||||
delta1 = mo->z - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
delta2 = thingtop - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
if (*rover->topheight > mo->floorz && abs(delta1) < abs(delta2)
|
||||
&& (!(rover->flags & FF_REVERSEPLATFORM)))
|
||||
{
|
||||
mo->floorz = *rover->topheight;
|
||||
}
|
||||
if (*rover->bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
|
||||
&& (/*mo->z + mo->height <= *rover->bottomheight ||*/ !(rover->flags & FF_PLATFORM)))
|
||||
{
|
||||
mo->ceilingz = *rover->bottomheight;
|
||||
}
|
||||
}
|
||||
}
|
||||
P_AdjustMobjFloorZ_FFloors(mo, mo->subsector->sector, 0);
|
||||
if (mo->subsector->polyList)
|
||||
P_AdjustMobjFloorZ_PolyObjs(mo, mo->subsector);
|
||||
|
||||
// check for smooth step up
|
||||
if ((mo->eflags & MFE_VERTICALFLIP && mo->z + mo->height > mo->ceilingz)
|
||||
|
@ -2052,26 +2063,24 @@ static void P_PlayerZMovement(mobj_t *mo)
|
|||
|
||||
while(po)
|
||||
{
|
||||
if (!P_MobjInsidePolyobj(po, mo))
|
||||
{
|
||||
po = (polyobj_t *)(po->link.next);
|
||||
continue;
|
||||
}
|
||||
|
||||
polysec = po->lines[0]->backsector;
|
||||
|
||||
// Moving polyobjects should act like conveyors if the player lands on one. (I.E. none of the momentum cut thing below) -Red
|
||||
if ((mo->z == polysec->ceilingheight || mo->z+mo->height == polysec->floorheight) && (po->flags & POF_SOLID) && po->thinker)
|
||||
stopmovecut = true;
|
||||
|
||||
if (!(po->flags & POF_LDEXEC)
|
||||
|| !(po->flags & POF_SOLID))
|
||||
if (!P_MobjInsidePolyobj(po, mo) || !(po->flags & POF_SOLID))
|
||||
{
|
||||
po = (polyobj_t *)(po->link.next);
|
||||
continue;
|
||||
}
|
||||
|
||||
// We're inside it! Yess...
|
||||
polysec = po->lines[0]->backsector;
|
||||
|
||||
// Moving polyobjects should act like conveyors if the player lands on one. (I.E. none of the momentum cut thing below) -Red
|
||||
if ((mo->z == polysec->ceilingheight || mo->z+mo->height == polysec->floorheight) && po->thinker)
|
||||
stopmovecut = true;
|
||||
|
||||
if (!(po->flags & POF_LDEXEC))
|
||||
{
|
||||
po = (polyobj_t *)(po->link.next);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mo->z == polysec->ceilingheight)
|
||||
{
|
||||
|
@ -2241,42 +2250,9 @@ static boolean P_SceneryZMovement(mobj_t *mo)
|
|||
{
|
||||
// Intercept the stupid 'fall through 3dfloors' bug
|
||||
if (mo->subsector->sector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t delta1, delta2;
|
||||
INT32 thingtop = mo->z + mo->height;
|
||||
|
||||
for (rover = mo->subsector->sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS))
|
||||
continue;
|
||||
|
||||
if ((!(rover->flags & FF_BLOCKOTHERS || rover->flags & FF_QUICKSAND) || (rover->flags & FF_SWIMMABLE)))
|
||||
continue;
|
||||
|
||||
if (rover->flags & FF_QUICKSAND)
|
||||
{
|
||||
if (mo->z < *rover->topheight && *rover->bottomheight < thingtop)
|
||||
{
|
||||
mo->floorz = mo->z;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
delta1 = mo->z - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
delta2 = thingtop - (*rover->bottomheight + ((*rover->topheight - *rover->bottomheight)/2));
|
||||
if (*rover->topheight > mo->floorz && abs(delta1) < abs(delta2)
|
||||
&& (!(rover->flags & FF_REVERSEPLATFORM)))
|
||||
{
|
||||
mo->floorz = *rover->topheight;
|
||||
}
|
||||
if (*rover->bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
|
||||
&& (/*mo->z + mo->height <= *rover->bottomheight ||*/ !(rover->flags & FF_PLATFORM)))
|
||||
{
|
||||
mo->ceilingz = *rover->bottomheight;
|
||||
}
|
||||
}
|
||||
}
|
||||
P_AdjustMobjFloorZ_FFloors(mo, mo->subsector->sector, 2);
|
||||
if (mo->subsector->polyList)
|
||||
P_AdjustMobjFloorZ_PolyObjs(mo, mo->subsector);
|
||||
|
||||
// adjust height
|
||||
if (mo->pmomz && mo->z != mo->floorz)
|
||||
|
@ -3371,11 +3347,7 @@ static void P_Boss2Thinker(mobj_t *mobj)
|
|||
if (!mobj->movecount)
|
||||
mobj->flags2 &= ~MF2_FRET;
|
||||
|
||||
if (!mobj->tracer
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
&& gametype != GT_CHAOS
|
||||
#endif
|
||||
)
|
||||
if (!mobj->tracer)
|
||||
{
|
||||
var1 = 0;
|
||||
A_BossJetFume(mobj);
|
||||
|
@ -3398,11 +3370,7 @@ static void P_Boss2Thinker(mobj_t *mobj)
|
|||
return;
|
||||
}
|
||||
|
||||
if (mobj->state == &states[mobj->info->spawnstate] && mobj->health > mobj->info->damage
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
&& gametype != GT_CHAOS
|
||||
#endif
|
||||
)
|
||||
if (mobj->state == &states[mobj->info->spawnstate] && mobj->health > mobj->info->damage)
|
||||
A_Boss2Chase(mobj);
|
||||
else if (mobj->health > 0 && mobj->state != &states[mobj->info->painstate] && mobj->state != &states[mobjinfo[mobj->info->missilestate].raisestate])
|
||||
{
|
||||
|
@ -5116,32 +5084,6 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
|
|||
}
|
||||
}
|
||||
|
||||
// Returns true if no boss with health is in the level.
|
||||
// Used for Chaos mode
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
static boolean P_BossDoesntExist(void)
|
||||
{
|
||||
thinker_t *th;
|
||||
mobj_t *mo2;
|
||||
|
||||
// scan the thinkers
|
||||
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 != (actionf_p1)P_MobjThinker)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
||||
if (mo2->flags & MF_BOSS && mo2->health)
|
||||
return false;
|
||||
}
|
||||
|
||||
// No boss found!
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on your target
|
||||
{
|
||||
fixed_t dist, ndist, speedmul;
|
||||
|
@ -6130,14 +6072,6 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS && mobj->target->health <= 0)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
jetx = mobj->target->x + P_ReturnThrustX(mobj->target, mobj->target->angle, FixedMul(-64*FRACUNIT, mobj->target->scale));
|
||||
jety = mobj->target->y + P_ReturnThrustY(mobj->target, mobj->target->angle, FixedMul(-64*FRACUNIT, mobj->target->scale));
|
||||
|
||||
|
@ -6209,14 +6143,6 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS && mobj->target->health <= 0)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
jetx = mobj->target->x + P_ReturnThrustX(mobj->target, mobj->target->angle, FixedMul(-60*FRACUNIT, mobj->target->scale));
|
||||
jety = mobj->target->y + P_ReturnThrustY(mobj->target, mobj->target->angle, FixedMul(-60*FRACUNIT, mobj->target->scale));
|
||||
|
||||
|
@ -6239,13 +6165,6 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS && mobj->target->health <= 0)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x = mobj->target->x;
|
||||
mobj->y = mobj->target->y;
|
||||
|
@ -6677,148 +6596,6 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s
|
|||
}
|
||||
P_RemoveMobj(mobj); // make sure they disappear
|
||||
return;
|
||||
case MT_CHAOSSPAWNER: // Chaos Mode spawner thingy
|
||||
{
|
||||
// 8 enemies: Blue Crawla, Red Crawla, Crawla Commander,
|
||||
// Jett-Synn Bomber, Jett-Synn Gunner, Skim,
|
||||
// Egg Mobile, Egg Slimer.
|
||||
// Max. 3 chances per enemy.
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
|
||||
mobjtype_t spawnchance[8*3], enemy;
|
||||
mobj_t *spawnedmo;
|
||||
INT32 i = 0, numchoices = 0, stop;
|
||||
fixed_t sfloorz, space, airspace, spawnz[8*3];
|
||||
|
||||
sfloorz = mobj->floorz;
|
||||
space = mobj->ceilingz - sfloorz;
|
||||
|
||||
// This makes the assumption there is no gravity-defying water.
|
||||
// A fair assumption to make, if you ask me.
|
||||
airspace = min(space, mobj->ceilingz - mobj->watertop);
|
||||
|
||||
mobj->fuse = cv_chaos_spawnrate.value*TICRATE;
|
||||
prandom = P_Random(); // Gotta love those random numbers!
|
||||
|
||||
if (cv_chaos_bluecrawla.value && space >= mobjinfo[MT_BLUECRAWLA].height)
|
||||
{
|
||||
stop = i + cv_chaos_bluecrawla.value;
|
||||
for (; i < stop; i++)
|
||||
{
|
||||
spawnchance[i] = MT_BLUECRAWLA;
|
||||
spawnz[i] = sfloorz;
|
||||
numchoices++;
|
||||
}
|
||||
}
|
||||
if (cv_chaos_redcrawla.value && space >= mobjinfo[MT_REDCRAWLA].height)
|
||||
{
|
||||
stop = i + cv_chaos_redcrawla.value;
|
||||
for (; i < stop; i++)
|
||||
{
|
||||
spawnchance[i] = MT_REDCRAWLA;
|
||||
spawnz[i] = sfloorz;
|
||||
numchoices++;
|
||||
}
|
||||
}
|
||||
if (cv_chaos_crawlacommander.value
|
||||
&& space >= mobjinfo[MT_CRAWLACOMMANDER].height + 33*FRACUNIT)
|
||||
{
|
||||
stop = i + cv_chaos_crawlacommander.value;
|
||||
for (; i < stop; i++)
|
||||
{
|
||||
spawnchance[i] = MT_CRAWLACOMMANDER;
|
||||
spawnz[i] = sfloorz + 33*FRACUNIT;
|
||||
numchoices++;
|
||||
}
|
||||
}
|
||||
if (cv_chaos_jettysynbomber.value
|
||||
&& airspace >= mobjinfo[MT_JETTBOMBER].height + 33*FRACUNIT)
|
||||
{
|
||||
stop = i + cv_chaos_jettysynbomber.value;
|
||||
for (; i < stop; i++)
|
||||
{
|
||||
spawnchance[i] = MT_JETTBOMBER;
|
||||
spawnz[i] = max(sfloorz, mobj->watertop) + 33*FRACUNIT;
|
||||
numchoices++;
|
||||
}
|
||||
}
|
||||
if (cv_chaos_jettysyngunner.value
|
||||
&& airspace >= mobjinfo[MT_JETTGUNNER].height + 33*FRACUNIT)
|
||||
{
|
||||
stop = i + cv_chaos_jettysyngunner.value;
|
||||
for (; i < stop; i++)
|
||||
{
|
||||
spawnchance[i] = MT_JETTGUNNER;
|
||||
spawnz[i] = max(sfloorz, mobj->watertop) + 33*FRACUNIT;
|
||||
numchoices++;
|
||||
}
|
||||
}
|
||||
if (cv_chaos_skim.value
|
||||
&& mobj->watertop < mobj->ceilingz - mobjinfo[MT_SKIM].height
|
||||
&& mobj->watertop - sfloorz > mobjinfo[MT_SKIM].height/2)
|
||||
{
|
||||
stop = i + cv_chaos_skim.value;
|
||||
for (; i < stop; i++)
|
||||
{
|
||||
spawnchance[i] = MT_SKIM;
|
||||
spawnz[i] = mobj->watertop;
|
||||
numchoices++;
|
||||
}
|
||||
}
|
||||
if (P_BossDoesntExist())
|
||||
{
|
||||
if (cv_chaos_eggmobile1.value
|
||||
&& space >= mobjinfo[MT_EGGMOBILE].height + 33*FRACUNIT)
|
||||
{
|
||||
stop = i + cv_chaos_eggmobile1.value;
|
||||
for (; i < stop; i++)
|
||||
{
|
||||
spawnchance[i] = MT_EGGMOBILE;
|
||||
spawnz[i] = sfloorz + 33*FRACUNIT;
|
||||
numchoices++;
|
||||
}
|
||||
}
|
||||
if (cv_chaos_eggmobile2.value
|
||||
&& space >= mobjinfo[MT_EGGMOBILE2].height + 33*FRACUNIT)
|
||||
{
|
||||
stop = i + cv_chaos_eggmobile2.value;
|
||||
for (; i < stop; i++)
|
||||
{
|
||||
spawnchance[i] = MT_EGGMOBILE2;
|
||||
spawnz[i] = sfloorz + 33*FRACUNIT;
|
||||
numchoices++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (numchoices)
|
||||
{
|
||||
fixed_t fogz;
|
||||
|
||||
i = prandom % numchoices;
|
||||
enemy = spawnchance[i];
|
||||
|
||||
fogz = spawnz[i] - 32*FRACUNIT;
|
||||
if (fogz < sfloorz)
|
||||
fogz = sfloorz;
|
||||
|
||||
spawnedmo = P_SpawnMobj(mobj->x, mobj->y, spawnz[i], enemy);
|
||||
P_SpawnMobj(mobj->x, mobj->y, fogz, MT_TFOG);
|
||||
|
||||
P_SupermanLook4Players(spawnedmo);
|
||||
if (spawnedmo->target && spawnedmo->type != MT_SKIM)
|
||||
P_SetMobjState(spawnedmo, spawnedmo->info->seestate);
|
||||
|
||||
if (spawnedmo->flags & MF_BOSS)
|
||||
{
|
||||
spawnedmo->flags2 |= MF2_CHAOSBOSS;
|
||||
spawnedmo->momx = spawnedmo->momy = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case MT_METALSONIC_BATTLE:
|
||||
break; // don't remove
|
||||
case MT_SPIKE:
|
||||
|
@ -8178,7 +7955,8 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
|||
|
||||
if (i == NUMMOBJTYPES)
|
||||
{
|
||||
if (mthing->type == 3328) // 3D Mode start Thing
|
||||
if (mthing->type == 3328 // 3D Mode start Thing
|
||||
|| mthing->type == 750) // Chaos mode spawn
|
||||
return;
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Unknown thing type %d placed at (%d, %d)\n"), mthing->type, mthing->x, mthing->y);
|
||||
i = MT_UNKNOWN;
|
||||
|
@ -8597,15 +8375,6 @@ ML_NOCLIMB : Direction not controllable
|
|||
if (mthing->angle > 0)
|
||||
mobj->health = mthing->angle;
|
||||
break;
|
||||
case MT_CHAOSSPAWNER:
|
||||
#ifndef CHAOSISNOTDEADYET
|
||||
return;
|
||||
#else
|
||||
if (gametype != GT_CHAOS)
|
||||
return;
|
||||
mobj->fuse = P_Random()*2;
|
||||
break;
|
||||
#endif
|
||||
case MT_TRAPGOYLE:
|
||||
case MT_TRAPGOYLEUP:
|
||||
case MT_TRAPGOYLEDOWN:
|
||||
|
|
10
src/p_pspr.h
10
src/p_pspr.h
|
@ -43,6 +43,16 @@
|
|||
#define FF_TRANSMASK 0xf0000
|
||||
/// \brief shift for FF_TRANSMASK
|
||||
#define FF_TRANSSHIFT 16
|
||||
/// \brief preshifted translucency flags
|
||||
#define FF_TRANS10 (tr_trans10<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS20 (tr_trans20<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS30 (tr_trans30<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS40 (tr_trans40<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS50 (tr_trans50<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS60 (tr_trans60<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS70 (tr_trans70<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS80 (tr_trans80<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS90 (tr_trans90<<FF_TRANSSHIFT)
|
||||
|
||||
/** \brief translucency tables
|
||||
|
||||
|
|
911
src/p_saveg.c
911
src/p_saveg.c
|
@ -990,6 +990,241 @@ static inline UINT32 SavePlayer(const player_t *player)
|
|||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
//
|
||||
// SaveMobjThinker
|
||||
//
|
||||
// Saves a mobj_t thinker
|
||||
//
|
||||
static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||
{
|
||||
const mobj_t *mobj = (const mobj_t *)th;
|
||||
UINT32 diff;
|
||||
UINT16 diff2;
|
||||
|
||||
// Ignore stationary hoops - these will be respawned from mapthings.
|
||||
if (mobj->type == MT_HOOP)
|
||||
return;
|
||||
|
||||
// These are NEVER saved.
|
||||
if (mobj->type == MT_HOOPCOLLIDE)
|
||||
return;
|
||||
|
||||
// This hoop has already been collected.
|
||||
if (mobj->type == MT_HOOPCENTER && mobj->threshold == 4242)
|
||||
return;
|
||||
|
||||
if (mobj->spawnpoint && mobj->info->doomednum != -1)
|
||||
{
|
||||
// spawnpoint is not modified but we must save it since it is an identifier
|
||||
diff = MD_SPAWNPOINT;
|
||||
|
||||
if ((mobj->x != mobj->spawnpoint->x << FRACBITS) ||
|
||||
(mobj->y != mobj->spawnpoint->y << FRACBITS) ||
|
||||
(mobj->angle != FixedAngle(mobj->spawnpoint->angle*FRACUNIT)))
|
||||
diff |= MD_POS;
|
||||
|
||||
if (mobj->info->doomednum != mobj->spawnpoint->type)
|
||||
diff |= MD_TYPE;
|
||||
}
|
||||
else
|
||||
diff = MD_POS | MD_TYPE; // not a map spawned thing so make it from scratch
|
||||
|
||||
diff2 = 0;
|
||||
|
||||
// not the default but the most probable
|
||||
if (mobj->momx != 0 || mobj->momy != 0 || mobj->momz != 0)
|
||||
diff |= MD_MOM;
|
||||
if (mobj->radius != mobj->info->radius)
|
||||
diff |= MD_RADIUS;
|
||||
if (mobj->height != mobj->info->height)
|
||||
diff |= MD_HEIGHT;
|
||||
if (mobj->flags != mobj->info->flags)
|
||||
diff |= MD_FLAGS;
|
||||
if (mobj->flags2)
|
||||
diff |= MD_FLAGS2;
|
||||
if (mobj->health != mobj->info->spawnhealth)
|
||||
diff |= MD_HEALTH;
|
||||
if (mobj->reactiontime != mobj->info->reactiontime)
|
||||
diff |= MD_RTIME;
|
||||
if ((statenum_t)(mobj->state-states) != mobj->info->spawnstate)
|
||||
diff |= MD_STATE;
|
||||
if (mobj->tics != mobj->state->tics)
|
||||
diff |= MD_TICS;
|
||||
if (mobj->sprite != mobj->state->sprite)
|
||||
diff |= MD_SPRITE;
|
||||
if (mobj->frame != mobj->state->frame)
|
||||
diff |= MD_FRAME;
|
||||
if (mobj->eflags)
|
||||
diff |= MD_EFLAGS;
|
||||
if (mobj->player)
|
||||
diff |= MD_PLAYER;
|
||||
|
||||
if (mobj->movedir)
|
||||
diff |= MD_MOVEDIR;
|
||||
if (mobj->movecount)
|
||||
diff |= MD_MOVECOUNT;
|
||||
if (mobj->threshold)
|
||||
diff |= MD_THRESHOLD;
|
||||
if (mobj->lastlook != -1)
|
||||
diff |= MD_LASTLOOK;
|
||||
if (mobj->target)
|
||||
diff |= MD_TARGET;
|
||||
if (mobj->tracer)
|
||||
diff |= MD_TRACER;
|
||||
if (mobj->friction != ORIG_FRICTION)
|
||||
diff |= MD_FRICTION;
|
||||
if (mobj->movefactor != ORIG_FRICTION_FACTOR)
|
||||
diff |= MD_MOVEFACTOR;
|
||||
if (mobj->fuse)
|
||||
diff |= MD_FUSE;
|
||||
if (mobj->watertop)
|
||||
diff |= MD_WATERTOP;
|
||||
if (mobj->waterbottom)
|
||||
diff |= MD_WATERBOTTOM;
|
||||
if (mobj->scale != FRACUNIT)
|
||||
diff |= MD_SCALE;
|
||||
if (mobj->destscale != mobj->scale)
|
||||
diff |= MD_DSCALE;
|
||||
if (mobj->scalespeed != FRACUNIT/12)
|
||||
diff2 |= MD2_SCALESPEED;
|
||||
|
||||
if (mobj == redflag)
|
||||
diff |= MD_REDFLAG;
|
||||
if (mobj == blueflag)
|
||||
diff |= MD_BLUEFLAG;
|
||||
|
||||
if (mobj->cusval)
|
||||
diff2 |= MD2_CUSVAL;
|
||||
if (mobj->cvmem)
|
||||
diff2 |= MD2_CVMEM;
|
||||
if (mobj->color)
|
||||
diff2 |= MD2_COLOR;
|
||||
if (mobj->skin)
|
||||
diff2 |= MD2_SKIN;
|
||||
if (mobj->extravalue1)
|
||||
diff2 |= MD2_EXTVAL1;
|
||||
if (mobj->extravalue2)
|
||||
diff2 |= MD2_EXTVAL2;
|
||||
if (mobj->hnext)
|
||||
diff2 |= MD2_HNEXT;
|
||||
if (mobj->hprev)
|
||||
diff2 |= MD2_HPREV;
|
||||
if (diff2 != 0)
|
||||
diff |= MD_MORE;
|
||||
|
||||
// Scrap all of that. If we're a hoop center, this is ALL we're saving.
|
||||
if (mobj->type == MT_HOOPCENTER)
|
||||
diff = MD_SPAWNPOINT;
|
||||
|
||||
WRITEUINT8(save_p, type);
|
||||
WRITEUINT32(save_p, diff);
|
||||
if (diff & MD_MORE)
|
||||
WRITEUINT16(save_p, diff2);
|
||||
|
||||
// save pointer, at load time we will search this pointer to reinitilize pointers
|
||||
WRITEUINT32(save_p, (size_t)mobj);
|
||||
|
||||
WRITEFIXED(save_p, mobj->z); // Force this so 3dfloor problems don't arise.
|
||||
WRITEFIXED(save_p, mobj->floorz);
|
||||
WRITEFIXED(save_p, mobj->ceilingz);
|
||||
|
||||
if (diff & MD_SPAWNPOINT)
|
||||
{
|
||||
size_t z;
|
||||
|
||||
for (z = 0; z < nummapthings; z++)
|
||||
if (&mapthings[z] == mobj->spawnpoint)
|
||||
WRITEUINT16(save_p, z);
|
||||
if (mobj->type == MT_HOOPCENTER)
|
||||
return;
|
||||
}
|
||||
|
||||
if (diff & MD_TYPE)
|
||||
WRITEUINT32(save_p, mobj->type);
|
||||
if (diff & MD_POS)
|
||||
{
|
||||
WRITEFIXED(save_p, mobj->x);
|
||||
WRITEFIXED(save_p, mobj->y);
|
||||
WRITEANGLE(save_p, mobj->angle);
|
||||
}
|
||||
if (diff & MD_MOM)
|
||||
{
|
||||
WRITEFIXED(save_p, mobj->momx);
|
||||
WRITEFIXED(save_p, mobj->momy);
|
||||
WRITEFIXED(save_p, mobj->momz);
|
||||
}
|
||||
if (diff & MD_RADIUS)
|
||||
WRITEFIXED(save_p, mobj->radius);
|
||||
if (diff & MD_HEIGHT)
|
||||
WRITEFIXED(save_p, mobj->height);
|
||||
if (diff & MD_FLAGS)
|
||||
WRITEUINT32(save_p, mobj->flags);
|
||||
if (diff & MD_FLAGS2)
|
||||
WRITEUINT32(save_p, mobj->flags2);
|
||||
if (diff & MD_HEALTH)
|
||||
WRITEINT32(save_p, mobj->health);
|
||||
if (diff & MD_RTIME)
|
||||
WRITEINT32(save_p, mobj->reactiontime);
|
||||
if (diff & MD_STATE)
|
||||
WRITEUINT16(save_p, mobj->state-states);
|
||||
if (diff & MD_TICS)
|
||||
WRITEINT32(save_p, mobj->tics);
|
||||
if (diff & MD_SPRITE)
|
||||
WRITEUINT16(save_p, mobj->sprite);
|
||||
if (diff & MD_FRAME)
|
||||
WRITEUINT32(save_p, mobj->frame);
|
||||
if (diff & MD_EFLAGS)
|
||||
WRITEUINT8(save_p, mobj->eflags);
|
||||
if (diff & MD_PLAYER)
|
||||
WRITEUINT8(save_p, mobj->player-players);
|
||||
if (diff & MD_MOVEDIR)
|
||||
WRITEANGLE(save_p, mobj->movedir);
|
||||
if (diff & MD_MOVECOUNT)
|
||||
WRITEINT32(save_p, mobj->movecount);
|
||||
if (diff & MD_THRESHOLD)
|
||||
WRITEINT32(save_p, mobj->threshold);
|
||||
if (diff & MD_LASTLOOK)
|
||||
WRITEINT32(save_p, mobj->lastlook);
|
||||
if (diff & MD_TARGET)
|
||||
WRITEUINT32(save_p, mobj->target->mobjnum);
|
||||
if (diff & MD_TRACER)
|
||||
WRITEUINT32(save_p, mobj->tracer->mobjnum);
|
||||
if (diff & MD_FRICTION)
|
||||
WRITEFIXED(save_p, mobj->friction);
|
||||
if (diff & MD_MOVEFACTOR)
|
||||
WRITEFIXED(save_p, mobj->movefactor);
|
||||
if (diff & MD_FUSE)
|
||||
WRITEINT32(save_p, mobj->fuse);
|
||||
if (diff & MD_WATERTOP)
|
||||
WRITEFIXED(save_p, mobj->watertop);
|
||||
if (diff & MD_WATERBOTTOM)
|
||||
WRITEFIXED(save_p, mobj->waterbottom);
|
||||
if (diff & MD_SCALE)
|
||||
WRITEFIXED(save_p, mobj->scale);
|
||||
if (diff & MD_DSCALE)
|
||||
WRITEFIXED(save_p, mobj->destscale);
|
||||
if (diff2 & MD2_SCALESPEED)
|
||||
WRITEFIXED(save_p, mobj->scalespeed);
|
||||
if (diff2 & MD2_CUSVAL)
|
||||
WRITEINT32(save_p, mobj->cusval);
|
||||
if (diff2 & MD2_CVMEM)
|
||||
WRITEINT32(save_p, mobj->cvmem);
|
||||
if (diff2 & MD2_SKIN)
|
||||
WRITEUINT8(save_p, (UINT8)((skin_t *)mobj->skin - skins));
|
||||
if (diff2 & MD2_COLOR)
|
||||
WRITEUINT8(save_p, mobj->color);
|
||||
if (diff2 & MD2_EXTVAL1)
|
||||
WRITEINT32(save_p, mobj->extravalue1);
|
||||
if (diff2 & MD2_EXTVAL2)
|
||||
WRITEINT32(save_p, mobj->extravalue2);
|
||||
if (diff2 & MD2_HNEXT)
|
||||
WRITEUINT32(save_p, mobj->hnext->mobjnum);
|
||||
if (diff2 & MD2_HPREV)
|
||||
WRITEUINT32(save_p, mobj->hprev->mobjnum);
|
||||
|
||||
WRITEUINT32(save_p, mobj->mobjnum);
|
||||
}
|
||||
|
||||
//
|
||||
// SaveSpecialLevelThinker
|
||||
//
|
||||
|
@ -1395,9 +1630,6 @@ static inline void SaveWhatThinker(const thinker_t *th, const UINT8 type)
|
|||
static void P_NetArchiveThinkers(void)
|
||||
{
|
||||
const thinker_t *th;
|
||||
const mobj_t *mobj;
|
||||
UINT32 diff;
|
||||
UINT16 diff2;
|
||||
|
||||
WRITEUINT32(save_p, ARCHIVEBLOCK_THINKERS);
|
||||
|
||||
|
@ -1406,230 +1638,8 @@ static void P_NetArchiveThinkers(void)
|
|||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_MobjThinker)
|
||||
{
|
||||
mobj = (const mobj_t *)th;
|
||||
|
||||
// Ignore stationary hoops - these will be respawned from mapthings.
|
||||
if (mobj->type == MT_HOOP)
|
||||
SaveMobjThinker(th, tc_mobj);
|
||||
continue;
|
||||
|
||||
// These are NEVER saved.
|
||||
if (mobj->type == MT_HOOPCOLLIDE)
|
||||
continue;
|
||||
|
||||
// This hoop has already been collected.
|
||||
if (mobj->type == MT_HOOPCENTER && mobj->threshold == 4242)
|
||||
continue;
|
||||
|
||||
if (mobj->spawnpoint && mobj->info->doomednum != -1)
|
||||
{
|
||||
// spawnpoint is not modified but we must save it since it is an identifier
|
||||
diff = MD_SPAWNPOINT;
|
||||
|
||||
if ((mobj->x != mobj->spawnpoint->x << FRACBITS) ||
|
||||
(mobj->y != mobj->spawnpoint->y << FRACBITS) ||
|
||||
(mobj->angle != FixedAngle(mobj->spawnpoint->angle*FRACUNIT)))
|
||||
diff |= MD_POS;
|
||||
|
||||
if (mobj->info->doomednum != mobj->spawnpoint->type)
|
||||
diff |= MD_TYPE;
|
||||
}
|
||||
else
|
||||
diff = MD_POS | MD_TYPE; // not a map spawned thing so make it from scratch
|
||||
|
||||
diff2 = 0;
|
||||
|
||||
// not the default but the most probable
|
||||
if (mobj->momx != 0 || mobj->momy != 0 || mobj->momz != 0)
|
||||
diff |= MD_MOM;
|
||||
if (mobj->radius != mobj->info->radius)
|
||||
diff |= MD_RADIUS;
|
||||
if (mobj->height != mobj->info->height)
|
||||
diff |= MD_HEIGHT;
|
||||
if (mobj->flags != mobj->info->flags)
|
||||
diff |= MD_FLAGS;
|
||||
if (mobj->flags2)
|
||||
diff |= MD_FLAGS2;
|
||||
if (mobj->health != mobj->info->spawnhealth)
|
||||
diff |= MD_HEALTH;
|
||||
if (mobj->reactiontime != mobj->info->reactiontime)
|
||||
diff |= MD_RTIME;
|
||||
if ((statenum_t)(mobj->state-states) != mobj->info->spawnstate)
|
||||
diff |= MD_STATE;
|
||||
if (mobj->tics != mobj->state->tics)
|
||||
diff |= MD_TICS;
|
||||
if (mobj->sprite != mobj->state->sprite)
|
||||
diff |= MD_SPRITE;
|
||||
if (mobj->frame != mobj->state->frame)
|
||||
diff |= MD_FRAME;
|
||||
if (mobj->eflags)
|
||||
diff |= MD_EFLAGS;
|
||||
if (mobj->player)
|
||||
diff |= MD_PLAYER;
|
||||
|
||||
if (mobj->movedir)
|
||||
diff |= MD_MOVEDIR;
|
||||
if (mobj->movecount)
|
||||
diff |= MD_MOVECOUNT;
|
||||
if (mobj->threshold)
|
||||
diff |= MD_THRESHOLD;
|
||||
if (mobj->lastlook != -1)
|
||||
diff |= MD_LASTLOOK;
|
||||
if (mobj->target)
|
||||
diff |= MD_TARGET;
|
||||
if (mobj->tracer)
|
||||
diff |= MD_TRACER;
|
||||
if (mobj->friction != ORIG_FRICTION)
|
||||
diff |= MD_FRICTION;
|
||||
if (mobj->movefactor != ORIG_FRICTION_FACTOR)
|
||||
diff |= MD_MOVEFACTOR;
|
||||
if (mobj->fuse)
|
||||
diff |= MD_FUSE;
|
||||
if (mobj->watertop)
|
||||
diff |= MD_WATERTOP;
|
||||
if (mobj->waterbottom)
|
||||
diff |= MD_WATERBOTTOM;
|
||||
if (mobj->scale != FRACUNIT)
|
||||
diff |= MD_SCALE;
|
||||
if (mobj->destscale != mobj->scale)
|
||||
diff |= MD_DSCALE;
|
||||
if (mobj->scalespeed != FRACUNIT/12)
|
||||
diff2 |= MD2_SCALESPEED;
|
||||
|
||||
if (mobj == redflag)
|
||||
diff |= MD_REDFLAG;
|
||||
if (mobj == blueflag)
|
||||
diff |= MD_BLUEFLAG;
|
||||
|
||||
if (mobj->cusval)
|
||||
diff2 |= MD2_CUSVAL;
|
||||
if (mobj->cvmem)
|
||||
diff2 |= MD2_CVMEM;
|
||||
if (mobj->color)
|
||||
diff2 |= MD2_COLOR;
|
||||
if (mobj->skin)
|
||||
diff2 |= MD2_SKIN;
|
||||
if (mobj->extravalue1)
|
||||
diff2 |= MD2_EXTVAL1;
|
||||
if (mobj->extravalue2)
|
||||
diff2 |= MD2_EXTVAL2;
|
||||
if (mobj->hnext)
|
||||
diff2 |= MD2_HNEXT;
|
||||
if (mobj->hprev)
|
||||
diff2 |= MD2_HPREV;
|
||||
if (diff2 != 0)
|
||||
diff |= MD_MORE;
|
||||
|
||||
// Scrap all of that. If we're a hoop center, this is ALL we're saving.
|
||||
if (mobj->type == MT_HOOPCENTER)
|
||||
diff = MD_SPAWNPOINT;
|
||||
|
||||
WRITEUINT8(save_p, tc_mobj);
|
||||
WRITEUINT32(save_p, diff);
|
||||
if (diff & MD_MORE)
|
||||
WRITEUINT16(save_p, diff2);
|
||||
|
||||
// save pointer, at load time we will search this pointer to reinitilize pointers
|
||||
WRITEUINT32(save_p, (size_t)mobj);
|
||||
|
||||
WRITEFIXED(save_p, mobj->z); // Force this so 3dfloor problems don't arise.
|
||||
WRITEFIXED(save_p, mobj->floorz);
|
||||
WRITEFIXED(save_p, mobj->ceilingz);
|
||||
|
||||
if (diff & MD_SPAWNPOINT)
|
||||
{
|
||||
size_t z;
|
||||
|
||||
for (z = 0; z < nummapthings; z++)
|
||||
if (&mapthings[z] == mobj->spawnpoint)
|
||||
WRITEUINT16(save_p, z);
|
||||
if (mobj->type == MT_HOOPCENTER)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (diff & MD_TYPE)
|
||||
WRITEUINT32(save_p, mobj->type);
|
||||
if (diff & MD_POS)
|
||||
{
|
||||
WRITEFIXED(save_p, mobj->x);
|
||||
WRITEFIXED(save_p, mobj->y);
|
||||
WRITEANGLE(save_p, mobj->angle);
|
||||
}
|
||||
if (diff & MD_MOM)
|
||||
{
|
||||
WRITEFIXED(save_p, mobj->momx);
|
||||
WRITEFIXED(save_p, mobj->momy);
|
||||
WRITEFIXED(save_p, mobj->momz);
|
||||
}
|
||||
if (diff & MD_RADIUS)
|
||||
WRITEFIXED(save_p, mobj->radius);
|
||||
if (diff & MD_HEIGHT)
|
||||
WRITEFIXED(save_p, mobj->height);
|
||||
if (diff & MD_FLAGS)
|
||||
WRITEUINT32(save_p, mobj->flags);
|
||||
if (diff & MD_FLAGS2)
|
||||
WRITEUINT32(save_p, mobj->flags2);
|
||||
if (diff & MD_HEALTH)
|
||||
WRITEINT32(save_p, mobj->health);
|
||||
if (diff & MD_RTIME)
|
||||
WRITEINT32(save_p, mobj->reactiontime);
|
||||
if (diff & MD_STATE)
|
||||
WRITEUINT16(save_p, mobj->state-states);
|
||||
if (diff & MD_TICS)
|
||||
WRITEINT32(save_p, mobj->tics);
|
||||
if (diff & MD_SPRITE)
|
||||
WRITEUINT16(save_p, mobj->sprite);
|
||||
if (diff & MD_FRAME)
|
||||
WRITEUINT32(save_p, mobj->frame);
|
||||
if (diff & MD_EFLAGS)
|
||||
WRITEUINT8(save_p, mobj->eflags);
|
||||
if (diff & MD_PLAYER)
|
||||
WRITEUINT8(save_p, mobj->player-players);
|
||||
if (diff & MD_MOVEDIR)
|
||||
WRITEANGLE(save_p, mobj->movedir);
|
||||
if (diff & MD_MOVECOUNT)
|
||||
WRITEINT32(save_p, mobj->movecount);
|
||||
if (diff & MD_THRESHOLD)
|
||||
WRITEINT32(save_p, mobj->threshold);
|
||||
if (diff & MD_LASTLOOK)
|
||||
WRITEINT32(save_p, mobj->lastlook);
|
||||
if (diff & MD_TARGET)
|
||||
WRITEUINT32(save_p, mobj->target->mobjnum);
|
||||
if (diff & MD_TRACER)
|
||||
WRITEUINT32(save_p, mobj->tracer->mobjnum);
|
||||
if (diff & MD_FRICTION)
|
||||
WRITEFIXED(save_p, mobj->friction);
|
||||
if (diff & MD_MOVEFACTOR)
|
||||
WRITEFIXED(save_p, mobj->movefactor);
|
||||
if (diff & MD_FUSE)
|
||||
WRITEINT32(save_p, mobj->fuse);
|
||||
if (diff & MD_WATERTOP)
|
||||
WRITEFIXED(save_p, mobj->watertop);
|
||||
if (diff & MD_WATERBOTTOM)
|
||||
WRITEFIXED(save_p, mobj->waterbottom);
|
||||
if (diff & MD_SCALE)
|
||||
WRITEFIXED(save_p, mobj->scale);
|
||||
if (diff & MD_DSCALE)
|
||||
WRITEFIXED(save_p, mobj->destscale);
|
||||
if (diff2 & MD2_SCALESPEED)
|
||||
WRITEFIXED(save_p, mobj->scalespeed);
|
||||
if (diff2 & MD2_CUSVAL)
|
||||
WRITEINT32(save_p, mobj->cusval);
|
||||
if (diff2 & MD2_CVMEM)
|
||||
WRITEINT32(save_p, mobj->cvmem);
|
||||
if (diff2 & MD2_SKIN)
|
||||
WRITEUINT8(save_p, (UINT8)((skin_t *)mobj->skin - skins));
|
||||
if (diff2 & MD2_COLOR)
|
||||
WRITEUINT8(save_p, mobj->color);
|
||||
if (diff2 & MD2_EXTVAL1)
|
||||
WRITEINT32(save_p, mobj->extravalue1);
|
||||
if (diff2 & MD2_EXTVAL2)
|
||||
WRITEINT32(save_p, mobj->extravalue2);
|
||||
if (diff2 & MD2_HNEXT)
|
||||
WRITEUINT32(save_p, mobj->hnext->mobjnum);
|
||||
if (diff2 & MD2_HPREV)
|
||||
WRITEUINT32(save_p, mobj->hprev->mobjnum);
|
||||
|
||||
WRITEUINT32(save_p, mobj->mobjnum);
|
||||
}
|
||||
#ifdef PARANOIA
|
||||
else if (th->function.acp1 == (actionf_p1)P_RainThinker
|
||||
|
@ -1862,6 +1872,232 @@ static inline player_t *LoadPlayer(UINT32 player)
|
|||
return &players[player];
|
||||
}
|
||||
|
||||
//
|
||||
// LoadMobjThinker
|
||||
//
|
||||
// Loads a mobj_t from a save game
|
||||
//
|
||||
static void LoadMobjThinker(actionf_p1 thinker)
|
||||
{
|
||||
thinker_t *next;
|
||||
mobj_t *mobj;
|
||||
UINT32 diff;
|
||||
UINT16 diff2;
|
||||
INT32 i;
|
||||
fixed_t z, floorz, ceilingz;
|
||||
|
||||
diff = READUINT32(save_p);
|
||||
if (diff & MD_MORE)
|
||||
diff2 = READUINT16(save_p);
|
||||
else
|
||||
diff2 = 0;
|
||||
|
||||
next = (void *)(size_t)READUINT32(save_p);
|
||||
|
||||
z = READFIXED(save_p); // Force this so 3dfloor problems don't arise.
|
||||
floorz = READFIXED(save_p);
|
||||
ceilingz = READFIXED(save_p);
|
||||
|
||||
if (diff & MD_SPAWNPOINT)
|
||||
{
|
||||
UINT16 spawnpointnum = READUINT16(save_p);
|
||||
|
||||
if (mapthings[spawnpointnum].type == 1705 || mapthings[spawnpointnum].type == 1713) // NiGHTS Hoop special case
|
||||
{
|
||||
P_SpawnHoopsAndRings(&mapthings[spawnpointnum]);
|
||||
return;
|
||||
}
|
||||
|
||||
mobj = Z_Calloc(sizeof (*mobj), PU_LEVEL, NULL);
|
||||
|
||||
mobj->spawnpoint = &mapthings[spawnpointnum];
|
||||
mapthings[spawnpointnum].mobj = mobj;
|
||||
}
|
||||
else
|
||||
mobj = Z_Calloc(sizeof (*mobj), PU_LEVEL, NULL);
|
||||
|
||||
// declare this as a valid mobj as soon as possible.
|
||||
mobj->thinker.function.acp1 = thinker;
|
||||
|
||||
mobj->z = z;
|
||||
mobj->floorz = floorz;
|
||||
mobj->ceilingz = ceilingz;
|
||||
|
||||
if (diff & MD_TYPE)
|
||||
mobj->type = READUINT32(save_p);
|
||||
else
|
||||
{
|
||||
for (i = 0; i < NUMMOBJTYPES; i++)
|
||||
if (mobj->spawnpoint && mobj->spawnpoint->type == mobjinfo[i].doomednum)
|
||||
break;
|
||||
if (i == NUMMOBJTYPES)
|
||||
{
|
||||
if (mobj->spawnpoint)
|
||||
CONS_Alert(CONS_ERROR, "Found mobj with unknown map thing type %d\n", mobj->spawnpoint->type);
|
||||
else
|
||||
CONS_Alert(CONS_ERROR, "Found mobj with unknown map thing type NULL\n");
|
||||
I_Error("Savegame corrupted");
|
||||
}
|
||||
mobj->type = i;
|
||||
}
|
||||
mobj->info = &mobjinfo[mobj->type];
|
||||
if (diff & MD_POS)
|
||||
{
|
||||
mobj->x = READFIXED(save_p);
|
||||
mobj->y = READFIXED(save_p);
|
||||
mobj->angle = READANGLE(save_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj->x = mobj->spawnpoint->x << FRACBITS;
|
||||
mobj->y = mobj->spawnpoint->y << FRACBITS;
|
||||
mobj->angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT);
|
||||
}
|
||||
if (diff & MD_MOM)
|
||||
{
|
||||
mobj->momx = READFIXED(save_p);
|
||||
mobj->momy = READFIXED(save_p);
|
||||
mobj->momz = READFIXED(save_p);
|
||||
} // otherwise they're zero, and the memset took care of it
|
||||
|
||||
if (diff & MD_RADIUS)
|
||||
mobj->radius = READFIXED(save_p);
|
||||
else
|
||||
mobj->radius = mobj->info->radius;
|
||||
if (diff & MD_HEIGHT)
|
||||
mobj->height = READFIXED(save_p);
|
||||
else
|
||||
mobj->height = mobj->info->height;
|
||||
if (diff & MD_FLAGS)
|
||||
mobj->flags = READUINT32(save_p);
|
||||
else
|
||||
mobj->flags = mobj->info->flags;
|
||||
if (diff & MD_FLAGS2)
|
||||
mobj->flags2 = READUINT32(save_p);
|
||||
if (diff & MD_HEALTH)
|
||||
mobj->health = READINT32(save_p);
|
||||
else
|
||||
mobj->health = mobj->info->spawnhealth;
|
||||
if (diff & MD_RTIME)
|
||||
mobj->reactiontime = READINT32(save_p);
|
||||
else
|
||||
mobj->reactiontime = mobj->info->reactiontime;
|
||||
|
||||
if (diff & MD_STATE)
|
||||
mobj->state = &states[READUINT16(save_p)];
|
||||
else
|
||||
mobj->state = &states[mobj->info->spawnstate];
|
||||
if (diff & MD_TICS)
|
||||
mobj->tics = READINT32(save_p);
|
||||
else
|
||||
mobj->tics = mobj->state->tics;
|
||||
if (diff & MD_SPRITE)
|
||||
mobj->sprite = READUINT16(save_p);
|
||||
else
|
||||
mobj->sprite = mobj->state->sprite;
|
||||
if (diff & MD_FRAME)
|
||||
mobj->frame = READUINT32(save_p);
|
||||
else
|
||||
mobj->frame = mobj->state->frame;
|
||||
if (diff & MD_EFLAGS)
|
||||
mobj->eflags = READUINT8(save_p);
|
||||
if (diff & MD_PLAYER)
|
||||
{
|
||||
i = READUINT8(save_p);
|
||||
mobj->player = &players[i];
|
||||
mobj->player->mo = mobj;
|
||||
// added for angle prediction
|
||||
if (consoleplayer == i)
|
||||
localangle = mobj->angle;
|
||||
if (secondarydisplayplayer == i)
|
||||
localangle2 = mobj->angle;
|
||||
}
|
||||
if (diff & MD_MOVEDIR)
|
||||
mobj->movedir = READANGLE(save_p);
|
||||
if (diff & MD_MOVECOUNT)
|
||||
mobj->movecount = READINT32(save_p);
|
||||
if (diff & MD_THRESHOLD)
|
||||
mobj->threshold = READINT32(save_p);
|
||||
if (diff & MD_LASTLOOK)
|
||||
mobj->lastlook = READINT32(save_p);
|
||||
else
|
||||
mobj->lastlook = -1;
|
||||
if (diff & MD_TARGET)
|
||||
mobj->target = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff & MD_TRACER)
|
||||
mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff & MD_FRICTION)
|
||||
mobj->friction = READFIXED(save_p);
|
||||
else
|
||||
mobj->friction = ORIG_FRICTION;
|
||||
if (diff & MD_MOVEFACTOR)
|
||||
mobj->movefactor = READFIXED(save_p);
|
||||
else
|
||||
mobj->movefactor = ORIG_FRICTION_FACTOR;
|
||||
if (diff & MD_FUSE)
|
||||
mobj->fuse = READINT32(save_p);
|
||||
if (diff & MD_WATERTOP)
|
||||
mobj->watertop = READFIXED(save_p);
|
||||
if (diff & MD_WATERBOTTOM)
|
||||
mobj->waterbottom = READFIXED(save_p);
|
||||
if (diff & MD_SCALE)
|
||||
mobj->scale = READFIXED(save_p);
|
||||
else
|
||||
mobj->scale = FRACUNIT;
|
||||
if (diff & MD_DSCALE)
|
||||
mobj->destscale = READFIXED(save_p);
|
||||
else
|
||||
mobj->destscale = mobj->scale;
|
||||
if (diff2 & MD2_SCALESPEED)
|
||||
mobj->scalespeed = READFIXED(save_p);
|
||||
else
|
||||
mobj->scalespeed = FRACUNIT/12;
|
||||
if (diff2 & MD2_CUSVAL)
|
||||
mobj->cusval = READINT32(save_p);
|
||||
if (diff2 & MD2_CVMEM)
|
||||
mobj->cvmem = READINT32(save_p);
|
||||
if (diff2 & MD2_SKIN)
|
||||
mobj->skin = &skins[READUINT8(save_p)];
|
||||
if (diff2 & MD2_COLOR)
|
||||
mobj->color = READUINT8(save_p);
|
||||
if (diff2 & MD2_EXTVAL1)
|
||||
mobj->extravalue1 = READINT32(save_p);
|
||||
if (diff2 & MD2_EXTVAL2)
|
||||
mobj->extravalue2 = READINT32(save_p);
|
||||
if (diff2 & MD2_HNEXT)
|
||||
mobj->hnext = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff2 & MD2_HPREV)
|
||||
mobj->hprev = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
|
||||
if (diff & MD_REDFLAG)
|
||||
{
|
||||
redflag = mobj;
|
||||
rflagpoint = mobj->spawnpoint;
|
||||
}
|
||||
if (diff & MD_BLUEFLAG)
|
||||
{
|
||||
blueflag = mobj;
|
||||
bflagpoint = mobj->spawnpoint;
|
||||
}
|
||||
|
||||
// set sprev, snext, bprev, bnext, subsector
|
||||
P_SetThingPosition(mobj);
|
||||
|
||||
mobj->mobjnum = READUINT32(save_p);
|
||||
|
||||
if (mobj->player)
|
||||
{
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
mobj->player->viewz = mobj->z + mobj->height - mobj->player->viewheight;
|
||||
else
|
||||
mobj->player->viewz = mobj->player->mo->z + mobj->player->viewheight;
|
||||
}
|
||||
|
||||
P_AddThinker(&mobj->thinker);
|
||||
|
||||
mobj->info = (mobjinfo_t *)next; // temporarily, set when leave this function
|
||||
}
|
||||
|
||||
//
|
||||
// LoadSpecialLevelThinker
|
||||
//
|
||||
|
@ -2131,11 +2367,15 @@ static void LoadPusherThinker(actionf_p1 thinker)
|
|||
static inline void LoadLaserThinker(actionf_p1 thinker)
|
||||
{
|
||||
laserthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL);
|
||||
ffloor_t *rover = NULL;
|
||||
ht->thinker.function.acp1 = thinker;
|
||||
ht->sector = LoadSector(READUINT32(save_p));
|
||||
ht->ffloor = NULL;
|
||||
ht->sec = LoadSector(READUINT32(save_p));
|
||||
ht->sourceline = LoadLine(READUINT32(save_p));
|
||||
for (rover = ht->sector->ffloors; rover; rover = rover->next)
|
||||
if (rover->secnum == (size_t)(ht->sec - sectors)
|
||||
&& rover->master == ht->sourceline)
|
||||
ht->ffloor = rover;
|
||||
P_AddThinker(&ht->thinker);
|
||||
}
|
||||
|
||||
|
@ -2333,13 +2573,8 @@ static void P_NetUnArchiveThinkers(void)
|
|||
{
|
||||
thinker_t *currentthinker;
|
||||
thinker_t *next;
|
||||
mobj_t *mobj;
|
||||
UINT32 diff;
|
||||
UINT16 diff2;
|
||||
INT32 i;
|
||||
UINT8 tclass;
|
||||
UINT8 restoreNum = false;
|
||||
fixed_t z, floorz, ceilingz;
|
||||
|
||||
if (READUINT32(save_p) != ARCHIVEBLOCK_THINKERS)
|
||||
I_Error("Bad $$$.sav at archive block Thinkers");
|
||||
|
@ -2350,7 +2585,6 @@ static void P_NetUnArchiveThinkers(void)
|
|||
{
|
||||
next = currentthinker->next;
|
||||
|
||||
mobj = (mobj_t *)currentthinker;
|
||||
if (currentthinker->function.acp1 == (actionf_p1)P_MobjThinker)
|
||||
P_RemoveSavegameMobj((mobj_t *)currentthinker); // item isn't saved, don't remove it
|
||||
else
|
||||
|
@ -2372,216 +2606,7 @@ static void P_NetUnArchiveThinkers(void)
|
|||
switch (tclass)
|
||||
{
|
||||
case tc_mobj:
|
||||
diff = READUINT32(save_p);
|
||||
if (diff & MD_MORE)
|
||||
diff2 = READUINT16(save_p);
|
||||
else
|
||||
diff2 = 0;
|
||||
|
||||
next = (void *)(size_t)READUINT32(save_p);
|
||||
|
||||
z = READFIXED(save_p); // Force this so 3dfloor problems don't arise.
|
||||
floorz = READFIXED(save_p);
|
||||
ceilingz = READFIXED(save_p);
|
||||
|
||||
if (diff & MD_SPAWNPOINT)
|
||||
{
|
||||
UINT16 spawnpointnum = READUINT16(save_p);
|
||||
|
||||
if (mapthings[spawnpointnum].type == 1705 || mapthings[spawnpointnum].type == 1713) // NiGHTS Hoop special case
|
||||
{
|
||||
P_SpawnHoopsAndRings(&mapthings[spawnpointnum]);
|
||||
continue;
|
||||
}
|
||||
|
||||
mobj = Z_Calloc(sizeof (*mobj), PU_LEVEL, NULL);
|
||||
|
||||
mobj->spawnpoint = &mapthings[spawnpointnum];
|
||||
mapthings[spawnpointnum].mobj = mobj;
|
||||
}
|
||||
else
|
||||
mobj = Z_Calloc(sizeof (*mobj), PU_LEVEL, NULL);
|
||||
|
||||
// declare this as a valid mobj as soon as possible.
|
||||
mobj->thinker.function.acp1 = (actionf_p1)P_MobjThinker;
|
||||
|
||||
mobj->z = z;
|
||||
mobj->floorz = floorz;
|
||||
mobj->ceilingz = ceilingz;
|
||||
|
||||
if (diff & MD_TYPE)
|
||||
mobj->type = READUINT32(save_p);
|
||||
else
|
||||
{
|
||||
for (i = 0; i < NUMMOBJTYPES; i++)
|
||||
if (mobj->spawnpoint && mobj->spawnpoint->type == mobjinfo[i].doomednum)
|
||||
break;
|
||||
if (i == NUMMOBJTYPES)
|
||||
{
|
||||
if (mobj->spawnpoint)
|
||||
CONS_Alert(CONS_ERROR, "Found mobj with unknown map thing type %d\n", mobj->spawnpoint->type);
|
||||
else
|
||||
CONS_Alert(CONS_ERROR, "Found mobj with unknown map thing type NULL\n");
|
||||
I_Error("Savegame corrupted");
|
||||
}
|
||||
mobj->type = i;
|
||||
}
|
||||
mobj->info = &mobjinfo[mobj->type];
|
||||
if (diff & MD_POS)
|
||||
{
|
||||
mobj->x = READFIXED(save_p);
|
||||
mobj->y = READFIXED(save_p);
|
||||
mobj->angle = READANGLE(save_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj->x = mobj->spawnpoint->x << FRACBITS;
|
||||
mobj->y = mobj->spawnpoint->y << FRACBITS;
|
||||
mobj->angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT);
|
||||
}
|
||||
if (diff & MD_MOM)
|
||||
{
|
||||
mobj->momx = READFIXED(save_p);
|
||||
mobj->momy = READFIXED(save_p);
|
||||
mobj->momz = READFIXED(save_p);
|
||||
} // otherwise they're zero, and the memset took care of it
|
||||
|
||||
if (diff & MD_RADIUS)
|
||||
mobj->radius = READFIXED(save_p);
|
||||
else
|
||||
mobj->radius = mobj->info->radius;
|
||||
if (diff & MD_HEIGHT)
|
||||
mobj->height = READFIXED(save_p);
|
||||
else
|
||||
mobj->height = mobj->info->height;
|
||||
if (diff & MD_FLAGS)
|
||||
mobj->flags = READUINT32(save_p);
|
||||
else
|
||||
mobj->flags = mobj->info->flags;
|
||||
if (diff & MD_FLAGS2)
|
||||
mobj->flags2 = READUINT32(save_p);
|
||||
if (diff & MD_HEALTH)
|
||||
mobj->health = READINT32(save_p);
|
||||
else
|
||||
mobj->health = mobj->info->spawnhealth;
|
||||
if (diff & MD_RTIME)
|
||||
mobj->reactiontime = READINT32(save_p);
|
||||
else
|
||||
mobj->reactiontime = mobj->info->reactiontime;
|
||||
|
||||
if (diff & MD_STATE)
|
||||
mobj->state = &states[READUINT16(save_p)];
|
||||
else
|
||||
mobj->state = &states[mobj->info->spawnstate];
|
||||
if (diff & MD_TICS)
|
||||
mobj->tics = READINT32(save_p);
|
||||
else
|
||||
mobj->tics = mobj->state->tics;
|
||||
if (diff & MD_SPRITE)
|
||||
mobj->sprite = READUINT16(save_p);
|
||||
else
|
||||
mobj->sprite = mobj->state->sprite;
|
||||
if (diff & MD_FRAME)
|
||||
mobj->frame = READUINT32(save_p);
|
||||
else
|
||||
mobj->frame = mobj->state->frame;
|
||||
if (diff & MD_EFLAGS)
|
||||
mobj->eflags = READUINT8(save_p);
|
||||
if (diff & MD_PLAYER)
|
||||
{
|
||||
i = READUINT8(save_p);
|
||||
mobj->player = &players[i];
|
||||
mobj->player->mo = mobj;
|
||||
// added for angle prediction
|
||||
if (consoleplayer == i)
|
||||
localangle = mobj->angle;
|
||||
if (secondarydisplayplayer == i)
|
||||
localangle2 = mobj->angle;
|
||||
}
|
||||
if (diff & MD_MOVEDIR)
|
||||
mobj->movedir = READANGLE(save_p);
|
||||
if (diff & MD_MOVECOUNT)
|
||||
mobj->movecount = READINT32(save_p);
|
||||
if (diff & MD_THRESHOLD)
|
||||
mobj->threshold = READINT32(save_p);
|
||||
if (diff & MD_LASTLOOK)
|
||||
mobj->lastlook = READINT32(save_p);
|
||||
else
|
||||
mobj->lastlook = -1;
|
||||
if (diff & MD_TARGET)
|
||||
mobj->target = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff & MD_TRACER)
|
||||
mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff & MD_FRICTION)
|
||||
mobj->friction = READFIXED(save_p);
|
||||
else
|
||||
mobj->friction = ORIG_FRICTION;
|
||||
if (diff & MD_MOVEFACTOR)
|
||||
mobj->movefactor = READFIXED(save_p);
|
||||
else
|
||||
mobj->movefactor = ORIG_FRICTION_FACTOR;
|
||||
if (diff & MD_FUSE)
|
||||
mobj->fuse = READINT32(save_p);
|
||||
if (diff & MD_WATERTOP)
|
||||
mobj->watertop = READFIXED(save_p);
|
||||
if (diff & MD_WATERBOTTOM)
|
||||
mobj->waterbottom = READFIXED(save_p);
|
||||
if (diff & MD_SCALE)
|
||||
mobj->scale = READFIXED(save_p);
|
||||
else
|
||||
mobj->scale = FRACUNIT;
|
||||
if (diff & MD_DSCALE)
|
||||
mobj->destscale = READFIXED(save_p);
|
||||
else
|
||||
mobj->destscale = mobj->scale;
|
||||
if (diff2 & MD2_SCALESPEED)
|
||||
mobj->scalespeed = READFIXED(save_p);
|
||||
else
|
||||
mobj->scalespeed = FRACUNIT/12;
|
||||
if (diff2 & MD2_CUSVAL)
|
||||
mobj->cusval = READINT32(save_p);
|
||||
if (diff2 & MD2_CVMEM)
|
||||
mobj->cvmem = READINT32(save_p);
|
||||
if (diff2 & MD2_SKIN)
|
||||
mobj->skin = &skins[READUINT8(save_p)];
|
||||
if (diff2 & MD2_COLOR)
|
||||
mobj->color = READUINT8(save_p);
|
||||
if (diff2 & MD2_EXTVAL1)
|
||||
mobj->extravalue1 = READINT32(save_p);
|
||||
if (diff2 & MD2_EXTVAL2)
|
||||
mobj->extravalue2 = READINT32(save_p);
|
||||
if (diff2 & MD2_HNEXT)
|
||||
mobj->hnext = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff2 & MD2_HPREV)
|
||||
mobj->hprev = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
|
||||
if (diff & MD_REDFLAG)
|
||||
{
|
||||
redflag = mobj;
|
||||
rflagpoint = mobj->spawnpoint;
|
||||
}
|
||||
if (diff & MD_BLUEFLAG)
|
||||
{
|
||||
blueflag = mobj;
|
||||
bflagpoint = mobj->spawnpoint;
|
||||
}
|
||||
|
||||
// set sprev, snext, bprev, bnext, subsector
|
||||
P_SetThingPosition(mobj);
|
||||
|
||||
mobj->mobjnum = READUINT32(save_p);
|
||||
|
||||
if (mobj->player)
|
||||
{
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
mobj->player->viewz = mobj->z + mobj->height - mobj->player->viewheight;
|
||||
else
|
||||
mobj->player->viewz = mobj->player->mo->z + mobj->player->viewheight;
|
||||
}
|
||||
|
||||
P_AddThinker(&mobj->thinker);
|
||||
|
||||
mobj->info = (mobjinfo_t *)next; // temporarily, set when leave this function
|
||||
LoadMobjThinker((actionf_p1)P_MobjThinker);
|
||||
break;
|
||||
|
||||
case tc_ceiling:
|
||||
|
|
|
@ -1502,22 +1502,26 @@ static void P_LoadSideDefs2(lumpnum_t lumpnum)
|
|||
|
||||
static boolean LineInBlock(fixed_t cx1, fixed_t cy1, fixed_t cx2, fixed_t cy2, fixed_t bx1, fixed_t by1)
|
||||
{
|
||||
fixed_t bx2 = bx1 + MAPBLOCKUNITS;
|
||||
fixed_t by2 = by1 + MAPBLOCKUNITS;
|
||||
line_t boxline, testline;
|
||||
vertex_t vbox, vtest;
|
||||
fixed_t bbox[4];
|
||||
line_t testline;
|
||||
vertex_t vtest;
|
||||
|
||||
bbox[BOXRIGHT] = bx1 + MAPBLOCKUNITS;
|
||||
bbox[BOXTOP] = by1 + MAPBLOCKUNITS;
|
||||
bbox[BOXLEFT] = bx1;
|
||||
bbox[BOXBOTTOM] = by1;
|
||||
|
||||
// Trivial rejection
|
||||
if (cx1 < bx1 && cx2 < bx1)
|
||||
if (cx1 < bbox[BOXLEFT] && cx2 < bbox[BOXLEFT])
|
||||
return false;
|
||||
|
||||
if (cx1 > bx2 && cx2 > bx2)
|
||||
if (cx1 > bbox[BOXRIGHT] && cx2 > bbox[BOXRIGHT])
|
||||
return false;
|
||||
|
||||
if (cy1 < by1 && cy2 < by1)
|
||||
if (cy1 < bbox[BOXBOTTOM] && cy2 < bbox[BOXBOTTOM])
|
||||
return false;
|
||||
|
||||
if (cy1 > by2 && cy2 > by2)
|
||||
if (cy1 > bbox[BOXTOP] && cy2 > bbox[BOXTOP])
|
||||
return false;
|
||||
|
||||
// Rats, guess we gotta check
|
||||
|
@ -1527,12 +1531,11 @@ static boolean LineInBlock(fixed_t cx1, fixed_t cy1, fixed_t cx2, fixed_t cy2, f
|
|||
cy1 <<= FRACBITS;
|
||||
cx2 <<= FRACBITS;
|
||||
cy2 <<= FRACBITS;
|
||||
bx1 <<= FRACBITS;
|
||||
by1 <<= FRACBITS;
|
||||
bx2 <<= FRACBITS;
|
||||
by2 <<= FRACBITS;
|
||||
bbox[BOXTOP] <<= FRACBITS;
|
||||
bbox[BOXBOTTOM] <<= FRACBITS;
|
||||
bbox[BOXLEFT] <<= FRACBITS;
|
||||
bbox[BOXRIGHT] <<= FRACBITS;
|
||||
|
||||
boxline.v1 = &vbox;
|
||||
testline.v1 = &vtest;
|
||||
|
||||
testline.v1->x = cx1;
|
||||
|
@ -1540,47 +1543,12 @@ static boolean LineInBlock(fixed_t cx1, fixed_t cy1, fixed_t cx2, fixed_t cy2, f
|
|||
testline.dx = cx2 - cx1;
|
||||
testline.dy = cy2 - cy1;
|
||||
|
||||
// Test line against bottom edge of box
|
||||
boxline.v1->x = bx1;
|
||||
boxline.v1->y = by1;
|
||||
boxline.dx = bx2 - bx1;
|
||||
boxline.dy = 0;
|
||||
if ((testline.dx > 0) ^ (testline.dy > 0))
|
||||
testline.slopetype = ST_NEGATIVE;
|
||||
else
|
||||
testline.slopetype = ST_POSITIVE;
|
||||
|
||||
if (P_PointOnLineSide(cx1, cy1, &boxline) != P_PointOnLineSide(cx2, cy2, &boxline)
|
||||
&& P_PointOnLineSide(boxline.v1->x, boxline.v1->y, &testline) != P_PointOnLineSide(boxline.v1->x+boxline.dx, boxline.v1->y+boxline.dy, &testline))
|
||||
return true;
|
||||
|
||||
// Right edge of box
|
||||
boxline.v1->x = bx2;
|
||||
boxline.v1->y = by1;
|
||||
boxline.dx = 0;
|
||||
boxline.dy = by2-by1;
|
||||
|
||||
if (P_PointOnLineSide(cx1, cy1, &boxline) != P_PointOnLineSide(cx2, cy2, &boxline)
|
||||
&& P_PointOnLineSide(boxline.v1->x, boxline.v1->y, &testline) != P_PointOnLineSide(boxline.v1->x+boxline.dx, boxline.v1->y+boxline.dy, &testline))
|
||||
return true;
|
||||
|
||||
// Top edge of box
|
||||
boxline.v1->x = bx1;
|
||||
boxline.v1->y = by2;
|
||||
boxline.dx = bx2 - bx1;
|
||||
boxline.dy = 0;
|
||||
|
||||
if (P_PointOnLineSide(cx1, cy1, &boxline) != P_PointOnLineSide(cx2, cy2, &boxline)
|
||||
&& P_PointOnLineSide(boxline.v1->x, boxline.v1->y, &testline) != P_PointOnLineSide(boxline.v1->x+boxline.dx, boxline.v1->y+boxline.dy, &testline))
|
||||
return true;
|
||||
|
||||
// Left edge of box
|
||||
boxline.v1->x = bx1;
|
||||
boxline.v1->y = by1;
|
||||
boxline.dx = 0;
|
||||
boxline.dy = by2-by1;
|
||||
|
||||
if (P_PointOnLineSide(cx1, cy1, &boxline) != P_PointOnLineSide(cx2, cy2, &boxline)
|
||||
&& P_PointOnLineSide(boxline.v1->x, boxline.v1->y, &testline) != P_PointOnLineSide(boxline.v1->x+boxline.dx, boxline.v1->y+boxline.dy, &testline))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return P_BoxOnLineSide(bbox, &testline) == -1;
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -2435,11 +2403,8 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
|
||||
// chasecam on in chaos, race, coop
|
||||
// chasecam off in match, tag, capture the flag
|
||||
chase = (gametype == GT_RACE || gametype == GT_COMPETITION || gametype == GT_COOP
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
|| gametype == GT_CHAOS
|
||||
#endif
|
||||
) || (maptol & TOL_2D);
|
||||
chase = (gametype == GT_RACE || gametype == GT_COMPETITION || gametype == GT_COOP)
|
||||
|| (maptol & TOL_2D);
|
||||
|
||||
if (!dedicated)
|
||||
{
|
||||
|
|
133
src/p_spec.c
133
src/p_spec.c
|
@ -94,6 +94,7 @@ typedef struct
|
|||
thinker_t **thinkers;
|
||||
} thinkerlist_t;
|
||||
|
||||
static void P_SearchForDisableLinedefs(void);
|
||||
static void P_SpawnScrollers(void);
|
||||
static void P_SpawnFriction(void);
|
||||
static void P_SpawnPushers(void);
|
||||
|
@ -4776,6 +4777,18 @@ void P_UpdateSpecials(void)
|
|||
}
|
||||
}
|
||||
|
||||
static inline ffloor_t *P_GetFFloorBySec(sector_t *sec, sector_t *sec2)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
|
||||
if (!sec->ffloors)
|
||||
return NULL;
|
||||
for (rover = sec->ffloors; rover; rover = rover->next)
|
||||
if (rover->secnum == (size_t)(sec2 - sectors))
|
||||
return rover;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Adds a newly formed 3Dfloor structure to a sector's ffloors list.
|
||||
*
|
||||
* \param sec Target sector.
|
||||
|
@ -4822,7 +4835,9 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
|||
size_t i;
|
||||
|
||||
if (sec == sec2)
|
||||
return false; //Don't need a fake floor on a control sector.
|
||||
return NULL; //Don't need a fake floor on a control sector.
|
||||
if ((ffloor = (P_GetFFloorBySec(sec, sec2))))
|
||||
return ffloor; // If this ffloor already exists, return it
|
||||
|
||||
if (sec2->ceilingheight < sec2->floorheight)
|
||||
{
|
||||
|
@ -5312,9 +5327,6 @@ void T_LaserFlash(laserthink_t *flash)
|
|||
ffloor_t *ffloor = flash->ffloor;
|
||||
sector_t *sector = flash->sector;
|
||||
|
||||
if (!ffloor)
|
||||
flash->ffloor = ffloor = P_AddFakeFloor(sector, flash->sec, flash->sourceline, laserflags, NULL);
|
||||
|
||||
if (!ffloor || !(ffloor->flags & FF_EXISTS))
|
||||
return;
|
||||
|
||||
|
@ -5409,6 +5421,10 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
thinkerlist_t *secthinkers;
|
||||
thinker_t *th;
|
||||
|
||||
// This used to be used, and *should* be used in the future,
|
||||
// but currently isn't.
|
||||
(void)fromnetsave;
|
||||
|
||||
// Set the default gravity. Custom gravity overrides this setting.
|
||||
gravity = FRACUNIT/2;
|
||||
|
||||
|
@ -5480,37 +5496,12 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
curWeather = PRECIP_NONE;
|
||||
|
||||
P_InitTagLists(); // Create xref tables for tags
|
||||
P_SearchForDisableLinedefs(); // Disable linedefs are now allowed to disable *any* line
|
||||
|
||||
P_SpawnScrollers(); // Add generalized scrollers
|
||||
P_SpawnFriction(); // Friction model using linedefs
|
||||
P_SpawnPushers(); // Pusher model using linedefs
|
||||
|
||||
// Look for disable linedefs
|
||||
for (i = 0; i < numlines; i++)
|
||||
{
|
||||
if (lines[i].special == 6)
|
||||
{
|
||||
// Ability flags can disable disable linedefs now, lol
|
||||
if (netgame || multiplayer)
|
||||
{
|
||||
// future: nonet flag?
|
||||
}
|
||||
else if (((lines[i].flags & ML_NETONLY) != ML_NETONLY)
|
||||
&& !(players[consoleplayer].charability == CA_THOK && (lines[i].flags & ML_NOSONIC))
|
||||
&& !(players[consoleplayer].charability == CA_FLY && (lines[i].flags & ML_NOTAILS))
|
||||
&& !(players[consoleplayer].charability == CA_GLIDEANDCLIMB && (lines[i].flags & ML_NOKNUX )))
|
||||
{
|
||||
for (j = -1; (j = P_FindLineFromLineTag(&lines[i], j)) >= 0;)
|
||||
{
|
||||
lines[j].tag = 0;
|
||||
lines[j].special = 0;
|
||||
}
|
||||
}
|
||||
lines[i].special = 0;
|
||||
lines[i].tag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Look for thinkers that affect FOFs, and sort them by sector
|
||||
|
||||
secthinkers = Z_Calloc(numsectors * sizeof(thinkerlist_t), PU_STATIC, NULL);
|
||||
|
@ -5993,12 +5984,7 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 160: // Float/bob platform
|
||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
{
|
||||
P_AddFakeFloor(§ors[s], §ors[sec], lines + i,
|
||||
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_FLOATBOB, secthinkers);
|
||||
}
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_FLOATBOB, secthinkers);
|
||||
break;
|
||||
|
||||
case 170: // Crumbling platform
|
||||
|
@ -6043,13 +6029,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 176: // Air bobbing platform that will crumble and bob on the water when it falls and hits
|
||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB|FF_CRUMBLE, secthinkers);
|
||||
lines[i].flags |= ML_BLOCKMONSTERS;
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
{
|
||||
P_AddFakeFloor(§ors[s], §ors[sec], lines + i,
|
||||
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_FLOATBOB|FF_CRUMBLE, secthinkers);
|
||||
}
|
||||
P_AddOldAirbob(lines[i].frontsector, lines + i, true);
|
||||
break;
|
||||
|
||||
|
@ -6061,21 +6042,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 178: // Crumbling platform that will float when it hits water
|
||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
{
|
||||
P_AddFakeFloor(§ors[s], §ors[sec], lines + i,
|
||||
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE|FF_FLOATBOB, secthinkers);
|
||||
}
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CRUMBLE|FF_FLOATBOB, secthinkers);
|
||||
break;
|
||||
|
||||
case 179: // Crumbling platform that will float when it hits water, but not return
|
||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
{
|
||||
P_AddFakeFloor(§ors[s], §ors[sec], lines + i,
|
||||
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE|FF_FLOATBOB|FF_NORETURN, secthinkers);
|
||||
}
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_CRUMBLE|FF_FLOATBOB|FF_NORETURN, secthinkers);
|
||||
break;
|
||||
|
||||
case 180: // Air bobbing platform that will crumble
|
||||
|
@ -6158,14 +6129,13 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 202: // Fog
|
||||
ffloorflags = FF_EXISTS|FF_RENDERALL|FF_FOG|FF_BOTHPLANES|FF_INVERTPLANES|FF_ALLSIDES|FF_INVERTSIDES|FF_CUTEXTRA|FF_EXTRA|FF_DOUBLESHADOW|FF_CUTSPRITES;
|
||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||
// SoM: Because it's fog, check for an extra colormap and set
|
||||
// the fog flag...
|
||||
if (sectors[sec].extra_colormap)
|
||||
sectors[sec].extra_colormap->fog = 1;
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
P_AddFakeFloor(§ors[s], §ors[sec], lines + i,
|
||||
FF_EXISTS|FF_RENDERALL|FF_FOG|FF_BOTHPLANES|FF_INVERTPLANES|FF_ALLSIDES|FF_INVERTSIDES|FF_CUTEXTRA|FF_EXTRA|FF_DOUBLESHADOW|FF_CUTSPRITES, secthinkers);
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
break;
|
||||
|
||||
case 220: // Like opaque water, but not swimmable. (Good for snow effect on FOFs)
|
||||
|
@ -6195,12 +6165,7 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 250: // Mario Block
|
||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
{
|
||||
P_AddFakeFloor(§ors[s], §ors[sec], lines + i,
|
||||
FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO, secthinkers);
|
||||
}
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO, secthinkers);
|
||||
break;
|
||||
|
||||
case 251: // A THWOMP!
|
||||
|
@ -6247,13 +6212,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 258: // Laser block
|
||||
if (!fromnetsave) // This creates a FOF which disrupts net saves
|
||||
{
|
||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
||||
|
||||
// No longer totally disrupts netgames
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
||||
EV_AddLaserThinker(§ors[s], §ors[sec], lines + i, secthinkers);
|
||||
}
|
||||
break;
|
||||
|
||||
case 259: // Make-Your-Own FOF!
|
||||
|
@ -7720,3 +7683,39 @@ static void P_SpawnPushers(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void P_SearchForDisableLinedefs(void)
|
||||
{
|
||||
size_t i;
|
||||
INT32 j;
|
||||
|
||||
// Look for disable linedefs
|
||||
for (i = 0; i < numlines; i++)
|
||||
{
|
||||
if (lines[i].special == 6)
|
||||
{
|
||||
// Remove special
|
||||
// Do *not* remove tag. That would mess with the tag lists
|
||||
// that P_InitTagLists literally just created!
|
||||
lines[i].special = 0;
|
||||
|
||||
// Ability flags can disable disable linedefs now, lol
|
||||
if (netgame || multiplayer)
|
||||
{
|
||||
// future: nonet flag?
|
||||
}
|
||||
else if ((lines[i].flags & ML_NETONLY) == ML_NETONLY)
|
||||
continue; // Net-only never triggers in single player
|
||||
else if (players[consoleplayer].charability == CA_THOK && (lines[i].flags & ML_NOSONIC))
|
||||
continue;
|
||||
else if (players[consoleplayer].charability == CA_FLY && (lines[i].flags & ML_NOTAILS))
|
||||
continue;
|
||||
else if (players[consoleplayer].charability == CA_GLIDEANDCLIMB && (lines[i].flags & ML_NOKNUX))
|
||||
continue;
|
||||
|
||||
// Disable any linedef specials with our tag.
|
||||
for (j = -1; (j = P_FindLineFromLineTag(&lines[i], j)) >= 0;)
|
||||
lines[j].special = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -587,7 +587,7 @@ void P_Ticker(boolean run)
|
|||
}
|
||||
|
||||
// Check for pause or menu up in single player
|
||||
if (paused || P_MenuActivePause())
|
||||
if (paused || P_AutoPause())
|
||||
return;
|
||||
|
||||
postimgtype = postimgtype2 = postimg_none;
|
||||
|
|
198
src/p_user.c
198
src/p_user.c
|
@ -160,15 +160,17 @@ fixed_t P_ReturnThrustY(mobj_t *mo, angle_t angle, fixed_t move)
|
|||
return FixedMul(move, FINESINE(angle));
|
||||
}
|
||||
|
||||
boolean P_MenuActivePause(void)
|
||||
//
|
||||
// P_AutoPause
|
||||
// Returns true when gameplay should be halted even if the game isn't necessarily paused.
|
||||
//
|
||||
boolean P_AutoPause(void)
|
||||
{
|
||||
if (netgame || !menuactive)
|
||||
// Don't pause even on menu-up or focus-lost in netgames or record attack
|
||||
if (netgame || modeattacking)
|
||||
return false;
|
||||
|
||||
if (modeattacking)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return (menuactive || window_notinfocus);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -328,14 +330,10 @@ void P_GiveEmerald(boolean spawnObj)
|
|||
//
|
||||
// P_ResetScore
|
||||
//
|
||||
// This is called when your chain is reset. If in
|
||||
// Chaos mode, it displays what chain you got.
|
||||
// This is called when your chain is reset.
|
||||
void P_ResetScore(player_t *player)
|
||||
{
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
if (gametype == GT_CHAOS && player->scoreadd >= 5)
|
||||
CONS_Printf(M_GetText("%s got a chain of %u!\n"), player_names[player-players], player->scoreadd);
|
||||
#endif
|
||||
// Formally a host for Chaos mode behavior
|
||||
|
||||
player->scoreadd = 0;
|
||||
}
|
||||
|
@ -2540,6 +2538,7 @@ static void P_DoClimbing(player_t *player)
|
|||
thinker_t *think;
|
||||
scroll_t *scroller;
|
||||
angle_t sideangle;
|
||||
fixed_t dx, dy;
|
||||
|
||||
for (think = thinkercap.next; think != &thinkercap; think = think->next)
|
||||
{
|
||||
|
@ -2554,14 +2553,25 @@ static void P_DoClimbing(player_t *player)
|
|||
if (scroller->affectee != player->lastsidehit)
|
||||
continue;
|
||||
|
||||
if (scroller->accel)
|
||||
{
|
||||
dx = scroller->vdx;
|
||||
dy = scroller->vdy;
|
||||
}
|
||||
else
|
||||
{
|
||||
dx = scroller->dx;
|
||||
dy = scroller->dy;
|
||||
}
|
||||
|
||||
if (cmd->forwardmove != 0)
|
||||
{
|
||||
player->mo->momz += scroller->dy;
|
||||
player->mo->momz += dy;
|
||||
climb = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
player->mo->momz = scroller->dy;
|
||||
player->mo->momz = dy;
|
||||
climb = false;
|
||||
}
|
||||
|
||||
|
@ -2569,12 +2579,12 @@ static void P_DoClimbing(player_t *player)
|
|||
|
||||
if (cmd->sidemove != 0)
|
||||
{
|
||||
P_Thrust(player->mo, sideangle, scroller->dx);
|
||||
P_Thrust(player->mo, sideangle, dx);
|
||||
climb = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
P_InstaThrust(player->mo, sideangle, scroller->dx);
|
||||
P_InstaThrust(player->mo, sideangle, dx);
|
||||
climb = false;
|
||||
}
|
||||
}
|
||||
|
@ -2652,6 +2662,125 @@ static void P_DoClimbing(player_t *player)
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// PIT_CheckSolidsTeeter
|
||||
// AKA: PIT_HacksToStopPlayersTeeteringOnGargoyles
|
||||
//
|
||||
|
||||
static mobj_t *teeterer; // the player checking for teetering
|
||||
static boolean solidteeter; // saves whether the player can teeter on this or not
|
||||
static fixed_t highesttop; // highest floor found so far
|
||||
// reserved for standing on multiple objects
|
||||
static boolean couldteeter;
|
||||
static fixed_t teeterxl, teeterxh;
|
||||
static fixed_t teeteryl, teeteryh;
|
||||
|
||||
static boolean PIT_CheckSolidsTeeter(mobj_t *thing)
|
||||
{
|
||||
fixed_t blockdist;
|
||||
fixed_t tiptop = FixedMul(MAXSTEPMOVE, teeterer->scale);
|
||||
fixed_t thingtop = thing->z + thing->height;
|
||||
fixed_t teeterertop = teeterer->z + teeterer->height;
|
||||
|
||||
if (!teeterer || !thing)
|
||||
return true;
|
||||
|
||||
if (!(thing->flags & MF_SOLID))
|
||||
return true;
|
||||
|
||||
if (thing->flags & MF_NOCLIP)
|
||||
return true;
|
||||
|
||||
if (thing == teeterer)
|
||||
return true;
|
||||
|
||||
if (thing->player && cv_tailspickup.value && gametype != GT_HIDEANDSEEK)
|
||||
return true;
|
||||
|
||||
blockdist = teeterer->radius + thing->radius;
|
||||
|
||||
if (abs(thing->x - teeterer->x) >= blockdist || abs(thing->y - teeterer->y) >= blockdist)
|
||||
return true; // didn't hit it
|
||||
|
||||
if (teeterer->eflags & MFE_VERTICALFLIP)
|
||||
{
|
||||
if (thingtop < teeterer->z)
|
||||
return true;
|
||||
if (thing->z > highesttop)
|
||||
return true;
|
||||
highesttop = thing->z;
|
||||
if (thing->z > teeterertop + tiptop)
|
||||
{
|
||||
solidteeter = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (thing->z > teeterertop)
|
||||
return true;
|
||||
if (thingtop < highesttop)
|
||||
return true;
|
||||
highesttop = thingtop;
|
||||
if (thingtop < teeterer->z - tiptop)
|
||||
{
|
||||
solidteeter = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// are you standing on this?
|
||||
if ((teeterer->eflags & MFE_VERTICALFLIP && thing->z - FixedMul(FRACUNIT, teeterer->scale) == teeterertop)
|
||||
|| (!(teeterer->eflags & MFE_VERTICALFLIP) && thingtop + FixedMul(FRACUNIT, teeterer->scale) == teeterer->z))
|
||||
{
|
||||
fixed_t teeterdist = thing->radius - FixedMul(5*FRACUNIT, teeterer->scale);
|
||||
// how far are you from the edge?
|
||||
if (abs(teeterer->x - thing->x) > teeterdist || abs(teeterer->y - thing->y) > teeterdist)
|
||||
{
|
||||
if (couldteeter) // player is standing on another object already, see if we can stand on both and not teeter!
|
||||
{
|
||||
if (thing->x - teeterdist < teeterxl)
|
||||
teeterxl = thing->x - teeterdist;
|
||||
if (thing->x + teeterdist > teeterxh)
|
||||
teeterxh = thing->x + teeterdist;
|
||||
if (thing->y - teeterdist < teeteryl)
|
||||
teeteryl = thing->y - teeterdist;
|
||||
if (thing->y + teeterdist > teeteryh)
|
||||
teeteryh = thing->y + teeterdist;
|
||||
|
||||
if (teeterer->x < teeterxl)
|
||||
return true;
|
||||
if (teeterer->x > teeterxh)
|
||||
return true;
|
||||
if (teeterer->y < teeteryl)
|
||||
return true;
|
||||
if (teeterer->y > teeteryh)
|
||||
return true;
|
||||
|
||||
solidteeter = false; // you can stop teetering now!
|
||||
couldteeter = false; // just in case...
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// too far! don't change teeter status though
|
||||
// save teeter x/y limits to bring up later
|
||||
teeterxl = thing->x - teeterdist;
|
||||
teeterxh = thing->x + teeterdist;
|
||||
teeteryl = thing->y - teeterdist;
|
||||
teeteryh = thing->y + teeterdist;
|
||||
}
|
||||
couldteeter = true;
|
||||
return true;
|
||||
}
|
||||
solidteeter = false;
|
||||
couldteeter = false;
|
||||
return false; // you're definitely not teetering, that's the end of the matter
|
||||
}
|
||||
solidteeter = false;
|
||||
return true; // you're not teetering but it's not neccessarily over, YET
|
||||
}
|
||||
|
||||
//
|
||||
// P_DoTeeter
|
||||
//
|
||||
|
@ -2826,18 +2955,18 @@ static void P_DoTeeter(player_t *player)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef POLYOBJECTS
|
||||
// Polyobjects
|
||||
{
|
||||
INT32 bx, by, xl, xh, yl, yh;
|
||||
|
||||
validcount++;
|
||||
|
||||
yh = (unsigned)(player->mo->y + player->mo->radius - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(player->mo->y - player->mo->radius - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(player->mo->x + player->mo->radius - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(player->mo->x - player->mo->radius - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
|
||||
// Polyobjects
|
||||
#ifdef POLYOBJECTS
|
||||
validcount++;
|
||||
|
||||
for (by = yl; by <= yh; by++)
|
||||
for (bx = xl; bx <= xh; bx++)
|
||||
{
|
||||
|
@ -2900,14 +3029,10 @@ static void P_DoTeeter(player_t *player)
|
|||
if (polybottom > player->mo->z + player->mo->height + tiptop
|
||||
|| (polybottom < player->mo->z
|
||||
&& player->mo->z + player->mo->height < player->mo->ceilingz - tiptop))
|
||||
{
|
||||
teeter = true;
|
||||
roverfloor = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
teeter = false;
|
||||
roverfloor = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2922,14 +3047,10 @@ static void P_DoTeeter(player_t *player)
|
|||
if (polytop < player->mo->z - tiptop
|
||||
|| (polytop > player->mo->z + player->mo->height
|
||||
&& player->mo->z > player->mo->floorz + tiptop))
|
||||
{
|
||||
teeter = true;
|
||||
roverfloor = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
teeter = false;
|
||||
roverfloor = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2937,8 +3058,27 @@ static void P_DoTeeter(player_t *player)
|
|||
plink = (polymaplink_t *)(plink->link.next);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (teeter) // only bother with objects as a last resort if you were already teetering
|
||||
{
|
||||
mobj_t *oldtmthing = tmthing;
|
||||
tmthing = teeterer = player->mo;
|
||||
teeterxl = teeterxh = player->mo->x;
|
||||
teeteryl = teeteryh = player->mo->y;
|
||||
couldteeter = false;
|
||||
solidteeter = teeter;
|
||||
for (by = yl; by <= yh; by++)
|
||||
for (bx = xl; bx <= xh; bx++)
|
||||
{
|
||||
highesttop = INT32_MIN;
|
||||
if (!P_BlockThingsIterator(bx, by, PIT_CheckSolidsTeeter))
|
||||
goto teeterdone; // we've found something that stops us teetering at all, how about we stop already
|
||||
}
|
||||
teeterdone:
|
||||
teeter = solidteeter;
|
||||
tmthing = oldtmthing; // restore old tmthing, goodness knows what the game does with this before mobj thinkers
|
||||
}
|
||||
}
|
||||
if (teeter)
|
||||
{
|
||||
if ((player->mo->state == &states[S_PLAY_STND] || player->mo->state == &states[S_PLAY_TAP1] || player->mo->state == &states[S_PLAY_TAP2] || player->mo->state == &states[S_PLAY_SUPERSTAND]))
|
||||
|
|
66
src/r_bsp.c
66
src/r_bsp.c
|
@ -572,8 +572,8 @@ static boolean R_CheckBBox(fixed_t *bspcoord)
|
|||
py2 = bspcoord[checkcoord[boxpos][3]];
|
||||
|
||||
// check clip list for an open space
|
||||
angle1 = R_PointToAngle(px1, py1) - viewangle;
|
||||
angle2 = R_PointToAngle(px2, py2) - viewangle;
|
||||
angle1 = R_PointToAngle2(viewx>>1, viewy>>1, px1>>1, py1>>1) - viewangle;
|
||||
angle2 = R_PointToAngle2(viewx>>1, viewy>>1, px2>>1, py2>>1) - viewangle;
|
||||
|
||||
span = angle1 - angle2;
|
||||
|
||||
|
@ -702,21 +702,62 @@ static int R_PolysegCompare(const void *p1, const void *p2)
|
|||
{
|
||||
const seg_t *seg1 = *(const seg_t * const *)p1;
|
||||
const seg_t *seg2 = *(const seg_t * const *)p2;
|
||||
fixed_t dist1, dist2;
|
||||
fixed_t dist1v1, dist1v2, dist2v1, dist2v2;
|
||||
|
||||
// TODO might be a better way to get distance?
|
||||
#define vxdist(v) FixedMul(R_PointToDist(v->x, v->y), FINECOSINE((R_PointToAngle(v->x, v->y)-viewangle)>>ANGLETOFINESHIFT))+0xFFFFFFF
|
||||
#define pdist(x, y) (FixedMul(R_PointToDist(x, y), FINECOSINE((R_PointToAngle(x, y)-viewangle)>>ANGLETOFINESHIFT))+0xFFFFFFF)
|
||||
#define vxdist(v) pdist(v->x, v->y)
|
||||
|
||||
dist1 = min(vxdist(seg1->v1), vxdist(seg1->v2));
|
||||
dist2 = min(vxdist(seg2->v1), vxdist(seg2->v2));
|
||||
dist1v1 = vxdist(seg1->v1);
|
||||
dist1v2 = vxdist(seg1->v2);
|
||||
dist2v1 = vxdist(seg2->v1);
|
||||
dist2v2 = vxdist(seg2->v2);
|
||||
|
||||
if (dist1 == dist2) { // Segs connect toward the front, so use the back verts to determine order!
|
||||
dist1 = max(vxdist(seg1->v1), vxdist(seg1->v2));
|
||||
dist2 = max(vxdist(seg2->v1), vxdist(seg2->v2));
|
||||
if (min(dist1v1, dist1v2) != min(dist2v1, dist2v2))
|
||||
return min(dist1v1, dist1v2) - min(dist2v1, dist2v2);
|
||||
|
||||
{ // That didn't work, so now let's try this.......
|
||||
fixed_t delta1, delta2, x1, y1, x2, y2;
|
||||
vertex_t *near1, *near2, *far1, *far2; // wherever you are~
|
||||
|
||||
delta1 = R_PointToDist2(seg1->v1->x, seg1->v1->y, seg1->v2->x, seg1->v2->y);
|
||||
delta2 = R_PointToDist2(seg2->v1->x, seg2->v1->y, seg2->v2->x, seg2->v2->y);
|
||||
|
||||
delta1 = FixedDiv(128<<FRACBITS, delta1);
|
||||
delta2 = FixedDiv(128<<FRACBITS, delta2);
|
||||
|
||||
if (dist1v1 < dist1v2)
|
||||
{
|
||||
near1 = seg1->v1;
|
||||
far1 = seg1->v2;
|
||||
}
|
||||
else
|
||||
{
|
||||
near1 = seg1->v2;
|
||||
far1 = seg1->v1;
|
||||
}
|
||||
|
||||
if (dist2v1 < dist2v2)
|
||||
{
|
||||
near2 = seg2->v1;
|
||||
far2 = seg2->v2;
|
||||
}
|
||||
else
|
||||
{
|
||||
near2 = seg2->v2;
|
||||
far2 = seg2->v1;
|
||||
}
|
||||
|
||||
x1 = near1->x + FixedMul(far1->x-near1->x, delta1);
|
||||
y1 = near1->y + FixedMul(far1->y-near1->y, delta1);
|
||||
|
||||
x2 = near2->x + FixedMul(far2->x-near2->x, delta2);
|
||||
y2 = near2->y + FixedMul(far2->y-near2->y, delta2);
|
||||
|
||||
return pdist(x1, y1)-pdist(x2, y2);
|
||||
}
|
||||
#undef vxdist
|
||||
|
||||
return dist1-dist2;
|
||||
#undef pdist
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -835,6 +876,7 @@ static void R_Subsector(size_t num)
|
|||
|
||||
numffloors = 0;
|
||||
ffloor[numffloors].plane = NULL;
|
||||
ffloor[numffloors].polyobj = NULL;
|
||||
if (frontsector->ffloors)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
|
@ -854,6 +896,7 @@ static void R_Subsector(size_t num)
|
|||
}
|
||||
|
||||
ffloor[numffloors].plane = NULL;
|
||||
ffloor[numffloors].polyobj = NULL;
|
||||
if (*rover->bottomheight <= frontsector->ceilingheight
|
||||
&& *rover->bottomheight >= frontsector->floorheight
|
||||
&& ((viewz < *rover->bottomheight && !(rover->flags & FF_INVERTPLANES))
|
||||
|
@ -872,6 +915,7 @@ static void R_Subsector(size_t num)
|
|||
if (numffloors >= MAXFFLOORS)
|
||||
break;
|
||||
ffloor[numffloors].plane = NULL;
|
||||
ffloor[numffloors].polyobj = NULL;
|
||||
if (*rover->topheight >= frontsector->floorheight
|
||||
&& *rover->topheight <= frontsector->ceilingheight
|
||||
&& ((viewz > *rover->topheight && !(rover->flags & FF_INVERTPLANES))
|
||||
|
|
|
@ -946,10 +946,12 @@ static void R_InitExtraColormaps(void)
|
|||
CONS_Printf(M_GetText("Number of Extra Colormaps: %s\n"), sizeu1(numcolormaplumps));
|
||||
}
|
||||
|
||||
// 12/14/14 -- only take flats in F_START/F_END
|
||||
lumpnum_t R_GetFlatNumForName(const char *name)
|
||||
{
|
||||
lumpnum_t lump = W_CheckNumForName(name);
|
||||
|
||||
lumpnum_t lump = W_CheckNumForNameInBlock(name, "F_START", "F_END");
|
||||
if (lump == LUMPERROR)
|
||||
lump = W_CheckNumForNameInBlock(name, "FF_START", "FF_END"); // deutex, some other old things
|
||||
if (lump == LUMPERROR)
|
||||
{
|
||||
if (strcmp(name, SKYFLATNAME))
|
||||
|
|
|
@ -162,6 +162,7 @@ consvar_t cv_allowmlook = {"allowmlook", "Yes", CV_NETVAR, CV_YesNo, NULL, 0, NU
|
|||
consvar_t cv_showhud = {"showhud", "Yes", CV_CALL, CV_YesNo, R_SetViewSize, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_translucenthud = {"translucenthud", "10", CV_SAVE, translucenthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_translucency = {"translucency", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_drawdist = {"drawdist", "Infinite", CV_SAVE, drawdist_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_drawdist_nights = {"drawdist_nights", "2048", CV_SAVE, drawdist_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
consvar_t cv_drawdist_precip = {"drawdist_precip", "1024", CV_SAVE, drawdist_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
@ -1406,6 +1407,7 @@ void R_RegisterEngineStuff(void)
|
|||
return;
|
||||
|
||||
CV_RegisterVar(&cv_precipdensity);
|
||||
CV_RegisterVar(&cv_translucency);
|
||||
CV_RegisterVar(&cv_drawdist);
|
||||
CV_RegisterVar(&cv_drawdist_nights);
|
||||
CV_RegisterVar(&cv_drawdist_precip);
|
||||
|
|
|
@ -88,6 +88,7 @@ extern consvar_t cv_homremoval;
|
|||
extern consvar_t cv_chasecam, cv_chasecam2;
|
||||
extern consvar_t cv_flipcam, cv_flipcam2;
|
||||
extern consvar_t cv_shadow, cv_shadowoffs;
|
||||
extern consvar_t cv_translucency;
|
||||
extern consvar_t cv_precipdensity, cv_drawdist, cv_drawdist_nights, cv_drawdist_precip;
|
||||
extern consvar_t cv_skybox;
|
||||
extern consvar_t cv_tailspickup;
|
||||
|
|
41
src/r_segs.c
41
src/r_segs.c
|
@ -528,7 +528,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
|||
else
|
||||
xwalllights = scalelight[rlight->lightnum];
|
||||
|
||||
pindex = spryscale>>LIGHTSCALESHIFT;
|
||||
pindex = FixedMul(spryscale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
||||
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
pindex = MAXLIGHTSCALE - 1;
|
||||
|
@ -573,7 +573,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
|||
}
|
||||
|
||||
// calculate lighting
|
||||
pindex = spryscale>>LIGHTSCALESHIFT;
|
||||
pindex = FixedMul(spryscale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
||||
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
pindex = MAXLIGHTSCALE - 1;
|
||||
|
@ -1130,8 +1130,8 @@ static void R_RenderSegLoop (void)
|
|||
for (i = 0; i < numffloors; i++)
|
||||
{
|
||||
#ifdef POLYOBJECTS_PLANES
|
||||
//if (curline->polyseg && (!ffloor[i].polyobj || ffloor[i].polyobj != curline->polyseg))
|
||||
//continue; // Causes issues with FOF planes in The Wall -Red
|
||||
if (ffloor[i].polyobj && (!curline->polyseg || ffloor[i].polyobj != curline->polyseg))
|
||||
continue;
|
||||
|
||||
// FIXME hack to fix planes disappearing when a seg goes behind the camera. This NEEDS to be changed to be done properly. -Red
|
||||
if (curline->polyseg) {
|
||||
|
@ -1203,7 +1203,7 @@ static void R_RenderSegLoop (void)
|
|||
if (segtextured)
|
||||
{
|
||||
// calculate lighting
|
||||
pindex = rw_scale>>LIGHTSCALESHIFT;
|
||||
pindex = FixedMul(rw_scale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
||||
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
pindex = MAXLIGHTSCALE-1;
|
||||
|
@ -1238,7 +1238,7 @@ static void R_RenderSegLoop (void)
|
|||
else
|
||||
xwalllights = scalelight[lightnum];
|
||||
|
||||
pindex = rw_scale>>LIGHTSCALESHIFT;
|
||||
pindex = FixedMul(rw_scale, FixedDiv(640, vid.width))>>LIGHTSCALESHIFT;
|
||||
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
pindex = MAXLIGHTSCALE-1;
|
||||
|
@ -1359,9 +1359,9 @@ static void R_RenderSegLoop (void)
|
|||
|
||||
for (i = 0; i < numffloors; i++)
|
||||
{
|
||||
#if 0 //#ifdef POLYOBJECTS_PLANES
|
||||
if (curline->polyseg && (!ffloor[i].polyobj || ffloor[i].polyobj != curline->polyseg))
|
||||
continue; // Causes issues with FOF planes in The Wall -Red
|
||||
#ifdef POLYOBJECTS_PLANES
|
||||
if (ffloor[i].polyobj && (!curline->polyseg || ffloor[i].polyobj != curline->polyseg))
|
||||
continue;
|
||||
#endif
|
||||
|
||||
ffloor[i].f_frac += ffloor[i].f_step;
|
||||
|
@ -1371,9 +1371,9 @@ static void R_RenderSegLoop (void)
|
|||
{
|
||||
INT32 y_w;
|
||||
|
||||
#if 0 //#ifdef POLYOBJECTS_PLANES
|
||||
if (curline->polyseg && (!ffloor[i].polyobj || ffloor[i].polyobj != curline->polyseg))
|
||||
continue; // Causes issues with FOF planes in The Wall -Red
|
||||
#ifdef POLYOBJECTS_PLANES
|
||||
if (ffloor[i].polyobj && (!curline->polyseg || ffloor[i].polyobj != curline->polyseg))
|
||||
continue;
|
||||
#endif
|
||||
y_w = ffloor[i].b_frac >> HEIGHTBITS;
|
||||
|
||||
|
@ -1520,9 +1520,9 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
{
|
||||
for (i = 0; i < numffloors; i++)
|
||||
{
|
||||
#if 0 //#ifdef POLYOBJECTS_PLANES
|
||||
if (ds_p->curline->polyseg && (!ffloor[i].polyobj || ffloor[i].polyobj != ds_p->curline->polyseg))
|
||||
continue; // Causes issues with FOF planes in The Wall -Red
|
||||
#ifdef POLYOBJECTS_PLANES
|
||||
if (ffloor[i].polyobj && (!ds_p->curline->polyseg || ffloor[i].polyobj != ds_p->curline->polyseg))
|
||||
continue;
|
||||
#endif
|
||||
ffloor[i].f_pos = ffloor[i].height - viewz;
|
||||
}
|
||||
|
@ -2021,9 +2021,9 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
{
|
||||
for (i = 0; i < numffloors; i++)
|
||||
{
|
||||
#if 0 //#ifdef POLYOBJECTS_PLANES
|
||||
if (curline->polyseg && (!ffloor[i].polyobj || ffloor[i].polyobj != curline->polyseg))
|
||||
continue; // Causes issues with FOF planes in The Wall -Red
|
||||
#ifdef POLYOBJECTS_PLANES
|
||||
if (ffloor[i].polyobj && (!curline->polyseg || ffloor[i].polyobj != curline->polyseg))
|
||||
continue;
|
||||
#endif
|
||||
|
||||
ffloor[i].f_pos >>= 4;
|
||||
|
@ -2126,7 +2126,8 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
#ifdef POLYOBJECTS_PLANES
|
||||
if (curline->polyseg && frontsector && (curline->polyseg->flags & POF_RENDERPLANES))
|
||||
{
|
||||
if (i < MAXFFLOORS && backsector->floorheight <= frontsector->ceilingheight &&
|
||||
while (i < numffloors && ffloor[i].polyobj != curline->polyseg) i++;
|
||||
if (i < numffloors && backsector->floorheight <= frontsector->ceilingheight &&
|
||||
backsector->floorheight >= frontsector->floorheight &&
|
||||
(viewz < backsector->floorheight))
|
||||
{
|
||||
|
@ -2142,7 +2143,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale);
|
||||
i++;
|
||||
}
|
||||
if (i < MAXFFLOORS && backsector->ceilingheight >= frontsector->floorheight &&
|
||||
if (i < numffloors && backsector->ceilingheight >= frontsector->floorheight &&
|
||||
backsector->ceilingheight <= frontsector->ceilingheight &&
|
||||
(viewz > backsector->ceilingheight))
|
||||
{
|
||||
|
|
|
@ -1293,7 +1293,9 @@ static void R_ProjectSprite(mobj_t *thing)
|
|||
vis->transmap = NULL;
|
||||
|
||||
// specific translucency
|
||||
if (thing->flags2 & MF2_SHADOW) // actually only the player should use this (temporary invisibility)
|
||||
if (!cv_translucency.value)
|
||||
; // no translucency
|
||||
else if (thing->flags2 & MF2_SHADOW) // actually only the player should use this (temporary invisibility)
|
||||
vis->transmap = ((tr_trans80-1)<<FF_TRANSSHIFT) + transtables; // because now the translucency is set through FF_TRANSMASK
|
||||
else if (thing->frame & FF_TRANSMASK)
|
||||
vis->transmap = (thing->frame & FF_TRANSMASK) - 0x10000 + transtables;
|
||||
|
|
|
@ -195,15 +195,15 @@ int main(int argc, char **argv)
|
|||
|
||||
#ifdef LOGMESSAGES
|
||||
#if defined(_WIN32_WCE) || defined(GP2X)
|
||||
logstream = fopen(va("%s.log",argv[0]), "a");
|
||||
logstream = fopen(va("%s.log",argv[0]), "wt");
|
||||
#elif defined (_WII)
|
||||
logstream = fopen(va("%s/srb2log.txt",logdir), "a");
|
||||
logstream = fopen(va("%s/log.txt",logdir), "wt");
|
||||
#elif defined (DEFAULTDIR)
|
||||
if (logdir)
|
||||
logstream = fopen(va("%s/"DEFAULTDIR"/srb2log.txt",logdir), "a");
|
||||
logstream = fopen(va("%s/"DEFAULTDIR"/log.txt",logdir), "wt");
|
||||
else
|
||||
#endif
|
||||
logstream = fopen("./srb2log.txt", "a");
|
||||
logstream = fopen("./log.txt", "wt");
|
||||
#endif
|
||||
|
||||
//I_OutputMsg("I_StartupSystem() ...\n");
|
||||
|
@ -228,9 +228,9 @@ int main(int argc, char **argv)
|
|||
#endif
|
||||
#endif
|
||||
// startup SRB2
|
||||
CONS_Printf("%s", M_GetText("Setting up SRB2...\n"));
|
||||
CONS_Printf("Setting up SRB2...\n");
|
||||
D_SRB2Main();
|
||||
CONS_Printf("%s", M_GetText("Entering main game loop...\n"));
|
||||
CONS_Printf("Entering main game loop...\n");
|
||||
// never return
|
||||
D_SRB2Loop();
|
||||
|
||||
|
|
|
@ -301,6 +301,7 @@ SDL_bool framebuffer = SDL_FALSE;
|
|||
|
||||
UINT8 keyboard_started = false;
|
||||
|
||||
#if !defined (DC)
|
||||
FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
||||
{
|
||||
//static char msg[] = "oh no! back to reality!\r\n";
|
||||
|
@ -318,7 +319,7 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
|||
sigmsg = "SIGILL - illegal instruction - invalid function image";
|
||||
break;
|
||||
case SIGFPE:
|
||||
sigmsg = "SIGFPE - floating point exception";
|
||||
sigmsg = "SIGFPE - mathematical exception";
|
||||
break;
|
||||
case SIGSEGV:
|
||||
sigmsg = "SIGSEGV - segment violation";
|
||||
|
@ -339,7 +340,7 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
|||
sigmsg = sigdef;
|
||||
}
|
||||
|
||||
I_OutputMsg("signal_handler() error: %s\n", sigmsg);
|
||||
I_OutputMsg("\nsignal_handler() error: %s\n", sigmsg);
|
||||
|
||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
|
||||
"Signal caught",
|
||||
|
@ -350,7 +351,6 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
|
|||
I_Quit();
|
||||
}
|
||||
|
||||
#if !defined (DC)
|
||||
FUNCNORETURN static ATTRNORETURN void quit_handler(int num)
|
||||
{
|
||||
signal(num, SIG_DFL); //default signal action
|
||||
|
@ -743,24 +743,15 @@ static inline void I_ShutdownConsole(void){}
|
|||
void I_StartupKeyboard (void)
|
||||
{
|
||||
#if !defined (DC)
|
||||
#ifdef SIGILL
|
||||
signal(SIGILL , signal_handler);
|
||||
#endif
|
||||
#ifdef SIGINT
|
||||
// If these defines don't exist,
|
||||
// then compilation would have failed above us...
|
||||
signal(SIGINT , quit_handler);
|
||||
#endif
|
||||
#ifdef SIGSEGV
|
||||
signal(SIGSEGV , signal_handler);
|
||||
#endif
|
||||
#ifdef SIGBREAK
|
||||
signal(SIGBREAK , quit_handler);
|
||||
#endif
|
||||
#ifdef SIGABRT
|
||||
signal(SIGABRT , signal_handler);
|
||||
#endif
|
||||
#ifdef SIGTERM
|
||||
signal(SIGTERM , quit_handler);
|
||||
#endif
|
||||
signal(SIGILL , signal_handler);
|
||||
signal(SIGSEGV , signal_handler);
|
||||
signal(SIGABRT , signal_handler);
|
||||
signal(SIGFPE , signal_handler);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -2375,62 +2366,38 @@ void I_Error(const char *error, ...)
|
|||
}
|
||||
if (errorcount > 20)
|
||||
{
|
||||
#ifdef MAC_ALERT
|
||||
va_start(argptr, error);
|
||||
vsprintf(buffer, error, argptr);
|
||||
va_end(argptr);
|
||||
// 2004-03-03 AJR Since the Mac user is most likely double clicking to run the game, give them a panel.
|
||||
MacShowAlert("Recursive Error", buffer, "Quit", NULL, NULL);
|
||||
#elif (defined (_WIN32) || (defined (_WIN32_WCE)) && !defined (__GNUC__)) && !defined (_XBOX)
|
||||
va_start(argptr,error);
|
||||
vsprintf(buffer, error, argptr);
|
||||
va_end(argptr);
|
||||
#ifndef _WIN32_WCE
|
||||
{
|
||||
HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
DWORD bytesWritten;
|
||||
if (co != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (GetFileType(co) == FILE_TYPE_CHAR && GetConsoleMode(co, &bytesWritten))
|
||||
WriteConsoleA(co, buffer, (DWORD)strlen(buffer), NULL, NULL);
|
||||
else
|
||||
WriteFile(co, buffer, (DWORD)strlen(buffer), &bytesWritten, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
OutputDebugStringA(buffer);
|
||||
MessageBoxA(vid.WndParent, buffer, "SRB2 Recursive Error", MB_OK|MB_ICONERROR);
|
||||
#else
|
||||
// Don't print garbage
|
||||
va_start(argptr, error);
|
||||
if (!framebuffer)
|
||||
vfprintf (stderr, error, argptr);
|
||||
va_end(argptr);
|
||||
#endif
|
||||
// Implement message box with SDL_ShowSimpleMessageBox,
|
||||
// which should fail gracefully if it can't put a message box up
|
||||
// on the target system
|
||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
|
||||
"SRB2 "VERSIONSTRING" Recursive Error",
|
||||
buffer, NULL);
|
||||
|
||||
W_Shutdown();
|
||||
|
||||
#ifdef GP2X
|
||||
chdir("/usr/gp2x");
|
||||
execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
|
||||
#endif
|
||||
|
||||
exit(-1); // recursive errors detected
|
||||
}
|
||||
}
|
||||
shutdowning = true;
|
||||
I_ShutdownConsole();
|
||||
#ifndef MAC_ALERT
|
||||
// Message first.
|
||||
va_start(argptr,error);
|
||||
if (!framebuffer)
|
||||
{
|
||||
fprintf(stderr, "Error: ");
|
||||
vfprintf(stderr,error,argptr);
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
va_end(argptr);
|
||||
|
||||
if (!framebuffer)
|
||||
fflush(stderr);
|
||||
#endif
|
||||
shutdowning = true;
|
||||
|
||||
// Display error message in the console before we start shutting it down
|
||||
va_start(argptr, error);
|
||||
vsprintf(buffer, error, argptr);
|
||||
va_end(argptr);
|
||||
I_OutputMsg("\nI_Error(): %s\n", buffer);
|
||||
// ---
|
||||
|
||||
I_ShutdownConsole();
|
||||
|
||||
M_SaveConfig(NULL); // save game config, cvars..
|
||||
#ifndef NONET
|
||||
D_SaveBan(); // save the ban list
|
||||
|
@ -2454,21 +2421,30 @@ void I_Error(const char *error, ...)
|
|||
#ifndef _arch_dreamcast
|
||||
SDL_Quit();
|
||||
#endif
|
||||
#ifdef MAC_ALERT
|
||||
va_start(argptr, error);
|
||||
vsprintf(buffer, error, argptr);
|
||||
va_end(argptr);
|
||||
// 2004-03-03 AJR Since the Mac user is most likely double clicking to run the game, give them a panel.
|
||||
MacShowAlert("Critical Error", buffer, "Quit", NULL, NULL);
|
||||
#endif
|
||||
|
||||
// Implement message box with SDL_ShowSimpleMessageBox,
|
||||
// which should fail gracefully if it can't put a message box up
|
||||
// on the target system
|
||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
|
||||
"SRB2 "VERSIONSTRING" Error",
|
||||
buffer, NULL);
|
||||
// Note that SDL_ShowSimpleMessageBox does *not* require SDL to be
|
||||
// initialized at the time, so calling it after SDL_Quit() is
|
||||
// perfectly okay! In addition, we do this on purpose so the
|
||||
// fullscreen window is closed before displaying the error message
|
||||
// in case the fullscreen window blocks it for some absurd reason.
|
||||
|
||||
W_Shutdown();
|
||||
|
||||
#if defined (PARANOIA) && defined (__CYGWIN__)
|
||||
*(INT32 *)2 = 4; //Alam: Debug!
|
||||
#endif
|
||||
|
||||
#ifdef GP2X
|
||||
chdir("/usr/gp2x");
|
||||
execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
|
||||
#endif
|
||||
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
@ -2534,6 +2510,7 @@ void I_ShutdownSystem(void)
|
|||
#ifdef LOGMESSAGES
|
||||
if (logstream)
|
||||
{
|
||||
I_OutputMsg("I_ShutdownSystem(): end of logstream.\n");
|
||||
fclose(logstream);
|
||||
logstream = NULL;
|
||||
}
|
||||
|
|
|
@ -667,31 +667,28 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
|||
|
||||
if (mousefocus && kbfocus)
|
||||
{
|
||||
// Tell game we got focus back, resume music if necessary
|
||||
window_notinfocus = false;
|
||||
if (!paused)
|
||||
I_ResumeSong(0); //resume it
|
||||
|
||||
if (!firsttimeonmouse)
|
||||
{
|
||||
if (cv_usemouse.value) I_StartupMouse();
|
||||
}
|
||||
//else firsttimeonmouse = SDL_FALSE;
|
||||
if (gamestate == GS_LEVEL)
|
||||
{
|
||||
if (!paused) I_ResumeSong(0); //resume it
|
||||
}
|
||||
}
|
||||
else if (!mousefocus && !kbfocus)
|
||||
{
|
||||
// Tell game we lost focus, pause music
|
||||
window_notinfocus = true;
|
||||
I_PauseSong(0);
|
||||
|
||||
if (!disable_mouse)
|
||||
{
|
||||
SDLforceUngrabMouse();
|
||||
}
|
||||
if (!netgame && gamestate == GS_LEVEL && !demoplayback && !demorecording && !modeattacking)
|
||||
{
|
||||
paused = true;
|
||||
}
|
||||
memset(gamekeydown, 0, NUMKEYS); // TODO this is a scary memset
|
||||
if (gamestate == GS_LEVEL)
|
||||
{
|
||||
I_PauseSong(0);
|
||||
}
|
||||
|
||||
if (MOUSE_MENU)
|
||||
{
|
||||
|
@ -1570,7 +1567,7 @@ static SDL_bool Impl_CreateWindow(SDL_bool fullscreen)
|
|||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
window = SDL_CreateWindow("SRB2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||
window = SDL_CreateWindow("SRB2 "VERSIONSTRING, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||
realwidth, realheight, flags | SDL_WINDOW_OPENGL);
|
||||
if (window != NULL)
|
||||
{
|
||||
|
@ -1590,7 +1587,7 @@ static SDL_bool Impl_CreateWindow(SDL_bool fullscreen)
|
|||
#endif
|
||||
if (rendermode == render_soft)
|
||||
{
|
||||
window = SDL_CreateWindow("SRB2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||
window = SDL_CreateWindow("SRB2 "VERSIONSTRING, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||
realwidth, realheight, flags);
|
||||
if (window != NULL)
|
||||
{
|
||||
|
@ -1775,7 +1772,7 @@ void I_StartupGraphics(void)
|
|||
|
||||
// Create window
|
||||
//Impl_CreateWindow(USE_FULLSCREEN);
|
||||
//Impl_SetWindowName("SRB2");
|
||||
//Impl_SetWindowName("SRB2 "VERSIONSTRING);
|
||||
VID_SetMode(VID_GetModeForSize(BASEVIDWIDTH, BASEVIDHEIGHT));
|
||||
|
||||
vid.buffer = NULL; // For software mode
|
||||
|
@ -1835,12 +1832,17 @@ void I_ShutdownGraphics(void)
|
|||
bufSurface = NULL;
|
||||
}
|
||||
|
||||
I_OutputMsg("I_ShutdownGraphics(): ");
|
||||
|
||||
// was graphics initialized anyway?
|
||||
if (!graphics_started)
|
||||
{
|
||||
I_OutputMsg("graphics never started\n");
|
||||
return;
|
||||
CONS_Printf("I_ShutdownGraphics: ");
|
||||
}
|
||||
graphics_started = false;
|
||||
CONS_Printf("%s", M_GetText("shut down\n"));
|
||||
I_OutputMsg("shut down\n");
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (GLUhandle)
|
||||
hwClose(GLUhandle);
|
||||
|
|
|
@ -1214,7 +1214,7 @@
|
|||
C01FCF4B08A954540054247B /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CURRENT_PROJECT_VERSION = 2.1.12;
|
||||
CURRENT_PROJECT_VERSION = 2.1.14;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"$(inherited)",
|
||||
NORMALSRB2,
|
||||
|
@ -1226,7 +1226,7 @@
|
|||
C01FCF4C08A954540054247B /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CURRENT_PROJECT_VERSION = 2.1.12;
|
||||
CURRENT_PROJECT_VERSION = 2.1.14;
|
||||
GCC_ENABLE_FIX_AND_CONTINUE = NO;
|
||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
|
|
|
@ -1214,7 +1214,7 @@
|
|||
C01FCF4B08A954540054247B /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CURRENT_PROJECT_VERSION = 2.1.12;
|
||||
CURRENT_PROJECT_VERSION = 2.1.14;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"$(inherited)",
|
||||
NORMALSRB2,
|
||||
|
@ -1226,7 +1226,7 @@
|
|||
C01FCF4C08A954540054247B /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CURRENT_PROJECT_VERSION = 2.1.12;
|
||||
CURRENT_PROJECT_VERSION = 2.1.14;
|
||||
GCC_ENABLE_FIX_AND_CONTINUE = NO;
|
||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
|
|
|
@ -203,7 +203,7 @@ void ST_doPaletteStuff(void)
|
|||
{
|
||||
INT32 palette;
|
||||
|
||||
if (paused || P_MenuActivePause())
|
||||
if (paused || P_AutoPause())
|
||||
palette = 0;
|
||||
else if (stplyr && stplyr->flashcount)
|
||||
palette = stplyr->flashpal;
|
||||
|
@ -1576,15 +1576,6 @@ static inline void ST_drawTeamName(void)
|
|||
V_DrawString(244, (splitscreen) ? STRINGY(184) : STRINGY(192), V_HUDTRANSHALF, "SPECTATOR");
|
||||
}
|
||||
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
static inline void ST_drawChaosHUD(void)
|
||||
{
|
||||
char chains[33];
|
||||
sprintf(chains, "CHAINS: %u", stplyr->scoreadd);
|
||||
V_DrawString(8, STRINGY(184), V_HUDTRANSHALF, chains);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void ST_drawSpecialStageHUD(void)
|
||||
{
|
||||
if (totalrings > 0)
|
||||
|
@ -1667,7 +1658,7 @@ static void ST_doHuntIconsAndSound(void)
|
|||
interval = newinterval;
|
||||
}
|
||||
|
||||
if (!(P_MenuActivePause() || paused) && interval > 0 && leveltime && leveltime % interval == 0)
|
||||
if (!(P_AutoPause() || paused) && interval > 0 && leveltime && leveltime % interval == 0)
|
||||
S_StartSound(NULL, sfx_emfind);
|
||||
}
|
||||
|
||||
|
@ -1727,7 +1718,7 @@ static void ST_doItemFinderIconsAndSound(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (!(P_MenuActivePause() || paused) && interval > 0 && leveltime && leveltime % interval == 0)
|
||||
if (!(P_AutoPause() || paused) && interval > 0 && leveltime && leveltime % interval == 0)
|
||||
S_StartSound(NULL, sfx_emfind);
|
||||
}
|
||||
|
||||
|
@ -1814,12 +1805,6 @@ static void ST_overlayDrawer(void)
|
|||
if (G_GametypeHasTeams())
|
||||
ST_drawTeamName();
|
||||
|
||||
// Chaos HUD Stuff
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
else if (gametype == GT_CHAOS)
|
||||
ST_drawChaosHUD();
|
||||
#endif
|
||||
|
||||
// Special Stage HUD
|
||||
if (!useNightsSS && G_IsSpecialStage(gamemap) && stplyr == &players[displayplayer])
|
||||
ST_drawSpecialStageHUD();
|
||||
|
|
26
src/w_wad.c
26
src/w_wad.c
|
@ -662,6 +662,32 @@ lumpnum_t W_GetNumForName(const char *name)
|
|||
return i;
|
||||
}
|
||||
|
||||
//
|
||||
// W_CheckNumForNameInBlock
|
||||
// Checks only in blocks from blockstart lump to blockend lump
|
||||
//
|
||||
lumpnum_t W_CheckNumForNameInBlock(const char *name, const char *blockstart, const char *blockend)
|
||||
{
|
||||
INT32 i;
|
||||
lumpnum_t bsid, beid;
|
||||
lumpnum_t check = INT16_MAX;
|
||||
|
||||
// scan wad files backwards so patch lump files take precedence
|
||||
for (i = numwadfiles - 1; i >= 0; i--)
|
||||
{
|
||||
bsid = W_CheckNumForNamePwad(blockstart,(UINT16)i,0);
|
||||
if (bsid == INT16_MAX)
|
||||
continue; // block doesn't exist, keep going
|
||||
beid = W_CheckNumForNamePwad(blockend,(UINT16)i,0);
|
||||
// if block end doesn't exist, just search through everything
|
||||
|
||||
check = W_CheckNumForNamePwad(name,(UINT16)i,bsid);
|
||||
if (check < beid)
|
||||
return (i<<16)+check; // found it, in our constraints
|
||||
}
|
||||
return LUMPERROR;
|
||||
}
|
||||
|
||||
// Used by Lua. Case sensitive lump checking, quickly...
|
||||
#include "fastcmp.h"
|
||||
UINT8 W_LumpExists(const char *name)
|
||||
|
|
|
@ -102,6 +102,7 @@ const char *W_CheckNameForNum(lumpnum_t lumpnum);
|
|||
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump); // checks only in one pwad
|
||||
lumpnum_t W_CheckNumForName(const char *name);
|
||||
lumpnum_t W_GetNumForName(const char *name); // like W_CheckNumForName but I_Error on LUMPERROR
|
||||
lumpnum_t W_CheckNumForNameInBlock(const char *name, const char *blockstart, const char *blockend);
|
||||
UINT8 W_LumpExists(const char *name); // Lua uses this.
|
||||
|
||||
size_t W_LumpLengthPwad(UINT16 wad, UINT16 lump);
|
||||
|
|
|
@ -588,7 +588,7 @@ void Y_Ticker(void)
|
|||
return;
|
||||
|
||||
// Check for pause or menu up in single player
|
||||
if (paused || P_MenuActivePause())
|
||||
if (paused || P_AutoPause())
|
||||
return;
|
||||
|
||||
intertic++;
|
||||
|
@ -907,11 +907,7 @@ void Y_StartIntermission(void)
|
|||
intertype = int_teammatch;
|
||||
else if (gametype == GT_MATCH
|
||||
|| gametype == GT_TAG
|
||||
|| gametype == GT_HIDEANDSEEK
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
|| gametype == GT_CHAOS
|
||||
#endif
|
||||
)
|
||||
|| gametype == GT_HIDEANDSEEK)
|
||||
intertype = int_match;
|
||||
else if (gametype == GT_RACE)
|
||||
intertype = int_race;
|
||||
|
|
|
@ -25,9 +25,6 @@ typedef enum
|
|||
int_teammatch,// Team Match
|
||||
// int_tag, // Tag
|
||||
int_ctf, // CTF
|
||||
#ifdef CHAOSISNOTDEADYET
|
||||
int_chaos, // Chaos
|
||||
#endif
|
||||
int_spec, // Special Stage
|
||||
int_nights, // NiGHTS into Dreams
|
||||
int_nightsspec,// NiGHTS special stage
|
||||
|
|
Loading…
Reference in a new issue