Merge branch 'master' of http://git.magicalgirl.moe/STJr/SRB2Internal.git into s_skinprovements
# Conflicts: # src/d_player.h # src/dehacked.c # src/info.c # src/p_user.c
This commit is contained in:
commit
d8065fa525
|
@ -98,7 +98,7 @@ matrix:
|
||||||
- p7zip-full
|
- p7zip-full
|
||||||
- gcc-6
|
- gcc-6
|
||||||
compiler: gcc-6
|
compiler: gcc-6
|
||||||
env: WFLAGS="-Wno-error=tautological-compare"
|
env: WFLAGS="-Wno-tautological-compare"
|
||||||
#gcc-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511
|
#gcc-6 (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang
|
compiler: clang
|
||||||
|
@ -213,7 +213,7 @@ before_script:
|
||||||
- 7z x $HOME/srb2_cache/SRB2-v2115-assets-2.7z -oassets
|
- 7z x $HOME/srb2_cache/SRB2-v2115-assets-2.7z -oassets
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
- export CFLAGS="-Wall -W $WFLAGS"
|
- export CFLAGS="-Wall -W -Werror $WFLAGS"
|
||||||
- export CCACHE_COMPRESS=true
|
- export CCACHE_COMPRESS=true
|
||||||
- cmake .. -DCMAKE_BUILD_TYPE=Release
|
- cmake .. -DCMAKE_BUILD_TYPE=Release
|
||||||
|
|
||||||
|
|
|
@ -732,7 +732,8 @@ void luaV_execute (lua_State *L, int nexeccalls) {
|
||||||
luaG_runerror(L, LUA_QL("for") " limit must be a number");
|
luaG_runerror(L, LUA_QL("for") " limit must be a number");
|
||||||
else if (!tonumber(pstep, ra+2))
|
else if (!tonumber(pstep, ra+2))
|
||||||
luaG_runerror(L, LUA_QL("for") " step must be a number");
|
luaG_runerror(L, LUA_QL("for") " step must be a number");
|
||||||
setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep)));
|
if (ra && pstep)
|
||||||
|
setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep)));
|
||||||
dojump(L, pc, GETARG_sBx(i));
|
dojump(L, pc, GETARG_sBx(i));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -966,9 +966,11 @@ void CV_RegisterVar(consvar_t *variable)
|
||||||
// check net variables
|
// check net variables
|
||||||
if (variable->flags & CV_NETVAR)
|
if (variable->flags & CV_NETVAR)
|
||||||
{
|
{
|
||||||
|
const consvar_t *netvar;
|
||||||
variable->netid = CV_ComputeNetid(variable->name);
|
variable->netid = CV_ComputeNetid(variable->name);
|
||||||
if (CV_FindNetVar(variable->netid))
|
netvar = CV_FindNetVar(variable->netid);
|
||||||
I_Error("Variables %s and %s have same netid\n", variable->name, CV_FindNetVar(variable->netid)->name);
|
if (netvar)
|
||||||
|
I_Error("Variables %s and %s have same netid\n", variable->name, netvar->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// link the variable in
|
// link the variable in
|
||||||
|
|
|
@ -531,6 +531,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
||||||
rsp->deadtimer = players[i].deadtimer;
|
rsp->deadtimer = players[i].deadtimer;
|
||||||
rsp->exiting = (tic_t)LONG(players[i].exiting);
|
rsp->exiting = (tic_t)LONG(players[i].exiting);
|
||||||
rsp->homing = players[i].homing;
|
rsp->homing = players[i].homing;
|
||||||
|
rsp->dashmode = (tic_t)LONG(players[i].dashmode);
|
||||||
rsp->skidtime = (tic_t)LONG(players[i].skidtime);
|
rsp->skidtime = (tic_t)LONG(players[i].skidtime);
|
||||||
rsp->cmomx = (fixed_t)LONG(players[i].cmomx);
|
rsp->cmomx = (fixed_t)LONG(players[i].cmomx);
|
||||||
rsp->cmomy = (fixed_t)LONG(players[i].cmomy);
|
rsp->cmomy = (fixed_t)LONG(players[i].cmomy);
|
||||||
|
@ -657,6 +658,7 @@ static void resynch_read_player(resynch_pak *rsp)
|
||||||
players[i].deadtimer = rsp->deadtimer;
|
players[i].deadtimer = rsp->deadtimer;
|
||||||
players[i].exiting = (tic_t)LONG(rsp->exiting);
|
players[i].exiting = (tic_t)LONG(rsp->exiting);
|
||||||
players[i].homing = rsp->homing;
|
players[i].homing = rsp->homing;
|
||||||
|
players[i].dashmode = (tic_t)LONG(rsp->dashmode);
|
||||||
players[i].skidtime = (tic_t)LONG(rsp->skidtime);
|
players[i].skidtime = (tic_t)LONG(rsp->skidtime);
|
||||||
players[i].cmomx = (fixed_t)LONG(rsp->cmomx);
|
players[i].cmomx = (fixed_t)LONG(rsp->cmomx);
|
||||||
players[i].cmomy = (fixed_t)LONG(rsp->cmomy);
|
players[i].cmomy = (fixed_t)LONG(rsp->cmomy);
|
||||||
|
|
|
@ -191,6 +191,7 @@ typedef struct
|
||||||
INT32 deadtimer;
|
INT32 deadtimer;
|
||||||
tic_t exiting;
|
tic_t exiting;
|
||||||
UINT8 homing;
|
UINT8 homing;
|
||||||
|
tic_t dashmode;
|
||||||
tic_t skidtime;
|
tic_t skidtime;
|
||||||
fixed_t cmomx;
|
fixed_t cmomx;
|
||||||
fixed_t cmomy;
|
fixed_t cmomy;
|
||||||
|
|
|
@ -41,7 +41,7 @@ void D_SRB2Main(void);
|
||||||
// Called by IO functions when input is detected.
|
// Called by IO functions when input is detected.
|
||||||
void D_PostEvent(const event_t *ev);
|
void D_PostEvent(const event_t *ev);
|
||||||
#ifndef DOXYGEN
|
#ifndef DOXYGEN
|
||||||
void D_PostEvent_end(void); // delimiter for locking memory
|
FUNCMATH void D_PostEvent_end(void); // delimiter for locking memory
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void D_ProcessEvents(void);
|
void D_ProcessEvents(void);
|
||||||
|
|
|
@ -63,6 +63,7 @@ typedef enum
|
||||||
CA_JUMPBOOST,
|
CA_JUMPBOOST,
|
||||||
CA_AIRDRILL,
|
CA_AIRDRILL,
|
||||||
CA_JUMPTHOK,
|
CA_JUMPTHOK,
|
||||||
|
CA_DASHMODE,
|
||||||
CA_TWINSPIN
|
CA_TWINSPIN
|
||||||
} charability_t;
|
} charability_t;
|
||||||
|
|
||||||
|
@ -170,6 +171,7 @@ typedef enum
|
||||||
PA_EDGE,
|
PA_EDGE,
|
||||||
PA_WALK,
|
PA_WALK,
|
||||||
PA_RUN,
|
PA_RUN,
|
||||||
|
PA_PEEL,
|
||||||
PA_PAIN,
|
PA_PAIN,
|
||||||
PA_ROLL,
|
PA_ROLL,
|
||||||
PA_JUMP,
|
PA_JUMP,
|
||||||
|
@ -358,6 +360,7 @@ typedef struct player_s
|
||||||
tic_t exiting; // Exitlevel timer
|
tic_t exiting; // Exitlevel timer
|
||||||
|
|
||||||
UINT8 homing; // Are you homing?
|
UINT8 homing; // Are you homing?
|
||||||
|
tic_t dashmode; // counter for dashmode ability
|
||||||
|
|
||||||
tic_t skidtime; // Skid timer
|
tic_t skidtime; // Skid timer
|
||||||
|
|
||||||
|
|
|
@ -3771,6 +3771,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_PLAY_WAIT",
|
"S_PLAY_WAIT",
|
||||||
"S_PLAY_WALK",
|
"S_PLAY_WALK",
|
||||||
"S_PLAY_RUN",
|
"S_PLAY_RUN",
|
||||||
|
"S_PLAY_PEEL",
|
||||||
"S_PLAY_PAIN",
|
"S_PLAY_PAIN",
|
||||||
"S_PLAY_DEAD",
|
"S_PLAY_DEAD",
|
||||||
"S_PLAY_DRWN",
|
"S_PLAY_DRWN",
|
||||||
|
@ -3800,6 +3801,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_PLAY_SUPER_STND",
|
"S_PLAY_SUPER_STND",
|
||||||
"S_PLAY_SUPER_WALK",
|
"S_PLAY_SUPER_WALK",
|
||||||
"S_PLAY_SUPER_RUN",
|
"S_PLAY_SUPER_RUN",
|
||||||
|
"S_PLAY_SUPER_PEEL",
|
||||||
"S_PLAY_SUPER_PAIN",
|
"S_PLAY_SUPER_PAIN",
|
||||||
"S_PLAY_SUPER_STUN",
|
"S_PLAY_SUPER_STUN",
|
||||||
"S_PLAY_SUPER_DEAD",
|
"S_PLAY_SUPER_DEAD",
|
||||||
|
@ -6695,12 +6697,14 @@ static const char *const MOBJEFLAG_LIST[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
static const char *const MAPTHINGFLAG_LIST[4] = {
|
static const char *const MAPTHINGFLAG_LIST[4] = {
|
||||||
NULL,
|
NULL,
|
||||||
"OBJECTFLIP", // Reverse gravity flag for objects.
|
"OBJECTFLIP", // Reverse gravity flag for objects.
|
||||||
"OBJECTSPECIAL", // Special flag used with certain objects.
|
"OBJECTSPECIAL", // Special flag used with certain objects.
|
||||||
"AMBUSH" // Deaf monsters/do not react to sound.
|
"AMBUSH" // Deaf monsters/do not react to sound.
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char *const PLAYERFLAG_LIST[] = {
|
static const char *const PLAYERFLAG_LIST[] = {
|
||||||
// Flip camera angle with gravity flip prefrence.
|
// Flip camera angle with gravity flip prefrence.
|
||||||
|
@ -6773,6 +6777,7 @@ static const char *const PLAYERFLAG_LIST[] = {
|
||||||
NULL // stop loop here.
|
NULL // stop loop here.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
// Linedef flags
|
// Linedef flags
|
||||||
static const char *const ML_LIST[16] = {
|
static const char *const ML_LIST[16] = {
|
||||||
"IMPASSIBLE",
|
"IMPASSIBLE",
|
||||||
|
@ -6792,6 +6797,7 @@ static const char *const ML_LIST[16] = {
|
||||||
"BOUNCY",
|
"BOUNCY",
|
||||||
"TFERLINE"
|
"TFERLINE"
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
// This DOES differ from r_draw's Color_Names, unfortunately.
|
// This DOES differ from r_draw's Color_Names, unfortunately.
|
||||||
// Also includes Super colors
|
// Also includes Super colors
|
||||||
|
@ -7125,6 +7131,7 @@ struct {
|
||||||
{"CA_JUMPBOOST",CA_JUMPBOOST},
|
{"CA_JUMPBOOST",CA_JUMPBOOST},
|
||||||
{"CA_AIRDRILL",CA_AIRDRILL},
|
{"CA_AIRDRILL",CA_AIRDRILL},
|
||||||
{"CA_JUMPTHOK",CA_JUMPTHOK},
|
{"CA_JUMPTHOK",CA_JUMPTHOK},
|
||||||
|
{"CA_DASHMODE",CA_DASHMODE},
|
||||||
{"CA_TWINSPIN",CA_TWINSPIN},
|
{"CA_TWINSPIN",CA_TWINSPIN},
|
||||||
// Secondary
|
// Secondary
|
||||||
{"CA2_NONE",CA2_NONE}, // now slot 0!
|
{"CA2_NONE",CA2_NONE}, // now slot 0!
|
||||||
|
@ -7176,6 +7183,7 @@ struct {
|
||||||
{"PA_EDGE",PA_EDGE},
|
{"PA_EDGE",PA_EDGE},
|
||||||
{"PA_WALK",PA_WALK},
|
{"PA_WALK",PA_WALK},
|
||||||
{"PA_RUN",PA_RUN},
|
{"PA_RUN",PA_RUN},
|
||||||
|
{"PA_PEEL",PA_PEEL},
|
||||||
{"PA_PAIN",PA_PAIN},
|
{"PA_PAIN",PA_PAIN},
|
||||||
{"PA_ROLL",PA_ROLL},
|
{"PA_ROLL",PA_ROLL},
|
||||||
{"PA_JUMP",PA_JUMP},
|
{"PA_JUMP",PA_JUMP},
|
||||||
|
@ -7757,7 +7765,7 @@ fixed_t get_number(const char *word)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void DEH_Check(void)
|
void FUNCMATH DEH_Check(void)
|
||||||
{
|
{
|
||||||
#if defined(_DEBUG) || defined(PARANOIA)
|
#if defined(_DEBUG) || defined(PARANOIA)
|
||||||
const size_t dehstates = sizeof(STATE_LIST)/sizeof(const char*);
|
const size_t dehstates = sizeof(STATE_LIST)/sizeof(const char*);
|
||||||
|
|
|
@ -213,7 +213,7 @@ extern FILE *logstream;
|
||||||
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
||||||
// Only set it higher, not lower, obviously.
|
// Only set it higher, not lower, obviously.
|
||||||
// Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1".
|
// Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1".
|
||||||
#define MODVERSION 20
|
#define MODVERSION 21
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|
||||||
|
@ -435,6 +435,12 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||||
/// Kalaron/Eternity Engine slope code (SRB2CB ported)
|
/// Kalaron/Eternity Engine slope code (SRB2CB ported)
|
||||||
#define ESLOPE
|
#define ESLOPE
|
||||||
|
|
||||||
|
#ifdef ESLOPE
|
||||||
|
/// Backwards compatibility with SRB2CB's slope linedef types.
|
||||||
|
/// \note A simple shim that prints a warning.
|
||||||
|
#define ESLOPE_TYPESHIM
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Delete file while the game is running.
|
/// Delete file while the game is running.
|
||||||
/// \note EXTREMELY buggy, tends to crash game.
|
/// \note EXTREMELY buggy, tends to crash game.
|
||||||
//#define DELFILE
|
//#define DELFILE
|
||||||
|
|
|
@ -35,7 +35,7 @@ void F_CutsceneTicker(void);
|
||||||
void F_TitleDemoTicker(void);
|
void F_TitleDemoTicker(void);
|
||||||
|
|
||||||
// Called by main loop.
|
// Called by main loop.
|
||||||
void F_GameEndDrawer(void);
|
FUNCMATH void F_GameEndDrawer(void);
|
||||||
void F_IntroDrawer(void);
|
void F_IntroDrawer(void);
|
||||||
void F_TitleScreenDrawer(void);
|
void F_TitleScreenDrawer(void);
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void (*I_Error_t) (const char *error, ...);
|
typedef void (*I_Error_t) (const char *error, ...) FUNCIERROR;
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// MATHS
|
// MATHS
|
||||||
|
|
|
@ -4529,7 +4529,8 @@ static void HWR_SortVisSprites(void)
|
||||||
// Fix first and last. ds still points to the last one after the loop
|
// Fix first and last. ds still points to the last one after the loop
|
||||||
dsfirst->prev = &unsorted;
|
dsfirst->prev = &unsorted;
|
||||||
unsorted.next = dsfirst;
|
unsorted.next = dsfirst;
|
||||||
ds->next = &unsorted;
|
if (ds)
|
||||||
|
ds->next = &unsorted;
|
||||||
unsorted.prev = ds;
|
unsorted.prev = ds;
|
||||||
|
|
||||||
// pull the vissprites out by scale
|
// pull the vissprites out by scale
|
||||||
|
@ -4552,10 +4553,13 @@ static void HWR_SortVisSprites(void)
|
||||||
best = ds;
|
best = ds;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
best->next->prev = best->prev;
|
if (best)
|
||||||
best->prev->next = best->next;
|
{
|
||||||
best->next = &gr_vsprsortedhead;
|
best->next->prev = best->prev;
|
||||||
best->prev = gr_vsprsortedhead.prev;
|
best->prev->next = best->next;
|
||||||
|
best->next = &gr_vsprsortedhead;
|
||||||
|
best->prev = gr_vsprsortedhead.prev;
|
||||||
|
}
|
||||||
gr_vsprsortedhead.prev->next = best;
|
gr_vsprsortedhead.prev->next = best;
|
||||||
gr_vsprsortedhead.prev = best;
|
gr_vsprsortedhead.prev = best;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1836,10 +1836,7 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------+
|
static inline void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 duration, UINT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
|
||||||
// HWRAPI DrawMD2 : Draw an MD2 model with glcommands
|
|
||||||
// -----------------+
|
|
||||||
EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 duration, UINT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
|
|
||||||
{
|
{
|
||||||
INT32 val, count, pindex;
|
INT32 val, count, pindex;
|
||||||
GLfloat s, t;
|
GLfloat s, t;
|
||||||
|
@ -1931,7 +1928,7 @@ EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 d
|
||||||
//pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency
|
//pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency
|
||||||
|
|
||||||
// Remove depth mask when the model is transparent so it doesn't cut thorugh sprites // SRB2CBTODO: For all stuff too?!
|
// Remove depth mask when the model is transparent so it doesn't cut thorugh sprites // SRB2CBTODO: For all stuff too?!
|
||||||
if (color[3] < 255)
|
if (color && color[3] < 255)
|
||||||
{
|
{
|
||||||
pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency
|
pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency
|
||||||
pglDepthMask(GL_FALSE);
|
pglDepthMask(GL_FALSE);
|
||||||
|
@ -2007,11 +2004,20 @@ EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 d
|
||||||
pglDisable(GL_CULL_FACE);
|
pglDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------+
|
||||||
|
// HWRAPI DrawMD2 : Draw an MD2 model with glcommands
|
||||||
|
// -----------------+
|
||||||
|
EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, UINT32 duration, UINT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
|
||||||
|
{
|
||||||
|
DrawMD2Ex(gl_cmd_buffer, frame, duration, tics, nextframe, pos, scale, flipped, color);
|
||||||
|
}
|
||||||
|
|
||||||
EXPORT void HWRAPI(DrawMD2) (INT32 *gl_cmd_buffer, md2_frame_t *frame, FTransform *pos, float scale)
|
EXPORT void HWRAPI(DrawMD2) (INT32 *gl_cmd_buffer, md2_frame_t *frame, FTransform *pos, float scale)
|
||||||
{
|
{
|
||||||
DrawMD2i(gl_cmd_buffer, frame, 0, 0, NULL, pos, scale, false, NULL);
|
DrawMD2Ex(gl_cmd_buffer, frame, 0, 0, NULL, pos, scale, false, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
// SetTransform :
|
// SetTransform :
|
||||||
// -----------------+
|
// -----------------+
|
||||||
|
|
|
@ -87,7 +87,7 @@ void HU_Init(void);
|
||||||
void HU_LoadGraphics(void);
|
void HU_LoadGraphics(void);
|
||||||
|
|
||||||
// reset heads up when consoleplayer respawns.
|
// reset heads up when consoleplayer respawns.
|
||||||
void HU_Start(void);
|
FUNCMATH void HU_Start(void);
|
||||||
|
|
||||||
boolean HU_Responder(event_t *ev);
|
boolean HU_Responder(event_t *ev);
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
||||||
"WAIT",
|
"WAIT",
|
||||||
"WALK",
|
"WALK",
|
||||||
"RUN_",
|
"RUN_",
|
||||||
|
"PEEL",
|
||||||
"PAIN",
|
"PAIN",
|
||||||
"DEAD",
|
"DEAD",
|
||||||
"DRWN",
|
"DRWN",
|
||||||
|
@ -91,6 +92,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
|
||||||
"SSTD",
|
"SSTD",
|
||||||
"SWLK",
|
"SWLK",
|
||||||
"SRUN",
|
"SRUN",
|
||||||
|
"SPEE",
|
||||||
"SPAN",
|
"SPAN",
|
||||||
"SMSL",
|
"SMSL",
|
||||||
"SDTH",
|
"SDTH",
|
||||||
|
@ -135,6 +137,7 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_PLAY, SPR2_WAIT, 16, {NULL}, 0, 0, S_PLAY_WAIT}, // S_PLAY_WAIT
|
{SPR_PLAY, SPR2_WAIT, 16, {NULL}, 0, 0, S_PLAY_WAIT}, // S_PLAY_WAIT
|
||||||
{SPR_PLAY, SPR2_WALK|FF_MIDDLESTARTCHANCE, 4, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_WALK
|
{SPR_PLAY, SPR2_WALK|FF_MIDDLESTARTCHANCE, 4, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_WALK
|
||||||
{SPR_PLAY, SPR2_RUN |FF_MIDDLESTARTCHANCE, 2, {NULL}, 0, 0, S_PLAY_RUN}, // S_PLAY_RUN
|
{SPR_PLAY, SPR2_RUN |FF_MIDDLESTARTCHANCE, 2, {NULL}, 0, 0, S_PLAY_RUN}, // S_PLAY_RUN
|
||||||
|
{SPR_PLAY, SPR2_PEEL, 2, {NULL}, 0, 0, S_PLAY_PEEL}, // S_PLAY_PEEL
|
||||||
{SPR_PLAY, SPR2_PAIN, 350, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_PAIN
|
{SPR_PLAY, SPR2_PAIN, 350, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_PAIN
|
||||||
{SPR_PLAY, SPR2_DEAD, 4, {NULL}, 0, 0, S_PLAY_DEAD}, // S_PLAY_DEAD
|
{SPR_PLAY, SPR2_DEAD, 4, {NULL}, 0, 0, S_PLAY_DEAD}, // S_PLAY_DEAD
|
||||||
{SPR_PLAY, SPR2_DRWN, 4, {NULL}, 0, 0, S_PLAY_DRWN}, // S_PLAY_DRWN
|
{SPR_PLAY, SPR2_DRWN, 4, {NULL}, 0, 0, S_PLAY_DRWN}, // S_PLAY_DRWN
|
||||||
|
@ -164,6 +167,7 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_PLAY, SPR2_SSTD, 7, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STND
|
{SPR_PLAY, SPR2_SSTD, 7, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STND
|
||||||
{SPR_PLAY, SPR2_SWLK, 7, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_WALK
|
{SPR_PLAY, SPR2_SWLK, 7, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_WALK
|
||||||
{SPR_PLAY, SPR2_SRUN, 7, {NULL}, 0, 0, S_PLAY_SUPER_RUN}, // S_PLAY_SUPER_RUN
|
{SPR_PLAY, SPR2_SRUN, 7, {NULL}, 0, 0, S_PLAY_SUPER_RUN}, // S_PLAY_SUPER_RUN
|
||||||
|
{SPR_PLAY, SPR2_SPEE, 7, {NULL}, 0, 0, S_PLAY_SUPER_PEEL}, // S_PLAY_SUPER_PEEL
|
||||||
{SPR_PLAY, SPR2_SPAN, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_PAIN
|
{SPR_PLAY, SPR2_SPAN, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_PAIN
|
||||||
{SPR_PLAY, SPR2_SMSL, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STUN
|
{SPR_PLAY, SPR2_SMSL, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STUN
|
||||||
{SPR_PLAY, SPR2_SDTH, 4, {NULL}, 0, 0, S_PLAY_SUPER_DEAD}, // S_PLAY_SUPER_DEAD
|
{SPR_PLAY, SPR2_SDTH, 4, {NULL}, 0, 0, S_PLAY_SUPER_DEAD}, // S_PLAY_SUPER_DEAD
|
||||||
|
|
|
@ -581,6 +581,7 @@ enum playersprite
|
||||||
SPR2_WAIT,
|
SPR2_WAIT,
|
||||||
SPR2_WALK,
|
SPR2_WALK,
|
||||||
SPR2_RUN ,
|
SPR2_RUN ,
|
||||||
|
SPR2_PEEL,
|
||||||
SPR2_PAIN,
|
SPR2_PAIN,
|
||||||
SPR2_DEAD,
|
SPR2_DEAD,
|
||||||
SPR2_DRWN,
|
SPR2_DRWN,
|
||||||
|
@ -610,6 +611,7 @@ enum playersprite
|
||||||
SPR2_SSTD,
|
SPR2_SSTD,
|
||||||
SPR2_SWLK,
|
SPR2_SWLK,
|
||||||
SPR2_SRUN,
|
SPR2_SRUN,
|
||||||
|
SPR2_SPEE,
|
||||||
SPR2_SPAN,
|
SPR2_SPAN,
|
||||||
SPR2_SMSL,
|
SPR2_SMSL,
|
||||||
SPR2_SDTH,
|
SPR2_SDTH,
|
||||||
|
@ -648,6 +650,7 @@ typedef enum state
|
||||||
S_PLAY_WAIT,
|
S_PLAY_WAIT,
|
||||||
S_PLAY_WALK,
|
S_PLAY_WALK,
|
||||||
S_PLAY_RUN,
|
S_PLAY_RUN,
|
||||||
|
S_PLAY_PEEL,
|
||||||
S_PLAY_PAIN,
|
S_PLAY_PAIN,
|
||||||
S_PLAY_DEAD,
|
S_PLAY_DEAD,
|
||||||
S_PLAY_DRWN,
|
S_PLAY_DRWN,
|
||||||
|
@ -677,6 +680,7 @@ typedef enum state
|
||||||
S_PLAY_SUPER_STND,
|
S_PLAY_SUPER_STND,
|
||||||
S_PLAY_SUPER_WALK,
|
S_PLAY_SUPER_WALK,
|
||||||
S_PLAY_SUPER_RUN,
|
S_PLAY_SUPER_RUN,
|
||||||
|
S_PLAY_SUPER_PEEL,
|
||||||
S_PLAY_SUPER_PAIN,
|
S_PLAY_SUPER_PAIN,
|
||||||
S_PLAY_SUPER_STUN,
|
S_PLAY_SUPER_STUN,
|
||||||
S_PLAY_SUPER_DEAD,
|
S_PLAY_SUPER_DEAD,
|
||||||
|
|
|
@ -429,6 +429,16 @@ static int lib_pMobjFlip(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_pGetMobjGravity(lua_State *L)
|
||||||
|
{
|
||||||
|
mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
|
||||||
|
//HUDSAFE
|
||||||
|
if (!mobj)
|
||||||
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
|
lua_pushfixed(L, P_GetMobjGravity(mobj));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int lib_pWeaponOrPanel(lua_State *L)
|
static int lib_pWeaponOrPanel(lua_State *L)
|
||||||
{
|
{
|
||||||
mobjtype_t type = luaL_checkinteger(L, 1);
|
mobjtype_t type = luaL_checkinteger(L, 1);
|
||||||
|
@ -2003,6 +2013,7 @@ static luaL_Reg lib[] = {
|
||||||
{"P_SPMAngle",lib_pSPMAngle},
|
{"P_SPMAngle",lib_pSPMAngle},
|
||||||
{"P_SpawnPlayerMissile",lib_pSpawnPlayerMissile},
|
{"P_SpawnPlayerMissile",lib_pSpawnPlayerMissile},
|
||||||
{"P_MobjFlip",lib_pMobjFlip},
|
{"P_MobjFlip",lib_pMobjFlip},
|
||||||
|
{"P_GetMobjGravity",lib_pGetMobjGravity},
|
||||||
{"P_WeaponOrPanel",lib_pWeaponOrPanel},
|
{"P_WeaponOrPanel",lib_pWeaponOrPanel},
|
||||||
{"P_FlashPal",lib_pFlashPal},
|
{"P_FlashPal",lib_pFlashPal},
|
||||||
{"P_GetClosestAxis",lib_pGetClosestAxis},
|
{"P_GetClosestAxis",lib_pGetClosestAxis},
|
||||||
|
|
|
@ -202,6 +202,8 @@ static int player_get(lua_State *L)
|
||||||
lua_pushinteger(L, plr->exiting);
|
lua_pushinteger(L, plr->exiting);
|
||||||
else if (fastcmp(field,"homing"))
|
else if (fastcmp(field,"homing"))
|
||||||
lua_pushinteger(L, plr->homing);
|
lua_pushinteger(L, plr->homing);
|
||||||
|
else if (fastcmp(field,"dashmode"))
|
||||||
|
lua_pushinteger(L, plr->dashmode);
|
||||||
else if (fastcmp(field,"skidtime"))
|
else if (fastcmp(field,"skidtime"))
|
||||||
lua_pushinteger(L, plr->skidtime);
|
lua_pushinteger(L, plr->skidtime);
|
||||||
else if (fastcmp(field,"cmomx"))
|
else if (fastcmp(field,"cmomx"))
|
||||||
|
@ -459,6 +461,8 @@ static int player_set(lua_State *L)
|
||||||
plr->exiting = (tic_t)luaL_checkinteger(L, 3);
|
plr->exiting = (tic_t)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"homing"))
|
else if (fastcmp(field,"homing"))
|
||||||
plr->homing = (UINT8)luaL_checkinteger(L, 3);
|
plr->homing = (UINT8)luaL_checkinteger(L, 3);
|
||||||
|
else if (fastcmp(field,"dashmode"))
|
||||||
|
plr->dashmode = (tic_t)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"skidtime"))
|
else if (fastcmp(field,"skidtime"))
|
||||||
plr->skidtime = (tic_t)luaL_checkinteger(L, 3);
|
plr->skidtime = (tic_t)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"cmomx"))
|
else if (fastcmp(field,"cmomx"))
|
||||||
|
|
|
@ -1163,7 +1163,7 @@ void T_SpikeSector(levelspecthink_t *spikes)
|
||||||
|
|
||||||
node = spikes->sector->touching_thinglist; // things touching this sector
|
node = spikes->sector->touching_thinglist; // things touching this sector
|
||||||
|
|
||||||
for (; node; node = node->m_snext)
|
for (; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
if (!thing->player)
|
if (!thing->player)
|
||||||
|
@ -1314,7 +1314,7 @@ void T_BridgeThinker(levelspecthink_t *bridge)
|
||||||
controlsec = §ors[k];
|
controlsec = §ors[k];
|
||||||
|
|
||||||
// Is a player standing on me?
|
// Is a player standing on me?
|
||||||
for (node = sector->touching_thinglist; node; node = node->m_snext)
|
for (node = sector->touching_thinglist; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
|
|
||||||
|
@ -1737,7 +1737,7 @@ wegotit:
|
||||||
static mobj_t *SearchMarioNode(msecnode_t *node)
|
static mobj_t *SearchMarioNode(msecnode_t *node)
|
||||||
{
|
{
|
||||||
mobj_t *thing = NULL;
|
mobj_t *thing = NULL;
|
||||||
for (; node; node = node->m_snext)
|
for (; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
// Things which should NEVER be ejected from a MarioBlock, by type.
|
// Things which should NEVER be ejected from a MarioBlock, by type.
|
||||||
switch (node->m_thing->type)
|
switch (node->m_thing->type)
|
||||||
|
@ -2009,7 +2009,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies)
|
||||||
&& thing->z < upperbound && thing->z+thing->height > lowerbound)
|
&& thing->z < upperbound && thing->z+thing->height > lowerbound)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
node = node->m_snext;
|
node = node->m_thinglist_next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2027,7 +2027,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies)
|
||||||
&& thing->z < upperbound && thing->z+thing->height > lowerbound)
|
&& thing->z < upperbound && thing->z+thing->height > lowerbound)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
node = node->m_snext;
|
node = node->m_thinglist_next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2306,7 +2306,7 @@ void T_RaiseSector(levelspecthink_t *raise)
|
||||||
sector = §ors[i];
|
sector = §ors[i];
|
||||||
|
|
||||||
// Is a player standing on me?
|
// Is a player standing on me?
|
||||||
for (node = sector->touching_thinglist; node; node = node->m_snext)
|
for (node = sector->touching_thinglist; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
|
|
||||||
|
|
|
@ -3664,7 +3664,7 @@ void P_PlayerFlagBurst(player_t *player, boolean toss)
|
||||||
// Flag text
|
// Flag text
|
||||||
{
|
{
|
||||||
char plname[MAXPLAYERNAME+4];
|
char plname[MAXPLAYERNAME+4];
|
||||||
char *flagtext;
|
const char *flagtext;
|
||||||
char flagcolor;
|
char flagcolor;
|
||||||
|
|
||||||
snprintf(plname, sizeof(plname), "%s%s%s",
|
snprintf(plname, sizeof(plname), "%s%s%s",
|
||||||
|
|
|
@ -252,7 +252,8 @@ mobj_t *P_SPMAngle(mobj_t *source, mobjtype_t type, angle_t angle, UINT8 aimtype
|
||||||
#endif
|
#endif
|
||||||
void P_ColorTeamMissile(mobj_t *missile, player_t *source);
|
void P_ColorTeamMissile(mobj_t *missile, player_t *source);
|
||||||
SINT8 P_MobjFlip(mobj_t *mobj);
|
SINT8 P_MobjFlip(mobj_t *mobj);
|
||||||
boolean P_WeaponOrPanel(mobjtype_t type);
|
fixed_t P_GetMobjGravity(mobj_t *mo);
|
||||||
|
FUNCMATH boolean P_WeaponOrPanel(mobjtype_t type);
|
||||||
|
|
||||||
boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled);
|
boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled);
|
||||||
|
|
||||||
|
|
132
src/p_map.c
132
src/p_map.c
|
@ -448,6 +448,35 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dashmode users destroy spikes and monitors.
|
||||||
|
if ((tmthing->player) && (tmthing->player->charability == CA_DASHMODE) && (tmthing->player->dashmode >= 3*TICRATE)
|
||||||
|
&& (thing->flags & (MF_MONITOR) || thing->type == MT_SPIKE))
|
||||||
|
{
|
||||||
|
if ((thing->flags & (MF_MONITOR)) && (thing->health <= 0 || !(thing->flags & MF_SHOOTABLE)))
|
||||||
|
return true;
|
||||||
|
blockdist = thing->radius + tmthing->radius;
|
||||||
|
if (abs(thing->x - tmx) >= blockdist || abs(thing->y - tmy) >= blockdist)
|
||||||
|
return true; // didn't hit it
|
||||||
|
// see if it went over / under
|
||||||
|
if (tmthing->z > thing->z + thing->height)
|
||||||
|
return true; // overhead
|
||||||
|
if (tmthing->z + tmthing->height < thing->z)
|
||||||
|
return true; // underneath
|
||||||
|
if (thing->type == MT_SPIKE)
|
||||||
|
{
|
||||||
|
S_StartSound(tmthing, thing->info->deathsound);
|
||||||
|
for (thing = thing->subsector->sector->thinglist; thing; thing = thing->snext)
|
||||||
|
if (thing->type == MT_SPIKE && thing->health > 0 && thing->flags & MF_SOLID && P_AproxDistance(thing->x - tmthing->x, thing->y - tmthing->y) < FixedMul(56*FRACUNIT, thing->scale))
|
||||||
|
P_KillMobj(thing, tmthing, tmthing, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
thing->health = 0;
|
||||||
|
P_KillMobj(thing, tmthing, tmthing, 0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE)))
|
if (!(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -2438,6 +2467,8 @@ isblocking:
|
||||||
//
|
//
|
||||||
// P_IsClimbingValid
|
// P_IsClimbingValid
|
||||||
//
|
//
|
||||||
|
// Unlike P_DoClimbing, don't use when up against a one-sided linedef.
|
||||||
|
//
|
||||||
static boolean P_IsClimbingValid(player_t *player, angle_t angle)
|
static boolean P_IsClimbingValid(player_t *player, angle_t angle)
|
||||||
{
|
{
|
||||||
fixed_t platx, platy;
|
fixed_t platx, platy;
|
||||||
|
@ -2662,6 +2693,7 @@ isblocking:
|
||||||
// see about climbing on the wall
|
// see about climbing on the wall
|
||||||
if (!(checkline->flags & ML_NOCLIMB))
|
if (!(checkline->flags & ML_NOCLIMB))
|
||||||
{
|
{
|
||||||
|
boolean canclimb; // FUCK C90
|
||||||
angle_t climbangle, climbline;
|
angle_t climbangle, climbline;
|
||||||
INT32 whichside = P_PointOnLineSide(slidemo->x, slidemo->y, li);
|
INT32 whichside = P_PointOnLineSide(slidemo->x, slidemo->y, li);
|
||||||
|
|
||||||
|
@ -2672,9 +2704,11 @@ isblocking:
|
||||||
|
|
||||||
climbangle += (ANGLE_90 * (whichside ? -1 : 1));
|
climbangle += (ANGLE_90 * (whichside ? -1 : 1));
|
||||||
|
|
||||||
|
canclimb = (li->backsector ? P_IsClimbingValid(slidemo->player, climbangle) : true);
|
||||||
|
|
||||||
if (((!slidemo->player->climbing && abs((signed)(slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45)
|
if (((!slidemo->player->climbing && abs((signed)(slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45)
|
||||||
|| (slidemo->player->climbing == 1 && abs((signed)(slidemo->angle - climbline)) < ANGLE_135))
|
|| (slidemo->player->climbing == 1 && abs((signed)(slidemo->angle - climbline)) < ANGLE_135))
|
||||||
&& P_IsClimbingValid(slidemo->player, climbangle))
|
&& canclimb)
|
||||||
{
|
{
|
||||||
slidemo->angle = climbangle;
|
slidemo->angle = climbangle;
|
||||||
if (!demoplayback || P_AnalogMove(slidemo->player))
|
if (!demoplayback || P_AnalogMove(slidemo->player))
|
||||||
|
@ -3373,7 +3407,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
||||||
for (i = 0; i < sector->numattached; i++)
|
for (i = 0; i < sector->numattached; i++)
|
||||||
{
|
{
|
||||||
sec = §ors[sector->attached[i]];
|
sec = §ors[sector->attached[i]];
|
||||||
for (n = sec->touching_thinglist; n; n = n->m_snext)
|
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
||||||
n->visited = false;
|
n->visited = false;
|
||||||
|
|
||||||
sec->moved = true;
|
sec->moved = true;
|
||||||
|
@ -3385,7 +3419,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
for (n = sec->touching_thinglist; n; n = n->m_snext)
|
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
||||||
if (!n->visited)
|
if (!n->visited)
|
||||||
{
|
{
|
||||||
n->visited = true;
|
n->visited = true;
|
||||||
|
@ -3406,12 +3440,12 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
||||||
// Mark all things invalid
|
// Mark all things invalid
|
||||||
sector->moved = true;
|
sector->moved = true;
|
||||||
|
|
||||||
for (n = sector->touching_thinglist; n; n = n->m_snext)
|
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next)
|
||||||
n->visited = false;
|
n->visited = false;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
for (n = sector->touching_thinglist; n; n = n->m_snext) // go through list
|
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list
|
||||||
if (!n->visited) // unprocessed thing found
|
if (!n->visited) // unprocessed thing found
|
||||||
{
|
{
|
||||||
n->visited = true; // mark thing as processed
|
n->visited = true; // mark thing as processed
|
||||||
|
@ -3435,7 +3469,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
||||||
for (i = 0; i < sector->numattached; i++)
|
for (i = 0; i < sector->numattached; i++)
|
||||||
{
|
{
|
||||||
sec = §ors[sector->attached[i]];
|
sec = §ors[sector->attached[i]];
|
||||||
for (n = sec->touching_thinglist; n; n = n->m_snext)
|
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
||||||
n->visited = false;
|
n->visited = false;
|
||||||
|
|
||||||
sec->moved = true;
|
sec->moved = true;
|
||||||
|
@ -3447,7 +3481,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
for (n = sec->touching_thinglist; n; n = n->m_snext)
|
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
||||||
if (!n->visited)
|
if (!n->visited)
|
||||||
{
|
{
|
||||||
n->visited = true;
|
n->visited = true;
|
||||||
|
@ -3465,12 +3499,12 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
|
||||||
// Mark all things invalid
|
// Mark all things invalid
|
||||||
sector->moved = true;
|
sector->moved = true;
|
||||||
|
|
||||||
for (n = sector->touching_thinglist; n; n = n->m_snext)
|
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next)
|
||||||
n->visited = false;
|
n->visited = false;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
for (n = sector->touching_thinglist; n; n = n->m_snext) // go through list
|
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list
|
||||||
if (!n->visited) // unprocessed thing found
|
if (!n->visited) // unprocessed thing found
|
||||||
{
|
{
|
||||||
n->visited = true; // mark thing as processed
|
n->visited = true; // mark thing as processed
|
||||||
|
@ -3510,7 +3544,7 @@ static msecnode_t *P_GetSecnode(void)
|
||||||
if (headsecnode)
|
if (headsecnode)
|
||||||
{
|
{
|
||||||
node = headsecnode;
|
node = headsecnode;
|
||||||
headsecnode = headsecnode->m_snext;
|
headsecnode = headsecnode->m_thinglist_next;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL);
|
node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL);
|
||||||
|
@ -3524,7 +3558,7 @@ static mprecipsecnode_t *P_GetPrecipSecnode(void)
|
||||||
if (headprecipsecnode)
|
if (headprecipsecnode)
|
||||||
{
|
{
|
||||||
node = headprecipsecnode;
|
node = headprecipsecnode;
|
||||||
headprecipsecnode = headprecipsecnode->m_snext;
|
headprecipsecnode = headprecipsecnode->m_thinglist_next;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL);
|
node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL);
|
||||||
|
@ -3535,14 +3569,14 @@ static mprecipsecnode_t *P_GetPrecipSecnode(void)
|
||||||
|
|
||||||
static inline void P_PutSecnode(msecnode_t *node)
|
static inline void P_PutSecnode(msecnode_t *node)
|
||||||
{
|
{
|
||||||
node->m_snext = headsecnode;
|
node->m_thinglist_next = headsecnode;
|
||||||
headsecnode = node;
|
headsecnode = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tails 08-25-2002
|
// Tails 08-25-2002
|
||||||
static inline void P_PutPrecipSecnode(mprecipsecnode_t *node)
|
static inline void P_PutPrecipSecnode(mprecipsecnode_t *node)
|
||||||
{
|
{
|
||||||
node->m_snext = headprecipsecnode;
|
node->m_thinglist_next = headprecipsecnode;
|
||||||
headprecipsecnode = node;
|
headprecipsecnode = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3563,7 +3597,7 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode
|
||||||
node->m_thing = thing; // Yes. Setting m_thing says 'keep it'.
|
node->m_thing = thing; // Yes. Setting m_thing says 'keep it'.
|
||||||
return nextnode;
|
return nextnode;
|
||||||
}
|
}
|
||||||
node = node->m_tnext;
|
node = node->m_sectorlist_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Couldn't find an existing node for this sector. Add one at the head
|
// Couldn't find an existing node for this sector. Add one at the head
|
||||||
|
@ -3576,17 +3610,17 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode
|
||||||
|
|
||||||
node->m_sector = s; // sector
|
node->m_sector = s; // sector
|
||||||
node->m_thing = thing; // mobj
|
node->m_thing = thing; // mobj
|
||||||
node->m_tprev = NULL; // prev node on Thing thread
|
node->m_sectorlist_prev = NULL; // prev node on Thing thread
|
||||||
node->m_tnext = nextnode; // next node on Thing thread
|
node->m_sectorlist_next = nextnode; // next node on Thing thread
|
||||||
if (nextnode)
|
if (nextnode)
|
||||||
nextnode->m_tprev = node; // set back link on Thing
|
nextnode->m_sectorlist_prev = node; // set back link on Thing
|
||||||
|
|
||||||
// Add new node at head of sector thread starting at s->touching_thinglist
|
// Add new node at head of sector thread starting at s->touching_thinglist
|
||||||
|
|
||||||
node->m_sprev = NULL; // prev node on sector thread
|
node->m_thinglist_prev = NULL; // prev node on sector thread
|
||||||
node->m_snext = s->touching_thinglist; // next node on sector thread
|
node->m_thinglist_next = s->touching_thinglist; // next node on sector thread
|
||||||
if (s->touching_thinglist)
|
if (s->touching_thinglist)
|
||||||
node->m_snext->m_sprev = node;
|
node->m_thinglist_next->m_thinglist_prev = node;
|
||||||
s->touching_thinglist = node;
|
s->touching_thinglist = node;
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -3604,7 +3638,7 @@ static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mp
|
||||||
node->m_thing = thing; // Yes. Setting m_thing says 'keep it'.
|
node->m_thing = thing; // Yes. Setting m_thing says 'keep it'.
|
||||||
return nextnode;
|
return nextnode;
|
||||||
}
|
}
|
||||||
node = node->m_tnext;
|
node = node->m_sectorlist_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Couldn't find an existing node for this sector. Add one at the head
|
// Couldn't find an existing node for this sector. Add one at the head
|
||||||
|
@ -3617,17 +3651,17 @@ static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mp
|
||||||
|
|
||||||
node->m_sector = s; // sector
|
node->m_sector = s; // sector
|
||||||
node->m_thing = thing; // mobj
|
node->m_thing = thing; // mobj
|
||||||
node->m_tprev = NULL; // prev node on Thing thread
|
node->m_sectorlist_prev = NULL; // prev node on Thing thread
|
||||||
node->m_tnext = nextnode; // next node on Thing thread
|
node->m_sectorlist_next = nextnode; // next node on Thing thread
|
||||||
if (nextnode)
|
if (nextnode)
|
||||||
nextnode->m_tprev = node; // set back link on Thing
|
nextnode->m_sectorlist_prev = node; // set back link on Thing
|
||||||
|
|
||||||
// Add new node at head of sector thread starting at s->touching_thinglist
|
// Add new node at head of sector thread starting at s->touching_thinglist
|
||||||
|
|
||||||
node->m_sprev = NULL; // prev node on sector thread
|
node->m_thinglist_prev = NULL; // prev node on sector thread
|
||||||
node->m_snext = s->touching_preciplist; // next node on sector thread
|
node->m_thinglist_next = s->touching_preciplist; // next node on sector thread
|
||||||
if (s->touching_preciplist)
|
if (s->touching_preciplist)
|
||||||
node->m_snext->m_sprev = node;
|
node->m_thinglist_next->m_thinglist_prev = node;
|
||||||
s->touching_preciplist = node;
|
s->touching_preciplist = node;
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -3649,24 +3683,24 @@ static msecnode_t *P_DelSecnode(msecnode_t *node)
|
||||||
// Unlink from the Thing thread. The Thing thread begins at
|
// Unlink from the Thing thread. The Thing thread begins at
|
||||||
// sector_list and not from mobj_t->touching_sectorlist.
|
// sector_list and not from mobj_t->touching_sectorlist.
|
||||||
|
|
||||||
tp = node->m_tprev;
|
tp = node->m_sectorlist_prev;
|
||||||
tn = node->m_tnext;
|
tn = node->m_sectorlist_next;
|
||||||
if (tp)
|
if (tp)
|
||||||
tp->m_tnext = tn;
|
tp->m_sectorlist_next = tn;
|
||||||
if (tn)
|
if (tn)
|
||||||
tn->m_tprev = tp;
|
tn->m_sectorlist_prev = tp;
|
||||||
|
|
||||||
// Unlink from the sector thread. This thread begins at
|
// Unlink from the sector thread. This thread begins at
|
||||||
// sector_t->touching_thinglist.
|
// sector_t->touching_thinglist.
|
||||||
|
|
||||||
sp = node->m_sprev;
|
sp = node->m_thinglist_prev;
|
||||||
sn = node->m_snext;
|
sn = node->m_thinglist_next;
|
||||||
if (sp)
|
if (sp)
|
||||||
sp->m_snext = sn;
|
sp->m_thinglist_next = sn;
|
||||||
else
|
else
|
||||||
node->m_sector->touching_thinglist = sn;
|
node->m_sector->touching_thinglist = sn;
|
||||||
if (sn)
|
if (sn)
|
||||||
sn->m_sprev = sp;
|
sn->m_thinglist_prev = sp;
|
||||||
|
|
||||||
// Return this node to the freelist
|
// Return this node to the freelist
|
||||||
|
|
||||||
|
@ -3688,24 +3722,24 @@ static mprecipsecnode_t *P_DelPrecipSecnode(mprecipsecnode_t *node)
|
||||||
// Unlink from the Thing thread. The Thing thread begins at
|
// Unlink from the Thing thread. The Thing thread begins at
|
||||||
// sector_list and not from mobj_t->touching_sectorlist.
|
// sector_list and not from mobj_t->touching_sectorlist.
|
||||||
|
|
||||||
tp = node->m_tprev;
|
tp = node->m_sectorlist_prev;
|
||||||
tn = node->m_tnext;
|
tn = node->m_sectorlist_next;
|
||||||
if (tp)
|
if (tp)
|
||||||
tp->m_tnext = tn;
|
tp->m_sectorlist_next = tn;
|
||||||
if (tn)
|
if (tn)
|
||||||
tn->m_tprev = tp;
|
tn->m_sectorlist_prev = tp;
|
||||||
|
|
||||||
// Unlink from the sector thread. This thread begins at
|
// Unlink from the sector thread. This thread begins at
|
||||||
// sector_t->touching_thinglist.
|
// sector_t->touching_thinglist.
|
||||||
|
|
||||||
sp = node->m_sprev;
|
sp = node->m_thinglist_prev;
|
||||||
sn = node->m_snext;
|
sn = node->m_thinglist_next;
|
||||||
if (sp)
|
if (sp)
|
||||||
sp->m_snext = sn;
|
sp->m_thinglist_next = sn;
|
||||||
else
|
else
|
||||||
node->m_sector->touching_preciplist = sn;
|
node->m_sector->touching_preciplist = sn;
|
||||||
if (sn)
|
if (sn)
|
||||||
sn->m_sprev = sp;
|
sn->m_thinglist_prev = sp;
|
||||||
|
|
||||||
// Return this node to the freelist
|
// Return this node to the freelist
|
||||||
|
|
||||||
|
@ -3820,7 +3854,7 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y)
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
node->m_thing = NULL;
|
node->m_thing = NULL;
|
||||||
node = node->m_tnext;
|
node = node->m_sectorlist_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
P_SetTarget(&tmthing, thing);
|
P_SetTarget(&tmthing, thing);
|
||||||
|
@ -3858,11 +3892,11 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y)
|
||||||
if (!node->m_thing)
|
if (!node->m_thing)
|
||||||
{
|
{
|
||||||
if (node == sector_list)
|
if (node == sector_list)
|
||||||
sector_list = node->m_tnext;
|
sector_list = node->m_sectorlist_next;
|
||||||
node = P_DelSecnode(node);
|
node = P_DelSecnode(node);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
node = node->m_tnext;
|
node = node->m_sectorlist_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cph -
|
/* cph -
|
||||||
|
@ -3903,7 +3937,7 @@ void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y)
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
node->m_thing = NULL;
|
node->m_thing = NULL;
|
||||||
node = node->m_tnext;
|
node = node->m_sectorlist_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmprecipthing = thing;
|
tmprecipthing = thing;
|
||||||
|
@ -3937,11 +3971,11 @@ void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y)
|
||||||
if (!node->m_thing)
|
if (!node->m_thing)
|
||||||
{
|
{
|
||||||
if (node == precipsector_list)
|
if (node == precipsector_list)
|
||||||
precipsector_list = node->m_tnext;
|
precipsector_list = node->m_sectorlist_next;
|
||||||
node = P_DelPrecipSecnode(node);
|
node = P_DelPrecipSecnode(node);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
node = node->m_tnext;
|
node = node->m_sectorlist_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cph -
|
/* cph -
|
||||||
|
|
104
src/p_mobj.c
104
src/p_mobj.c
|
@ -185,6 +185,8 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
||||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_WALK);
|
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_WALK);
|
||||||
case S_PLAY_RUN:
|
case S_PLAY_RUN:
|
||||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_RUN);
|
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_RUN);
|
||||||
|
case S_PLAY_PEEL:
|
||||||
|
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PEEL);
|
||||||
case S_PLAY_PAIN:
|
case S_PLAY_PAIN:
|
||||||
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PAIN);
|
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PAIN);
|
||||||
case S_PLAY_DEAD:
|
case S_PLAY_DEAD:
|
||||||
|
@ -241,6 +243,10 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
||||||
case S_PLAY_SUPER_RUN:
|
case S_PLAY_SUPER_RUN:
|
||||||
player->panim = PA_RUN;
|
player->panim = PA_RUN;
|
||||||
break;
|
break;
|
||||||
|
case S_PLAY_PEEL:
|
||||||
|
case S_PLAY_SUPER_PEEL:
|
||||||
|
player->panim = PA_PEEL;
|
||||||
|
break;
|
||||||
case S_PLAY_PAIN:
|
case S_PLAY_PAIN:
|
||||||
case S_PLAY_SUPER_PAIN:
|
case S_PLAY_SUPER_PAIN:
|
||||||
case S_PLAY_SUPER_STUN:
|
case S_PLAY_SUPER_STUN:
|
||||||
|
@ -330,7 +336,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
||||||
else
|
else
|
||||||
mobj->tics = 4;
|
mobj->tics = 4;
|
||||||
}
|
}
|
||||||
else if (player->panim == PA_RUN)
|
else if ((player->panim == PA_RUN) || (player->panim == PA_PEEL))
|
||||||
{
|
{
|
||||||
if (speed > 52<<FRACBITS)
|
if (speed > 52<<FRACBITS)
|
||||||
mobj->tics = 1;
|
mobj->tics = 1;
|
||||||
|
@ -356,6 +362,9 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
||||||
{
|
{
|
||||||
switch(spr2)
|
switch(spr2)
|
||||||
{
|
{
|
||||||
|
case SPR2_PEEL:
|
||||||
|
spr2 = SPR2_RUN;
|
||||||
|
break;
|
||||||
case SPR2_RUN:
|
case SPR2_RUN:
|
||||||
spr2 = SPR2_WALK;
|
spr2 = SPR2_WALK;
|
||||||
break;
|
break;
|
||||||
|
@ -412,6 +421,9 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
||||||
case SPR2_SRUN:
|
case SPR2_SRUN:
|
||||||
spr2 = SPR2_RUN;
|
spr2 = SPR2_RUN;
|
||||||
break;
|
break;
|
||||||
|
case SPR2_SPEE:
|
||||||
|
spr2 = SPR2_PEEL;
|
||||||
|
break;
|
||||||
case SPR2_SPAN:
|
case SPR2_SPAN:
|
||||||
spr2 = SPR2_PAIN;
|
spr2 = SPR2_PAIN;
|
||||||
break;
|
break;
|
||||||
|
@ -1501,13 +1513,12 @@ static void P_PlayerFlip(mobj_t *mo)
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_CheckGravity
|
// P_GetMobjGravity
|
||||||
//
|
//
|
||||||
// Checks the current gravity state
|
// Returns the current gravity
|
||||||
// of the object. If affect is true,
|
// value of the object.
|
||||||
// a gravity force will be applied.
|
|
||||||
//
|
//
|
||||||
void P_CheckGravity(mobj_t *mo, boolean affect)
|
fixed_t P_GetMobjGravity(mobj_t *mo)
|
||||||
{
|
{
|
||||||
fixed_t gravityadd = 0;
|
fixed_t gravityadd = 0;
|
||||||
boolean no3dfloorgrav = true; // Custom gravity
|
boolean no3dfloorgrav = true; // Custom gravity
|
||||||
|
@ -1566,9 +1577,6 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
||||||
if (mo->eflags & MFE_UNDERWATER && !goopgravity)
|
if (mo->eflags & MFE_UNDERWATER && !goopgravity)
|
||||||
gravityadd = gravityadd/3;
|
gravityadd = gravityadd/3;
|
||||||
|
|
||||||
if (!mo->momz) // mobj at stop, no floor, so feel the push of gravity!
|
|
||||||
gravityadd <<= 1;
|
|
||||||
|
|
||||||
if (mo->player)
|
if (mo->player)
|
||||||
{
|
{
|
||||||
if (mo->player->charability == CA_FLY && (mo->player->powers[pw_tailsfly]
|
if (mo->player->charability == CA_FLY && (mo->player->powers[pw_tailsfly]
|
||||||
|
@ -1649,12 +1657,31 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
||||||
if (goopgravity)
|
if (goopgravity)
|
||||||
gravityadd = -gravityadd/5;
|
gravityadd = -gravityadd/5;
|
||||||
|
|
||||||
if (affect)
|
|
||||||
mo->momz += FixedMul(gravityadd, mo->scale);
|
|
||||||
|
|
||||||
if (mo->player && !!(mo->eflags & MFE_VERTICALFLIP) != wasflip)
|
if (mo->player && !!(mo->eflags & MFE_VERTICALFLIP) != wasflip)
|
||||||
P_PlayerFlip(mo);
|
P_PlayerFlip(mo);
|
||||||
|
|
||||||
|
gravityadd = FixedMul(gravityadd, mo->scale);
|
||||||
|
|
||||||
|
return gravityadd;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_CheckGravity
|
||||||
|
//
|
||||||
|
// Checks the current gravity state
|
||||||
|
// of the object. If affect is true,
|
||||||
|
// a gravity force will be applied.
|
||||||
|
//
|
||||||
|
void P_CheckGravity(mobj_t *mo, boolean affect)
|
||||||
|
{
|
||||||
|
fixed_t gravityadd = P_GetMobjGravity(mo);
|
||||||
|
|
||||||
|
if (!mo->momz) // mobj at stop, no floor, so feel the push of gravity!
|
||||||
|
gravityadd <<= 1;
|
||||||
|
|
||||||
|
if (affect)
|
||||||
|
mo->momz += gravityadd;
|
||||||
|
|
||||||
if (mo->type == MT_SKIM && mo->z + mo->momz <= mo->watertop && mo->z >= mo->watertop)
|
if (mo->type == MT_SKIM && mo->z + mo->momz <= mo->watertop && mo->z >= mo->watertop)
|
||||||
{
|
{
|
||||||
mo->momz = 0;
|
mo->momz = 0;
|
||||||
|
@ -1729,7 +1756,7 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy)
|
||||||
&& abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale)
|
&& abs(player->rmomy) < FixedMul(STOPSPEED, mo->scale)
|
||||||
&& (!(player->cmd.forwardmove && !(twodlevel || mo->flags2 & MF2_TWOD)) && !player->cmd.sidemove && !(player->pflags & PF_SPINNING))
|
&& (!(player->cmd.forwardmove && !(twodlevel || mo->flags2 & MF2_TWOD)) && !player->cmd.sidemove && !(player->pflags & PF_SPINNING))
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
&& !(player->mo->standingslope && abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)
|
&& !(player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && (abs(player->mo->standingslope->zdelta) >= FRACUNIT/2))
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -1779,7 +1806,7 @@ static void P_PushableCheckBustables(mobj_t *mo)
|
||||||
mo->y += mo->momy;
|
mo->y += mo->momy;
|
||||||
P_SetThingPosition(mo);
|
P_SetThingPosition(mo);
|
||||||
|
|
||||||
for (node = mo->touching_sectorlist; node; node = node->m_snext)
|
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
if (!node->m_sector)
|
if (!node->m_sector)
|
||||||
break;
|
break;
|
||||||
|
@ -2262,12 +2289,14 @@ static void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motyp
|
||||||
delta1 = mo->z - (bottomheight + ((topheight - bottomheight)/2));
|
delta1 = mo->z - (bottomheight + ((topheight - bottomheight)/2));
|
||||||
delta2 = thingtop - (bottomheight + ((topheight - bottomheight)/2));
|
delta2 = thingtop - (bottomheight + ((topheight - bottomheight)/2));
|
||||||
if (topheight > mo->floorz && abs(delta1) < abs(delta2)
|
if (topheight > mo->floorz && abs(delta1) < abs(delta2)
|
||||||
&& !(rover->flags & FF_REVERSEPLATFORM))
|
&& !(rover->flags & FF_REVERSEPLATFORM)
|
||||||
|
&& ((P_MobjFlip(mo)*mo->momz > 0) || (!(rover->flags & FF_PLATFORM)))) // In reverse gravity, only clip for FOFs that are intangible from their bottom (the "top" you're falling through) if you're coming from above ("below" in your frame of reference)
|
||||||
{
|
{
|
||||||
mo->floorz = topheight;
|
mo->floorz = topheight;
|
||||||
}
|
}
|
||||||
if (bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
|
if (bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
|
||||||
&& !(rover->flags & FF_PLATFORM))
|
&& !(rover->flags & FF_PLATFORM)
|
||||||
|
&& ((P_MobjFlip(mo)*mo->momz > 0) || (!(rover->flags & FF_REVERSEPLATFORM)))) // In normal gravity, only clip for FOFs that are intangible from the top if you're coming from below
|
||||||
{
|
{
|
||||||
mo->ceilingz = bottomheight;
|
mo->ceilingz = bottomheight;
|
||||||
}
|
}
|
||||||
|
@ -2401,16 +2430,6 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||||
I_Assert(mo != NULL);
|
I_Assert(mo != NULL);
|
||||||
I_Assert(!P_MobjWasRemoved(mo));
|
I_Assert(!P_MobjWasRemoved(mo));
|
||||||
|
|
||||||
#ifdef ESLOPE
|
|
||||||
if (mo->standingslope)
|
|
||||||
{
|
|
||||||
if (mo->flags & MF_NOCLIPHEIGHT)
|
|
||||||
mo->standingslope = NULL;
|
|
||||||
else if (!P_IsObjectOnGround(mo))
|
|
||||||
P_SlopeLaunch(mo);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Intercept the stupid 'fall through 3dfloors' bug
|
// Intercept the stupid 'fall through 3dfloors' bug
|
||||||
if (mo->subsector->sector->ffloors)
|
if (mo->subsector->sector->ffloors)
|
||||||
P_AdjustMobjFloorZ_FFloors(mo, mo->subsector->sector, 0);
|
P_AdjustMobjFloorZ_FFloors(mo, mo->subsector->sector, 0);
|
||||||
|
@ -2425,6 +2444,16 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||||
}
|
}
|
||||||
mo->z += mo->momz;
|
mo->z += mo->momz;
|
||||||
|
|
||||||
|
#ifdef ESLOPE
|
||||||
|
if (mo->standingslope)
|
||||||
|
{
|
||||||
|
if (mo->flags & MF_NOCLIPHEIGHT)
|
||||||
|
mo->standingslope = NULL;
|
||||||
|
else if (!P_IsObjectOnGround(mo))
|
||||||
|
P_SlopeLaunch(mo);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (mo->type)
|
switch (mo->type)
|
||||||
{
|
{
|
||||||
case MT_THROWNBOUNCE:
|
case MT_THROWNBOUNCE:
|
||||||
|
@ -2611,10 +2640,7 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||||
if ((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) {
|
if ((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) {
|
||||||
mo->standingslope = (mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope;
|
mo->standingslope = (mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope;
|
||||||
|
|
||||||
// Reverse quantizing might could use its own function later
|
P_ReverseQuantizeMomentumToSlope(&mom, mo->standingslope);
|
||||||
mo->standingslope->zangle = ANGLE_MAX-mo->standingslope->zangle;
|
|
||||||
P_QuantizeMomentumToSlope(&mom, mo->standingslope);
|
|
||||||
mo->standingslope->zangle = ANGLE_MAX-mo->standingslope->zangle;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2952,7 +2978,7 @@ static void P_PlayerZMovement(mobj_t *mo)
|
||||||
msecnode_t *node;
|
msecnode_t *node;
|
||||||
boolean stopmovecut = false;
|
boolean stopmovecut = false;
|
||||||
|
|
||||||
for (node = mo->touching_sectorlist; node; node = node->m_snext)
|
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
sector_t *sec = node->m_sector;
|
sector_t *sec = node->m_sector;
|
||||||
subsector_t *newsubsec;
|
subsector_t *newsubsec;
|
||||||
|
@ -3029,7 +3055,9 @@ static void P_PlayerZMovement(mobj_t *mo)
|
||||||
{
|
{
|
||||||
if (mo->player->cmomx || mo->player->cmomy)
|
if (mo->player->cmomx || mo->player->cmomy)
|
||||||
{
|
{
|
||||||
if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
|
if (mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL)
|
||||||
|
P_SetPlayerMobjState(mo, S_PLAY_PEEL);
|
||||||
|
else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
|
||||||
P_SetPlayerMobjState(mo, S_PLAY_RUN);
|
P_SetPlayerMobjState(mo, S_PLAY_RUN);
|
||||||
else if ((mo->player->rmomx || mo->player->rmomy) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_SUPER_FLOAT))
|
else if ((mo->player->rmomx || mo->player->rmomy) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_SUPER_FLOAT))
|
||||||
P_SetPlayerMobjState(mo, S_PLAY_WALK);
|
P_SetPlayerMobjState(mo, S_PLAY_WALK);
|
||||||
|
@ -3038,6 +3066,8 @@ static void P_PlayerZMovement(mobj_t *mo)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL)
|
||||||
|
P_SetPlayerMobjState(mo, S_PLAY_PEEL);
|
||||||
if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
|
if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN)
|
||||||
P_SetPlayerMobjState(mo, S_PLAY_RUN);
|
P_SetPlayerMobjState(mo, S_PLAY_RUN);
|
||||||
else if ((mo->momx || mo->momy) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_SUPER_FLOAT))
|
else if ((mo->momx || mo->momy) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_SUPER_FLOAT))
|
||||||
|
@ -3129,7 +3159,7 @@ nightsdone:
|
||||||
if (CheckForMarioBlocks && !(netgame && mo->player->spectator)) // Only let the player punch
|
if (CheckForMarioBlocks && !(netgame && mo->player->spectator)) // Only let the player punch
|
||||||
{
|
{
|
||||||
// Search the touching sectors, from side-to-side...
|
// Search the touching sectors, from side-to-side...
|
||||||
for (node = mo->touching_sectorlist; node; node = node->m_snext)
|
for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
ffloor_t *rover;
|
ffloor_t *rover;
|
||||||
if (!node->m_sector->ffloors)
|
if (!node->m_sector->ffloors)
|
||||||
|
@ -3897,7 +3927,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
||||||
if (!(netgame && mobj->player->spectator))
|
if (!(netgame && mobj->player->spectator))
|
||||||
{
|
{
|
||||||
// Crumbling platforms
|
// Crumbling platforms
|
||||||
for (node = mobj->touching_sectorlist; node; node = node->m_snext)
|
for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
fixed_t topheight, bottomheight;
|
fixed_t topheight, bottomheight;
|
||||||
ffloor_t *rover;
|
ffloor_t *rover;
|
||||||
|
@ -3922,7 +3952,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
||||||
{
|
{
|
||||||
boolean thereiswater = false;
|
boolean thereiswater = false;
|
||||||
|
|
||||||
for (node = mobj->touching_sectorlist; node; node = node->m_snext)
|
for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
if (node->m_sector->ffloors)
|
if (node->m_sector->ffloors)
|
||||||
{
|
{
|
||||||
|
@ -3943,7 +3973,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
|
||||||
}
|
}
|
||||||
if (thereiswater)
|
if (thereiswater)
|
||||||
{
|
{
|
||||||
for (node = mobj->touching_sectorlist; node; node = node->m_snext)
|
for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
if (node->m_sector->ffloors)
|
if (node->m_sector->ffloors)
|
||||||
{
|
{
|
||||||
|
@ -4056,7 +4086,7 @@ void P_RecalcPrecipInSector(sector_t *sector)
|
||||||
|
|
||||||
sector->moved = true; // Recalc lighting and things too, maybe
|
sector->moved = true; // Recalc lighting and things too, maybe
|
||||||
|
|
||||||
for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_snext)
|
for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_thinglist_next)
|
||||||
CalculatePrecipFloor(psecnode->m_thing);
|
CalculatePrecipFloor(psecnode->m_thing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -442,7 +442,7 @@ boolean P_SupermanLook4Players(mobj_t *actor);
|
||||||
void P_DestroyRobots(void);
|
void P_DestroyRobots(void);
|
||||||
void P_SnowThinker(precipmobj_t *mobj);
|
void P_SnowThinker(precipmobj_t *mobj);
|
||||||
void P_RainThinker(precipmobj_t *mobj);
|
void P_RainThinker(precipmobj_t *mobj);
|
||||||
void P_NullPrecipThinker(precipmobj_t *mobj);
|
FUNCMATH void P_NullPrecipThinker(precipmobj_t *mobj);
|
||||||
void P_RemovePrecipMobj(precipmobj_t *mobj);
|
void P_RemovePrecipMobj(precipmobj_t *mobj);
|
||||||
void P_SetScale(mobj_t *mobj, fixed_t newscale);
|
void P_SetScale(mobj_t *mobj, fixed_t newscale);
|
||||||
void P_XYMovement(mobj_t *mo);
|
void P_XYMovement(mobj_t *mo);
|
||||||
|
|
|
@ -162,6 +162,7 @@ static void P_NetArchivePlayers(void)
|
||||||
WRITEINT32(save_p, players[i].deadtimer);
|
WRITEINT32(save_p, players[i].deadtimer);
|
||||||
WRITEUINT32(save_p, players[i].exiting);
|
WRITEUINT32(save_p, players[i].exiting);
|
||||||
WRITEUINT8(save_p, players[i].homing);
|
WRITEUINT8(save_p, players[i].homing);
|
||||||
|
WRITEUINT32(save_p, players[i].dashmode);
|
||||||
WRITEUINT32(save_p, players[i].skidtime);
|
WRITEUINT32(save_p, players[i].skidtime);
|
||||||
|
|
||||||
////////////////////////////
|
////////////////////////////
|
||||||
|
@ -337,6 +338,7 @@ static void P_NetUnArchivePlayers(void)
|
||||||
players[i].deadtimer = READINT32(save_p); // End game if game over lasts too long
|
players[i].deadtimer = READINT32(save_p); // End game if game over lasts too long
|
||||||
players[i].exiting = READUINT32(save_p); // Exitlevel timer
|
players[i].exiting = READUINT32(save_p); // Exitlevel timer
|
||||||
players[i].homing = READUINT8(save_p); // Are you homing?
|
players[i].homing = READUINT8(save_p); // Are you homing?
|
||||||
|
players[i].dashmode = READUINT32(save_p); // counter for dashmode ability
|
||||||
players[i].skidtime = READUINT32(save_p); // Skid timer
|
players[i].skidtime = READUINT32(save_p); // Skid timer
|
||||||
|
|
||||||
////////////////////////////
|
////////////////////////////
|
||||||
|
|
|
@ -1931,10 +1931,18 @@ static void P_GroupLines(void)
|
||||||
// allocate linebuffers for each sector
|
// allocate linebuffers for each sector
|
||||||
for (i = 0, sector = sectors; i < numsectors; i++, sector++)
|
for (i = 0, sector = sectors; i < numsectors; i++, sector++)
|
||||||
{
|
{
|
||||||
sector->lines = Z_Calloc(sector->linecount * sizeof(line_t*), PU_LEVEL, NULL);
|
if (sector->linecount == 0) // no lines found?
|
||||||
|
{
|
||||||
|
sector->lines = NULL;
|
||||||
|
CONS_Debug(DBG_SETUP, "P_GroupLines: sector %s has no lines\n", sizeu1(i));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sector->lines = Z_Calloc(sector->linecount * sizeof(line_t*), PU_LEVEL, NULL);
|
||||||
|
|
||||||
// zero the count, since we'll later use this to track how many we've recorded
|
// zero the count, since we'll later use this to track how many we've recorded
|
||||||
sector->linecount = 0;
|
sector->linecount = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// iterate through lines, assigning them to sectors' linebuffers,
|
// iterate through lines, assigning them to sectors' linebuffers,
|
||||||
|
@ -1952,11 +1960,14 @@ static void P_GroupLines(void)
|
||||||
{
|
{
|
||||||
M_ClearBox(bbox);
|
M_ClearBox(bbox);
|
||||||
|
|
||||||
for (j = 0; j < sector->linecount; j++)
|
if (sector->linecount != 0)
|
||||||
{
|
{
|
||||||
li = sector->lines[j];
|
for (j = 0; j < sector->linecount; j++)
|
||||||
M_AddToBox(bbox, li->v1->x, li->v1->y);
|
{
|
||||||
M_AddToBox(bbox, li->v2->x, li->v2->y);
|
li = sector->lines[j];
|
||||||
|
M_AddToBox(bbox, li->v1->x, li->v1->y);
|
||||||
|
M_AddToBox(bbox, li->v2->x, li->v2->y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the degenmobj_t to the middle of the bounding box
|
// set the degenmobj_t to the middle of the bounding box
|
||||||
|
@ -1966,6 +1977,35 @@ static void P_GroupLines(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_LoadReject
|
||||||
|
//
|
||||||
|
// Detect if the REJECT lump is valid,
|
||||||
|
// if not, rejectmatrix will be NULL
|
||||||
|
static void P_LoadReject(lumpnum_t lumpnum)
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
const char *lumpname = W_CheckNameForNum(lumpnum);
|
||||||
|
|
||||||
|
// Check if the lump exists, and if it's named "REJECT"
|
||||||
|
if (!lumpname || memcmp(lumpname, "REJECT\0\0", 8) != 0)
|
||||||
|
{
|
||||||
|
rejectmatrix = NULL;
|
||||||
|
CONS_Debug(DBG_SETUP, "P_LoadReject: No valid REJECT lump found\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = W_LumpLength(lumpnum);
|
||||||
|
|
||||||
|
if (!count) // zero length, someone probably used ZDBSP
|
||||||
|
{
|
||||||
|
rejectmatrix = NULL;
|
||||||
|
CONS_Debug(DBG_SETUP, "P_LoadReject: REJECT lump has size 0, will not be loaded\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rejectmatrix = W_CacheLumpNum(lumpnum, PU_LEVEL);
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static char *levellumps[] =
|
static char *levellumps[] =
|
||||||
{
|
{
|
||||||
|
@ -2574,7 +2614,7 @@ boolean P_SetupLevel(boolean skipprecip)
|
||||||
P_LoadSubsectors(lastloadedmaplumpnum + ML_SSECTORS);
|
P_LoadSubsectors(lastloadedmaplumpnum + ML_SSECTORS);
|
||||||
P_LoadNodes(lastloadedmaplumpnum + ML_NODES);
|
P_LoadNodes(lastloadedmaplumpnum + ML_NODES);
|
||||||
P_LoadSegs(lastloadedmaplumpnum + ML_SEGS);
|
P_LoadSegs(lastloadedmaplumpnum + ML_SEGS);
|
||||||
rejectmatrix = W_CacheLumpNum(lastloadedmaplumpnum + ML_REJECT, PU_LEVEL);
|
P_LoadReject(lastloadedmaplumpnum + ML_REJECT);
|
||||||
P_GroupLines();
|
P_GroupLines();
|
||||||
|
|
||||||
numdmstarts = numredctfstarts = numbluectfstarts = 0;
|
numdmstarts = numredctfstarts = numbluectfstarts = 0;
|
||||||
|
|
|
@ -325,9 +325,12 @@ boolean P_CheckSight(mobj_t *t1, mobj_t *t2)
|
||||||
s2 = t2->subsector->sector;
|
s2 = t2->subsector->sector;
|
||||||
pnum = (s1-sectors)*numsectors + (s2-sectors);
|
pnum = (s1-sectors)*numsectors + (s2-sectors);
|
||||||
|
|
||||||
// Check in REJECT table.
|
if (rejectmatrix != NULL)
|
||||||
if (rejectmatrix[pnum>>3] & (1 << (pnum&7))) // can't possibly be connected
|
{
|
||||||
return false;
|
// Check in REJECT table.
|
||||||
|
if (rejectmatrix[pnum>>3] & (1 << (pnum&7))) // can't possibly be connected
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// killough 11/98: shortcut for melee situations
|
// killough 11/98: shortcut for melee situations
|
||||||
// same subsector? obviously visible
|
// same subsector? obviously visible
|
||||||
|
|
353
src/p_slopes.c
353
src/p_slopes.c
|
@ -199,7 +199,6 @@ static fixed_t P_GetExtent(sector_t *sector, line_t *line)
|
||||||
|
|
||||||
// Find furthest vertex from the reference line. It, along with the two ends
|
// Find furthest vertex from the reference line. It, along with the two ends
|
||||||
// of the line, will define the plane.
|
// of the line, will define the plane.
|
||||||
// SRB2CBTODO: Use a formula to get the slope to slide objects depending on how steep
|
|
||||||
for(i = 0; i < sector->linecount; i++)
|
for(i = 0; i < sector->linecount; i++)
|
||||||
{
|
{
|
||||||
line_t *li = sector->lines[i];
|
line_t *li = sector->lines[i];
|
||||||
|
@ -231,7 +230,6 @@ static fixed_t P_GetExtent(sector_t *sector, line_t *line)
|
||||||
//
|
//
|
||||||
// Creates one or more slopes based on the given line type and front/back
|
// Creates one or more slopes based on the given line type and front/back
|
||||||
// sectors.
|
// sectors.
|
||||||
// Kalaron: Check if dynamic slopes need recalculation
|
|
||||||
//
|
//
|
||||||
void P_SpawnSlope_Line(int linenum)
|
void P_SpawnSlope_Line(int linenum)
|
||||||
{
|
{
|
||||||
|
@ -276,7 +274,6 @@ void P_SpawnSlope_Line(int linenum)
|
||||||
ny = -FixedDiv(line->dx, len);
|
ny = -FixedDiv(line->dx, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SRB2CBTODO: Transform origin relative to the bounds of an individual FOF
|
|
||||||
origin.x = line->v1->x + (line->v2->x - line->v1->x)/2;
|
origin.x = line->v1->x + (line->v2->x - line->v1->x)/2;
|
||||||
origin.y = line->v1->y + (line->v2->y - line->v1->y)/2;
|
origin.y = line->v1->y + (line->v2->y - line->v1->y)/2;
|
||||||
|
|
||||||
|
@ -327,7 +324,7 @@ void P_SpawnSlope_Line(int linenum)
|
||||||
// fslope->normal is a 3D line perpendicular to the 3D vector
|
// fslope->normal is a 3D line perpendicular to the 3D vector
|
||||||
|
|
||||||
// Sync the linedata of the line that started this slope
|
// Sync the linedata of the line that started this slope
|
||||||
// SRB2CBTODO: Anything special for remote(control sector)-based slopes later?
|
// TODO: Anything special for control sector based slopes later?
|
||||||
fslope->sourceline = line;
|
fslope->sourceline = line;
|
||||||
|
|
||||||
// To find the real highz/lowz of a slope, you need to check all the vertexes
|
// To find the real highz/lowz of a slope, you need to check all the vertexes
|
||||||
|
@ -379,7 +376,7 @@ void P_SpawnSlope_Line(int linenum)
|
||||||
cslope->refpos = 2;
|
cslope->refpos = 2;
|
||||||
|
|
||||||
// Sync the linedata of the line that started this slope
|
// Sync the linedata of the line that started this slope
|
||||||
// SRB2CBTODO: Anything special for remote(control sector)-based slopes later?
|
// TODO: Anything special for control sector based slopes later?
|
||||||
cslope->sourceline = line;
|
cslope->sourceline = line;
|
||||||
|
|
||||||
// Remember the way the slope is formed
|
// Remember the way the slope is formed
|
||||||
|
@ -445,7 +442,7 @@ void P_SpawnSlope_Line(int linenum)
|
||||||
fslope->refpos = 3;
|
fslope->refpos = 3;
|
||||||
|
|
||||||
// Sync the linedata of the line that started this slope
|
// Sync the linedata of the line that started this slope
|
||||||
// SRB2CBTODO: Anything special for remote(control sector)-based slopes later?
|
// TODO: Anything special for control sector based slopes later?
|
||||||
fslope->sourceline = line;
|
fslope->sourceline = line;
|
||||||
|
|
||||||
// Remember the way the slope is formed
|
// Remember the way the slope is formed
|
||||||
|
@ -488,7 +485,7 @@ void P_SpawnSlope_Line(int linenum)
|
||||||
cslope->refpos = 4;
|
cslope->refpos = 4;
|
||||||
|
|
||||||
// Sync the linedata of the line that started this slope
|
// Sync the linedata of the line that started this slope
|
||||||
// SRB2CBTODO: Anything special for remote(control sector)-based slopes later?
|
// TODO: Anything special for control sector based slopes later?
|
||||||
cslope->sourceline = line;
|
cslope->sourceline = line;
|
||||||
|
|
||||||
// Remember the way the slope is formed
|
// Remember the way the slope is formed
|
||||||
|
@ -554,16 +551,11 @@ static pslope_t *P_NewVertexSlope(INT16 tag1, INT16 tag2, INT16 tag3, UINT8 flag
|
||||||
ret->vertices[2] = mt;
|
ret->vertices[2] = mt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ret->vertices[0])
|
|
||||||
CONS_Printf("PANIC 0\n");
|
|
||||||
if (!ret->vertices[1])
|
|
||||||
CONS_Printf("PANIC 1\n");
|
|
||||||
if (!ret->vertices[2])
|
|
||||||
CONS_Printf("PANIC 2\n");
|
|
||||||
|
|
||||||
// Now set heights for each vertex, because they haven't been set yet
|
// Now set heights for each vertex, because they haven't been set yet
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
mt = ret->vertices[i];
|
mt = ret->vertices[i];
|
||||||
|
if (!mt) // If a vertex wasn't found, it's game over. There's nothing you can do to recover (except maybe try and kill the slope instead - TODO?)
|
||||||
|
I_Error("P_NewVertexSlope: Slope vertex %s (for linedef tag %d) not found!", sizeu1(i), tag1);
|
||||||
if (mt->extrainfo)
|
if (mt->extrainfo)
|
||||||
mt->z = mt->options;
|
mt->z = mt->options;
|
||||||
else
|
else
|
||||||
|
@ -623,265 +615,10 @@ pslope_t *P_SlopeById(UINT16 id)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SPRINGCLEAN
|
|
||||||
#include "byteptr.h"
|
|
||||||
|
|
||||||
#include "p_setup.h"
|
|
||||||
#include "p_local.h"
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// P_SetSlopesFromVertexHeights
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
void P_SetSlopesFromVertexHeights(lumpnum_t lumpnum)
|
|
||||||
{
|
|
||||||
mapthing_t *mt;
|
|
||||||
boolean vt_found = false;
|
|
||||||
size_t i, j, k, l, q;
|
|
||||||
|
|
||||||
//size_t i;
|
|
||||||
//mapthing_t *mt;
|
|
||||||
char *data;
|
|
||||||
char *datastart;
|
|
||||||
|
|
||||||
// SRB2CBTODO: WHAT IS (5 * sizeof (short))?! It = 10
|
|
||||||
// anything else seems to make a map not load properly,
|
|
||||||
// but this hard-coded value MUST have some reason for being what it is
|
|
||||||
size_t snummapthings = W_LumpLength(lumpnum) / (5 * sizeof (short));
|
|
||||||
mapthing_t *smapthings = Z_Calloc(snummapthings * sizeof (*smapthings), PU_LEVEL, NULL);
|
|
||||||
fixed_t x, y;
|
|
||||||
sector_t *sector;
|
|
||||||
// Spawn axis points first so they are
|
|
||||||
// at the front of the list for fast searching.
|
|
||||||
data = datastart = W_CacheLumpNum(lumpnum, PU_LEVEL);
|
|
||||||
mt = smapthings;
|
|
||||||
for (i = 0; i < snummapthings; i++, mt++)
|
|
||||||
{
|
|
||||||
mt->x = READINT16(data);
|
|
||||||
mt->y = READINT16(data);
|
|
||||||
mt->angle = READINT16(data);
|
|
||||||
mt->type = READINT16(data);
|
|
||||||
mt->options = READINT16(data);
|
|
||||||
// mt->z hasn't been set yet!
|
|
||||||
//mt->extrainfo = (byte)(mt->type >> 12); // slope things are special, they have a bigger range of types
|
|
||||||
|
|
||||||
//mt->type &= 4095; // SRB2CBTODO: WHAT IS THIS???? Mobj type limits?!!!!
|
|
||||||
x = mt->x*FRACUNIT;
|
|
||||||
y = mt->y*FRACUNIT;
|
|
||||||
sector = R_PointInSubsector(x, y)->sector;
|
|
||||||
// Z for objects
|
|
||||||
#ifdef ESLOPE
|
|
||||||
if (sector->f_slope)
|
|
||||||
mt->z = (short)(P_GetZAt(sector->f_slope, x, y)>>FRACBITS);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
mt->z = (short)(sector->floorheight>>FRACBITS);
|
|
||||||
|
|
||||||
mt->z = mt->z + (mt->options >> ZSHIFT);
|
|
||||||
|
|
||||||
if (mt->type == THING_VertexFloorZ || mt->type == THING_VertexCeilingZ) // THING_VertexFloorZ
|
|
||||||
{
|
|
||||||
for(l = 0; l < numvertexes; l++)
|
|
||||||
{
|
|
||||||
if (vertexes[l].x == mt->x*FRACUNIT && vertexes[l].y == mt->y*FRACUNIT)
|
|
||||||
{
|
|
||||||
if (mt->type == THING_VertexFloorZ)
|
|
||||||
{
|
|
||||||
vertexes[l].z = mt->z*FRACUNIT;
|
|
||||||
//I_Error("Z value: %i", vertexes[l].z/FRACUNIT);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vertexes[l].z = mt->z*FRACUNIT; // celing floor
|
|
||||||
}
|
|
||||||
vt_found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//mt->type = 0; // VPHYSICS: Dynamic slopes
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (vt_found)
|
|
||||||
{
|
|
||||||
for (k = 0; k < numsectors; k++)
|
|
||||||
{
|
|
||||||
sector_t *sec = §ors[k];
|
|
||||||
if (sec->linecount != 3) continue; // only works with triangular sectors
|
|
||||||
|
|
||||||
v3float_t vt1, vt2, vt3; // cross = ret->normalf
|
|
||||||
v3float_t vec1, vec2;
|
|
||||||
|
|
||||||
int vi1, vi2, vi3;
|
|
||||||
|
|
||||||
vi1 = (int)(sec->lines[0]->v1 - vertexes);
|
|
||||||
vi2 = (int)(sec->lines[0]->v2 - vertexes);
|
|
||||||
vi3 = (sec->lines[1]->v1 == sec->lines[0]->v1 || sec->lines[1]->v1 == sec->lines[0]->v2)?
|
|
||||||
(int)(sec->lines[1]->v2 - vertexes) : (int)(sec->lines[1]->v1 - vertexes);
|
|
||||||
|
|
||||||
//if (vertexes[vi1].z)
|
|
||||||
// I_Error("OSNAP %i", vertexes[vi1].z/FRACUNIT);
|
|
||||||
//if (vertexes[vi2].z)
|
|
||||||
// I_Error("OSNAP %i", vertexes[vi2].z/FRACUNIT);
|
|
||||||
//if (vertexes[vi3].z)
|
|
||||||
// I_Error("OSNAP %i", vertexes[vi3].z/FRACUNIT);
|
|
||||||
|
|
||||||
//I_Error("%i, %i", mt->z*FRACUNIT, vertexes[vi1].z);
|
|
||||||
|
|
||||||
//I_Error("%i, %i, %i", mt->x, mt->y, mt->z);
|
|
||||||
//P_SpawnMobj(mt->x*FRACUNIT, mt->y*FRACUNIT, mt->z*FRACUNIT, MT_RING);
|
|
||||||
|
|
||||||
// TODO: Make sure not to spawn in the same place 2x! (we need an object in every vertex of the
|
|
||||||
// triangle sector to setup the real vertex slopes
|
|
||||||
// Check for the vertexes of all sectors
|
|
||||||
for(q = 0; q < numvertexes; q++)
|
|
||||||
{
|
|
||||||
if (vertexes[q].x == mt->x*FRACUNIT && vertexes[q].y == mt->y*FRACUNIT)
|
|
||||||
{
|
|
||||||
//I_Error("yeah %i", vertexes[q].z);
|
|
||||||
P_SpawnMobj(vertexes[q].x, vertexes[q].y, vertexes[q].z, MT_RING);
|
|
||||||
#if 0
|
|
||||||
if ((mt->y*FRACUNIT == vertexes[vi1].y && mt->x*FRACUNIT == vertexes[vi1].x && mt->z*FRACUNIT == vertexes[vi1].z)
|
|
||||||
&& !(mt->y*FRACUNIT == vertexes[vi2].y && mt->x*FRACUNIT == vertexes[vi2].x && mt->z*FRACUNIT == vertexes[vi2].z)
|
|
||||||
&& !(mt->y*FRACUNIT == vertexes[vi3].y && mt->x*FRACUNIT == vertexes[vi3].x && mt->z*FRACUNIT == vertexes[vi3].z))
|
|
||||||
P_SpawnMobj(vertexes[vi1].x, vertexes[vi1].y, vertexes[vi1].z, MT_RING);
|
|
||||||
else if ((mt->y*FRACUNIT == vertexes[vi2].y && mt->x*FRACUNIT == vertexes[vi2].x && mt->z*FRACUNIT == vertexes[vi2].z)
|
|
||||||
&& !(mt->y*FRACUNIT == vertexes[vi1].y && mt->x*FRACUNIT == vertexes[vi1].x && mt->z*FRACUNIT == vertexes[vi1].z)
|
|
||||||
&& !(mt->y*FRACUNIT == vertexes[vi3].y && mt->x*FRACUNIT == vertexes[vi3].x && mt->z*FRACUNIT == vertexes[vi3].z))
|
|
||||||
P_SpawnMobj(vertexes[vi2].x, vertexes[vi2].y, vertexes[vi2].z, MT_BOUNCETV);
|
|
||||||
else if ((mt->y*FRACUNIT == vertexes[vi3].y && mt->x*FRACUNIT == vertexes[vi3].x && mt->z*FRACUNIT == vertexes[vi3].z)
|
|
||||||
&& !(mt->y*FRACUNIT == vertexes[vi2].y && mt->x*FRACUNIT == vertexes[vi2].x && mt->z*FRACUNIT == vertexes[vi2].z)
|
|
||||||
&& !(mt->y*FRACUNIT == vertexes[vi1].y && mt->x*FRACUNIT == vertexes[vi1].x && mt->z*FRACUNIT == vertexes[vi1].z))
|
|
||||||
P_SpawnMobj(vertexes[vi3].x, vertexes[vi3].y, vertexes[vi3].z, MT_GFZFLOWER1);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vt1.x = FIXED_TO_FLOAT(vertexes[vi1].x);
|
|
||||||
vt1.y = FIXED_TO_FLOAT(vertexes[vi1].y);
|
|
||||||
vt2.x = FIXED_TO_FLOAT(vertexes[vi2].x);
|
|
||||||
vt2.y = FIXED_TO_FLOAT(vertexes[vi2].y);
|
|
||||||
vt3.x = FIXED_TO_FLOAT(vertexes[vi3].x);
|
|
||||||
vt3.y = FIXED_TO_FLOAT(vertexes[vi3].y);
|
|
||||||
|
|
||||||
for(j = 0; j < 2; j++)
|
|
||||||
{
|
|
||||||
|
|
||||||
fixed_t z3;
|
|
||||||
//I_Error("Lo hicimos");
|
|
||||||
|
|
||||||
vt1.z = mt->z;//FIXED_TO_FLOAT(j==0 ? sec->floorheight : sec->ceilingheight);
|
|
||||||
vt2.z = mt->z;//FIXED_TO_FLOAT(j==0? sec->floorheight : sec->ceilingheight);
|
|
||||||
z3 = mt->z;//j==0? sec->floorheight : sec->ceilingheight; // Destination height
|
|
||||||
vt3.z = FIXED_TO_FLOAT(z3);
|
|
||||||
|
|
||||||
if (P_PointOnLineSide(vertexes[vi3].x, vertexes[vi3].y, sec->lines[0]) == 0)
|
|
||||||
{
|
|
||||||
vec1.x = vt2.x - vt3.x;
|
|
||||||
vec1.y = vt2.y - vt3.y;
|
|
||||||
vec1.z = vt2.z - vt3.z;
|
|
||||||
|
|
||||||
vec2.x = vt1.x - vt3.x;
|
|
||||||
vec2.y = vt1.y - vt3.y;
|
|
||||||
vec2.z = vt1.z - vt3.z;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vec1.x = vt1.x - vt3.x;
|
|
||||||
vec1.y = vt1.y - vt3.y;
|
|
||||||
vec1.z = vt1.z - vt3.z;
|
|
||||||
|
|
||||||
vec2.x = vt2.x - vt3.x;
|
|
||||||
vec2.y = vt2.y - vt3.y;
|
|
||||||
vec2.z = vt2.z - vt3.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
pslope_t *ret = Z_Malloc(sizeof(pslope_t), PU_LEVEL, NULL);
|
|
||||||
memset(ret, 0, sizeof(*ret));
|
|
||||||
|
|
||||||
{
|
|
||||||
M_CrossProduct3f(&ret->normalf, &vec1, &vec2);
|
|
||||||
|
|
||||||
// Cross product length
|
|
||||||
float len = (float)sqrt(ret->normalf.x * ret->normalf.x +
|
|
||||||
ret->normalf.y * ret->normalf.y +
|
|
||||||
ret->normalf.z * ret->normalf.z);
|
|
||||||
|
|
||||||
if (len == 0)
|
|
||||||
{
|
|
||||||
// Only happens when all vertices in this sector are on the same line.
|
|
||||||
// Let's just ignore this case.
|
|
||||||
//CONS_Printf("Slope thing at (%d,%d) lies directly on its target line.\n", (int)(x>>16), (int)(y>>16));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// cross/len
|
|
||||||
ret->normalf.x /= len;
|
|
||||||
ret->normalf.y /= len;
|
|
||||||
ret->normalf.z /= len;
|
|
||||||
|
|
||||||
// ZDoom cross = ret->normalf
|
|
||||||
// Fix backward normals
|
|
||||||
if ((ret->normalf.z < 0 && j == 0) || (ret->normalf.z > 0 && j == 1))
|
|
||||||
{
|
|
||||||
// cross = -cross
|
|
||||||
ret->normalf.x = -ret->normalf.x;
|
|
||||||
ret->normalf.y = -ret->normalf.x;
|
|
||||||
ret->normalf.z = -ret->normalf.x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
secplane_t *srcplane = Z_Calloc(sizeof(*srcplane), PU_LEVEL, NULL);
|
|
||||||
|
|
||||||
srcplane->a = FLOAT_TO_FIXED (ret->normalf.x);
|
|
||||||
srcplane->b = FLOAT_TO_FIXED (ret->normalf.y);
|
|
||||||
srcplane->c = FLOAT_TO_FIXED (ret->normalf.z);
|
|
||||||
//srcplane->ic = FixedDiv(FRACUNIT, srcplane->c);
|
|
||||||
srcplane->d = -TMulScale16 (srcplane->a, vertexes[vi3].x,
|
|
||||||
srcplane->b, vertexes[vi3].y,
|
|
||||||
srcplane->c, z3);
|
|
||||||
|
|
||||||
if (j == 0)
|
|
||||||
{
|
|
||||||
sec->f_slope = ret;
|
|
||||||
sec->f_slope->secplane = *srcplane;
|
|
||||||
}
|
|
||||||
else if (j == 1)
|
|
||||||
{
|
|
||||||
sec->c_slope = ret;
|
|
||||||
sec->c_slope->secplane = *srcplane;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Z_Free(datastart);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Reset the dynamic slopes pointer, and read all of the fancy schmancy slopes
|
// Reset the dynamic slopes pointer, and read all of the fancy schmancy slopes
|
||||||
void P_ResetDynamicSlopes(void) {
|
void P_ResetDynamicSlopes(void) {
|
||||||
size_t i;
|
size_t i;
|
||||||
#if 1 // Rewrite old specials to new ones, and give a console warning
|
#ifdef ESLOPE_TYPESHIM // Rewrite old specials to new ones, and give a console warning
|
||||||
boolean warned = false;
|
boolean warned = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -894,7 +631,7 @@ void P_ResetDynamicSlopes(void) {
|
||||||
{
|
{
|
||||||
switch (lines[i].special)
|
switch (lines[i].special)
|
||||||
{
|
{
|
||||||
#if 1 // Rewrite old specials to new ones, and give a console warning
|
#ifdef ESLOPE_TYPESHIM // Rewrite old specials to new ones, and give a console warning
|
||||||
#define WARNME if (!warned) {warned = true; CONS_Alert(CONS_WARNING, "This level uses old slope specials.\nA conversion will be needed before 2.2's release.\n");}
|
#define WARNME if (!warned) {warned = true; CONS_Alert(CONS_WARNING, "This level uses old slope specials.\nA conversion will be needed before 2.2's release.\n");}
|
||||||
case 386:
|
case 386:
|
||||||
case 387:
|
case 387:
|
||||||
|
@ -1018,7 +755,11 @@ fixed_t P_GetZAt(pslope_t *slope, fixed_t x, fixed_t y)
|
||||||
// When given a vector, rotates it and aligns it to a slope
|
// When given a vector, rotates it and aligns it to a slope
|
||||||
void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope)
|
void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope)
|
||||||
{
|
{
|
||||||
vector3_t axis;
|
vector3_t axis; // Fuck you, C90.
|
||||||
|
|
||||||
|
if (slope->flags & SL_NOPHYSICS)
|
||||||
|
return; // No physics, no quantizing.
|
||||||
|
|
||||||
axis.x = -slope->d.y;
|
axis.x = -slope->d.y;
|
||||||
axis.y = slope->d.x;
|
axis.y = slope->d.x;
|
||||||
axis.z = 0;
|
axis.z = 0;
|
||||||
|
@ -1026,24 +767,38 @@ void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope)
|
||||||
FV3_Rotate(momentum, &axis, slope->zangle >> ANGLETOFINESHIFT);
|
FV3_Rotate(momentum, &axis, slope->zangle >> ANGLETOFINESHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_ReverseQuantizeMomentumToSlope
|
||||||
|
//
|
||||||
|
// When given a vector, rotates and aligns it to a flat surface (from being relative to a given slope)
|
||||||
|
void P_ReverseQuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope)
|
||||||
|
{
|
||||||
|
slope->zangle = InvAngle(slope->zangle);
|
||||||
|
P_QuantizeMomentumToSlope(momentum, slope);
|
||||||
|
slope->zangle = InvAngle(slope->zangle);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_SlopeLaunch
|
// P_SlopeLaunch
|
||||||
//
|
//
|
||||||
// Handles slope ejection for objects
|
// Handles slope ejection for objects
|
||||||
void P_SlopeLaunch(mobj_t *mo)
|
void P_SlopeLaunch(mobj_t *mo)
|
||||||
{
|
{
|
||||||
// Double the pre-rotation Z, then halve the post-rotation Z. This reduces the
|
if (!(mo->standingslope->flags & SL_NOPHYSICS)) // If there's physics, time for launching.
|
||||||
// vertical launch given from slopes while increasing the horizontal launch
|
{
|
||||||
// given. Good for SRB2's gravity and horizontal speeds.
|
// Double the pre-rotation Z, then halve the post-rotation Z. This reduces the
|
||||||
vector3_t slopemom;
|
// vertical launch given from slopes while increasing the horizontal launch
|
||||||
slopemom.x = mo->momx;
|
// given. Good for SRB2's gravity and horizontal speeds.
|
||||||
slopemom.y = mo->momy;
|
vector3_t slopemom;
|
||||||
slopemom.z = mo->momz*2;
|
slopemom.x = mo->momx;
|
||||||
P_QuantizeMomentumToSlope(&slopemom, mo->standingslope);
|
slopemom.y = mo->momy;
|
||||||
|
slopemom.z = mo->momz*2;
|
||||||
|
P_QuantizeMomentumToSlope(&slopemom, mo->standingslope);
|
||||||
|
|
||||||
mo->momx = slopemom.x;
|
mo->momx = slopemom.x;
|
||||||
mo->momy = slopemom.y;
|
mo->momy = slopemom.y;
|
||||||
mo->momz = slopemom.z/2;
|
mo->momz = slopemom.z/2;
|
||||||
|
}
|
||||||
|
|
||||||
//CONS_Printf("Launched off of slope.\n");
|
//CONS_Printf("Launched off of slope.\n");
|
||||||
mo->standingslope = NULL;
|
mo->standingslope = NULL;
|
||||||
|
@ -1052,17 +807,21 @@ void P_SlopeLaunch(mobj_t *mo)
|
||||||
// Function to help handle landing on slopes
|
// Function to help handle landing on slopes
|
||||||
void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope)
|
void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope)
|
||||||
{
|
{
|
||||||
vector3_t mom;
|
vector3_t mom; // Ditto.
|
||||||
|
|
||||||
|
if (slope->flags & SL_NOPHYSICS) { // No physics, no need to make anything complicated.
|
||||||
|
if (P_MobjFlip(thing)*(thing->momz) < 0) { // falling, land on slope
|
||||||
|
thing->momz = -P_MobjFlip(thing);
|
||||||
|
thing->standingslope = slope;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mom.x = thing->momx;
|
mom.x = thing->momx;
|
||||||
mom.y = thing->momy;
|
mom.y = thing->momy;
|
||||||
mom.z = thing->momz*2;
|
mom.z = thing->momz*2;
|
||||||
|
|
||||||
//CONS_Printf("langing on slope\n");
|
P_ReverseQuantizeMomentumToSlope(&mom, slope);
|
||||||
|
|
||||||
// Reverse quantizing might could use its own function later
|
|
||||||
slope->zangle = ANGLE_MAX-slope->zangle;
|
|
||||||
P_QuantizeMomentumToSlope(&mom, slope);
|
|
||||||
slope->zangle = ANGLE_MAX-slope->zangle;
|
|
||||||
|
|
||||||
if (P_MobjFlip(thing)*mom.z < 0) { // falling, land on slope
|
if (P_MobjFlip(thing)*mom.z < 0) { // falling, land on slope
|
||||||
thing->momx = mom.x;
|
thing->momx = mom.x;
|
||||||
|
@ -1082,6 +841,9 @@ void P_ButteredSlope(mobj_t *mo)
|
||||||
if (!mo->standingslope)
|
if (!mo->standingslope)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (mo->standingslope->flags & SL_NOPHYSICS)
|
||||||
|
return; // No physics, no butter.
|
||||||
|
|
||||||
if (mo->flags & (MF_NOCLIPHEIGHT|MF_NOGRAVITY))
|
if (mo->flags & (MF_NOCLIPHEIGHT|MF_NOGRAVITY))
|
||||||
return; // don't slide down slopes if you can't touch them or you're not affected by gravity
|
return; // don't slide down slopes if you can't touch them or you're not affected by gravity
|
||||||
|
|
||||||
|
@ -1106,8 +868,6 @@ void P_ButteredSlope(mobj_t *mo)
|
||||||
mult = FINECOSINE(angle >> ANGLETOFINESHIFT);
|
mult = FINECOSINE(angle >> ANGLETOFINESHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
//CONS_Printf("%d\n", mult);
|
|
||||||
|
|
||||||
thrust = FixedMul(thrust, FRACUNIT*2/3 + mult/8);
|
thrust = FixedMul(thrust, FRACUNIT*2/3 + mult/8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1115,10 +875,11 @@ void P_ButteredSlope(mobj_t *mo)
|
||||||
thrust = FixedMul(thrust, FRACUNIT+P_AproxDistance(mo->momx, mo->momy)/16);
|
thrust = FixedMul(thrust, FRACUNIT+P_AproxDistance(mo->momx, mo->momy)/16);
|
||||||
// This makes it harder to zigzag up steep slopes, as well as allows greater top speed when rolling down
|
// This makes it harder to zigzag up steep slopes, as well as allows greater top speed when rolling down
|
||||||
|
|
||||||
// Multiply by gravity
|
// Let's get the gravity strength for the object...
|
||||||
thrust = FixedMul(thrust, gravity); // TODO account for per-sector gravity etc
|
thrust = FixedMul(thrust, abs(P_GetMobjGravity(mo)));
|
||||||
// Multiply by scale (gravity strength depends on mobj scale)
|
|
||||||
thrust = FixedMul(thrust, mo->scale);
|
// ... and its friction against the ground for good measure (divided by original friction to keep behaviour for normal slopes the same).
|
||||||
|
thrust = FixedMul(thrust, FixedDiv(mo->friction, ORIG_FRICTION));
|
||||||
|
|
||||||
P_Thrust(mo, mo->standingslope->xydirection, thrust);
|
P_Thrust(mo, mo->standingslope->xydirection, thrust);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,26 +21,6 @@ void P_RunDynamicSlopes(void);
|
||||||
// sectors.
|
// sectors.
|
||||||
void P_SpawnSlope_Line(int linenum);
|
void P_SpawnSlope_Line(int linenum);
|
||||||
|
|
||||||
#ifdef SPRINGCLEAN
|
|
||||||
// Loads just map objects that make slopes,
|
|
||||||
// terrain affecting objects have to be spawned first
|
|
||||||
void P_SetSlopesFromVertexHeights(lumpnum_t lumpnum);
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
THING_SlopeFloorPointLine = 9500,
|
|
||||||
THING_SlopeCeilingPointLine = 9501,
|
|
||||||
THING_SetFloorSlope = 9502,
|
|
||||||
THING_SetCeilingSlope = 9503,
|
|
||||||
THING_CopyFloorPlane = 9510,
|
|
||||||
THING_CopyCeilingPlane = 9511,
|
|
||||||
THING_VavoomFloor=1500,
|
|
||||||
THING_VavoomCeiling=1501,
|
|
||||||
THING_VertexFloorZ=1504,
|
|
||||||
THING_VertexCeilingZ=1505,
|
|
||||||
} slopething_e;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_CopySectorSlope
|
// P_CopySectorSlope
|
||||||
//
|
//
|
||||||
|
@ -55,6 +35,7 @@ fixed_t P_GetZAt(pslope_t *slope, fixed_t x, fixed_t y);
|
||||||
|
|
||||||
// Lots of physics-based bullshit
|
// Lots of physics-based bullshit
|
||||||
void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope);
|
void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope);
|
||||||
|
void P_ReverseQuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope);
|
||||||
void P_SlopeLaunch(mobj_t *mo);
|
void P_SlopeLaunch(mobj_t *mo);
|
||||||
void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope);
|
void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope);
|
||||||
void P_ButteredSlope(mobj_t *mo);
|
void P_ButteredSlope(mobj_t *mo);
|
||||||
|
|
24
src/p_spec.c
24
src/p_spec.c
|
@ -1642,7 +1642,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||||
mo = node->m_thing;
|
mo = node->m_thing;
|
||||||
if (mo->flags & MF_PUSHABLE)
|
if (mo->flags & MF_PUSHABLE)
|
||||||
numpush++;
|
numpush++;
|
||||||
node = node->m_snext;
|
node = node->m_thinglist_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (triggerline->flags & ML_NOCLIMB) // Need at least or more
|
if (triggerline->flags & ML_NOCLIMB) // Need at least or more
|
||||||
|
@ -3145,7 +3145,7 @@ void P_SetupSignExit(player_t *player)
|
||||||
thinker_t *think;
|
thinker_t *think;
|
||||||
INT32 numfound = 0;
|
INT32 numfound = 0;
|
||||||
|
|
||||||
for (; node; node = node->m_snext)
|
for (; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
if (thing->type != MT_SIGN)
|
if (thing->type != MT_SIGN)
|
||||||
|
@ -3309,7 +3309,7 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n
|
||||||
return rover->master->frontsector;
|
return rover->master->frontsector;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
if (GETSECSPECIAL(node->m_sector->special, section) == number)
|
if (GETSECSPECIAL(node->m_sector->special, section) == number)
|
||||||
{
|
{
|
||||||
|
@ -4658,7 +4658,7 @@ void P_PlayerInSpecialSector(player_t *player)
|
||||||
P_RunSpecialSectorCheck(player, sector);
|
P_RunSpecialSectorCheck(player, sector);
|
||||||
|
|
||||||
// Iterate through touching_sectorlist
|
// Iterate through touching_sectorlist
|
||||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
sector = node->m_sector;
|
sector = node->m_sector;
|
||||||
|
|
||||||
|
@ -5309,7 +5309,7 @@ void T_LaserFlash(laserthink_t *flash)
|
||||||
S_StartSound(§or->soundorg, sfx_laser);
|
S_StartSound(§or->soundorg, sfx_laser);
|
||||||
|
|
||||||
// Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough*
|
// Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough*
|
||||||
for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_snext)
|
for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
|
|
||||||
|
@ -6580,7 +6580,7 @@ void T_Scroll(scroll_t *s)
|
||||||
sector_t *psec;
|
sector_t *psec;
|
||||||
psec = sectors + sect;
|
psec = sectors + sect;
|
||||||
|
|
||||||
for (node = psec->touching_thinglist; node; node = node->m_snext)
|
for (node = psec->touching_thinglist; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
|
|
||||||
|
@ -6602,7 +6602,7 @@ void T_Scroll(scroll_t *s)
|
||||||
|
|
||||||
if (!is3dblock)
|
if (!is3dblock)
|
||||||
{
|
{
|
||||||
for (node = sec->touching_thinglist; node; node = node->m_snext)
|
for (node = sec->touching_thinglist; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
|
|
||||||
|
@ -6643,7 +6643,7 @@ void T_Scroll(scroll_t *s)
|
||||||
sector_t *psec;
|
sector_t *psec;
|
||||||
psec = sectors + sect;
|
psec = sectors + sect;
|
||||||
|
|
||||||
for (node = psec->touching_thinglist; node; node = node->m_snext)
|
for (node = psec->touching_thinglist; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
|
|
||||||
|
@ -6665,7 +6665,7 @@ void T_Scroll(scroll_t *s)
|
||||||
|
|
||||||
if (!is3dblock)
|
if (!is3dblock)
|
||||||
{
|
{
|
||||||
for (node = sec->touching_thinglist; node; node = node->m_snext)
|
for (node = sec->touching_thinglist; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
|
|
||||||
|
@ -7015,7 +7015,7 @@ void T_Friction(friction_t *f)
|
||||||
{
|
{
|
||||||
if (thing->floorz != P_GetSpecialTopZ(thing, referrer, sec))
|
if (thing->floorz != P_GetSpecialTopZ(thing, referrer, sec))
|
||||||
{
|
{
|
||||||
node = node->m_snext;
|
node = node->m_thinglist_next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7033,7 +7033,7 @@ void T_Friction(friction_t *f)
|
||||||
thing->movefactor = f->movefactor;
|
thing->movefactor = f->movefactor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
node = node->m_snext;
|
node = node->m_thinglist_next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7373,7 +7373,7 @@ void T_Pusher(pusher_t *p)
|
||||||
|
|
||||||
// constant pushers p_wind and p_current
|
// constant pushers p_wind and p_current
|
||||||
node = sec->touching_thinglist; // things touching this sector
|
node = sec->touching_thinglist; // things touching this sector
|
||||||
for (; node; node = node->m_snext)
|
for (; node; node = node->m_thinglist_next)
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
thing = node->m_thing;
|
||||||
if (thing->flags & (MF_NOGRAVITY | MF_NOCLIP)
|
if (thing->flags & (MF_NOGRAVITY | MF_NOCLIP)
|
||||||
|
|
714
src/p_user.c
714
src/p_user.c
|
@ -1696,7 +1696,7 @@ static void P_CheckBustableBlocks(player_t *player)
|
||||||
player->mo->y += player->mo->momy;
|
player->mo->y += player->mo->momy;
|
||||||
P_SetThingPosition(player->mo);
|
P_SetThingPosition(player->mo);
|
||||||
|
|
||||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
if (!node->m_sector)
|
if (!node->m_sector)
|
||||||
break;
|
break;
|
||||||
|
@ -1813,7 +1813,7 @@ static void P_CheckBouncySectors(player_t *player)
|
||||||
player->mo->z += player->mo->momz;
|
player->mo->z += player->mo->momz;
|
||||||
P_SetThingPosition(player->mo);
|
P_SetThingPosition(player->mo);
|
||||||
|
|
||||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
if (!node->m_sector)
|
if (!node->m_sector)
|
||||||
break;
|
break;
|
||||||
|
@ -1863,12 +1863,8 @@ static void P_CheckBouncySectors(player_t *player)
|
||||||
momentum.y = player->mo->momy;
|
momentum.y = player->mo->momy;
|
||||||
momentum.z = player->mo->momz*2;
|
momentum.z = player->mo->momz*2;
|
||||||
|
|
||||||
if (slope) {
|
if (slope)
|
||||||
// Reverse quantizing might could use its own function later
|
P_ReverseQuantizeMomentumToSlope(&momentum, slope);
|
||||||
slope->zangle = ANGLE_MAX-slope->zangle;
|
|
||||||
P_QuantizeMomentumToSlope(&momentum, slope);
|
|
||||||
slope->zangle = ANGLE_MAX-slope->zangle;
|
|
||||||
}
|
|
||||||
|
|
||||||
newmom = momentum.z = -FixedMul(momentum.z,linedist)/2;
|
newmom = momentum.z = -FixedMul(momentum.z,linedist)/2;
|
||||||
#else
|
#else
|
||||||
|
@ -2268,9 +2264,9 @@ static void P_DoClimbing(player_t *player)
|
||||||
platx = P_ReturnThrustX(player->mo, player->mo->angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale));
|
platx = P_ReturnThrustX(player->mo, player->mo->angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale));
|
||||||
platy = P_ReturnThrustY(player->mo, player->mo->angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale));
|
platy = P_ReturnThrustY(player->mo, player->mo->angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale));
|
||||||
|
|
||||||
glidesector = R_PointInSubsector(player->mo->x + platx, player->mo->y + platy);
|
glidesector = R_IsPointInSubsector(player->mo->x + platx, player->mo->y + platy);
|
||||||
|
|
||||||
if (glidesector->sector != player->mo->subsector->sector)
|
if (!glidesector || glidesector->sector != player->mo->subsector->sector)
|
||||||
{
|
{
|
||||||
boolean floorclimb;
|
boolean floorclimb;
|
||||||
boolean thrust;
|
boolean thrust;
|
||||||
|
@ -2282,299 +2278,304 @@ static void P_DoClimbing(player_t *player)
|
||||||
boostup = false;
|
boostup = false;
|
||||||
skyclimber = false;
|
skyclimber = false;
|
||||||
|
|
||||||
#ifdef ESLOPE
|
if (glidesector)
|
||||||
floorheight = glidesector->sector->f_slope ? P_GetZAt(glidesector->sector->f_slope, player->mo->x, player->mo->y)
|
|
||||||
: glidesector->sector->floorheight;
|
|
||||||
ceilingheight = glidesector->sector->c_slope ? P_GetZAt(glidesector->sector->c_slope, player->mo->x, player->mo->y)
|
|
||||||
: glidesector->sector->ceilingheight;
|
|
||||||
#else
|
|
||||||
floorheight = glidesector->sector->floorheight;
|
|
||||||
ceilingheight = glidesector->sector->ceilingheight;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (glidesector->sector->ffloors)
|
|
||||||
{
|
{
|
||||||
ffloor_t *rover;
|
#ifdef ESLOPE
|
||||||
fixed_t topheight, bottomheight; // ESLOPE
|
floorheight = glidesector->sector->f_slope ? P_GetZAt(glidesector->sector->f_slope, player->mo->x, player->mo->y)
|
||||||
|
: glidesector->sector->floorheight;
|
||||||
|
ceilingheight = glidesector->sector->c_slope ? P_GetZAt(glidesector->sector->c_slope, player->mo->x, player->mo->y)
|
||||||
|
: glidesector->sector->ceilingheight;
|
||||||
|
#else
|
||||||
|
floorheight = glidesector->sector->floorheight;
|
||||||
|
ceilingheight = glidesector->sector->ceilingheight;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (rover = glidesector->sector->ffloors; rover; rover = rover->next)
|
if (glidesector->sector->ffloors)
|
||||||
{
|
{
|
||||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP))
|
ffloor_t *rover;
|
||||||
continue;
|
fixed_t topheight, bottomheight; // ESLOPE
|
||||||
|
|
||||||
floorclimb = true;
|
for (rover = glidesector->sector->ffloors; rover; rover = rover->next)
|
||||||
|
{
|
||||||
|
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
floorclimb = true;
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
bottomheight = *rover->b_slope ? P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y) : *rover->bottomheight;
|
bottomheight = *rover->b_slope ? P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y) : *rover->bottomheight;
|
||||||
topheight = *rover->t_slope ? P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y) : *rover->topheight;
|
topheight = *rover->t_slope ? P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y) : *rover->topheight;
|
||||||
#else
|
#else
|
||||||
bottomheight = *rover->bottomheight;
|
bottomheight = *rover->bottomheight;
|
||||||
topheight = *rover->topheight;
|
topheight = *rover->topheight;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Only supports rovers that are moving like an 'elevator', not just the top or bottom.
|
// Only supports rovers that are moving like an 'elevator', not just the top or bottom.
|
||||||
if (rover->master->frontsector->floorspeed && rover->master->frontsector->ceilspeed == 42)
|
if (rover->master->frontsector->floorspeed && rover->master->frontsector->ceilspeed == 42)
|
||||||
{
|
|
||||||
if ((!(player->mo->eflags & MFE_VERTICALFLIP) && (bottomheight < player->mo->z+player->mo->height)
|
|
||||||
&& (topheight >= player->mo->z + FixedMul(16*FRACUNIT, player->mo->scale)))
|
|
||||||
|| ((player->mo->eflags & MFE_VERTICALFLIP) && (topheight > player->mo->z)
|
|
||||||
&& (bottomheight <= player->mo->z + player->mo->height - FixedMul(16*FRACUNIT, player->mo->scale))))
|
|
||||||
{
|
{
|
||||||
if (cmd->forwardmove != 0)
|
if ((!(player->mo->eflags & MFE_VERTICALFLIP) && (bottomheight < player->mo->z+player->mo->height)
|
||||||
player->mo->momz += rover->master->frontsector->floorspeed;
|
&& (topheight >= player->mo->z + FixedMul(16*FRACUNIT, player->mo->scale)))
|
||||||
else
|
|| ((player->mo->eflags & MFE_VERTICALFLIP) && (topheight > player->mo->z)
|
||||||
|
&& (bottomheight <= player->mo->z + player->mo->height - FixedMul(16*FRACUNIT, player->mo->scale))))
|
||||||
{
|
{
|
||||||
player->mo->momz = rover->master->frontsector->floorspeed;
|
if (cmd->forwardmove != 0)
|
||||||
climb = false;
|
player->mo->momz += rover->master->frontsector->floorspeed;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player->mo->momz = rover->master->frontsector->floorspeed;
|
||||||
|
climb = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Gravity is flipped, so the comments are, too.
|
// Gravity is flipped, so the comments are, too.
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||||
{
|
|
||||||
// Trying to climb down past the bottom of the FOF
|
|
||||||
if ((topheight >= player->mo->z + player->mo->height) && ((player->mo->z + player->mo->height + player->mo->momz) >= topheight))
|
|
||||||
{
|
{
|
||||||
fixed_t bottomheight2;
|
// Trying to climb down past the bottom of the FOF
|
||||||
ffloor_t *roverbelow;
|
if ((topheight >= player->mo->z + player->mo->height) && ((player->mo->z + player->mo->height + player->mo->momz) >= topheight))
|
||||||
boolean foundfof = false;
|
|
||||||
floorclimb = true;
|
|
||||||
boostup = false;
|
|
||||||
|
|
||||||
// Is there a FOF directly below this one that we can move onto?
|
|
||||||
for (roverbelow = glidesector->sector->ffloors; roverbelow; roverbelow = roverbelow->next)
|
|
||||||
{
|
{
|
||||||
if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || (roverbelow->flags & FF_BUSTUP))
|
fixed_t bottomheight2;
|
||||||
continue;
|
ffloor_t *roverbelow;
|
||||||
|
boolean foundfof = false;
|
||||||
|
floorclimb = true;
|
||||||
|
boostup = false;
|
||||||
|
|
||||||
if (roverbelow == rover)
|
// Is there a FOF directly below this one that we can move onto?
|
||||||
continue;
|
for (roverbelow = glidesector->sector->ffloors; roverbelow; roverbelow = roverbelow->next)
|
||||||
|
{
|
||||||
|
if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || (roverbelow->flags & FF_BUSTUP))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (roverbelow == rover)
|
||||||
|
continue;
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
bottomheight2 = *roverbelow->b_slope ? P_GetZAt(*roverbelow->b_slope, player->mo->x, player->mo->y) : *roverbelow->bottomheight;
|
bottomheight2 = *roverbelow->b_slope ? P_GetZAt(*roverbelow->b_slope, player->mo->x, player->mo->y) : *roverbelow->bottomheight;
|
||||||
#else
|
#else
|
||||||
bottomheight2 = *roverbelow->bottomheight;
|
bottomheight2 = *roverbelow->bottomheight;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (bottomheight2 < topheight + FixedMul(16*FRACUNIT, player->mo->scale))
|
if (bottomheight2 < topheight + FixedMul(16*FRACUNIT, player->mo->scale))
|
||||||
foundfof = true;
|
foundfof = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundfof)
|
||||||
|
player->mo->momz = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundfof)
|
// Below the FOF
|
||||||
player->mo->momz = 0;
|
if (topheight <= player->mo->z)
|
||||||
}
|
|
||||||
|
|
||||||
// Below the FOF
|
|
||||||
if (topheight <= player->mo->z)
|
|
||||||
{
|
|
||||||
floorclimb = false;
|
|
||||||
boostup = false;
|
|
||||||
thrust = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Above the FOF
|
|
||||||
if (bottomheight > player->mo->z + player->mo->height - FixedMul(16*FRACUNIT, player->mo->scale))
|
|
||||||
{
|
|
||||||
floorclimb = false;
|
|
||||||
thrust = true;
|
|
||||||
boostup = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Trying to climb down past the bottom of a FOF
|
|
||||||
if ((bottomheight <= player->mo->z) && ((player->mo->z + player->mo->momz) <= bottomheight))
|
|
||||||
{
|
|
||||||
fixed_t topheight2;
|
|
||||||
ffloor_t *roverbelow;
|
|
||||||
boolean foundfof = false;
|
|
||||||
floorclimb = true;
|
|
||||||
boostup = false;
|
|
||||||
|
|
||||||
// Is there a FOF directly below this one that we can move onto?
|
|
||||||
for (roverbelow = glidesector->sector->ffloors; roverbelow; roverbelow = roverbelow->next)
|
|
||||||
{
|
{
|
||||||
if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || (roverbelow->flags & FF_BUSTUP))
|
floorclimb = false;
|
||||||
continue;
|
boostup = false;
|
||||||
|
thrust = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (roverbelow == rover)
|
// Above the FOF
|
||||||
continue;
|
if (bottomheight > player->mo->z + player->mo->height - FixedMul(16*FRACUNIT, player->mo->scale))
|
||||||
|
{
|
||||||
|
floorclimb = false;
|
||||||
|
thrust = true;
|
||||||
|
boostup = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Trying to climb down past the bottom of a FOF
|
||||||
|
if ((bottomheight <= player->mo->z) && ((player->mo->z + player->mo->momz) <= bottomheight))
|
||||||
|
{
|
||||||
|
fixed_t topheight2;
|
||||||
|
ffloor_t *roverbelow;
|
||||||
|
boolean foundfof = false;
|
||||||
|
floorclimb = true;
|
||||||
|
boostup = false;
|
||||||
|
|
||||||
|
// Is there a FOF directly below this one that we can move onto?
|
||||||
|
for (roverbelow = glidesector->sector->ffloors; roverbelow; roverbelow = roverbelow->next)
|
||||||
|
{
|
||||||
|
if (!(roverbelow->flags & FF_EXISTS) || !(roverbelow->flags & FF_BLOCKPLAYER) || (roverbelow->flags & FF_BUSTUP))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (roverbelow == rover)
|
||||||
|
continue;
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
topheight2 = *roverbelow->t_slope ? P_GetZAt(*roverbelow->t_slope, player->mo->x, player->mo->y) : *roverbelow->topheight;
|
topheight2 = *roverbelow->t_slope ? P_GetZAt(*roverbelow->t_slope, player->mo->x, player->mo->y) : *roverbelow->topheight;
|
||||||
#else
|
#else
|
||||||
topheight2 = *roverbelow->topheight;
|
topheight2 = *roverbelow->topheight;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (topheight2 > bottomheight - FixedMul(16*FRACUNIT, player->mo->scale))
|
if (topheight2 > bottomheight - FixedMul(16*FRACUNIT, player->mo->scale))
|
||||||
foundfof = true;
|
foundfof = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundfof)
|
||||||
|
player->mo->momz = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundfof)
|
// Below the FOF
|
||||||
player->mo->momz = 0;
|
if (bottomheight >= player->mo->z + player->mo->height)
|
||||||
|
{
|
||||||
|
floorclimb = false;
|
||||||
|
boostup = false;
|
||||||
|
thrust = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Above the FOF
|
||||||
|
if (topheight < player->mo->z + FixedMul(16*FRACUNIT, player->mo->scale))
|
||||||
|
{
|
||||||
|
floorclimb = false;
|
||||||
|
thrust = true;
|
||||||
|
boostup = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Below the FOF
|
if (floorclimb)
|
||||||
if (bottomheight >= player->mo->z + player->mo->height)
|
|
||||||
{
|
{
|
||||||
floorclimb = false;
|
if (rover->flags & FF_CRUMBLE && !(netgame && player->spectator))
|
||||||
boostup = false;
|
EV_StartCrumble(rover->master->frontsector, rover, (rover->flags & FF_FLOATBOB), player, rover->alpha, !(rover->flags & FF_NORETURN));
|
||||||
thrust = false;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Above the FOF
|
|
||||||
if (topheight < player->mo->z + FixedMul(16*FRACUNIT, player->mo->scale))
|
|
||||||
{
|
|
||||||
floorclimb = false;
|
|
||||||
thrust = true;
|
|
||||||
boostup = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (floorclimb)
|
|
||||||
{
|
|
||||||
if (rover->flags & FF_CRUMBLE && !(netgame && player->spectator))
|
|
||||||
EV_StartCrumble(rover->master->frontsector, rover, (rover->flags & FF_FLOATBOB), player, rover->alpha, !(rover->flags & FF_NORETURN));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Gravity is flipped, so are comments.
|
// Gravity is flipped, so are comments.
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||||
{
|
|
||||||
// Trying to climb down past the upper texture area
|
|
||||||
if ((floorheight >= player->mo->z + player->mo->height) && ((player->mo->z + player->mo->height + player->mo->momz) >= floorheight))
|
|
||||||
{
|
{
|
||||||
boolean foundfof = false;
|
// Trying to climb down past the upper texture area
|
||||||
floorclimb = true;
|
if ((floorheight >= player->mo->z + player->mo->height) && ((player->mo->z + player->mo->height + player->mo->momz) >= floorheight))
|
||||||
|
|
||||||
// Is there a FOF directly below that we can move onto?
|
|
||||||
if (glidesector->sector->ffloors)
|
|
||||||
{
|
{
|
||||||
fixed_t bottomheight;
|
boolean foundfof = false;
|
||||||
ffloor_t *rover;
|
floorclimb = true;
|
||||||
for (rover = glidesector->sector->ffloors; rover; rover = rover->next)
|
|
||||||
|
// Is there a FOF directly below that we can move onto?
|
||||||
|
if (glidesector->sector->ffloors)
|
||||||
{
|
{
|
||||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP))
|
fixed_t bottomheight;
|
||||||
continue;
|
ffloor_t *rover;
|
||||||
|
for (rover = glidesector->sector->ffloors; rover; rover = rover->next)
|
||||||
|
{
|
||||||
|
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP))
|
||||||
|
continue;
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
bottomheight = *rover->b_slope ? P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y) : *rover->bottomheight;
|
bottomheight = *rover->b_slope ? P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y) : *rover->bottomheight;
|
||||||
#else
|
#else
|
||||||
bottomheight = *rover->bottomheight;
|
bottomheight = *rover->bottomheight;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (bottomheight < floorheight + FixedMul(16*FRACUNIT, player->mo->scale))
|
if (bottomheight < floorheight + FixedMul(16*FRACUNIT, player->mo->scale))
|
||||||
{
|
{
|
||||||
foundfof = true;
|
foundfof = true;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!foundfof)
|
||||||
|
player->mo->momz = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundfof)
|
// Reached the top of the lower texture area
|
||||||
player->mo->momz = 0;
|
if (!floorclimb && ceilingheight > player->mo->z + player->mo->height - FixedMul(16*FRACUNIT, player->mo->scale)
|
||||||
|
&& (glidesector->sector->ceilingpic == skyflatnum || floorheight < (player->mo->z - FixedMul(8*FRACUNIT, player->mo->scale))))
|
||||||
|
{
|
||||||
|
thrust = true;
|
||||||
|
boostup = true;
|
||||||
|
// Play climb-up animation here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Trying to climb down past the upper texture area
|
||||||
|
if ((ceilingheight <= player->mo->z) && ((player->mo->z + player->mo->momz) <= ceilingheight))
|
||||||
|
{
|
||||||
|
boolean foundfof = false;
|
||||||
|
floorclimb = true;
|
||||||
|
|
||||||
|
// Is there a FOF directly below that we can move onto?
|
||||||
|
if (glidesector->sector->ffloors)
|
||||||
|
{
|
||||||
|
ffloor_t *rover;
|
||||||
|
for (rover = glidesector->sector->ffloors; rover; rover = rover->next)
|
||||||
|
{
|
||||||
|
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (*rover->topheight > ceilingheight - FixedMul(16*FRACUNIT, player->mo->scale))
|
||||||
|
{
|
||||||
|
foundfof = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundfof)
|
||||||
|
player->mo->momz = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow climbing from a FOF or lower texture onto the upper texture and vice versa.
|
||||||
|
if (player->mo->z > ceilingheight - FixedMul(16*FRACUNIT, player->mo->scale))
|
||||||
|
{
|
||||||
|
floorclimb = true;
|
||||||
|
thrust = false;
|
||||||
|
boostup = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reached the top of the lower texture area
|
||||||
|
if (!floorclimb && floorheight < player->mo->z + FixedMul(16*FRACUNIT, player->mo->scale)
|
||||||
|
&& (glidesector->sector->ceilingpic == skyflatnum || ceilingheight > (player->mo->z + player->mo->height + FixedMul(8*FRACUNIT, player->mo->scale))))
|
||||||
|
{
|
||||||
|
thrust = true;
|
||||||
|
boostup = true;
|
||||||
|
// Play climb-up animation here
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reached the top of the lower texture area
|
// Trying to climb on the sky
|
||||||
if (!floorclimb && ceilingheight > player->mo->z + player->mo->height - FixedMul(16*FRACUNIT, player->mo->scale)
|
if ((ceilingheight < player->mo->z) && glidesector->sector->ceilingpic == skyflatnum)
|
||||||
&& (glidesector->sector->ceilingpic == skyflatnum || floorheight < (player->mo->z - FixedMul(8*FRACUNIT, player->mo->scale))))
|
|
||||||
{
|
{
|
||||||
thrust = true;
|
skyclimber = true;
|
||||||
boostup = true;
|
}
|
||||||
// Play climb-up animation here
|
|
||||||
|
// Climbing on the lower texture area?
|
||||||
|
if ((!(player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z + FixedMul(16*FRACUNIT, player->mo->scale) < floorheight)
|
||||||
|
|| ((player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z + player->mo->height <= floorheight))
|
||||||
|
{
|
||||||
|
floorclimb = true;
|
||||||
|
|
||||||
|
if (glidesector->sector->floorspeed)
|
||||||
|
{
|
||||||
|
if (cmd->forwardmove != 0)
|
||||||
|
player->mo->momz += glidesector->sector->floorspeed;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player->mo->momz = glidesector->sector->floorspeed;
|
||||||
|
climb = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Climbing on the upper texture area?
|
||||||
|
else if ((!(player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z >= ceilingheight)
|
||||||
|
|| ((player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z + player->mo->height - FixedMul(16*FRACUNIT, player->mo->scale) > ceilingheight))
|
||||||
|
{
|
||||||
|
floorclimb = true;
|
||||||
|
|
||||||
|
if (glidesector->sector->ceilspeed)
|
||||||
|
{
|
||||||
|
if (cmd->forwardmove != 0)
|
||||||
|
player->mo->momz += glidesector->sector->ceilspeed;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player->mo->momz = glidesector->sector->ceilspeed;
|
||||||
|
climb = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
// Trying to climb down past the upper texture area
|
|
||||||
if ((ceilingheight <= player->mo->z) && ((player->mo->z + player->mo->momz) <= ceilingheight))
|
|
||||||
{
|
|
||||||
boolean foundfof = false;
|
|
||||||
floorclimb = true;
|
|
||||||
|
|
||||||
// Is there a FOF directly below that we can move onto?
|
|
||||||
if (glidesector->sector->ffloors)
|
|
||||||
{
|
|
||||||
ffloor_t *rover;
|
|
||||||
for (rover = glidesector->sector->ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (*rover->topheight > ceilingheight - FixedMul(16*FRACUNIT, player->mo->scale))
|
|
||||||
{
|
|
||||||
foundfof = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!foundfof)
|
|
||||||
player->mo->momz = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow climbing from a FOF or lower texture onto the upper texture and vice versa.
|
|
||||||
if (player->mo->z > ceilingheight - FixedMul(16*FRACUNIT, player->mo->scale))
|
|
||||||
{
|
|
||||||
floorclimb = true;
|
|
||||||
thrust = false;
|
|
||||||
boostup = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reached the top of the lower texture area
|
|
||||||
if (!floorclimb && floorheight < player->mo->z + FixedMul(16*FRACUNIT, player->mo->scale)
|
|
||||||
&& (glidesector->sector->ceilingpic == skyflatnum || ceilingheight > (player->mo->z + player->mo->height + FixedMul(8*FRACUNIT, player->mo->scale))))
|
|
||||||
{
|
|
||||||
thrust = true;
|
|
||||||
boostup = true;
|
|
||||||
// Play climb-up animation here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trying to climb on the sky
|
|
||||||
if ((ceilingheight < player->mo->z) && glidesector->sector->ceilingpic == skyflatnum)
|
|
||||||
{
|
|
||||||
skyclimber = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Climbing on the lower texture area?
|
|
||||||
if ((!(player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z + FixedMul(16*FRACUNIT, player->mo->scale) < floorheight)
|
|
||||||
|| ((player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z + player->mo->height <= floorheight))
|
|
||||||
{
|
|
||||||
floorclimb = true;
|
floorclimb = true;
|
||||||
|
|
||||||
if (glidesector->sector->floorspeed)
|
|
||||||
{
|
|
||||||
if (cmd->forwardmove != 0)
|
|
||||||
player->mo->momz += glidesector->sector->floorspeed;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player->mo->momz = glidesector->sector->floorspeed;
|
|
||||||
climb = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Climbing on the upper texture area?
|
|
||||||
else if ((!(player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z >= ceilingheight)
|
|
||||||
|| ((player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z + player->mo->height - FixedMul(16*FRACUNIT, player->mo->scale) > ceilingheight))
|
|
||||||
{
|
|
||||||
floorclimb = true;
|
|
||||||
|
|
||||||
if (glidesector->sector->ceilspeed)
|
|
||||||
{
|
|
||||||
if (cmd->forwardmove != 0)
|
|
||||||
player->mo->momz += glidesector->sector->ceilspeed;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player->mo->momz = glidesector->sector->ceilspeed;
|
|
||||||
climb = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player->lastsidehit != -1 && player->lastlinehit != -1)
|
if (player->lastsidehit != -1 && player->lastlinehit != -1)
|
||||||
{
|
{
|
||||||
thinker_t *think;
|
thinker_t *think;
|
||||||
|
@ -2833,94 +2834,20 @@ static boolean PIT_CheckSolidsTeeter(mobj_t *thing)
|
||||||
//
|
//
|
||||||
static void P_DoTeeter(player_t *player)
|
static void P_DoTeeter(player_t *player)
|
||||||
{
|
{
|
||||||
msecnode_t *node;
|
|
||||||
boolean teeter = false;
|
boolean teeter = false;
|
||||||
boolean roverfloor; // solid 3d floors?
|
boolean roverfloor; // solid 3d floors?
|
||||||
boolean checkedforteeter = false;
|
fixed_t floorheight, ceilingheight;
|
||||||
|
fixed_t topheight, bottomheight; // for 3d floor usage
|
||||||
const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter.
|
const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter.
|
||||||
|
|
||||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
if (player->mo->standingslope && player->mo->standingslope->zdelta >= (FRACUNIT/2)) // Always teeter if the slope is too steep.
|
||||||
|
teeter = true;
|
||||||
|
else // Let's do some checks...
|
||||||
{
|
{
|
||||||
// Ledge teetering. Check if any nearby sectors are low enough from your current one.
|
|
||||||
checkedforteeter = true;
|
|
||||||
roverfloor = false;
|
|
||||||
if (node->m_sector->ffloors)
|
|
||||||
{
|
|
||||||
ffloor_t *rover;
|
|
||||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
|
||||||
{
|
|
||||||
if (!(rover->flags & FF_EXISTS)) continue;
|
|
||||||
|
|
||||||
if (P_CheckSolidLava(player->mo, rover))
|
|
||||||
;
|
|
||||||
else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND))
|
|
||||||
continue; // intangible 3d floor
|
|
||||||
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
{
|
|
||||||
if (*rover->bottomheight > node->m_sector->ceilingheight) // Above the ceiling
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (*rover->bottomheight > player->mo->z + player->mo->height + tiptop
|
|
||||||
|| (*rover->topheight < player->mo->z
|
|
||||||
&& player->mo->z + player->mo->height < node->m_sector->ceilingheight - tiptop))
|
|
||||||
{
|
|
||||||
teeter = true;
|
|
||||||
roverfloor = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
teeter = false;
|
|
||||||
roverfloor = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (*rover->topheight < node->m_sector->floorheight) // Below the floor
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (*rover->topheight < player->mo->z - tiptop
|
|
||||||
|| (*rover->bottomheight > player->mo->z + player->mo->height
|
|
||||||
&& player->mo->z > node->m_sector->floorheight + tiptop))
|
|
||||||
{
|
|
||||||
teeter = true;
|
|
||||||
roverfloor = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
teeter = false;
|
|
||||||
roverfloor = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!teeter && !roverfloor)
|
|
||||||
{
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
{
|
|
||||||
if (node->m_sector->ceilingheight > player->mo->z + player->mo->height + tiptop)
|
|
||||||
teeter = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (node->m_sector->floorheight < player->mo->z - tiptop)
|
|
||||||
teeter = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (checkedforteeter && !teeter) // Backup code
|
|
||||||
{
|
|
||||||
subsector_t *subsec[4]; // changed abcd into array instead
|
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
|
sector_t *sec;
|
||||||
subsec[0] = R_PointInSubsector(player->mo->x + FixedMul(5*FRACUNIT, player->mo->scale), player->mo->y + FixedMul(5*FRACUNIT, player->mo->scale));
|
fixed_t highestceilingheight = INT32_MIN;
|
||||||
subsec[1] = R_PointInSubsector(player->mo->x - FixedMul(5*FRACUNIT, player->mo->scale), player->mo->y + FixedMul(5*FRACUNIT, player->mo->scale));
|
fixed_t lowestfloorheight = INT32_MAX;
|
||||||
subsec[2] = R_PointInSubsector(player->mo->x + FixedMul(5*FRACUNIT, player->mo->scale), player->mo->y - FixedMul(5*FRACUNIT, player->mo->scale));
|
|
||||||
subsec[3] = R_PointInSubsector(player->mo->x - FixedMul(5*FRACUNIT, player->mo->scale), player->mo->y - FixedMul(5*FRACUNIT, player->mo->scale));
|
|
||||||
|
|
||||||
teeter = false;
|
teeter = false;
|
||||||
roverfloor = false;
|
roverfloor = false;
|
||||||
|
@ -2928,13 +2855,43 @@ static void P_DoTeeter(player_t *player)
|
||||||
{
|
{
|
||||||
ffloor_t *rover;
|
ffloor_t *rover;
|
||||||
|
|
||||||
if (!(subsec[i]->sector->ffloors))
|
#define xsign ((i & 1) ? -1 : 1) // 0 -> 1 | 1 -> -1 | 2 -> 1 | 3 -> -1
|
||||||
|
#define ysign ((i & 2) ? 1 : -1) // 0 -> 1 | 1 -> 1 | 2 -> -1 | 3 -> -1
|
||||||
|
fixed_t checkx = player->mo->x + (xsign*FixedMul(5*FRACUNIT, player->mo->scale));
|
||||||
|
fixed_t checky = player->mo->y + (ysign*FixedMul(5*FRACUNIT, player->mo->scale));
|
||||||
|
#undef xsign
|
||||||
|
#undef ysign
|
||||||
|
|
||||||
|
sec = R_PointInSubsector(checkx, checky)->sector;
|
||||||
|
|
||||||
|
ceilingheight = sec->ceilingheight;
|
||||||
|
floorheight = sec->floorheight;
|
||||||
|
#ifdef ESLOPE
|
||||||
|
if (sec->c_slope)
|
||||||
|
ceilingheight = P_GetZAt(sec->c_slope, checkx, checky);
|
||||||
|
if (sec->f_slope)
|
||||||
|
floorheight = P_GetZAt(sec->f_slope, checkx, checky);
|
||||||
|
#endif
|
||||||
|
highestceilingheight = (ceilingheight > highestceilingheight) ? ceilingheight : highestceilingheight;
|
||||||
|
lowestfloorheight = (floorheight < lowestfloorheight) ? floorheight : lowestfloorheight;
|
||||||
|
|
||||||
|
if (!(sec->ffloors))
|
||||||
continue; // move on to the next subsector
|
continue; // move on to the next subsector
|
||||||
|
|
||||||
for (rover = subsec[i]->sector->ffloors; rover; rover = rover->next)
|
for (rover = sec->ffloors; rover; rover = rover->next)
|
||||||
{
|
{
|
||||||
if (!(rover->flags & FF_EXISTS)) continue;
|
if (!(rover->flags & FF_EXISTS)) continue;
|
||||||
|
|
||||||
|
topheight = *rover->topheight;
|
||||||
|
bottomheight = *rover->bottomheight;
|
||||||
|
|
||||||
|
#ifdef ESLOPE
|
||||||
|
if (*rover->t_slope)
|
||||||
|
topheight = P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y);
|
||||||
|
if (*rover->b_slope)
|
||||||
|
bottomheight = P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (P_CheckSolidLava(player->mo, rover))
|
if (P_CheckSolidLava(player->mo, rover))
|
||||||
;
|
;
|
||||||
else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND))
|
else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND))
|
||||||
|
@ -2942,12 +2899,12 @@ static void P_DoTeeter(player_t *player)
|
||||||
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||||
{
|
{
|
||||||
if (*rover->bottomheight > subsec[i]->sector->ceilingheight) // Above the ceiling
|
if (bottomheight > ceilingheight) // Above the ceiling
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (*rover->bottomheight > player->mo->z + player->mo->height + tiptop
|
if (bottomheight > player->mo->z + player->mo->height + tiptop
|
||||||
|| (*rover->topheight < player->mo->z
|
|| (topheight < player->mo->z
|
||||||
&& player->mo->z + player->mo->height < subsec[i]->sector->ceilingheight - tiptop))
|
&& player->mo->z + player->mo->height < ceilingheight - tiptop))
|
||||||
{
|
{
|
||||||
teeter = true;
|
teeter = true;
|
||||||
roverfloor = true;
|
roverfloor = true;
|
||||||
|
@ -2961,12 +2918,12 @@ static void P_DoTeeter(player_t *player)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (*rover->topheight < subsec[i]->sector->floorheight) // Below the floor
|
if (topheight < floorheight) // Below the floor
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (*rover->topheight < player->mo->z - tiptop
|
if (topheight < player->mo->z - tiptop
|
||||||
|| (*rover->bottomheight > player->mo->z + player->mo->height
|
|| (bottomheight > player->mo->z + player->mo->height
|
||||||
&& player->mo->z > subsec[i]->sector->floorheight + tiptop))
|
&& player->mo->z > floorheight + tiptop))
|
||||||
{
|
{
|
||||||
teeter = true;
|
teeter = true;
|
||||||
roverfloor = true;
|
roverfloor = true;
|
||||||
|
@ -2984,18 +2941,12 @@ static void P_DoTeeter(player_t *player)
|
||||||
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
if (player->mo->eflags & MFE_VERTICALFLIP)
|
||||||
{
|
{
|
||||||
if (!teeter && !roverfloor && (subsec[0]->sector->ceilingheight > player->mo->ceilingz + tiptop
|
if (!teeter && !roverfloor && (highestceilingheight > player->mo->ceilingz + tiptop))
|
||||||
|| subsec[1]->sector->ceilingheight > player->mo->ceilingz + tiptop
|
|
||||||
|| subsec[2]->sector->ceilingheight > player->mo->ceilingz + tiptop
|
|
||||||
|| subsec[3]->sector->ceilingheight > player->mo->ceilingz + tiptop))
|
|
||||||
teeter = true;
|
teeter = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!teeter && !roverfloor && (subsec[0]->sector->floorheight < player->mo->floorz - tiptop
|
if (!teeter && !roverfloor && (lowestfloorheight < player->mo->floorz - tiptop))
|
||||||
|| subsec[1]->sector->floorheight < player->mo->floorz - tiptop
|
|
||||||
|| subsec[2]->sector->floorheight < player->mo->floorz - tiptop
|
|
||||||
|| subsec[3]->sector->floorheight < player->mo->floorz - tiptop))
|
|
||||||
teeter = true;
|
teeter = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3131,7 +3082,7 @@ teeterdone:
|
||||||
if (player->panim == PA_IDLE)
|
if (player->panim == PA_IDLE)
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_EDGE);
|
P_SetPlayerMobjState(player->mo, S_PLAY_EDGE);
|
||||||
}
|
}
|
||||||
else if (checkedforteeter && player->panim == PA_EDGE)
|
else if (player->panim == PA_EDGE)
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
|
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3490,6 +3441,9 @@ static void P_DoSuperStuff(player_t *player)
|
||||||
case S_PLAY_SUPER_RUN:
|
case S_PLAY_SUPER_RUN:
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_RUN);
|
P_SetPlayerMobjState(player->mo, S_PLAY_RUN);
|
||||||
break;
|
break;
|
||||||
|
case S_PLAY_SUPER_PEEL:
|
||||||
|
P_SetPlayerMobjState(player->mo, S_PLAY_PEEL);
|
||||||
|
break;
|
||||||
case S_PLAY_SUPER_PAIN:
|
case S_PLAY_SUPER_PAIN:
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_PAIN);
|
P_SetPlayerMobjState(player->mo, S_PLAY_PAIN);
|
||||||
break;
|
break;
|
||||||
|
@ -3744,7 +3698,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd)
|
||||||
{
|
{
|
||||||
if ((cmd->buttons & BT_USE) && player->speed < FixedMul(5<<FRACBITS, player->mo->scale) && !player->mo->momz && onground && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING)
|
if ((cmd->buttons & BT_USE) && player->speed < FixedMul(5<<FRACBITS, player->mo->scale) && !player->mo->momz && onground && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING)
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
&& (!player->mo->standingslope || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
&& (!player->mo->standingslope || (player->mo->standingslope->flags & SL_NOPHYSICS) || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -3780,7 +3734,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd)
|
||||||
else if ((cmd->buttons & BT_USE || ((twodlevel || (player->mo->flags2 & MF2_TWOD)) && cmd->forwardmove < -20))
|
else if ((cmd->buttons & BT_USE || ((twodlevel || (player->mo->flags2 & MF2_TWOD)) && cmd->forwardmove < -20))
|
||||||
&& !player->climbing && !player->mo->momz && onground && (player->speed > FixedMul(5<<FRACBITS, player->mo->scale)
|
&& !player->climbing && !player->mo->momz && onground && (player->speed > FixedMul(5<<FRACBITS, player->mo->scale)
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
|| (player->mo->standingslope && abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)
|
|| (player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)
|
||||||
#endif
|
#endif
|
||||||
) && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING))
|
) && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING))
|
||||||
{
|
{
|
||||||
|
@ -3796,7 +3750,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd)
|
||||||
if (onground && player->pflags & PF_SPINNING && !(player->pflags & PF_STARTDASH)
|
if (onground && player->pflags & PF_SPINNING && !(player->pflags & PF_STARTDASH)
|
||||||
&& player->speed < FixedMul(5*FRACUNIT,player->mo->scale)
|
&& player->speed < FixedMul(5*FRACUNIT,player->mo->scale)
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
&& (!player->mo->standingslope || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
&& (!player->mo->standingslope || (player->mo->standingslope->flags & SL_NOPHYSICS) || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -4036,19 +3990,26 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
||||||
case CA_THOK:
|
case CA_THOK:
|
||||||
case CA_HOMINGTHOK:
|
case CA_HOMINGTHOK:
|
||||||
case CA_JUMPTHOK: // Credit goes to CZ64 and Sryder13 for the original
|
case CA_JUMPTHOK: // Credit goes to CZ64 and Sryder13 for the original
|
||||||
|
case CA_DASHMODE: // Credit goes to Iceman404
|
||||||
// Now it's Sonic's abilities turn!
|
// Now it's Sonic's abilities turn!
|
||||||
// THOK!
|
// THOK!
|
||||||
if (!(player->pflags & PF_THOKKED) || (player->charability2 == CA2_MULTIABILITY))
|
if (!(player->pflags & PF_THOKKED) || (player->charability2 == CA2_MULTIABILITY))
|
||||||
{
|
{
|
||||||
// Catapult the player
|
// Catapult the player
|
||||||
fixed_t actionspd = player->actionspd;
|
fixed_t actionspd = player->actionspd;
|
||||||
|
|
||||||
|
if (player->charability == CA_DASHMODE)
|
||||||
|
actionspd = max(player->normalspeed, FixedDiv(player->speed, player->mo->scale));
|
||||||
|
|
||||||
if (player->mo->eflags & MFE_UNDERWATER)
|
if (player->mo->eflags & MFE_UNDERWATER)
|
||||||
actionspd >>= 1;
|
actionspd >>= 1;
|
||||||
|
|
||||||
if ((player->charability == CA_JUMPTHOK) && !(player->pflags & PF_THOKKED))
|
if ((player->charability == CA_JUMPTHOK) && !(player->pflags & PF_THOKKED))
|
||||||
{
|
{
|
||||||
player->pflags &= ~PF_JUMPED;
|
player->pflags &= ~PF_JUMPED;
|
||||||
P_DoJump(player, false);
|
P_DoJump(player, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(actionspd, player->mo->scale));
|
P_InstaThrust(player->mo, player->mo->angle, FixedMul(actionspd, player->mo->scale));
|
||||||
|
|
||||||
if (maptol & TOL_2D)
|
if (maptol & TOL_2D)
|
||||||
|
@ -4801,7 +4762,7 @@ static void P_3dMovement(player_t *player)
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if ((totalthrust.x || totalthrust.y)
|
if ((totalthrust.x || totalthrust.y)
|
||||||
&& player->mo->standingslope && abs(player->mo->standingslope->zdelta) > FRACUNIT/2) {
|
&& player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) > FRACUNIT/2) {
|
||||||
// Factor thrust to slope, but only for the part pushing up it!
|
// Factor thrust to slope, but only for the part pushing up it!
|
||||||
// The rest is unaffected.
|
// The rest is unaffected.
|
||||||
angle_t thrustangle = R_PointToAngle2(0, 0, totalthrust.x, totalthrust.y)-player->mo->standingslope->xydirection;
|
angle_t thrustangle = R_PointToAngle2(0, 0, totalthrust.x, totalthrust.y)-player->mo->standingslope->xydirection;
|
||||||
|
@ -6502,9 +6463,12 @@ static void P_MovePlayer(player_t *player)
|
||||||
|
|
||||||
if ((cmd->forwardmove != 0 || cmd->sidemove != 0) || (player->powers[pw_super] && !onground))
|
if ((cmd->forwardmove != 0 || cmd->sidemove != 0) || (player->powers[pw_super] && !onground))
|
||||||
{
|
{
|
||||||
|
// If the player is in dashmode, here's their peelout.
|
||||||
|
if (player->charability == CA_DASHMODE && player->dashmode >= 3*TICRATE && player->panim == PA_RUN && !player->skidtime && (onground || player->powers[pw_super]))
|
||||||
|
P_SetPlayerMobjState (player->mo, S_PLAY_PEEL);
|
||||||
// If the player is moving fast enough,
|
// If the player is moving fast enough,
|
||||||
// break into a run!
|
// break into a run!
|
||||||
if (player->speed >= runspd && player->panim == PA_WALK && !player->skidtime && (onground || player->powers[pw_super]))
|
else if (player->speed >= runspd && player->panim == PA_WALK && !player->skidtime && (onground || player->powers[pw_super]))
|
||||||
P_SetPlayerMobjState (player->mo, S_PLAY_RUN);
|
P_SetPlayerMobjState (player->mo, S_PLAY_RUN);
|
||||||
|
|
||||||
// Super floating at slow speeds has its own special animation.
|
// Super floating at slow speeds has its own special animation.
|
||||||
|
@ -6516,6 +6480,11 @@ static void P_MovePlayer(player_t *player)
|
||||||
P_SetPlayerMobjState (player->mo, S_PLAY_WALK);
|
P_SetPlayerMobjState (player->mo, S_PLAY_WALK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If your peelout animation is playing, and you're
|
||||||
|
// going too slow, switch back to the run.
|
||||||
|
if (player->panim == PA_PEEL && player->dashmode < 3*TICRATE)
|
||||||
|
P_SetPlayerMobjState(player->mo, S_PLAY_RUN);
|
||||||
|
|
||||||
// If your running animation is playing, and you're
|
// If your running animation is playing, and you're
|
||||||
// going too slow, switch back to the walking frames.
|
// going too slow, switch back to the walking frames.
|
||||||
if (player->panim == PA_RUN && player->speed < runspd)
|
if (player->panim == PA_RUN && player->speed < runspd)
|
||||||
|
@ -6848,7 +6817,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
// Otherwise, face the direction you're travelling.
|
// Otherwise, face the direction you're travelling.
|
||||||
else if (player->panim == PA_WALK || player->panim == PA_RUN || player->panim == PA_ROLL || player->panim == PA_JUMP
|
else if (player->panim == PA_WALK || player->panim == PA_RUN || player->panim == PA_PEEL || player->panim == PA_ROLL || player->panim == PA_JUMP
|
||||||
|| (player->mo->state-states == S_PLAY_FLY || player->mo->state-states == S_PLAY_FLY_TIRED))
|
|| (player->mo->state-states == S_PLAY_FLY || player->mo->state-states == S_PLAY_FLY_TIRED))
|
||||||
player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
|
player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
|
||||||
|
|
||||||
|
@ -7070,7 +7039,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
player->mo->y += player->mo->momy;
|
player->mo->y += player->mo->momy;
|
||||||
P_SetThingPosition(player->mo);
|
P_SetThingPosition(player->mo);
|
||||||
|
|
||||||
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
|
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
if (!node->m_sector)
|
if (!node->m_sector)
|
||||||
break;
|
break;
|
||||||
|
@ -9168,6 +9137,49 @@ void P_PlayerThink(player_t *player)
|
||||||
|
|
||||||
player->pflags &= ~PF_SLIDING;
|
player->pflags &= ~PF_SLIDING;
|
||||||
|
|
||||||
|
#define dashmode player->dashmode
|
||||||
|
// Dash mode ability for Metal Sonic
|
||||||
|
if ((player->charability == CA_DASHMODE) && !(maptol & TOL_NIGHTS)) // woo, dashmode! no nights tho.
|
||||||
|
{
|
||||||
|
if (player->speed >= FixedMul(player->runspeed, player->mo->scale) || (player->pflags & PF_STARTDASH))
|
||||||
|
{
|
||||||
|
dashmode++; // Counter. Adds 1 to dash mode per tic in top speed.
|
||||||
|
if (dashmode == 3*TICRATE) // This isn't in the ">=" equation because it'd cause the sound to play infinitely.
|
||||||
|
S_StartSound(player->mo, sfx_s3ka2); // If the player enters dashmode, play this sound on the the tic it starts.
|
||||||
|
}
|
||||||
|
else if (!(player->pflags & PF_SPINNING))
|
||||||
|
{
|
||||||
|
if (dashmode > 3)
|
||||||
|
dashmode -= 3; // Rather than lose it all, it gently counts back down!
|
||||||
|
else
|
||||||
|
dashmode = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dashmode < 3*TICRATE) // Exits Dash Mode if you drop below speed/dash counter tics. Not in the above block so it doesn't keep disabling in midair.
|
||||||
|
{
|
||||||
|
player->normalspeed = skins[player->skin].normalspeed; // Reset to default if not capable of entering dash mode.
|
||||||
|
player->jumpfactor = skins[player->skin].jumpfactor;
|
||||||
|
}
|
||||||
|
else if (P_IsObjectOnGround(player->mo)) // Activate dash mode if we're on the ground.
|
||||||
|
{
|
||||||
|
if (player->normalspeed < skins[player->skin].actionspd) // If the player normalspeed is not currently at actionspd in dash mode, add speed each tic
|
||||||
|
player->normalspeed = player->normalspeed + 1*FRACUNIT/5; // Enter Dash Mode smoothly.
|
||||||
|
|
||||||
|
if (player->jumpfactor < FixedMul(skins[player->skin].jumpfactor, 5*FRACUNIT/4)) // Boost jump height.
|
||||||
|
player->jumpfactor = player->jumpfactor + 1*FRACUNIT/300;
|
||||||
|
}
|
||||||
|
|
||||||
|
dashmode = min(dashmode, 3*TICRATE + 3);
|
||||||
|
|
||||||
|
if (player->normalspeed >= skins[player->skin].actionspd)
|
||||||
|
{
|
||||||
|
mobj_t *ghost = P_SpawnGhostMobj(player->mo); // Spawns afterimages
|
||||||
|
ghost->fuse = 2; // Makes the images fade quickly
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
dashmode = 0;
|
||||||
|
#undef dashmode
|
||||||
/*
|
/*
|
||||||
// Colormap verification
|
// Colormap verification
|
||||||
{
|
{
|
||||||
|
|
20
src/r_defs.h
20
src/r_defs.h
|
@ -500,10 +500,10 @@ typedef struct subsector_s
|
||||||
// Sector list node showing all sectors an object appears in.
|
// Sector list node showing all sectors an object appears in.
|
||||||
//
|
//
|
||||||
// There are two threads that flow through these nodes. The first thread
|
// There are two threads that flow through these nodes. The first thread
|
||||||
// starts at touching_thinglist in a sector_t and flows through the m_snext
|
// starts at touching_thinglist in a sector_t and flows through the m_thinglist_next
|
||||||
// links to find all mobjs that are entirely or partially in the sector.
|
// links to find all mobjs that are entirely or partially in the sector.
|
||||||
// The second thread starts at touching_sectorlist in an mobj_t and flows
|
// The second thread starts at touching_sectorlist in an mobj_t and flows
|
||||||
// through the m_tnext links to find all sectors a thing touches. This is
|
// through the m_sectorlist_next links to find all sectors a thing touches. This is
|
||||||
// useful when applying friction or push effects to sectors. These effects
|
// useful when applying friction or push effects to sectors. These effects
|
||||||
// can be done as thinkers that act upon all objects touching their sectors.
|
// can be done as thinkers that act upon all objects touching their sectors.
|
||||||
// As an mobj moves through the world, these nodes are created and
|
// As an mobj moves through the world, these nodes are created and
|
||||||
|
@ -515,10 +515,10 @@ typedef struct msecnode_s
|
||||||
{
|
{
|
||||||
sector_t *m_sector; // a sector containing this object
|
sector_t *m_sector; // a sector containing this object
|
||||||
struct mobj_s *m_thing; // this object
|
struct mobj_s *m_thing; // this object
|
||||||
struct msecnode_s *m_tprev; // prev msecnode_t for this thing
|
struct msecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing
|
||||||
struct msecnode_s *m_tnext; // next msecnode_t for this thing
|
struct msecnode_s *m_sectorlist_next; // next msecnode_t for this thing
|
||||||
struct msecnode_s *m_sprev; // prev msecnode_t for this sector
|
struct msecnode_s *m_thinglist_prev; // prev msecnode_t for this sector
|
||||||
struct msecnode_s *m_snext; // next msecnode_t for this sector
|
struct msecnode_s *m_thinglist_next; // next msecnode_t for this sector
|
||||||
boolean visited; // used in search algorithms
|
boolean visited; // used in search algorithms
|
||||||
} msecnode_t;
|
} msecnode_t;
|
||||||
|
|
||||||
|
@ -526,10 +526,10 @@ typedef struct mprecipsecnode_s
|
||||||
{
|
{
|
||||||
sector_t *m_sector; // a sector containing this object
|
sector_t *m_sector; // a sector containing this object
|
||||||
struct precipmobj_s *m_thing; // this object
|
struct precipmobj_s *m_thing; // this object
|
||||||
struct mprecipsecnode_s *m_tprev; // prev msecnode_t for this thing
|
struct mprecipsecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing
|
||||||
struct mprecipsecnode_s *m_tnext; // next msecnode_t for this thing
|
struct mprecipsecnode_s *m_sectorlist_next; // next msecnode_t for this thing
|
||||||
struct mprecipsecnode_s *m_sprev; // prev msecnode_t for this sector
|
struct mprecipsecnode_s *m_thinglist_prev; // prev msecnode_t for this sector
|
||||||
struct mprecipsecnode_s *m_snext; // next msecnode_t for this sector
|
struct mprecipsecnode_s *m_thinglist_next; // next msecnode_t for this sector
|
||||||
boolean visited; // used in search algorithms
|
boolean visited; // used in search algorithms
|
||||||
} mprecipsecnode_t;
|
} mprecipsecnode_t;
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ extern lighttable_t **planezlight;
|
||||||
extern fixed_t *yslope;
|
extern fixed_t *yslope;
|
||||||
extern fixed_t distscale[MAXVIDWIDTH];
|
extern fixed_t distscale[MAXVIDWIDTH];
|
||||||
|
|
||||||
void R_InitPlanes(void);
|
FUNCMATH void R_InitPlanes(void);
|
||||||
void R_PortalStoreClipValues(INT32 start, INT32 end, INT16 *ceil, INT16 *floor, fixed_t *scale);
|
void R_PortalStoreClipValues(INT32 start, INT32 end, INT16 *ceil, INT16 *floor, fixed_t *scale);
|
||||||
void R_PortalRestoreClipValues(INT32 start, INT32 end, INT16 *ceil, INT16 *floor, fixed_t *scale);
|
void R_PortalRestoreClipValues(INT32 start, INT32 end, INT16 *ceil, INT16 *floor, fixed_t *scale);
|
||||||
void R_ClearPlanes(void);
|
void R_ClearPlanes(void);
|
||||||
|
|
119
src/r_segs.c
119
src/r_segs.c
|
@ -1453,34 +1453,45 @@ static void R_RenderSegLoop (void)
|
||||||
frontscale[rw_x] = rw_scale;
|
frontscale[rw_x] = rw_scale;
|
||||||
|
|
||||||
// draw the wall tiers
|
// draw the wall tiers
|
||||||
if (midtexture && yl <= yh && yh < vid.height && yh > 0)
|
if (midtexture)
|
||||||
{
|
{
|
||||||
// single sided line
|
// single sided line
|
||||||
dc_yl = yl;
|
if (yl <= yh && yh >= 0 && yl < viewheight)
|
||||||
dc_yh = yh;
|
{
|
||||||
dc_texturemid = rw_midtexturemid;
|
dc_yl = yl;
|
||||||
dc_source = R_GetColumn(midtexture,texturecolumn);
|
dc_yh = yh;
|
||||||
dc_texheight = textureheight[midtexture]>>FRACBITS;
|
dc_texturemid = rw_midtexturemid;
|
||||||
|
dc_source = R_GetColumn(midtexture,texturecolumn);
|
||||||
|
dc_texheight = textureheight[midtexture]>>FRACBITS;
|
||||||
|
|
||||||
//profile stuff ---------------------------------------------------------
|
//profile stuff ---------------------------------------------------------
|
||||||
#ifdef TIMING
|
#ifdef TIMING
|
||||||
ProfZeroTimer();
|
ProfZeroTimer();
|
||||||
#endif
|
#endif
|
||||||
colfunc();
|
colfunc();
|
||||||
#ifdef TIMING
|
#ifdef TIMING
|
||||||
RDMSR(0x10,&mycount);
|
RDMSR(0x10,&mycount);
|
||||||
mytotal += mycount; //64bit add
|
mytotal += mycount; //64bit add
|
||||||
|
|
||||||
if (nombre--==0)
|
if (nombre--==0)
|
||||||
I_Error("R_DrawColumn CPU Spy reports: 0x%d %d\n", *((INT32 *)&mytotal+1),
|
I_Error("R_DrawColumn CPU Spy reports: 0x%d %d\n", *((INT32 *)&mytotal+1),
|
||||||
(INT32)mytotal);
|
(INT32)mytotal);
|
||||||
#endif
|
#endif
|
||||||
//profile stuff ---------------------------------------------------------
|
//profile stuff ---------------------------------------------------------
|
||||||
|
|
||||||
// dont draw anything more for this column, since
|
// dont draw anything more for this column, since
|
||||||
// a midtexture blocks the view
|
// a midtexture blocks the view
|
||||||
ceilingclip[rw_x] = (INT16)viewheight;
|
ceilingclip[rw_x] = (INT16)viewheight;
|
||||||
floorclip[rw_x] = -1;
|
floorclip[rw_x] = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// note: don't use min/max macros, since casting from INT32 to INT16 is involved here
|
||||||
|
if (markceiling)
|
||||||
|
ceilingclip[rw_x] = (yh >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1;
|
||||||
|
if (markfloor)
|
||||||
|
floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1494,21 +1505,28 @@ static void R_RenderSegLoop (void)
|
||||||
if (mid >= floorclip[rw_x])
|
if (mid >= floorclip[rw_x])
|
||||||
mid = floorclip[rw_x]-1;
|
mid = floorclip[rw_x]-1;
|
||||||
|
|
||||||
if (mid >= yl && yh < vid.height && yh > 0)
|
if (mid >= yl) // back ceiling lower than front ceiling ?
|
||||||
{
|
{
|
||||||
dc_yl = yl;
|
if (yl >= viewheight) // entirely off bottom of screen
|
||||||
dc_yh = mid;
|
ceilingclip[rw_x] = (INT16)viewheight;
|
||||||
dc_texturemid = rw_toptexturemid;
|
else if (mid >= 0) // safe to draw top texture
|
||||||
dc_source = R_GetColumn(toptexture,texturecolumn);
|
{
|
||||||
dc_texheight = textureheight[toptexture]>>FRACBITS;
|
dc_yl = yl;
|
||||||
colfunc();
|
dc_yh = mid;
|
||||||
ceilingclip[rw_x] = (INT16)mid;
|
dc_texturemid = rw_toptexturemid;
|
||||||
|
dc_source = R_GetColumn(toptexture,texturecolumn);
|
||||||
|
dc_texheight = textureheight[toptexture]>>FRACBITS;
|
||||||
|
colfunc();
|
||||||
|
ceilingclip[rw_x] = (INT16)mid;
|
||||||
|
}
|
||||||
|
else // entirely off top of screen
|
||||||
|
ceilingclip[rw_x] = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ceilingclip[rw_x] = (INT16)((INT16)yl - 1);
|
ceilingclip[rw_x] = (yh >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1;
|
||||||
}
|
}
|
||||||
else if (markceiling) // no top wall
|
else if (markceiling) // no top wall
|
||||||
ceilingclip[rw_x] = (INT16)((INT16)yl - 1);
|
ceilingclip[rw_x] = (yh >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1;
|
||||||
|
|
||||||
if (bottomtexture)
|
if (bottomtexture)
|
||||||
{
|
{
|
||||||
|
@ -1520,22 +1538,29 @@ static void R_RenderSegLoop (void)
|
||||||
if (mid <= ceilingclip[rw_x])
|
if (mid <= ceilingclip[rw_x])
|
||||||
mid = ceilingclip[rw_x]+1;
|
mid = ceilingclip[rw_x]+1;
|
||||||
|
|
||||||
if (mid <= yh && yh < vid.height && yh > 0)
|
if (mid <= yh) // back floor higher than front floor ?
|
||||||
{
|
{
|
||||||
dc_yl = mid;
|
if (yh < 0) // entirely off top of screen
|
||||||
dc_yh = yh;
|
floorclip[rw_x] = -1;
|
||||||
dc_texturemid = rw_bottomtexturemid;
|
else if (mid < viewheight) // safe to draw bottom texture
|
||||||
dc_source = R_GetColumn(bottomtexture,
|
{
|
||||||
texturecolumn);
|
dc_yl = mid;
|
||||||
dc_texheight = textureheight[bottomtexture]>>FRACBITS;
|
dc_yh = yh;
|
||||||
colfunc();
|
dc_texturemid = rw_bottomtexturemid;
|
||||||
floorclip[rw_x] = (INT16)mid;
|
dc_source = R_GetColumn(bottomtexture,
|
||||||
|
texturecolumn);
|
||||||
|
dc_texheight = textureheight[bottomtexture]>>FRACBITS;
|
||||||
|
colfunc();
|
||||||
|
floorclip[rw_x] = (INT16)mid;
|
||||||
|
}
|
||||||
|
else // entirely off bottom of screen
|
||||||
|
floorclip[rw_x] = (INT16)viewheight;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
floorclip[rw_x] = (INT16)((INT16)yh + 1);
|
floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight;
|
||||||
}
|
}
|
||||||
else if (markfloor) // no bottom wall
|
else if (markfloor) // no bottom wall
|
||||||
floorclip[rw_x] = (INT16)((INT16)yh + 1);
|
floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maskedtexture || numthicksides)
|
if (maskedtexture || numthicksides)
|
||||||
|
@ -1858,12 +1883,13 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
// a single sided line is terminal, so it must mark ends
|
// a single sided line is terminal, so it must mark ends
|
||||||
markfloor = markceiling = true;
|
markfloor = markceiling = true;
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (!(linedef->flags & ML_EFFECT1)) {
|
if (linedef->flags & ML_EFFECT2) {
|
||||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||||
rw_midtexturemid = frontsector->floorheight + textureheight[sidedef->midtexture] - viewz;
|
rw_midtexturemid = frontsector->floorheight + textureheight[sidedef->midtexture] - viewz;
|
||||||
else
|
else
|
||||||
rw_midtexturemid = frontsector->ceilingheight;
|
rw_midtexturemid = frontsector->ceilingheight - viewz;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||||
{
|
{
|
||||||
|
@ -2482,6 +2508,15 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
maskedtextureheight = ds_p->maskedtextureheight; // note to red, this == &(ds_p->maskedtextureheight[0])
|
maskedtextureheight = ds_p->maskedtextureheight; // note to red, this == &(ds_p->maskedtextureheight[0])
|
||||||
|
|
||||||
|
#ifdef POLYOBJECTS
|
||||||
|
if (curline->polyseg) { // use REAL front and back floors please, so midtexture rendering isn't mucked up
|
||||||
|
rw_midtextureslide = rw_midtexturebackslide = 0;
|
||||||
|
if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3))
|
||||||
|
rw_midtexturemid = rw_midtextureback = max(curline->frontsector->floorheight, curline->backsector->floorheight) - viewz;
|
||||||
|
else
|
||||||
|
rw_midtexturemid = rw_midtextureback = min(curline->frontsector->ceilingheight, curline->backsector->ceilingheight) - viewz;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
// Set midtexture starting height
|
// Set midtexture starting height
|
||||||
if (linedef->flags & ML_EFFECT2) { // Ignore slopes when texturing
|
if (linedef->flags & ML_EFFECT2) { // Ignore slopes when texturing
|
||||||
rw_midtextureslide = rw_midtexturebackslide = 0;
|
rw_midtextureslide = rw_midtexturebackslide = 0;
|
||||||
|
|
|
@ -63,7 +63,11 @@ typedef struct floorsplat_s
|
||||||
fixed_t P_SegLength(seg_t *seg);
|
fixed_t P_SegLength(seg_t *seg);
|
||||||
|
|
||||||
// call at P_SetupLevel()
|
// call at P_SetupLevel()
|
||||||
|
#if !(defined (WALLSPLATS) || defined (FLOORSPLATS))
|
||||||
|
FUNCMATH void R_ClearLevelSplats(void);
|
||||||
|
#else
|
||||||
void R_ClearLevelSplats(void);
|
void R_ClearLevelSplats(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WALLSPLATS
|
#ifdef WALLSPLATS
|
||||||
void R_AddWallSplat(line_t *wallline, INT16 sectorside, const char *patchname, fixed_t top,
|
void R_AddWallSplat(line_t *wallline, INT16 sectorside, const char *patchname, fixed_t top,
|
||||||
|
|
|
@ -1645,7 +1645,8 @@ void R_SortVisSprites(void)
|
||||||
// Fix first and last. ds still points to the last one after the loop
|
// Fix first and last. ds still points to the last one after the loop
|
||||||
dsfirst->prev = &unsorted;
|
dsfirst->prev = &unsorted;
|
||||||
unsorted.next = dsfirst;
|
unsorted.next = dsfirst;
|
||||||
ds->next = &unsorted;
|
if (ds)
|
||||||
|
ds->next = &unsorted;
|
||||||
unsorted.prev = ds;
|
unsorted.prev = ds;
|
||||||
|
|
||||||
// pull the vissprites out by scale
|
// pull the vissprites out by scale
|
||||||
|
|
|
@ -119,7 +119,7 @@ void S_ResumeAudio(void);
|
||||||
//
|
//
|
||||||
void S_UpdateSounds(void);
|
void S_UpdateSounds(void);
|
||||||
|
|
||||||
fixed_t S_CalculateSoundDistance(fixed_t px1, fixed_t py1, fixed_t pz1, fixed_t px2, fixed_t py2, fixed_t pz2);
|
FUNCMATH fixed_t S_CalculateSoundDistance(fixed_t px1, fixed_t py1, fixed_t pz1, fixed_t px2, fixed_t py2, fixed_t pz2);
|
||||||
|
|
||||||
void S_SetDigMusicVolume(INT32 volume);
|
void S_SetDigMusicVolume(INT32 volume);
|
||||||
void S_SetMIDIMusicVolume(INT32 volume);
|
void S_SetMIDIMusicVolume(INT32 volume);
|
||||||
|
|
|
@ -69,6 +69,13 @@ consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE, CV_Unsigned, NULL, 0, N
|
||||||
consvar_t cv_scr_depth = {"scr_depth", "16 bits", CV_SAVE, scr_depth_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_scr_depth = {"scr_depth", "16 bits", CV_SAVE, scr_depth_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
#endif
|
#endif
|
||||||
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
#ifdef DIRECTFULLSCREEN
|
||||||
|
static FUNCMATH void SCR_ChangeFullscreen (void);
|
||||||
|
#else
|
||||||
|
static void SCR_ChangeFullscreen (void);
|
||||||
|
#endif
|
||||||
|
|
||||||
consvar_t cv_fullscreen = {"fullscreen", "Yes", CV_SAVE|CV_CALL, CV_YesNo, SCR_ChangeFullscreen, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_fullscreen = {"fullscreen", "Yes", CV_SAVE|CV_CALL, CV_YesNo, SCR_ChangeFullscreen, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|
|
@ -175,9 +175,7 @@ void SCR_SetDefaultMode (void);
|
||||||
|
|
||||||
void SCR_Startup (void);
|
void SCR_Startup (void);
|
||||||
|
|
||||||
void SCR_ChangeFullscreen (void);
|
FUNCMATH boolean SCR_IsAspectCorrect(INT32 width, INT32 height);
|
||||||
|
|
||||||
boolean SCR_IsAspectCorrect(INT32 width, INT32 height);
|
|
||||||
|
|
||||||
// move out to main code for consistency
|
// move out to main code for consistency
|
||||||
void SCR_DisplayTicRate(void);
|
void SCR_DisplayTicRate(void);
|
||||||
|
|
|
@ -12,25 +12,25 @@ consvar_t cd_volume = {"cd_volume","31",CV_SAVE,soundvolume_cons_t, NULL, 0, NUL
|
||||||
consvar_t cdUpdate = {"cd_update","1",CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cdUpdate = {"cd_update","1",CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
|
||||||
void I_InitCD(void){}
|
FUNCMATH void I_InitCD(void){}
|
||||||
|
|
||||||
void I_StopCD(void){}
|
FUNCMATH void I_StopCD(void){}
|
||||||
|
|
||||||
void I_PauseCD(void){}
|
FUNCMATH void I_PauseCD(void){}
|
||||||
|
|
||||||
void I_ResumeCD(void){}
|
FUNCMATH void I_ResumeCD(void){}
|
||||||
|
|
||||||
void I_ShutdownCD(void){}
|
FUNCMATH void I_ShutdownCD(void){}
|
||||||
|
|
||||||
void I_UpdateCD(void){}
|
FUNCMATH void I_UpdateCD(void){}
|
||||||
|
|
||||||
void I_PlayCD(UINT8 track, UINT8 looping)
|
FUNCMATH void I_PlayCD(UINT8 track, UINT8 looping)
|
||||||
{
|
{
|
||||||
(void)track;
|
(void)track;
|
||||||
(void)looping;
|
(void)looping;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean I_SetVolumeCD(int volume)
|
FUNCMATH boolean I_SetVolumeCD(int volume)
|
||||||
{
|
{
|
||||||
(void)volume;
|
(void)volume;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -2049,14 +2049,14 @@ void I_StartupMouse2(void)
|
||||||
//
|
//
|
||||||
// I_Tactile
|
// I_Tactile
|
||||||
//
|
//
|
||||||
void I_Tactile(FFType pFFType, const JoyFF_t *FFEffect)
|
FUNCMATH void I_Tactile(FFType pFFType, const JoyFF_t *FFEffect)
|
||||||
{
|
{
|
||||||
// UNUSED.
|
// UNUSED.
|
||||||
(void)pFFType;
|
(void)pFFType;
|
||||||
(void)FFEffect;
|
(void)FFEffect;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect)
|
FUNCMATH void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect)
|
||||||
{
|
{
|
||||||
// UNUSED.
|
// UNUSED.
|
||||||
(void)pFFType;
|
(void)pFFType;
|
||||||
|
@ -2067,7 +2067,7 @@ void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect)
|
||||||
*/
|
*/
|
||||||
static ticcmd_t emptycmd;
|
static ticcmd_t emptycmd;
|
||||||
|
|
||||||
ticcmd_t *I_BaseTiccmd(void)
|
FUNCMATH ticcmd_t *I_BaseTiccmd(void)
|
||||||
{
|
{
|
||||||
return &emptycmd;
|
return &emptycmd;
|
||||||
}
|
}
|
||||||
|
@ -2076,7 +2076,7 @@ ticcmd_t *I_BaseTiccmd(void)
|
||||||
*/
|
*/
|
||||||
static ticcmd_t emptycmd2;
|
static ticcmd_t emptycmd2;
|
||||||
|
|
||||||
ticcmd_t *I_BaseTiccmd2(void)
|
FUNCMATH ticcmd_t *I_BaseTiccmd2(void)
|
||||||
{
|
{
|
||||||
return &emptycmd2;
|
return &emptycmd2;
|
||||||
}
|
}
|
||||||
|
@ -2179,7 +2179,7 @@ tic_t I_GetTime (void)
|
||||||
//
|
//
|
||||||
//I_StartupTimer
|
//I_StartupTimer
|
||||||
//
|
//
|
||||||
void I_StartupTimer(void)
|
FUNCMATH void I_StartupTimer(void)
|
||||||
{
|
{
|
||||||
#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX)
|
#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX)
|
||||||
// for win2k time bug
|
// for win2k time bug
|
||||||
|
@ -2313,11 +2313,11 @@ void I_WaitVBL(INT32 count)
|
||||||
SDL_Delay(count);
|
SDL_Delay(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_BeginRead(void)
|
FUNCMATH void I_BeginRead(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_EndRead(void)
|
FUNCMATH void I_EndRead(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3067,5 +3067,5 @@ const CPUInfoFlags *I_CPUInfo(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// note CPUAFFINITY code used to reside here
|
// note CPUAFFINITY code used to reside here
|
||||||
void I_RegisterSysCommands(void) {}
|
FUNCMATH void I_RegisterSysCommands(void) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1346,7 +1346,7 @@ void I_SetPalette(RGBA_t *palette)
|
||||||
}
|
}
|
||||||
|
|
||||||
// return number of fullscreen + X11 modes
|
// return number of fullscreen + X11 modes
|
||||||
INT32 VID_NumModes(void)
|
FUNCMATH INT32 VID_NumModes(void)
|
||||||
{
|
{
|
||||||
if (USE_FULLSCREEN && numVidModes != -1)
|
if (USE_FULLSCREEN && numVidModes != -1)
|
||||||
return numVidModes - firstEntry;
|
return numVidModes - firstEntry;
|
||||||
|
@ -1354,7 +1354,7 @@ INT32 VID_NumModes(void)
|
||||||
return MAXWINMODES;
|
return MAXWINMODES;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *VID_GetModeName(INT32 modeNum)
|
FUNCMATH const char *VID_GetModeName(INT32 modeNum)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
if (USE_FULLSCREEN && numVidModes != -1) // fullscreen modes
|
if (USE_FULLSCREEN && numVidModes != -1) // fullscreen modes
|
||||||
|
@ -1384,7 +1384,7 @@ const char *VID_GetModeName(INT32 modeNum)
|
||||||
return &vidModeName[modeNum][0];
|
return &vidModeName[modeNum][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
FUNCMATH INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < MAXWINMODES; i++)
|
for (i = 0; i < MAXWINMODES; i++)
|
||||||
|
|
|
@ -126,7 +126,7 @@ void I_ShutdownSound(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_UpdateSound(void)
|
FUNCMATH void I_UpdateSound(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -464,7 +464,7 @@ static void mix_gme(void *udata, Uint8 *stream, int len)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void I_InitMusic(void)
|
FUNCMATH void I_InitMusic(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -769,7 +769,7 @@ boolean I_SetSongTrack(int track)
|
||||||
// MIDI Music
|
// MIDI Music
|
||||||
//
|
//
|
||||||
|
|
||||||
void I_InitMIDIMusic(void)
|
FUNCMATH void I_InitMIDIMusic(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
// Called by main loop.
|
// Called by main loop.
|
||||||
void ST_Ticker(void);
|
FUNCMATH void ST_Ticker(void);
|
||||||
|
|
||||||
// Called by main loop.
|
// Called by main loop.
|
||||||
void ST_Drawer(void);
|
void ST_Drawer(void);
|
||||||
|
|
|
@ -82,7 +82,7 @@ typedef UINT32 angle_t;
|
||||||
extern angle_t tantoangle[SLOPERANGE+1];
|
extern angle_t tantoangle[SLOPERANGE+1];
|
||||||
|
|
||||||
// Utility function, called by R_PointToAngle.
|
// Utility function, called by R_PointToAngle.
|
||||||
unsigned SlopeDiv(unsigned num, unsigned den);
|
FUNCMATH unsigned SlopeDiv(unsigned num, unsigned den);
|
||||||
|
|
||||||
// 360 - angle_t(ANGLE_45) = ANGLE_315
|
// 360 - angle_t(ANGLE_45) = ANGLE_315
|
||||||
FUNCMATH FUNCINLINE static ATTRINLINE angle_t InvAngle(angle_t a)
|
FUNCMATH FUNCINLINE static ATTRINLINE angle_t InvAngle(angle_t a)
|
||||||
|
|
Loading…
Reference in New Issue