mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'master' of https://git.do.srb2.org/KartKrew/Kart into other-progression
This commit is contained in:
commit
97996d1a22
42 changed files with 1961 additions and 551 deletions
|
|
@ -2540,7 +2540,7 @@ void CL_ClearPlayer(INT32 playernum)
|
|||
}
|
||||
|
||||
#define PlayerPointerRemove(field) \
|
||||
if (field) \
|
||||
if (P_MobjWasRemoved(field) == false) \
|
||||
{ \
|
||||
P_RemoveMobj(field); \
|
||||
P_SetTarget(&field, NULL); \
|
||||
|
|
@ -2550,7 +2550,8 @@ void CL_ClearPlayer(INT32 playernum)
|
|||
PlayerPointerRemove(players[playernum].mo);
|
||||
PlayerPointerRemove(players[playernum].followmobj);
|
||||
PlayerPointerRemove(players[playernum].stumbleIndicator);
|
||||
PlayerPointerRemove(players[playernum].sliptideZipIndicator);
|
||||
PlayerPointerRemove(players[playernum].wavedashIndicator);
|
||||
PlayerPointerRemove(players[playernum].trickIndicator);
|
||||
|
||||
#undef PlayerPointerRemove
|
||||
|
||||
|
|
@ -5620,7 +5621,7 @@ static INT16 Consistancy(void)
|
|||
if (TypeIsNetSynced(mo->type) == false)
|
||||
continue;
|
||||
|
||||
if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_MONITOR | MF_FIRE | MF_ENEMY | MF_PAIN | MF_STICKY))
|
||||
if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_ELEMENTAL | MF_FIRE | MF_ENEMY | MF_PAIN | MF_DONTPUNT))
|
||||
{
|
||||
ret -= mo->type;
|
||||
ret += mo->x;
|
||||
|
|
|
|||
|
|
@ -2429,13 +2429,16 @@ static void Command_Map_f(void)
|
|||
// Let's just guess so we don't have to specify the gametype EVERY time...
|
||||
newgametype = G_GuessGametypeByTOL(mapheaderinfo[newmapnum-1]->typeoflevel);
|
||||
|
||||
if (newgametype == -1)
|
||||
if (!option_force && newgametype == -1)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("%s (%s) doesn't support any known gametype!\n"), realmapname, G_BuildMapName(newmapnum));
|
||||
Z_Free(realmapname);
|
||||
Z_Free(mapname);
|
||||
return;
|
||||
}
|
||||
|
||||
if (newgametype == -1)
|
||||
newgametype = GT_RACE; // sensible default
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -267,6 +267,16 @@ typedef enum
|
|||
TRIPWIRE_BLASTER,
|
||||
} tripwirepass_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TRICKSTATE_NONE = 0,
|
||||
TRICKSTATE_READY,
|
||||
TRICKSTATE_FORWARD,
|
||||
TRICKSTATE_RIGHT,
|
||||
TRICKSTATE_LEFT,
|
||||
TRICKSTATE_BACK,
|
||||
} trickstate_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
// Unsynced, HUD or clientsided effects
|
||||
|
|
@ -645,6 +655,7 @@ struct player_t
|
|||
respawnvars_t respawn; // Respawn info
|
||||
mobj_t *ringShooter; // DEZ respawner object
|
||||
tic_t airtime; // Used to track just air time, but has evolved over time into a general "karted" timer. Rename this variable?
|
||||
tic_t lastairtime;
|
||||
UINT8 startboost; // (0 to 125) - Boost you get from start of race
|
||||
UINT8 dropdashboost; // Boost you get when holding A while respawning
|
||||
|
||||
|
|
@ -758,7 +769,7 @@ struct player_t
|
|||
UINT8 confirmVictim; // Player ID that you dealt damage to
|
||||
UINT8 confirmVictimDelay; // Delay before playing the sound
|
||||
|
||||
UINT8 trickpanel; // Trick panel state
|
||||
UINT8 trickpanel; // Trick panel state - see trickstate_t
|
||||
UINT8 tricktime; // Increases while you're tricking. You can't input any trick until it's reached a certain threshold
|
||||
fixed_t trickboostpower; // Save the rough speed multiplier. Used for upwards tricks.
|
||||
UINT8 trickboostdecay; // used to know how long you've waited
|
||||
|
|
@ -903,14 +914,19 @@ struct player_t
|
|||
|
||||
UINT8 tripwireReboundDelay; // When failing Tripwire, brieftly lock out speed-based tripwire pass (anti-cheese)
|
||||
|
||||
UINT16 sliptideZip; // How long is our chained sliptide? Grant a proportional boost when it's over.
|
||||
UINT8 sliptideZipDelay; // How long since the last sliptide? Only boost once you've been straightened out for a bit.
|
||||
UINT16 sliptideZipBoost; // The actual boost granted from sliptideZip.
|
||||
UINT16 wavedash; // How long is our chained sliptide? Grant a proportional boost when it's over.
|
||||
UINT8 wavedashdelay; // How long since the last sliptide? Only boost once you've been straightened out for a bit.
|
||||
UINT16 wavedashboost; // The actual boost granted from wavedash.
|
||||
|
||||
UINT16 trickcharge; // Landed normally from a trick panel? Get the benefits package!
|
||||
|
||||
UINT16 infinitether; // Generic infinitether time, used for infinitether leniency.
|
||||
|
||||
UINT8 lastsafelap;
|
||||
|
||||
mobj_t *stumbleIndicator;
|
||||
mobj_t *sliptideZipIndicator;
|
||||
mobj_t *wavedashIndicator;
|
||||
mobj_t *trickIndicator;
|
||||
mobj_t *whip;
|
||||
mobj_t *hand;
|
||||
mobj_t *flickyAttacker;
|
||||
|
|
@ -928,6 +944,7 @@ struct player_t
|
|||
INT16 incontrol; // -1 to -175 when spinning out or tumbling, 1 to 175 when not. Use to check for combo hits or emergency inputs.
|
||||
|
||||
boolean markedfordeath;
|
||||
boolean dotrickfx;
|
||||
|
||||
UINT8 ringboxdelay; // Delay until Ring Box auto-activates
|
||||
UINT8 ringboxaward; // Where did we stop?
|
||||
|
|
|
|||
|
|
@ -3314,7 +3314,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_MAGICIANBOXTOP",
|
||||
"S_MAGICIANBOXBOTTOM",
|
||||
|
||||
"S_SLIPTIDEZIP",
|
||||
"S_WAVEDASH",
|
||||
|
||||
"S_INSTAWHIP",
|
||||
"S_INSTAWHIP_RECHARGE1",
|
||||
|
|
@ -3325,6 +3325,13 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_BLOCKRING",
|
||||
"S_BLOCKBODY",
|
||||
|
||||
"S_CHARGEAURA",
|
||||
"S_CHARGEFALL",
|
||||
"S_CHARGEFLICKER",
|
||||
"S_CHARGESPARK",
|
||||
"S_CHARGERELEASE",
|
||||
"S_CHARGEEXTRA",
|
||||
|
||||
"S_SERVANTHAND",
|
||||
|
||||
"S_HORNCODE",
|
||||
|
|
@ -3892,6 +3899,16 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
|
||||
"S_SMOOTHLANDING",
|
||||
|
||||
"S_TRICKINDICATOR_OVERLAY",
|
||||
"S_TRICKINDICATOR_UNDERLAY",
|
||||
"S_TRICKINDICATOR_OVERLAY_ARROW",
|
||||
"S_TRICKINDICATOR_UNDERLAY_ARROW",
|
||||
"S_TRICKINDICATOR_UNDERLAY_ARROW2",
|
||||
|
||||
"S_SIDETRICK",
|
||||
"S_BACKTRICK",
|
||||
"S_FORWARDTRICK",
|
||||
|
||||
// DEZ Ring Shooter
|
||||
"S_TIREGRABBER",
|
||||
"S_RINGSHOOTER_SIDE",
|
||||
|
|
@ -5538,7 +5555,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_MONITOR_SHARD",
|
||||
"MT_MAGICIANBOX",
|
||||
|
||||
"MT_SLIPTIDEZIP",
|
||||
"MT_WAVEDASH",
|
||||
|
||||
"MT_INSTAWHIP",
|
||||
"MT_INSTAWHIP_RECHARGE",
|
||||
|
|
@ -5546,6 +5563,13 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_BLOCKRING",
|
||||
"MT_BLOCKBODY",
|
||||
|
||||
"MT_CHARGEAURA",
|
||||
"MT_CHARGEFALL",
|
||||
"MT_CHARGEFLICKER",
|
||||
"MT_CHARGESPARK",
|
||||
"MT_CHARGERELEASE",
|
||||
"MT_CHARGEEXTRA",
|
||||
|
||||
"MT_SERVANTHAND",
|
||||
|
||||
"MT_HORNCODE",
|
||||
|
|
@ -5649,6 +5673,9 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_TRIPWIREBOOST",
|
||||
|
||||
"MT_SMOOTHLANDING",
|
||||
"MT_TRICKINDICATOR",
|
||||
"MT_SIDETRICK",
|
||||
"MT_FORWARDTRICK",
|
||||
|
||||
"MT_TIREGRABBER",
|
||||
"MT_RINGSHOOTER",
|
||||
|
|
@ -5987,13 +6014,13 @@ const char *const MOBJFLAG_LIST[] = {
|
|||
"SLOPE",
|
||||
"MISSILE",
|
||||
"SPRING",
|
||||
"MONITOR",
|
||||
"ELEMENTAL",
|
||||
"NOTHINK",
|
||||
"NOCLIPHEIGHT",
|
||||
"ENEMY",
|
||||
"SCENERY",
|
||||
"PAIN",
|
||||
"STICKY",
|
||||
"DONTPUNT",
|
||||
"APPLYTERRAIN",
|
||||
"NOCLIPTHING",
|
||||
"GRENADEBOUNCE",
|
||||
|
|
|
|||
|
|
@ -1330,7 +1330,7 @@ readghosttic:
|
|||
z = READFIXED(g->p);
|
||||
angle = READANGLE(g->p);
|
||||
if (!(mobjinfo[type].flags & MF_SHOOTABLE)
|
||||
|| !(mobjinfo[type].flags & (MF_ENEMY|MF_MONITOR))
|
||||
|| !(mobjinfo[type].flags & MF_ENEMY)
|
||||
|| health != 0 || i >= 4) // only spawn for the first 4 hits per frame, to prevent ghosts from splode-spamming too bad.
|
||||
continue;
|
||||
poof = P_SpawnMobj(x, y, z, MT_GHOST);
|
||||
|
|
|
|||
|
|
@ -2145,7 +2145,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
{
|
||||
rings = 0;
|
||||
}
|
||||
else if (modeattacking & ATTACKING_SPB)
|
||||
else if (G_TimeAttackStart())
|
||||
{
|
||||
rings = 20;
|
||||
}
|
||||
|
|
@ -2234,7 +2234,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
K_RemoveFollower(&players[player]);
|
||||
|
||||
#define PlayerPointerRemove(field) \
|
||||
if (field) \
|
||||
if (P_MobjWasRemoved(field) == false) \
|
||||
{ \
|
||||
P_RemoveMobj(field); \
|
||||
P_SetTarget(&field, NULL); \
|
||||
|
|
@ -2243,7 +2243,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
|||
// These are mostly subservient to the player, and may not clean themselves up.
|
||||
PlayerPointerRemove(players[player].followmobj);
|
||||
PlayerPointerRemove(players[player].stumbleIndicator);
|
||||
PlayerPointerRemove(players[player].sliptideZipIndicator);
|
||||
PlayerPointerRemove(players[player].wavedashIndicator);
|
||||
PlayerPointerRemove(players[player].trickIndicator);
|
||||
|
||||
#undef PlayerPointerRemove
|
||||
|
||||
|
|
|
|||
418
src/info.c
418
src/info.c
|
|
@ -558,7 +558,8 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"IMDB", // Item Monitor Small Shard (Debris)
|
||||
"MTWK", // Item Monitor Glass Twinkle
|
||||
|
||||
"SLPT", // Sliptide zip indicator
|
||||
"SLPT", // Wavedash indicator
|
||||
"TRBS", // Trickdash indicator
|
||||
|
||||
"IWHP", // Instawhip
|
||||
"WPRE", // Instawhip Recharge
|
||||
|
|
@ -566,6 +567,12 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"GRNG", // Guard ring
|
||||
"GBDY", // Guard body
|
||||
|
||||
"TRC1", // Charge aura
|
||||
"TRC2", // Charge fall
|
||||
"TRC3", // Charge flicker/sparks
|
||||
"TRC4", // Charge release
|
||||
"TRC5", // Charge extra
|
||||
|
||||
"DHND", // Servant Hand
|
||||
|
||||
"HORN", // Horncode
|
||||
|
|
@ -631,6 +638,15 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"TWBT", // Tripwire BLASTER
|
||||
"SMLD", // Smooth landing
|
||||
|
||||
// Trick Effects
|
||||
"TRK1",
|
||||
"TRK2",
|
||||
"TRK3",
|
||||
"TRK4",
|
||||
"TRK5",
|
||||
"TRK6",
|
||||
"TRK7",
|
||||
|
||||
"TIRG", // Tire grabbers
|
||||
"RSHT", // DEZ Ring Shooter
|
||||
|
||||
|
|
@ -4118,7 +4134,7 @@ state_t states[NUMSTATES] =
|
|||
{SPR_MGBT, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_TOP
|
||||
{SPR_MGBB, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_BOTTOM
|
||||
|
||||
{SPR_SLPT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_SLIPTIDEZIP
|
||||
{SPR_SLPT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_WAVEDASH
|
||||
|
||||
{SPR_IWHP, FF_FLOORSPRITE|FF_ANIMATE|0, -1, {NULL}, 6, 2, S_NULL}, // S_INSTAWHIP
|
||||
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_INSTAWHIP_RECHARGE2}, // S_INSTAWHIP_RECHARGE1
|
||||
|
|
@ -4129,6 +4145,13 @@ state_t states[NUMSTATES] =
|
|||
{SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING
|
||||
{SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY
|
||||
|
||||
{SPR_TRC1, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_CHARGEAURA
|
||||
{SPR_TRC2, FF_FULLBRIGHT|FF_ANIMATE|0, 20, {NULL}, 19, 1, S_NULL}, // S_CHARGEFALL
|
||||
{SPR_TRC3, FF_FULLBRIGHT|FF_ADD|0, 2, {NULL}, 0, 0, S_NULL}, // S_CHARGEFLICKER
|
||||
{SPR_TRC3, FF_FULLBRIGHT|FF_ADD|1, 2, {NULL}, 0, 0, S_NULL}, // S_CHARGESPARK
|
||||
{SPR_TRC4, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE|0, -1, {NULL}, 4, 1, S_NULL}, // S_CHARGERELEASE
|
||||
{SPR_TRC5, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE|0, -1, {NULL}, 4, 1, S_NULL}, // S_CHARGEEXTRA
|
||||
|
||||
{SPR_DHND, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SERVANTHAND
|
||||
|
||||
{SPR_HORN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_HORNCODE
|
||||
|
|
@ -4662,6 +4685,16 @@ state_t states[NUMSTATES] =
|
|||
|
||||
{SPR_SMLD, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE, -1, {NULL}, 7, 2, S_NULL}, // S_SMOOTHLANDING
|
||||
|
||||
{SPR_TRK1, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE|FF_ADD, -1, {NULL}, 3, 3, S_NULL}, // S_TRICKINDICATOR_OVERLAY,
|
||||
{SPR_TRK2, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 3, 3, S_NULL}, // S_TRICKINDICATOR_UNDERLAY,
|
||||
{SPR_TRK3, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE|FF_ADD, 13, {NULL}, 12, 1, S_INVISIBLE}, // S_TRICKINDICATOR_OVERLAY_ARROW,
|
||||
{SPR_NULL, 0, 1, {NULL}, 12, 1, S_TRICKINDICATOR_UNDERLAY_ARROW2}, // S_TRICKINDICATOR_UNDERLAY_ARROW,
|
||||
{SPR_TRK4, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, 13, {NULL}, 12, 1, S_INVISIBLE}, // S_TRICKINDICATOR_UNDERLAY_ARROW2,
|
||||
|
||||
{SPR_TRK5, FF_FULLBRIGHT|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_SIDETRICK,
|
||||
{SPR_TRK6, FF_FULLBRIGHT|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_BACKTRICK,
|
||||
{SPR_TRK7, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, -1, {NULL}, 6, 1, S_NULL}, // S_FORWARDTRICK,
|
||||
|
||||
{SPR_TIRG, FF_ANIMATE, -1, {NULL}, 1, 1, S_NULL}, // S_TIREGRABBER
|
||||
{SPR_RSHT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_RINGSHOOTER_SIDE
|
||||
{SPR_RSHT, FF_SEMIBRIGHT|FF_PAPERSPRITE|2, -1, {NULL}, 0, 0, S_NULL}, // S_RINGSHOOTER_NIPPLES
|
||||
|
|
@ -4815,12 +4848,12 @@ state_t states[NUMSTATES] =
|
|||
{SPR_FLEN, FF_FULLBRIGHT|1, 3, {NULL}, 0, 0, S_FLINGENERGY3}, // S_FLINGENERGY2,
|
||||
{SPR_FLEN, FF_FULLBRIGHT|2, 3, {NULL}, 0, 0, S_NULL}, // S_FLINGENERGY3,
|
||||
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30, 2, {A_PlayActiveSound}, 0, 0, S_CLASH2}, // S_CLASH1
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|1, 2, {NULL}, 0, 0, S_CLASH3}, // S_CLASH2
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|2, 2, {NULL}, 0, 0, S_CLASH4}, // S_CLASH3
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|3, 2, {NULL}, 0, 0, S_CLASH5}, // S_CLASH4
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|4, 2, {NULL}, 0, 0, S_CLASH6}, // S_CLASH5
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|5, 2, {NULL}, 0, 0, S_NULL}, // S_CLASH6
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_ADD, 2, {A_PlayActiveSound}, 0, 0, S_CLASH2}, // S_CLASH1
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_ADD|1, 2, {NULL}, 0, 0, S_CLASH3}, // S_CLASH2
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_ADD|2, 2, {NULL}, 0, 0, S_CLASH4}, // S_CLASH3
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_ADD|3, 2, {NULL}, 0, 0, S_CLASH5}, // S_CLASH4
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_ADD|4, 2, {NULL}, 0, 0, S_CLASH6}, // S_CLASH5
|
||||
{SPR_CLAS, FF_FULLBRIGHT|FF_ADD|5, 2, {NULL}, 0, 0, S_NULL}, // S_CLASH6
|
||||
|
||||
{SPR_PSHW, FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FIREDITEM2}, // S_FIREDITEM1
|
||||
{SPR_PSHW, FF_FULLBRIGHT|1, 3, {NULL}, 0, 0, S_FIREDITEM3}, // S_FIREDITEM2
|
||||
|
|
@ -5742,7 +5775,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
1000, // mass
|
||||
MT_THOK, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
(statenum_t)MT_THOK // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9327,7 +9360,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
sfx_mspogo, // deathsound
|
||||
2*TICRATE, // speed
|
||||
14*FRACUNIT, // radius
|
||||
64*FRACUNIT, // height
|
||||
90*FRACUNIT, // height
|
||||
0, // display offset
|
||||
4, // mass
|
||||
0, // damage
|
||||
|
|
@ -9353,7 +9386,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_WALLSPIKED2, // xdeathstate
|
||||
sfx_mspogo, // deathsound
|
||||
2*TICRATE, // speed
|
||||
16*FRACUNIT, // radius
|
||||
48*FRACUNIT, // radius
|
||||
14*FRACUNIT, // height
|
||||
0, // display offset
|
||||
4, // mass
|
||||
|
|
@ -9548,7 +9581,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_RING_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9575,7 +9608,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_PITY_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9602,7 +9635,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_ATTRACT_ICON,// damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9629,7 +9662,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_FORCE_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9656,7 +9689,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_ARMAGEDDON_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9683,7 +9716,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_WHIRLWIND_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9710,7 +9743,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_ELEMENTAL_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9737,7 +9770,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_SNEAKERS_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9764,7 +9797,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_INVULN_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9791,7 +9824,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_1UP_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9818,7 +9851,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_EGGMAN_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9845,7 +9878,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_MIXUP_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9872,7 +9905,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_UNKNOWN, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9899,7 +9932,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_GRAVITY_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9926,7 +9959,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_RECYCLER_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9953,7 +9986,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_SCORE1K_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9980,7 +10013,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_SCORE10K_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10007,7 +10040,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_FLAMEAURA_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10034,7 +10067,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_BUBBLEWRAP_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10061,7 +10094,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_THUNDERCOIN_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10088,7 +10121,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_PITY_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10115,7 +10148,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_ATTRACT_ICON,// damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10142,7 +10175,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_FORCE_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10169,7 +10202,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_ARMAGEDDON_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10196,7 +10229,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_WHIRLWIND_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10223,7 +10256,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_ELEMENTAL_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10250,7 +10283,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_SNEAKERS_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10277,7 +10310,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_INVULN_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10304,7 +10337,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_EGGMAN_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10331,7 +10364,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_GRAVITY_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10358,7 +10391,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_FLAMEAURA_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10385,7 +10418,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_BUBBLEWRAP_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10412,7 +10445,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_THUNDERCOIN_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags
|
||||
MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10439,7 +10472,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_RING_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -10466,7 +10499,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
MT_RING_ICON, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags
|
||||
MF_SOLID|MF_SHOOTABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -14618,13 +14651,13 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
5*FRACUNIT, // speed
|
||||
8*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
16*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_MISSILE|MF_PAIN, // flags
|
||||
MF_NOGRAVITY|MF_MISSILE|MF_PAIN|MF_NOSQUISH|MF_NOHITLAGFORME|MF_ELEMENTAL, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -23061,9 +23094,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_SLIPTIDEZIP
|
||||
{ // MT_WAVEDASH
|
||||
-1, // doomednum
|
||||
S_SLIPTIDEZIP, // spawnstate
|
||||
S_WAVEDASH, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
|
|
@ -23111,7 +23144,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -23223,6 +23256,168 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_CHARGEAURA
|
||||
-1, // doomednum
|
||||
S_CHARGEAURA, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_CHARGEFALL
|
||||
-1, // doomednum
|
||||
S_CHARGEFALL, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_CHARGEFLICKER
|
||||
-1, // doomednum
|
||||
S_CHARGEFLICKER, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_CHARGESPARK
|
||||
-1, // doomednum
|
||||
S_CHARGESPARK, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_SCENERY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_CHARGERELEASE
|
||||
-1, // doomednum
|
||||
S_CHARGERELEASE, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_CHARGEEXTRA
|
||||
-1, // doomednum
|
||||
S_CHARGEEXTRA, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
67*FRACUNIT, // radius
|
||||
67*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_SERVANTHAND
|
||||
-1, // doomednum
|
||||
S_SERVANTHAND, // spawnstate
|
||||
|
|
@ -24002,7 +24197,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_peel, // activesound
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24029,7 +24224,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24083,7 +24278,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_s3k96, // activesound
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24110,7 +24305,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24137,7 +24332,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_s3kc0s, // activesound
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24164,7 +24359,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24218,7 +24413,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_s3k5c, // activesound
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24245,7 +24440,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24353,7 +24548,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
0, // mass
|
||||
0, // damage
|
||||
sfx_s3k5c, // activesound
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24380,7 +24575,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_s3k96, // activesound
|
||||
MF_SPECIAL|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SPECIAL|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24407,7 +24602,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SPECIAL|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24461,7 +24656,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24515,7 +24710,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_kc64, // activesound
|
||||
MF_SOLID|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
|
||||
MF_SOLID|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24758,7 +24953,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags
|
||||
MF_NOCLIPTHING|MF_DONTENCOREMAP|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -25055,7 +25250,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_s3k5c, // activesound
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -25082,7 +25277,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -25136,7 +25331,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
1, // damage
|
||||
sfx_s3k96, // activesound
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags
|
||||
MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -25190,7 +25385,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags
|
||||
MF_SPECIAL|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -25329,6 +25524,87 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_TRICKINDICATOR
|
||||
-1, // doomednum
|
||||
S_INVISIBLE, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
8, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
128*FRACUNIT, // radius
|
||||
128*FRACUNIT, // height
|
||||
-1, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_SIDETRICK
|
||||
-1, // doomednum
|
||||
S_SIDETRICK, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
36*FRACUNIT, // radius
|
||||
40*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_FORWARDTRICK
|
||||
-1, // doomednum
|
||||
S_FORWARDTRICK, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // reactiontime
|
||||
sfx_None, // attacksound
|
||||
S_NULL, // painstate
|
||||
0, // painchance
|
||||
sfx_None, // painsound
|
||||
S_NULL, // meleestate
|
||||
S_NULL, // missilestate
|
||||
S_NULL, // deathstate
|
||||
S_NULL, // xdeathstate
|
||||
sfx_None, // deathsound
|
||||
0, // speed
|
||||
60*FRACUNIT, // radius
|
||||
86*FRACUNIT, // height
|
||||
0, // display offset
|
||||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_TIREGRABBER
|
||||
-1, // doomednum
|
||||
S_TIREGRABBER, // spawnstate
|
||||
|
|
@ -30433,7 +30709,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT, // flags
|
||||
MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTPUNT, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
|
|||
49
src/info.h
49
src/info.h
|
|
@ -1115,7 +1115,8 @@ typedef enum sprite
|
|||
SPR_IMDB, // Item Monitor Small Shard (Debris)
|
||||
SPR_MTWK, // Item Monitor Glass Twinkle
|
||||
|
||||
SPR_SLPT, // Sliptide zip indicator
|
||||
SPR_SLPT, // Wavedash indicator
|
||||
SPR_TRBS, // Trickdash indicator
|
||||
|
||||
SPR_IWHP, // Instawhip
|
||||
SPR_WPRE, // Instawhip Recharge
|
||||
|
|
@ -1123,6 +1124,12 @@ typedef enum sprite
|
|||
SPR_GRNG, // Guard ring
|
||||
SPR_GBDY, // Guard body
|
||||
|
||||
SPR_TRC1, // Charge aura
|
||||
SPR_TRC2, // Charge fall
|
||||
SPR_TRC3, // Charge flicker/sparks
|
||||
SPR_TRC4, // Charge release
|
||||
SPR_TRC5, // Charge extra
|
||||
|
||||
SPR_DHND, // Servant Hand
|
||||
|
||||
SPR_HORN, // Horncode
|
||||
|
|
@ -1188,6 +1195,15 @@ typedef enum sprite
|
|||
SPR_TWBT, // Tripwire BLASTER
|
||||
SPR_SMLD, // Smooth landing
|
||||
|
||||
// Trick Effects
|
||||
SPR_TRK1,
|
||||
SPR_TRK2,
|
||||
SPR_TRK3,
|
||||
SPR_TRK4,
|
||||
SPR_TRK5,
|
||||
SPR_TRK6,
|
||||
SPR_TRK7,
|
||||
|
||||
SPR_TIRG, // Tire grabbers
|
||||
SPR_RSHT, // DEZ Ring Shooter
|
||||
|
||||
|
|
@ -4529,7 +4545,7 @@ typedef enum state
|
|||
S_MAGICIANBOX_TOP,
|
||||
S_MAGICIANBOX_BOTTOM,
|
||||
|
||||
S_SLIPTIDEZIP,
|
||||
S_WAVEDASH,
|
||||
|
||||
S_INSTAWHIP,
|
||||
S_INSTAWHIP_RECHARGE1,
|
||||
|
|
@ -4540,6 +4556,13 @@ typedef enum state
|
|||
S_BLOCKRING,
|
||||
S_BLOCKBODY,
|
||||
|
||||
S_CHARGEAURA,
|
||||
S_CHARGEFALL,
|
||||
S_CHARGEFLICKER,
|
||||
S_CHARGESPARK,
|
||||
S_CHARGERELEASE,
|
||||
S_CHARGEEXTRA,
|
||||
|
||||
S_SERVANTHAND,
|
||||
|
||||
S_HORNCODE,
|
||||
|
|
@ -5106,6 +5129,16 @@ typedef enum state
|
|||
|
||||
S_SMOOTHLANDING,
|
||||
|
||||
S_TRICKINDICATOR_OVERLAY,
|
||||
S_TRICKINDICATOR_UNDERLAY,
|
||||
S_TRICKINDICATOR_OVERLAY_ARROW,
|
||||
S_TRICKINDICATOR_UNDERLAY_ARROW,
|
||||
S_TRICKINDICATOR_UNDERLAY_ARROW2,
|
||||
|
||||
S_SIDETRICK,
|
||||
S_BACKTRICK,
|
||||
S_FORWARDTRICK,
|
||||
|
||||
// DEZ Ring Shooter
|
||||
S_TIREGRABBER,
|
||||
S_RINGSHOOTER_SIDE,
|
||||
|
|
@ -6791,7 +6824,7 @@ typedef enum mobj_type
|
|||
MT_MONITOR_PART,
|
||||
MT_MONITOR_SHARD,
|
||||
MT_MAGICIANBOX,
|
||||
MT_SLIPTIDEZIP,
|
||||
MT_WAVEDASH,
|
||||
|
||||
MT_INSTAWHIP,
|
||||
MT_INSTAWHIP_RECHARGE,
|
||||
|
|
@ -6799,6 +6832,13 @@ typedef enum mobj_type
|
|||
MT_BLOCKRING,
|
||||
MT_BLOCKBODY,
|
||||
|
||||
MT_CHARGEAURA,
|
||||
MT_CHARGEFALL,
|
||||
MT_CHARGEFLICKER,
|
||||
MT_CHARGESPARK,
|
||||
MT_CHARGERELEASE,
|
||||
MT_CHARGEEXTRA,
|
||||
|
||||
MT_SERVANTHAND,
|
||||
|
||||
MT_HORNCODE,
|
||||
|
|
@ -6902,6 +6942,9 @@ typedef enum mobj_type
|
|||
MT_TRIPWIREBOOST,
|
||||
|
||||
MT_SMOOTHLANDING,
|
||||
MT_TRICKINDICATOR,
|
||||
MT_SIDETRICK,
|
||||
MT_FORWARDTRICK,
|
||||
|
||||
MT_TIREGRABBER,
|
||||
MT_RINGSHOOTER,
|
||||
|
|
|
|||
|
|
@ -1109,7 +1109,7 @@ static void K_BotTrick(player_t *player, ticcmd_t *cmd, const botcontroller_t *b
|
|||
return;
|
||||
}
|
||||
|
||||
if (player->trickpanel == 1)
|
||||
if (player->trickpanel == TRICKSTATE_READY)
|
||||
{
|
||||
switch (botController->trick)
|
||||
{
|
||||
|
|
@ -1521,7 +1521,7 @@ static void K_BuildBotTiccmdNormal(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
// Actual gameplay behaviors below this block!
|
||||
const botcontroller_t *botController = K_GetBotController(player->mo);
|
||||
if (player->trickpanel != 0)
|
||||
if (player->trickpanel != TRICKSTATE_NONE)
|
||||
{
|
||||
K_BotTrick(player, cmd, botController);
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include "k_podium.h"
|
||||
#include "k_powerup.h"
|
||||
#include "k_hitlag.h"
|
||||
#include "m_random.h"
|
||||
|
||||
angle_t K_GetCollideAngle(mobj_t *t1, mobj_t *t2)
|
||||
{
|
||||
|
|
@ -924,7 +925,7 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim)
|
|||
}
|
||||
else if (victim->type == MT_SUPER_FLICKY)
|
||||
{
|
||||
if (Obj_IsSuperFlickyWhippable(victim))
|
||||
if (Obj_IsSuperFlickyWhippable(victim, attacker))
|
||||
{
|
||||
K_AddHitLag(victim, victimHitlag, true);
|
||||
K_AddHitLag(attacker, attackerHitlag, false);
|
||||
|
|
@ -1170,3 +1171,114 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2)
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
void K_PuntHazard(mobj_t *t1, mobj_t *t2)
|
||||
{
|
||||
// TODO: spawn a unique mobjtype other than MT_GHOST
|
||||
mobj_t *img = P_SpawnGhostMobj(t1);
|
||||
|
||||
K_MakeObjectReappear(t1);
|
||||
|
||||
img->flags &= ~MF_NOGRAVITY;
|
||||
img->renderflags = t1->renderflags & ~RF_DONTDRAW;
|
||||
img->extravalue1 = 1;
|
||||
img->extravalue2 = 2;
|
||||
img->fuse = 2*TICRATE;
|
||||
|
||||
struct Vector
|
||||
{
|
||||
fixed_t x_, y_, z_;
|
||||
fixed_t h_ = FixedHypot(x_, y_);
|
||||
fixed_t speed_ = std::max(60 * mapobjectscale, FixedHypot(h_, z_) * 2);
|
||||
|
||||
explicit Vector(fixed_t x, fixed_t y, fixed_t z) : x_(x), y_(y), z_(z) {}
|
||||
explicit Vector(const mobj_t* mo) :
|
||||
Vector(std::max(
|
||||
Vector(mo->x - mo->old_x, mo->y - mo->old_y, mo->z - mo->old_z),
|
||||
Vector(mo->momx, mo->momy, mo->momz)
|
||||
))
|
||||
{
|
||||
}
|
||||
explicit Vector(const Vector&) = default;
|
||||
|
||||
bool operator<(const Vector& b) const { return speed_ < b.speed_; }
|
||||
|
||||
void invert()
|
||||
{
|
||||
x_ = -x_;
|
||||
y_ = -y_;
|
||||
z_ = -z_;
|
||||
}
|
||||
|
||||
void thrust(mobj_t* mo) const
|
||||
{
|
||||
angle_t yaw = R_PointToAngle2(0, 0, h_, z_);
|
||||
yaw = std::max(AbsAngle(yaw), static_cast<angle_t>(ANGLE_11hh)) + (yaw & ANGLE_180);
|
||||
|
||||
P_InstaThrust(mo, R_PointToAngle2(0, 0, x_, y_), FixedMul(speed_, FCOS(yaw)));
|
||||
mo->momz = FixedMul(speed_, FSIN(yaw));
|
||||
}
|
||||
};
|
||||
|
||||
Vector h_vector(t1);
|
||||
Vector p_vector(t2);
|
||||
|
||||
h_vector.invert();
|
||||
|
||||
std::max(h_vector, p_vector).thrust(img);
|
||||
|
||||
K_DoPowerClash(img, t2); // applies hitlag
|
||||
P_SpawnMobj(t2->x/2 + t1->x/2, t2->y/2 + t1->y/2, t2->z/2 + t1->z/2, MT_ITEMCLASH);
|
||||
}
|
||||
|
||||
boolean K_PuntCollide(mobj_t *t1, mobj_t *t2)
|
||||
{
|
||||
if (t1->flags & MF_DONTPUNT)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!t2->player)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!K_PlayerCanPunt(t2->player))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (t1->flags & MF_ELEMENTAL)
|
||||
{
|
||||
K_MakeObjectReappear(t1);
|
||||
|
||||
// copied from MT_ITEMCAPSULE
|
||||
UINT8 i;
|
||||
INT16 spacing = (t1->radius >> 1) / t1->scale;
|
||||
// dust effects
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
mobj_t *puff = P_SpawnMobjFromMobj(
|
||||
t1,
|
||||
P_RandomRange(PR_ITEM_DEBRIS, -spacing, spacing) * FRACUNIT,
|
||||
P_RandomRange(PR_ITEM_DEBRIS, -spacing, spacing) * FRACUNIT,
|
||||
P_RandomRange(PR_ITEM_DEBRIS, 0, 4*spacing) * FRACUNIT,
|
||||
MT_SPINDASHDUST
|
||||
);
|
||||
|
||||
puff->momz = puff->scale * P_MobjFlip(puff);
|
||||
|
||||
P_Thrust(puff, R_PointToAngle2(t2->x, t2->y, puff->x, puff->y), 3*puff->scale);
|
||||
|
||||
puff->momx += t2->momx / 2;
|
||||
puff->momy += t2->momy / 2;
|
||||
puff->momz += t2->momz / 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
K_PuntHazard(t1, t2);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,9 @@ boolean K_SMKIceBlockCollide(mobj_t *t1, mobj_t *t2);
|
|||
|
||||
boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2);
|
||||
|
||||
void K_PuntHazard(mobj_t *t1, mobj_t *t2);
|
||||
boolean K_PuntCollide(mobj_t *t1, mobj_t *t2);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -221,7 +221,7 @@ private:
|
|||
|
||||
bool can_change() const
|
||||
{
|
||||
if (viewplayer()->trickpanel > 0)
|
||||
if (viewplayer()->trickpanel != TRICKSTATE_NONE)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
728
src/k_kart.c
728
src/k_kart.c
File diff suppressed because it is too large
Load diff
|
|
@ -119,9 +119,11 @@ angle_t K_StumbleSlope(angle_t angle, angle_t pitch, angle_t roll);
|
|||
void K_StumblePlayer(player_t *player);
|
||||
boolean K_CheckStumble(player_t *player, angle_t oldPitch, angle_t oldRoll, boolean fromAir);
|
||||
void K_InitStumbleIndicator(player_t *player);
|
||||
void K_InitSliptideZipIndicator(player_t *player);
|
||||
void K_InitWavedashIndicator(player_t *player);
|
||||
void K_InitTrickIndicator(player_t *player);
|
||||
void K_UpdateStumbleIndicator(player_t *player);
|
||||
void K_UpdateSliptideZipIndicator(player_t *player);
|
||||
void K_UpdateWavedashIndicator(player_t *player);
|
||||
void K_UpdateTrickIndicator(player_t *player);
|
||||
INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source);
|
||||
void K_DebtStingPlayer(player_t *player, mobj_t *source);
|
||||
void K_GiveBumpersToPlayer(player_t *player, player_t *victim, UINT8 amount);
|
||||
|
|
@ -245,6 +247,9 @@ void K_SetTireGrease(player_t *player, tic_t tics);
|
|||
|
||||
boolean K_IsPlayingDisplayPlayer(player_t *player);
|
||||
|
||||
boolean K_PlayerCanPunt(player_t *player);
|
||||
void K_MakeObjectReappear(mobj_t *mo);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -126,6 +126,11 @@ void Obj_BlockRingThink(mobj_t *ring);
|
|||
void Obj_BlockBodyThink(mobj_t *body);
|
||||
void Obj_GuardBreakThink(mobj_t *fx);
|
||||
|
||||
void Obj_ChargeAuraThink(mobj_t *aura);
|
||||
void Obj_ChargeFallThink(mobj_t *charge);
|
||||
void Obj_ChargeReleaseThink(mobj_t *release);
|
||||
void Obj_ChargeExtraThink(mobj_t *extra);
|
||||
|
||||
/* Ring Shooter */
|
||||
boolean Obj_RingShooterThinker(mobj_t *mo);
|
||||
boolean Obj_PlayerRingShooterFreeze(player_t *const player);
|
||||
|
|
@ -168,7 +173,7 @@ void Obj_BlockSuperFlicky(mobj_t *flicky);
|
|||
void Obj_SuperFlickyPlayerCollide(mobj_t *flicky, mobj_t *player);
|
||||
void Obj_SuperFlickyLanding(mobj_t *flicky);
|
||||
mobj_t *Obj_SuperFlickyOwner(const mobj_t *flicky);
|
||||
boolean Obj_IsSuperFlickyWhippable(const mobj_t *flicky);
|
||||
boolean Obj_IsSuperFlickyWhippable(const mobj_t *flicky, const mobj_t *target);
|
||||
boolean Obj_IsSuperFlickyTargettingYou(const mobj_t *flicky, mobj_t *player);
|
||||
|
||||
/* Battle/Power-UP UFO */
|
||||
|
|
|
|||
|
|
@ -157,7 +157,9 @@ void K_DoIngameRespawn(player_t *player)
|
|||
player->ringboost = 0;
|
||||
player->driftboost = player->strongdriftboost = 0;
|
||||
player->gateBoost = 0;
|
||||
player->sliptideZip = player->sliptideZipBoost = player->sliptideZipDelay = 0;
|
||||
player->trickcharge = 0;
|
||||
player->infinitether = 0;
|
||||
player->wavedash = player->wavedashboost = player->wavedashdelay = 0;
|
||||
|
||||
K_TumbleInterrupt(player);
|
||||
P_ResetPlayer(player);
|
||||
|
|
@ -315,7 +317,7 @@ void K_DoIngameRespawn(player_t *player)
|
|||
player->respawn.init = true;
|
||||
player->respawn.fast = true;
|
||||
player->respawn.returnspeed = 0;
|
||||
player->laps = player->lastsafelap;
|
||||
player->laps = min(player->laps, player->lastsafelap);
|
||||
|
||||
player->respawn.airtimer = player->airtime;
|
||||
player->respawn.truedeath = !!(player->pflags & PF_FAULT);
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@ static kartitems_t K_KartItemReelTimeAttack[] =
|
|||
|
||||
static kartitems_t K_KartItemReelSPBAttack[] =
|
||||
{
|
||||
KITEM_GACHABOM,
|
||||
KITEM_DROPTARGET,
|
||||
KITEM_SUPERRING,
|
||||
KITEM_NONE
|
||||
};
|
||||
|
|
@ -1242,7 +1242,7 @@ static void K_CalculateRouletteSpeed(itemroulette_t *const roulette)
|
|||
return;
|
||||
}
|
||||
|
||||
if (K_TimeAttackRules() == true)
|
||||
if (K_TimeAttackRules() == true && !(modeattacking & ATTACKING_SPB))
|
||||
{
|
||||
// Time Attack rules; use a consistent speed.
|
||||
roulette->tics = roulette->speed = ROULETTE_SPEED_TIMEATTACK;
|
||||
|
|
|
|||
|
|
@ -485,8 +485,6 @@ void K_ProcessTerrainEffect(mobj_t *mo)
|
|||
fixed_t speed = FixedHypot(mo->momx, mo->momy);
|
||||
fixed_t upwards = 16 * terrain->trickPanel;
|
||||
|
||||
player->trickpanel = 1;
|
||||
player->pflags |= PF_TRICKDELAY;
|
||||
K_DoPogoSpring(mo, upwards, 1);
|
||||
|
||||
// Reduce speed
|
||||
|
|
@ -551,7 +549,7 @@ void K_ProcessTerrainEffect(mobj_t *mo)
|
|||
P_InstaThrust(player->mo, thrustAngle, max(thrustSpeed, 2*playerSpeed));
|
||||
|
||||
player->dashpadcooldown = TICRATE/3;
|
||||
player->trickpanel = 0;
|
||||
player->trickpanel = TRICKSTATE_NONE;
|
||||
player->floorboost = 2;
|
||||
|
||||
S_StartSound(player->mo, sfx_cdfm62);
|
||||
|
|
|
|||
|
|
@ -106,7 +106,9 @@ enum mobj_e {
|
|||
mobj_tid,
|
||||
mobj_special,
|
||||
mobj_args,
|
||||
mobj_stringargs
|
||||
mobj_stringargs,
|
||||
mobj_reappear,
|
||||
mobj_punt_ref,
|
||||
};
|
||||
|
||||
static const char *const mobj_opt[] = {
|
||||
|
|
@ -194,6 +196,8 @@ static const char *const mobj_opt[] = {
|
|||
"special",
|
||||
"args",
|
||||
"stringargs",
|
||||
"reappear",
|
||||
"punt_ref",
|
||||
NULL};
|
||||
|
||||
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
|
||||
|
|
@ -493,6 +497,17 @@ static int mobj_get(lua_State *L)
|
|||
case mobj_stringargs:
|
||||
LUA_PushUserdata(L, mo->thing_stringargs, META_THINGSTRINGARGS);
|
||||
break;
|
||||
case mobj_reappear:
|
||||
lua_pushinteger(L, mo->reappear);
|
||||
break;
|
||||
case mobj_punt_ref:
|
||||
if (mo->punt_ref && P_MobjWasRemoved(mo->punt_ref))
|
||||
{ // don't put invalid mobj back into Lua.
|
||||
P_SetTarget(&mo->punt_ref, NULL);
|
||||
return 0;
|
||||
}
|
||||
LUA_PushUserdata(L, mo->punt_ref, META_MOBJ);
|
||||
break;
|
||||
default: // extra custom variables in Lua memory
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
||||
I_Assert(lua_istable(L, -1));
|
||||
|
|
@ -883,6 +898,18 @@ static int mobj_set(lua_State *L)
|
|||
return NOSET;
|
||||
case mobj_stringargs:
|
||||
return NOSET;
|
||||
case mobj_reappear:
|
||||
mo->reappear = luaL_checkinteger(L, 3);
|
||||
break;
|
||||
case mobj_punt_ref:
|
||||
if (lua_isnil(L, 3))
|
||||
P_SetTarget(&mo->punt_ref, NULL);
|
||||
else
|
||||
{
|
||||
mobj_t *punt_ref = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
||||
P_SetTarget(&mo->punt_ref, punt_ref);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
|
||||
I_Assert(lua_istable(L, -1));
|
||||
|
|
|
|||
|
|
@ -233,6 +233,8 @@ static int player_get(lua_State *L)
|
|||
lua_pushinteger(L, plr->lastpickuptype);
|
||||
else if (fastcmp(field,"airtime"))
|
||||
lua_pushinteger(L, plr->airtime);
|
||||
else if (fastcmp(field,"lastairtime"))
|
||||
lua_pushinteger(L, plr->lastairtime);
|
||||
else if (fastcmp(field,"flashing"))
|
||||
lua_pushinteger(L, plr->flashing);
|
||||
else if (fastcmp(field,"spinouttimer"))
|
||||
|
|
@ -255,6 +257,8 @@ static int player_get(lua_State *L)
|
|||
lua_pushboolean(L, plr->flipDI);
|
||||
else if (fastcmp(field,"markedfordeath"))
|
||||
lua_pushboolean(L, plr->markedfordeath);
|
||||
else if (fastcmp(field,"dotrickfx"))
|
||||
lua_pushboolean(L, plr->dotrickfx);
|
||||
else if (fastcmp(field,"ringboxdelay"))
|
||||
lua_pushinteger(L, plr->ringboxdelay);
|
||||
else if (fastcmp(field,"ringboxaward"))
|
||||
|
|
@ -325,12 +329,16 @@ static int player_get(lua_State *L)
|
|||
lua_pushinteger(L, plr->tripwireLeniency);
|
||||
else if (fastcmp(field,"tripwireReboundDelay"))
|
||||
lua_pushinteger(L, plr->tripwireReboundDelay);
|
||||
else if (fastcmp(field,"sliptideZip"))
|
||||
lua_pushinteger(L, plr->sliptideZip);
|
||||
else if (fastcmp(field,"sliptideZipDelay"))
|
||||
lua_pushinteger(L, plr->sliptideZipDelay);
|
||||
else if (fastcmp(field,"sliptideZipBoost"))
|
||||
lua_pushinteger(L, plr->sliptideZipBoost);
|
||||
else if (fastcmp(field,"wavedash"))
|
||||
lua_pushinteger(L, plr->wavedash);
|
||||
else if (fastcmp(field,"wavedashdelay"))
|
||||
lua_pushinteger(L, plr->wavedashdelay);
|
||||
else if (fastcmp(field,"wavedashboost"))
|
||||
lua_pushinteger(L, plr->wavedashboost);
|
||||
else if (fastcmp(field,"trickcharge"))
|
||||
lua_pushinteger(L, plr->trickcharge);
|
||||
else if (fastcmp(field,"infinitether"))
|
||||
lua_pushinteger(L, plr->infinitether);
|
||||
else if (fastcmp(field,"lastsafelap"))
|
||||
lua_pushinteger(L, plr->lastsafelap);
|
||||
else if (fastcmp(field,"instaWhipCharge"))
|
||||
|
|
@ -721,6 +729,8 @@ static int player_set(lua_State *L)
|
|||
plr->airtime = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"airtime"))
|
||||
plr->airtime = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"lastairtime"))
|
||||
plr->lastairtime = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"flashing"))
|
||||
plr->flashing = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"spinouttimer"))
|
||||
|
|
@ -743,6 +753,8 @@ static int player_set(lua_State *L)
|
|||
plr->flipDI = luaL_checkboolean(L, 3);
|
||||
else if (fastcmp(field,"markedfordeath"))
|
||||
plr->markedfordeath = luaL_checkboolean(L, 3);
|
||||
else if (fastcmp(field,"dotrickfx"))
|
||||
plr->dotrickfx = luaL_checkboolean(L, 3);
|
||||
else if (fastcmp(field,"ringboxdelay"))
|
||||
plr->ringboxdelay = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"ringboxaward"))
|
||||
|
|
@ -813,12 +825,16 @@ static int player_set(lua_State *L)
|
|||
plr->tripwireLeniency = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"tripwireReboundDelay"))
|
||||
plr->tripwireReboundDelay = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"sliptideZip"))
|
||||
plr->sliptideZip = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"sliptideZipDelay"))
|
||||
plr->sliptideZipDelay = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"sliptideZipBoost"))
|
||||
plr->sliptideZipBoost = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"wavedash"))
|
||||
plr->wavedash = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"wavedashdelay"))
|
||||
plr->wavedashdelay = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"wavedashboost"))
|
||||
plr->wavedashboost = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"trickcharge"))
|
||||
plr->trickcharge = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"infinitether"))
|
||||
plr->infinitether = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"lastsafelap"))
|
||||
plr->lastsafelap = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"instaWhipCharge"))
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ target_sources(SRB2SDL2 PRIVATE
|
|||
wpzothers.c
|
||||
shadow.cpp
|
||||
ball-switch.cpp
|
||||
charge.c
|
||||
)
|
||||
|
||||
add_subdirectory(versus)
|
||||
|
|
|
|||
147
src/objects/charge.c
Normal file
147
src/objects/charge.c
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
#include "../doomdef.h"
|
||||
#include "../info.h"
|
||||
#include "../k_objects.h"
|
||||
#include "../p_local.h"
|
||||
#include "../k_kart.h"
|
||||
#include "../k_powerup.h"
|
||||
#include "../m_random.h"
|
||||
|
||||
#define CHARGEAURA_BURSTTIME (9)
|
||||
#define CHARGEAURA_SPARKRADIUS (40)
|
||||
|
||||
// xval1: destruction timer
|
||||
// xval2: master (spawns other visuals)
|
||||
// cvmem: spawn time (used to offset flash)
|
||||
void Obj_ChargeAuraThink (mobj_t *aura)
|
||||
{
|
||||
if (P_MobjWasRemoved(aura->target) || !aura->target->player || (aura->extravalue1 >= CHARGEAURA_BURSTTIME))
|
||||
{
|
||||
P_RemoveMobj(aura);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj_t *mo = aura->target;
|
||||
player_t *player = mo->player;
|
||||
|
||||
// Follow player
|
||||
aura->flags &= ~(MF_NOCLIPTHING);
|
||||
P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2);
|
||||
aura->flags |= MF_NOCLIPTHING;
|
||||
aura->color = mo->color;
|
||||
|
||||
aura->renderflags &= ~RF_DONTDRAW;
|
||||
|
||||
fixed_t baseScale = 12*mo->scale/10;
|
||||
|
||||
if (aura->extravalue1 || !player->trickcharge)
|
||||
{
|
||||
aura->extravalue1++;
|
||||
baseScale += (mo->scale / 3) * aura->extravalue1;
|
||||
aura->renderflags &= ~RF_TRANSMASK;
|
||||
aura->renderflags |= (aura->extravalue1)<<RF_TRANSSHIFT;
|
||||
if (aura->extravalue1 % 2)
|
||||
aura->renderflags |= RF_DONTDRAW;
|
||||
}
|
||||
|
||||
P_SetScale(aura, baseScale);
|
||||
|
||||
// Twirl
|
||||
aura->angle = aura->angle - ANG1*(player->trickcharge/TICRATE + 4);
|
||||
// Visuals
|
||||
aura->renderflags |= RF_PAPERSPRITE|RF_ADD;
|
||||
|
||||
// fuck
|
||||
boolean forceinvisible = !!!((leveltime - aura->cvmem) % 4);
|
||||
if (aura->extravalue1 || !(player->driftcharge > K_GetKartDriftSparkValueForStage(player, 3)))
|
||||
forceinvisible = false;
|
||||
|
||||
if (forceinvisible)
|
||||
aura->renderflags |= RF_DONTDRAW;
|
||||
|
||||
if (aura->extravalue2)
|
||||
{
|
||||
if (player->driftcharge)
|
||||
{
|
||||
mobj_t *spark = P_SpawnMobjFromMobj(aura,
|
||||
FRACUNIT*P_RandomRange(PR_DECORATION, -1*CHARGEAURA_SPARKRADIUS, CHARGEAURA_SPARKRADIUS),
|
||||
FRACUNIT*P_RandomRange(PR_DECORATION, -1*CHARGEAURA_SPARKRADIUS, CHARGEAURA_SPARKRADIUS),
|
||||
FRACUNIT*P_RandomRange(PR_DECORATION, -1*CHARGEAURA_SPARKRADIUS, CHARGEAURA_SPARKRADIUS),
|
||||
MT_CHARGESPARK);
|
||||
spark->frame = P_RandomRange(PR_DECORATION, 1, 5);
|
||||
spark->renderflags |= RF_FULLBRIGHT|RF_ADD;
|
||||
P_SetTarget(&spark->target, aura);
|
||||
P_SetScale(spark, 15*aura->scale/10);
|
||||
}
|
||||
|
||||
if (forceinvisible)
|
||||
{
|
||||
mobj_t *flicker = P_SpawnMobjFromMobj(aura, 0, 0, 0, MT_CHARGEFLICKER);
|
||||
P_SetTarget(&flicker->target, aura);
|
||||
P_SetScale(flicker, aura->scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Obj_ChargeFallThink (mobj_t *charge)
|
||||
{
|
||||
if (P_MobjWasRemoved(charge->target) || !charge->target->player)
|
||||
{
|
||||
P_RemoveMobj(charge);
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj_t *mo = charge->target;
|
||||
|
||||
// Follow player
|
||||
charge->flags &= ~(MF_NOCLIPTHING);
|
||||
P_MoveOrigin(charge, mo->x, mo->y, mo->z);
|
||||
charge->flags |= MF_NOCLIPTHING;
|
||||
charge->color = mo->color;
|
||||
charge->angle = mo->angle + ANGLE_45 + (ANGLE_90 * charge->extravalue1);
|
||||
|
||||
if (!P_IsObjectOnGround(mo))
|
||||
charge->renderflags |= RF_DONTDRAW;
|
||||
else
|
||||
charge->renderflags &= ~RF_DONTDRAW;
|
||||
|
||||
fixed_t baseScale = 12*mo->scale/10;
|
||||
P_SetScale(charge, baseScale);
|
||||
|
||||
charge->renderflags &= ~RF_TRANSMASK;
|
||||
if (charge->tics < 10)
|
||||
charge->renderflags |= (9 - charge->tics)<<RF_TRANSSHIFT;
|
||||
|
||||
// Visuals
|
||||
charge->renderflags |= RF_PAPERSPRITE|RF_ADD;
|
||||
}
|
||||
}
|
||||
|
||||
// xval1: lifetime (used to offset from tracked player)
|
||||
void Obj_ChargeReleaseThink (mobj_t *release)
|
||||
{
|
||||
release->renderflags &= ~RF_TRANSMASK;
|
||||
if (release->tics < 36)
|
||||
release->renderflags |= (9 - release->tics/4)<<RF_TRANSSHIFT;
|
||||
release->rollangle += ANG15/2;
|
||||
|
||||
if (P_MobjWasRemoved(release->target) || !release->target->player)
|
||||
return;
|
||||
|
||||
release->extravalue1++;
|
||||
|
||||
fixed_t off = 8 * release->extravalue1 * release->target->scale;
|
||||
angle_t ang = K_MomentumAngle(release->target) + ANGLE_180;
|
||||
fixed_t xoff = FixedMul(off, FINECOSINE(ang >> ANGLETOFINESHIFT));
|
||||
fixed_t yoff = FixedMul(off, FINESINE(ang >> ANGLETOFINESHIFT));
|
||||
|
||||
P_MoveOrigin(release, release->target->x + xoff, release->target->y + yoff, release->target->z + release->target->height/2);
|
||||
}
|
||||
|
||||
void Obj_ChargeExtraThink (mobj_t *extra)
|
||||
{
|
||||
extra->renderflags &= ~RF_TRANSMASK;
|
||||
if (extra->tics < 18)
|
||||
extra->renderflags |= (9 - extra->tics/2)<<RF_TRANSSHIFT;
|
||||
extra->rollangle += ANG30;
|
||||
}
|
||||
|
|
@ -66,7 +66,7 @@ void Obj_RainbowDashRingSpawn(mobj_t *mobj)
|
|||
|
||||
void Obj_DashRingSetup(mobj_t *mobj, mapthing_t *mthing)
|
||||
{
|
||||
static const UINT8 numColors = sizeof(rainbow_colors) / sizeof(skincolornum_t);
|
||||
static const UINT8 numColors = sizeof(ring_colors) / sizeof(skincolornum_t);
|
||||
const UINT8 additionalThrust = mthing->thing_args[1];
|
||||
statenum_t ringState, overlayState;
|
||||
|
||||
|
|
@ -199,8 +199,6 @@ static void RegularDashRingLaunch(player_t *player, mobj_t *ring)
|
|||
static void RainbowDashRingLaunch(player_t *player, mobj_t *ring)
|
||||
{
|
||||
player->mo->eflags &= ~MFE_SPRUNG;
|
||||
player->trickpanel = 1;
|
||||
player->pflags |= PF_TRICKDELAY;
|
||||
K_DoPogoSpring(player->mo, 0, 0);
|
||||
DashRingLaunch(player, ring);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -268,6 +268,8 @@ void Obj_DLZSeasawThink(mobj_t *mo)
|
|||
P_InstaThrust(t, mo->angle, mo->movefactor*3); // send the player flying at triple the speed they came at us with.
|
||||
S_StartSound(t, sfx_cdfm62);
|
||||
|
||||
K_SetTireGrease(p, 3*TICRATE);
|
||||
|
||||
p->seasawangleadd = 0;
|
||||
p->seasawangle = 0;
|
||||
p->seasawmoreangle = 0;
|
||||
|
|
|
|||
|
|
@ -121,10 +121,14 @@ void Obj_RandomItemVisuals(mobj_t *mobj)
|
|||
//
|
||||
// Then extraval1 starts ticking up and triggers the transformation from Ringbox to Random Item.
|
||||
if (mobj->fuse == 0 && !(mobj->flags & MF_NOCLIPTHING) && !(mobj->flags2 & MF2_BOSSDEAD) && !cv_thunderdome.value
|
||||
&& (modeattacking == 0 || specialstageinfo.valid)) // Time Attacking in Special is a fucked-looking exception
|
||||
&& (modeattacking == ATTACKING_NONE || !!(modeattacking & ATTACKING_SPB) || specialstageinfo.valid)) // Time Attacking in Special is a fucked-looking exception
|
||||
{
|
||||
mobj->extravalue1++;
|
||||
|
||||
// Dumb, but in Attack starts (or POSITION from hell) you can reach early boxes before they transform.
|
||||
if (leveltime == 0)
|
||||
mobj->extravalue1 = RINGBOX_TIME;
|
||||
|
||||
// Don't transform stuff that isn't a Ring Box, idiot
|
||||
statenum_t boxstate = mobj->state - states;
|
||||
if (boxstate < S_RINGBOX1 || boxstate > S_RINGBOX12)
|
||||
|
|
|
|||
|
|
@ -765,14 +765,14 @@ mobj_t *Obj_SuperFlickyOwner(const mobj_t* mobj)
|
|||
{
|
||||
const Flicky* x = static_cast<const Flicky*>(mobj);
|
||||
|
||||
return x->source();
|
||||
return x->valid() ? x->source() : nullptr;
|
||||
}
|
||||
|
||||
boolean Obj_IsSuperFlickyWhippable(const mobj_t* mobj)
|
||||
boolean Obj_IsSuperFlickyWhippable(const mobj_t* mobj, const mobj_t* target)
|
||||
{
|
||||
const Flicky* x = static_cast<const Flicky*>(mobj);
|
||||
|
||||
return mobj == x->chasing() && !x->stunned();
|
||||
return target == x->chasing() && !x->stunned();
|
||||
}
|
||||
|
||||
boolean Obj_IsSuperFlickyTargettingYou(const mobj_t* mobj, mobj_t *player)
|
||||
|
|
@ -780,4 +780,4 @@ boolean Obj_IsSuperFlickyTargettingYou(const mobj_t* mobj, mobj_t *player)
|
|||
const Flicky* x = static_cast<const Flicky*>(mobj);
|
||||
|
||||
return player == x->chasing();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1017,7 +1017,6 @@ static mobj_t *SearchMarioNode(msecnode_t *node)
|
|||
}
|
||||
// Ignore popped monitors, too.
|
||||
if (node->m_thing->health == 0 // this only really applies for monitors
|
||||
|| (!(node->m_thing->flags & MF_MONITOR) && (mobjinfo[node->m_thing->type].flags & MF_MONITOR)) // gold monitor support
|
||||
|| (node->m_thing->type == MT_RANDOMITEM))
|
||||
continue;
|
||||
// Okay, we found something valid.
|
||||
|
|
@ -2344,7 +2343,6 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
|
|||
fixed_t topheight = *rover->topheight;
|
||||
mariothink_t *block;
|
||||
mobj_t *thing;
|
||||
fixed_t oldx = 0, oldy = 0, oldz = 0;
|
||||
|
||||
I_Assert(puncher != NULL);
|
||||
I_Assert(puncher->player != NULL);
|
||||
|
|
@ -2362,7 +2360,6 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
|
|||
S_StartSound(puncher, sfx_mario1); // "Thunk!" sound - puncher is "close enough".
|
||||
else // Found something!
|
||||
{
|
||||
const boolean itsamonitor = (thing->flags & MF_MONITOR) == MF_MONITOR;
|
||||
// create and initialize new elevator thinker
|
||||
|
||||
block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL);
|
||||
|
|
@ -2383,13 +2380,6 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
|
|||
R_CreateInterpolator_SectorPlane(&block->thinker, roversec, false);
|
||||
R_CreateInterpolator_SectorPlane(&block->thinker, roversec, true);
|
||||
|
||||
if (itsamonitor)
|
||||
{
|
||||
oldx = thing->x;
|
||||
oldy = thing->y;
|
||||
oldz = thing->z;
|
||||
}
|
||||
|
||||
P_UnsetThingPosition(thing);
|
||||
thing->x = thing->old_x = sector->soundorg.x;
|
||||
thing->y = thing->old_y = sector->soundorg.y;
|
||||
|
|
@ -2410,16 +2400,5 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
|
|||
// "Powerup rise" sound
|
||||
S_StartSound(puncher, sfx_mario9); // Puncher is "close enough"
|
||||
}
|
||||
|
||||
if (itsamonitor && thing)
|
||||
{
|
||||
P_UnsetThingPosition(thing);
|
||||
thing->x = thing->old_x = oldx;
|
||||
thing->y = thing->old_y = oldy;
|
||||
thing->z = thing->old_z = oldz;
|
||||
thing->momx = 1;
|
||||
thing->momy = 1;
|
||||
P_SetThingPosition(thing);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
#include "k_hitlag.h"
|
||||
#include "acs/interface.h"
|
||||
#include "k_powerup.h"
|
||||
#include "k_collide.h"
|
||||
|
||||
// CTF player names
|
||||
#define CTFTEAMCODE(pl) pl->ctfteam ? (pl->ctfteam == 1 ? "\x85" : "\x84") : ""
|
||||
|
|
@ -1537,7 +1538,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
target->momx = target->momy = target->momz = 0;
|
||||
|
||||
// SRB2kart
|
||||
if (target->type != MT_PLAYER && !(target->flags & MF_MONITOR)
|
||||
if (target->type != MT_PLAYER
|
||||
&& !(target->type == MT_ORBINAUT || target->type == MT_ORBINAUT_SHIELD
|
||||
|| target->type == MT_JAWZ || target->type == MT_JAWZ_SHIELD
|
||||
|| target->type == MT_BANANA || target->type == MT_BANANA_SHIELD
|
||||
|
|
@ -1630,7 +1631,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
// if killed by a player
|
||||
if (source && source->player)
|
||||
{
|
||||
if (target->flags & MF_MONITOR || target->type == MT_RANDOMITEM)
|
||||
if (target->type == MT_RANDOMITEM)
|
||||
{
|
||||
P_SetTarget(&target->target, source);
|
||||
|
||||
|
|
@ -1692,7 +1693,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
target->player->roundscore = 0;
|
||||
}
|
||||
|
||||
target->player->trickpanel = 0;
|
||||
target->player->trickpanel = TRICKSTATE_NONE;
|
||||
|
||||
ACS_RunPlayerDeathScript(target->player);
|
||||
}
|
||||
|
|
@ -2611,10 +2612,18 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source,
|
|||
|
||||
P_SetPlayerMobjState(player->mo, player->mo->info->deathstate);
|
||||
|
||||
if (player->sliptideZipIndicator && !P_MobjWasRemoved(player->sliptideZipIndicator))
|
||||
P_RemoveMobj(player->sliptideZipIndicator);
|
||||
if (player->stumbleIndicator && !P_MobjWasRemoved(player->stumbleIndicator))
|
||||
P_RemoveMobj(player->stumbleIndicator);
|
||||
#define PlayerPointerRemove(field) \
|
||||
if (P_MobjWasRemoved(field) == false) \
|
||||
{ \
|
||||
P_RemoveMobj(field); \
|
||||
P_SetTarget(&field, NULL); \
|
||||
}
|
||||
|
||||
PlayerPointerRemove(player->stumbleIndicator);
|
||||
PlayerPointerRemove(player->wavedashIndicator);
|
||||
PlayerPointerRemove(player->trickIndicator);
|
||||
|
||||
#undef PlayerPointerRemove
|
||||
|
||||
if (type == DMG_TIMEOVER)
|
||||
{
|
||||
|
|
@ -2929,6 +2938,14 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
invincible = false;
|
||||
}
|
||||
|
||||
// TODO: doing this from P_DamageMobj limits punting to objects that damage the player.
|
||||
// And it may be kind of yucky.
|
||||
// But this is easier than accounting for every condition in PIT_CheckThing!
|
||||
if (inflictor && K_PuntCollide(inflictor, target))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (invincible && type != DMG_STUMBLE && type != DMG_WHUMBLE)
|
||||
{
|
||||
const INT32 oldHitlag = target->hitlag;
|
||||
|
|
@ -3164,6 +3181,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
break;
|
||||
}
|
||||
|
||||
// Have a shield? You get hit, but don't lose your rings!
|
||||
if (player->curshield != KSHIELD_NONE)
|
||||
{
|
||||
ringburst = 0;
|
||||
}
|
||||
|
||||
if (type != DMG_STUMBLE && type != DMG_WHUMBLE)
|
||||
{
|
||||
if (type != DMG_STING)
|
||||
|
|
@ -3351,7 +3374,7 @@ void P_PlayerRingBurst(player_t *player, INT32 num_rings)
|
|||
return;
|
||||
|
||||
// Have a shield? You get hit, but don't lose your rings!
|
||||
if (K_GetShieldFromItem(player->itemtype) != KSHIELD_NONE)
|
||||
if (player->curshield != KSHIELD_NONE)
|
||||
return;
|
||||
|
||||
// 20 is the maximum number of rings that can be taken from you at once - half the span of your counter
|
||||
|
|
|
|||
|
|
@ -596,6 +596,8 @@ mobj_t *P_FindMobjFromTID(mtag_t tid, mobj_t *i, mobj_t *activator);
|
|||
|
||||
void P_DeleteMobjStringArgs(mobj_t *mobj);
|
||||
|
||||
tic_t P_MobjIsReappearing(const mobj_t *mobj);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
|
|
|||
175
src/p_map.c
175
src/p_map.c
|
|
@ -427,12 +427,8 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
{
|
||||
if (spring->reactiontime == 0)
|
||||
{
|
||||
object->player->tricktime = 0; // Reset post-hitlag timer
|
||||
// Setup the boost for potential upwards trick, at worse, make it your regular max speed. (boost = curr speed*1.25)
|
||||
object->player->trickboostpower = max(FixedDiv(object->player->speed, K_GetKartSpeed(object->player, false, false)) - FRACUNIT, 0)*125/100;
|
||||
//CONS_Printf("Got boost: %d%\n", mo->player->trickboostpower*100 / FRACUNIT);
|
||||
object->player->trickpanel = 1;
|
||||
object->player->pflags |= PF_TRICKDELAY;
|
||||
object->eflags &= ~MFE_SPRUNG; // needed to permit the following
|
||||
K_DoPogoSpring(object, -vertispeed, 0); // negative so momz isn't modified
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -512,12 +508,6 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object)
|
|||
|
||||
if (spring->thing_args[1])
|
||||
{
|
||||
if (object->player)
|
||||
{
|
||||
object->player->trickpanel = 1;
|
||||
object->player->pflags |= PF_TRICKDELAY;
|
||||
}
|
||||
|
||||
K_DoPogoSpring(object, 32<<FRACBITS, 0);
|
||||
}
|
||||
else
|
||||
|
|
@ -538,6 +528,7 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object)
|
|||
static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
||||
{
|
||||
fixed_t blockdist;
|
||||
boolean damage = false;
|
||||
|
||||
if (tm.thing == NULL || P_MobjWasRemoved(tm.thing) == true)
|
||||
return BMIT_STOP; // func just popped our tm.thing, cannot continue.
|
||||
|
|
@ -562,6 +553,10 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
|||
if ((thing->flags & MF_NOCLIPTHING) || !(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE|MF_SPRING)))
|
||||
return BMIT_CONTINUE;
|
||||
|
||||
// Thing is respawning
|
||||
if (P_MobjIsReappearing(thing))
|
||||
return BMIT_CONTINUE;
|
||||
|
||||
blockdist = thing->radius + tm.thing->radius;
|
||||
|
||||
if (abs(thing->x - tm.x) >= blockdist || abs(thing->y - tm.y) >= blockdist)
|
||||
|
|
@ -664,23 +659,6 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
|||
&& (tm.thing->type == MT_BLENDEYE_MAIN || tm.thing->type == MT_BLENDEYE_EYE || tm.thing->type == MT_BLENDEYE_PUYO))
|
||||
return BMIT_CONTINUE;
|
||||
|
||||
// When solid spikes move, assume they just popped up and teleport things on top of them to hurt.
|
||||
if (tm.thing->type == MT_SPIKE && tm.thing->flags & MF_SOLID)
|
||||
{
|
||||
if (thing->z > tm.thing->z + tm.thing->height)
|
||||
return BMIT_CONTINUE; // overhead
|
||||
if (thing->z + thing->height < tm.thing->z)
|
||||
return BMIT_CONTINUE; // underneath
|
||||
|
||||
if (tm.thing->eflags & MFE_VERTICALFLIP)
|
||||
P_SetOrigin(thing, thing->x, thing->y, tm.thing->z - thing->height - FixedMul(FRACUNIT, tm.thing->scale));
|
||||
else
|
||||
P_SetOrigin(thing, thing->x, thing->y, tm.thing->z + tm.thing->height + FixedMul(FRACUNIT, tm.thing->scale));
|
||||
if (thing->flags & MF_SHOOTABLE)
|
||||
P_DamageMobj(thing, tm.thing, tm.thing, 1, 0);
|
||||
return BMIT_CONTINUE;
|
||||
}
|
||||
|
||||
if (thing->flags & MF_PAIN)
|
||||
{ // Player touches painful thing sitting on the floor
|
||||
// see if it went over / under
|
||||
|
|
@ -694,10 +672,12 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
|||
|
||||
if (P_DamageMobj(tm.thing, thing, thing, 1, damagetype) && (damagetype = (thing->info->mass>>8)))
|
||||
S_StartSound(thing, damagetype);
|
||||
}
|
||||
|
||||
if (P_MobjWasRemoved(tm.thing) || P_MobjWasRemoved(thing))
|
||||
return BMIT_CONTINUE;
|
||||
if (P_MobjWasRemoved(tm.thing) || P_MobjWasRemoved(thing))
|
||||
return BMIT_CONTINUE;
|
||||
|
||||
damage = true;
|
||||
}
|
||||
}
|
||||
else if (tm.thing->flags & MF_PAIN && thing->player)
|
||||
{ // Painful thing splats player in the face
|
||||
|
|
@ -712,10 +692,12 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
|||
|
||||
if (P_DamageMobj(thing, tm.thing, tm.thing, 1, damagetype) && (damagetype = (tm.thing->info->mass>>8)))
|
||||
S_StartSound(tm.thing, damagetype);
|
||||
}
|
||||
|
||||
if (P_MobjWasRemoved(tm.thing) || P_MobjWasRemoved(thing))
|
||||
return BMIT_CONTINUE;
|
||||
if (P_MobjWasRemoved(tm.thing) || P_MobjWasRemoved(thing))
|
||||
return BMIT_CONTINUE;
|
||||
|
||||
damage = true;
|
||||
}
|
||||
}
|
||||
|
||||
// check for skulls slamming into things
|
||||
|
|
@ -1216,7 +1198,7 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
|||
}
|
||||
|
||||
// missiles can hit other things
|
||||
if (tm.thing->flags & MF_MISSILE)
|
||||
if ((tm.thing->flags & MF_MISSILE) && !damage) // if something was already damaged, don't run this
|
||||
{
|
||||
UINT8 damagetype = (tm.thing->info->mass ^ DMG_WOMBO);
|
||||
|
||||
|
|
@ -1327,78 +1309,65 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
|||
}
|
||||
|
||||
// Sprite Spikes!
|
||||
// Do not return because solidity code comes below.
|
||||
if (tm.thing->type == MT_SPIKE && tm.thing->flags & MF_SOLID && thing->player) // moving spike rams into player?!
|
||||
if ((tm.thing->type == MT_SPIKE || tm.thing->type == MT_WALLSPIKE) && (tm.thing->flags & MF_SOLID)) // spike pops up
|
||||
{
|
||||
if (tm.thing->eflags & MFE_VERTICALFLIP)
|
||||
// see if it went over / under
|
||||
if (tm.thing->z > thing->z + thing->height)
|
||||
return BMIT_CONTINUE; // overhead
|
||||
if (tm.thing->z + tm.thing->height < thing->z)
|
||||
return BMIT_CONTINUE; // underneath
|
||||
|
||||
if (thing->flags & MF_SHOOTABLE)
|
||||
{
|
||||
if (thing->z + thing->height <= tm.thing->z + FixedMul(FRACUNIT, tm.thing->scale)
|
||||
&& thing->z + thing->height + thing->momz >= tm.thing->z + FixedMul(FRACUNIT, tm.thing->scale) + tm.thing->momz)
|
||||
P_DamageMobj(thing, tm.thing, tm.thing, 1, DMG_TUMBLE);
|
||||
if (P_MobjFlip(thing) == P_MobjFlip(tm.thing))
|
||||
{
|
||||
if (P_DamageMobj(thing, tm.thing, tm.thing, 1, DMG_TUMBLE))
|
||||
{
|
||||
// FIXME: None of this is correct for wall spikes,
|
||||
// but I don't feel like testing that right now.
|
||||
|
||||
// Increase vertical momentum for a strong effect
|
||||
thing->momz += (tm.thing->height / 2) * P_MobjFlip(tm.thing);
|
||||
|
||||
// Teleport on top of the spikes
|
||||
P_MoveOrigin(
|
||||
thing,
|
||||
thing->x,
|
||||
thing->y,
|
||||
tm.thing->z + (P_MobjFlip(thing) > 0 ? tm.thing->height : -thing->height)
|
||||
);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
P_DamageMobj(thing, tm.thing, tm.thing, 1, DMG_NORMAL);
|
||||
}
|
||||
}
|
||||
else if (thing->z >= tm.thing->z + tm.thing->height - FixedMul(FRACUNIT, tm.thing->scale)
|
||||
&& thing->z + thing->momz <= tm.thing->z + tm.thing->height - FixedMul(FRACUNIT, tm.thing->scale) + tm.thing->momz)
|
||||
P_DamageMobj(thing, tm.thing, tm.thing, 1, DMG_TUMBLE);
|
||||
return BMIT_CONTINUE;
|
||||
}
|
||||
else if (thing->type == MT_SPIKE && thing->flags & MF_SOLID && tm.thing->player) // unfortunate player falls into spike?!
|
||||
else if ((thing->type == MT_SPIKE || thing->type == MT_WALLSPIKE) &&
|
||||
(thing->flags & MF_SOLID) && (tm.thing->flags & MF_SHOOTABLE)) // stationary spike
|
||||
{
|
||||
if (thing->eflags & MFE_VERTICALFLIP)
|
||||
// see if it went over / under
|
||||
if (tm.thing->z > thing->z + thing->height)
|
||||
return BMIT_CONTINUE; // overhead
|
||||
if (tm.thing->z + tm.thing->height < thing->z)
|
||||
return BMIT_CONTINUE; // underneath
|
||||
|
||||
if (tm.thing->player && tm.thing->player && tm.thing->player->tumbleBounces > 0)
|
||||
{
|
||||
if (tm.thing->z + tm.thing->height <= thing->z - FixedMul(FRACUNIT, thing->scale)
|
||||
&& tm.thing->z + tm.thing->height + tm.thing->momz >= thing->z - FixedMul(FRACUNIT, thing->scale))
|
||||
P_DamageMobj(tm.thing, thing, thing, 1, DMG_TUMBLE);
|
||||
return BMIT_CONTINUE;
|
||||
}
|
||||
else if (tm.thing->z >= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale)
|
||||
&& tm.thing->z + tm.thing->momz <= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale))
|
||||
|
||||
if (!P_IsObjectOnGround(tm.thing) && tm.thing->momz * P_MobjFlip(tm.thing) < 0) // fell into it
|
||||
{
|
||||
P_DamageMobj(tm.thing, thing, thing, 1, DMG_TUMBLE);
|
||||
}
|
||||
|
||||
if (tm.thing->type == MT_WALLSPIKE && tm.thing->flags & MF_SOLID && thing->player) // wall spike impales player
|
||||
{
|
||||
fixed_t bottomz, topz;
|
||||
bottomz = tm.thing->z;
|
||||
topz = tm.thing->z + tm.thing->height;
|
||||
if (tm.thing->eflags & MFE_VERTICALFLIP)
|
||||
bottomz -= FixedMul(FRACUNIT, tm.thing->scale);
|
||||
else
|
||||
topz += FixedMul(FRACUNIT, tm.thing->scale);
|
||||
|
||||
if (thing->z + thing->height > bottomz // above bottom
|
||||
&& thing->z < topz) // below top
|
||||
// don't check angle, the player was clearly in the way in this case
|
||||
P_DamageMobj(thing, tm.thing, tm.thing, 1, DMG_NORMAL);
|
||||
}
|
||||
else if (thing->type == MT_WALLSPIKE && thing->flags & MF_SOLID && tm.thing->player)
|
||||
{
|
||||
fixed_t bottomz, topz;
|
||||
angle_t touchangle = R_PointToAngle2(thing->tracer->x, thing->tracer->y, tm.thing->x, tm.thing->y);
|
||||
|
||||
if (P_PlayerInPain(tm.thing->player) && (tm.thing->momx || tm.thing->momy))
|
||||
{
|
||||
angle_t playerangle = R_PointToAngle2(0, 0, tm.thing->momx, tm.thing->momy) - touchangle;
|
||||
if (playerangle > ANGLE_180)
|
||||
playerangle = InvAngle(playerangle);
|
||||
if (playerangle < ANGLE_90)
|
||||
return BMIT_CONTINUE; // Yes, this is intentionally outside the z-height check. No standing on spikes whilst moving away from them.
|
||||
return BMIT_CONTINUE;
|
||||
}
|
||||
|
||||
bottomz = thing->z;
|
||||
topz = thing->z + thing->height;
|
||||
|
||||
if (thing->eflags & MFE_VERTICALFLIP)
|
||||
bottomz -= FixedMul(FRACUNIT, thing->scale);
|
||||
else
|
||||
topz += FixedMul(FRACUNIT, thing->scale);
|
||||
|
||||
if (tm.thing->z + tm.thing->height > bottomz // above bottom
|
||||
&& tm.thing->z < topz // below top
|
||||
&& !P_MobjWasRemoved(thing->tracer)) // this probably wouldn't work if we didn't have a tracer
|
||||
{ // use base as a reference point to determine what angle you touched the spike at
|
||||
touchangle = thing->angle - touchangle;
|
||||
if (touchangle > ANGLE_180)
|
||||
touchangle = InvAngle(touchangle);
|
||||
if (touchangle <= ANGLE_22h) // if you touched it at this close an angle, you get poked!
|
||||
P_DamageMobj(tm.thing, thing, thing, 1, DMG_NORMAL);
|
||||
{
|
||||
// Do not return because solidity code comes below.
|
||||
P_DamageMobj(tm.thing, thing, thing, 1, DMG_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1626,7 +1595,10 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
|||
if (tm.thing->z + tm.thing->height < thing->z)
|
||||
return BMIT_CONTINUE; // underneath
|
||||
|
||||
K_KartSolidBounce(tm.thing, thing);
|
||||
if (!K_PuntCollide(thing, tm.thing))
|
||||
{
|
||||
K_KartSolidBounce(tm.thing, thing);
|
||||
}
|
||||
return BMIT_CONTINUE;
|
||||
}
|
||||
}
|
||||
|
|
@ -2341,7 +2313,8 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y, TryMoveResult_t *re
|
|||
// Check things first, possibly picking things up.
|
||||
|
||||
// MF_NOCLIPTHING: used by camera to not be blocked by things
|
||||
if (!(thing->flags & MF_NOCLIPTHING))
|
||||
// Respawning things should also be intangible to other things
|
||||
if (!(thing->flags & MF_NOCLIPTHING) && !P_MobjIsReappearing(thing))
|
||||
{
|
||||
for (bx = xl; bx <= xh; bx++)
|
||||
{
|
||||
|
|
@ -4220,7 +4193,7 @@ static BlockItReturn_t PIT_RadiusAttack(mobj_t *thing)
|
|||
if ((bombdamagetype & DMG_CANTHURTSELF) && bombsource && thing->type == bombsource->type) // ignore the type of guys who dropped the bomb (Jetty-Syn Bomber or Skim can bomb eachother, but not themselves.)
|
||||
return BMIT_CONTINUE;
|
||||
|
||||
if ((thing->flags & (MF_MONITOR|MF_SHOOTABLE)) != MF_SHOOTABLE)
|
||||
if ((thing->flags & MF_SHOOTABLE) != MF_SHOOTABLE)
|
||||
return BMIT_CONTINUE;
|
||||
|
||||
dx = abs(thing->x - bombspot->x);
|
||||
|
|
|
|||
300
src/p_mobj.c
300
src/p_mobj.c
|
|
@ -1149,7 +1149,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
P_PlayerFlip(mo);
|
||||
}
|
||||
|
||||
if (mo->player->trickpanel >= 2)
|
||||
if (mo->player->trickpanel > TRICKSTATE_READY)
|
||||
{
|
||||
gravityadd = (5*gravityadd)/2;
|
||||
}
|
||||
|
|
@ -1725,25 +1725,6 @@ void P_XYMovement(mobj_t *mo)
|
|||
P_ExplodeMissile(mo);
|
||||
return;
|
||||
}
|
||||
else if (mo->flags & MF_STICKY)
|
||||
{
|
||||
S_StartSound(mo, mo->info->activesound);
|
||||
mo->momx = mo->momy = mo->momz = 0; //Full stop!
|
||||
mo->flags |= MF_NOGRAVITY; //Stay there!
|
||||
mo->flags &= ~MF_STICKY; //Don't check again!
|
||||
|
||||
// Check for hit against sky here
|
||||
if (P_CheckSkyHit(mo))
|
||||
{
|
||||
// Hack to prevent missiles exploding
|
||||
// against the sky.
|
||||
// Does not handle sky floors.
|
||||
// Check frontsector as well.
|
||||
|
||||
P_RemoveMobj(mo);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
boolean walltransferred = false;
|
||||
|
|
@ -5698,12 +5679,12 @@ static void P_FlameJetSceneryThink(mobj_t *mobj)
|
|||
flame->angle = mobj->angle;
|
||||
|
||||
if (mobj->flags2 & MF2_AMBUSH) // Wave up and down instead of side-to-side
|
||||
flame->momz = mobj->fuse << (FRACBITS - 2);
|
||||
flame->momz = (mobj->fuse * mapobjectscale) / 4;
|
||||
else
|
||||
flame->angle += FixedAngle(mobj->fuse<<FRACBITS);
|
||||
|
||||
strength = 20*FRACUNIT;
|
||||
strength -= ((20*FRACUNIT)/16)*mobj->movedir;
|
||||
strength = 20*mapobjectscale;
|
||||
strength -= ((20*mapobjectscale)/16)*mobj->movedir;
|
||||
|
||||
P_InstaThrust(flame, flame->angle, strength);
|
||||
S_StartSound(flame, sfx_fire);
|
||||
|
|
@ -5733,8 +5714,8 @@ static void P_VerticalFlameJetSceneryThink(mobj_t *mobj)
|
|||
|
||||
flame = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_FLAMEJETFLAME);
|
||||
|
||||
strength = 20*FRACUNIT;
|
||||
strength -= ((20*FRACUNIT)/16)*mobj->movedir;
|
||||
strength = 20*mapobjectscale;
|
||||
strength -= ((20*mapobjectscale)/16)*mobj->movedir;
|
||||
|
||||
// If deaf'd, the object spawns on the ceiling.
|
||||
if (mobj->flags2 & MF2_AMBUSH)
|
||||
|
|
@ -5748,7 +5729,7 @@ static void P_VerticalFlameJetSceneryThink(mobj_t *mobj)
|
|||
P_SetMobjState(flame, S_FLAMEJETFLAME7);
|
||||
}
|
||||
|
||||
P_InstaThrust(flame, mobj->angle, FixedDiv(mobj->fuse*FRACUNIT, 3*FRACUNIT));
|
||||
P_InstaThrust(flame, mobj->angle, (mobj->fuse * mapobjectscale) / 3);
|
||||
S_StartSound(flame, sfx_fire);
|
||||
}
|
||||
|
||||
|
|
@ -8414,10 +8395,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
return true;
|
||||
}
|
||||
|
||||
mobj->extravalue1 += 1;
|
||||
|
||||
mobj->angle += ANG1*mobj->extravalue1;
|
||||
P_SetScale(mobj, mobj->target->scale);
|
||||
mobj->extravalue1 += 1;
|
||||
P_InstaScale(mobj, mobj->target->scale);
|
||||
|
||||
destx = mobj->target->x;
|
||||
desty = mobj->target->y;
|
||||
|
|
@ -8426,6 +8406,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
{
|
||||
destx += FixedMul(mobj->radius*2, FINECOSINE((mobj->angle+ANGLE_90) >> ANGLETOFINESHIFT));
|
||||
desty += FixedMul(mobj->radius*2, FINESINE((mobj->angle+ANGLE_90) >> ANGLETOFINESHIFT));
|
||||
|
||||
mobj->eflags = (mobj->eflags & ~MFE_VERTICALFLIP)|(mobj->target->eflags & MFE_VERTICALFLIP);
|
||||
mobj->flags2 = (mobj->flags2 & ~MF2_OBJECTFLIP)|(mobj->target->flags2 & MF2_OBJECTFLIP);
|
||||
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
zoff += mobj->target->height - mobj->height;
|
||||
}
|
||||
else if (mobj->state == &states[S_MAGICIANBOX_TOP]) // top
|
||||
{
|
||||
|
|
@ -8435,6 +8421,150 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
// Necessary to "ride" on Garden Top
|
||||
zoff += mobj->target->sprzoff;
|
||||
|
||||
if (mobj->flags2 & MF2_AMBUSH)
|
||||
{
|
||||
P_SetOrigin(mobj, destx, desty, mobj->target->z + zoff);
|
||||
mobj->old_angle = mobj->angle;
|
||||
mobj->flags2 &= ~MF2_AMBUSH;
|
||||
}
|
||||
else
|
||||
{
|
||||
P_MoveOrigin(mobj, destx, desty, mobj->target->z + zoff);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MT_SIDETRICK:
|
||||
{
|
||||
fixed_t destx, desty;
|
||||
fixed_t zoff = 0;
|
||||
|
||||
if (!mobj->target
|
||||
|| !mobj->target->health
|
||||
|| !mobj->target->player
|
||||
|| mobj->target->player->trickpanel <= TRICKSTATE_FORWARD)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Flicker every other frame from first visibility
|
||||
if (mobj->flags2 & MF2_BOSSDEAD)
|
||||
{
|
||||
mobj->renderflags |= RF_DONTDRAW;
|
||||
}
|
||||
else
|
||||
{
|
||||
mobj->renderflags &= ~RF_DONTDRAW;
|
||||
mobj->renderflags |= (mobj->target->renderflags & RF_DONTDRAW);
|
||||
}
|
||||
|
||||
mobj->eflags = (mobj->eflags & ~MFE_VERTICALFLIP)|(mobj->target->eflags & MFE_VERTICALFLIP);
|
||||
mobj->flags2 = ((mobj->flags2 & ~MF2_OBJECTFLIP)|(mobj->target->flags2 & MF2_OBJECTFLIP)) ^ MF2_BOSSDEAD;
|
||||
|
||||
fixed_t scale = mobj->target->scale;
|
||||
|
||||
// sweeping effect
|
||||
if (mobj->target->player->trickpanel == TRICKSTATE_BACK)
|
||||
{
|
||||
const fixed_t saferange = (20*FRACUNIT)/21;
|
||||
if (mobj->threshold < -saferange)
|
||||
{
|
||||
mobj->threshold = -saferange;
|
||||
mobj->flags2 |= MF2_AMBUSH;
|
||||
}
|
||||
else while (mobj->threshold > saferange)
|
||||
{
|
||||
mobj->threshold -= 2*saferange;
|
||||
mobj->flags2 |= MF2_AMBUSH;
|
||||
}
|
||||
|
||||
scale = P_ReturnThrustX(mobj, FixedAngle(90*mobj->threshold), scale);
|
||||
|
||||
// This funny dealie is to make it so default
|
||||
// scale is placed as standard,
|
||||
// but variant threshold shifts upwards
|
||||
fixed_t extraoffset = FixedMul(mobj->info->height, mobj->target->scale - scale);
|
||||
if (mobj->threshold < 0)
|
||||
extraoffset /= 2;
|
||||
|
||||
// And this makes it swooce across the object.
|
||||
extraoffset += FixedMul(mobj->threshold, mobj->target->height);
|
||||
|
||||
zoff += P_MobjFlip(mobj) * extraoffset;
|
||||
|
||||
mobj->threshold += (saferange/8);
|
||||
}
|
||||
|
||||
mobj->angle += mobj->movedir;
|
||||
P_InstaScale(mobj, scale);
|
||||
|
||||
destx = mobj->target->x;
|
||||
desty = mobj->target->y;
|
||||
|
||||
destx += P_ReturnThrustX(mobj, mobj->angle - ANGLE_90, mobj->radius*2);
|
||||
desty += P_ReturnThrustY(mobj, mobj->angle - ANGLE_90, mobj->radius*2);
|
||||
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
zoff += mobj->target->height - mobj->height;
|
||||
|
||||
// Necessary to "ride" on Garden Top
|
||||
zoff += mobj->target->sprzoff;
|
||||
|
||||
if (mobj->flags2 & MF2_AMBUSH)
|
||||
{
|
||||
P_SetOrigin(mobj, destx, desty, mobj->target->z + zoff);
|
||||
mobj->old_angle = mobj->angle;
|
||||
mobj->flags2 &= ~MF2_AMBUSH;
|
||||
}
|
||||
else
|
||||
{
|
||||
P_MoveOrigin(mobj, destx, desty, mobj->target->z + zoff);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MT_FORWARDTRICK:
|
||||
{
|
||||
fixed_t destx, desty;
|
||||
fixed_t zoff = 0;
|
||||
|
||||
if (!mobj->target
|
||||
|| !mobj->target->health
|
||||
|| !mobj->target->player
|
||||
|| mobj->target->player->trickpanel != TRICKSTATE_FORWARD)
|
||||
{
|
||||
P_RemoveMobj(mobj);
|
||||
return false;
|
||||
}
|
||||
|
||||
mobj->renderflags &= ~RF_DONTDRAW;
|
||||
mobj->renderflags |= (mobj->target->renderflags & RF_DONTDRAW);
|
||||
|
||||
mobj->eflags = (mobj->eflags & ~MFE_VERTICALFLIP)|(mobj->target->eflags & MFE_VERTICALFLIP);
|
||||
mobj->flags2 = ((mobj->flags2 & ~MF2_OBJECTFLIP)|(mobj->target->flags2 & MF2_OBJECTFLIP)) ^ MF2_BOSSDEAD;
|
||||
|
||||
// sweeping effect
|
||||
P_InstaScale(mobj, (6*mobj->target->scale)/5);
|
||||
|
||||
const fixed_t sweep = FixedMul(FRACUNIT - (mobj->threshold * 2), mobj->radius);
|
||||
|
||||
destx = mobj->target->x;
|
||||
desty = mobj->target->y;
|
||||
|
||||
destx += P_ReturnThrustX(mobj, mobj->movedir, sweep);
|
||||
desty += P_ReturnThrustY(mobj, mobj->movedir, sweep);
|
||||
|
||||
const fixed_t sideways = P_ReturnThrustY(mobj, mobj->angle - mobj->movedir, mobj->radius);
|
||||
destx += P_ReturnThrustX(mobj, mobj->movedir + ANGLE_90, sideways);
|
||||
desty += P_ReturnThrustY(mobj, mobj->movedir + ANGLE_90, sideways);
|
||||
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
zoff += mobj->target->height - (mobj->height + 18*mobj->target->scale);
|
||||
else
|
||||
zoff += 18*mobj->target->scale;
|
||||
|
||||
// Necessary to "ride" on Garden Top
|
||||
zoff += mobj->target->sprzoff;
|
||||
|
||||
if (mobj->flags2 & MF2_AMBUSH)
|
||||
{
|
||||
P_SetOrigin(mobj, destx, desty, mobj->target->z + zoff);
|
||||
|
|
@ -8444,6 +8574,20 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
{
|
||||
P_MoveOrigin(mobj, destx, desty, mobj->target->z + zoff);
|
||||
}
|
||||
|
||||
mobj->threshold += FRACUNIT/6;
|
||||
if (mobj->threshold > FRACUNIT)
|
||||
{
|
||||
mobj_t *puff = P_SpawnGhostMobj(mobj);
|
||||
if (puff)
|
||||
{
|
||||
puff->renderflags = (puff->renderflags & ~RF_TRANSMASK)|RF_ADD;
|
||||
}
|
||||
|
||||
mobj->threshold -= FRACUNIT;
|
||||
mobj->flags2 |= MF2_AMBUSH;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case MT_LIGHTNINGSHIELD:
|
||||
|
|
@ -8692,6 +8836,26 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
Obj_BlockBodyThink(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_CHARGEAURA:
|
||||
{
|
||||
Obj_ChargeAuraThink(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_CHARGEFALL:
|
||||
{
|
||||
Obj_ChargeFallThink(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_CHARGERELEASE:
|
||||
{
|
||||
Obj_ChargeReleaseThink(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_CHARGEEXTRA:
|
||||
{
|
||||
Obj_ChargeExtraThink(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_GUARDBREAK:
|
||||
{
|
||||
Obj_GuardBreakThink(mobj);
|
||||
|
|
@ -10077,48 +10241,6 @@ static void K_MineExplodeThink(mobj_t *mobj)
|
|||
}
|
||||
}
|
||||
|
||||
static void P_MonitorFuseThink(mobj_t *mobj)
|
||||
{
|
||||
mobj_t *newmobj;
|
||||
|
||||
// Special case for ALL monitors.
|
||||
// If a box's speed is nonzero, it's allowed to respawn as a WRM/SRM.
|
||||
if (mobj->info->speed != 0 && (mobj->flags2 & (MF2_AMBUSH|MF2_STRONGBOX)))
|
||||
{
|
||||
mobjtype_t spawnchance[64];
|
||||
INT32 numchoices = 0, i = 0;
|
||||
|
||||
// This define should make it a lot easier to organize and change monitor weights
|
||||
#define SETMONITORCHANCES(type, strongboxamt, weakboxamt) \
|
||||
for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) spawnchance[numchoices++] = type
|
||||
|
||||
// Type SRM WRM
|
||||
SETMONITORCHANCES(MT_SNEAKERS_BOX, 0, 10); // Super Sneakers
|
||||
SETMONITORCHANCES(MT_INVULN_BOX, 2, 0); // Invincibility
|
||||
SETMONITORCHANCES(MT_WHIRLWIND_BOX, 3, 8); // Whirlwind Shield
|
||||
SETMONITORCHANCES(MT_ELEMENTAL_BOX, 3, 8); // Elemental Shield
|
||||
SETMONITORCHANCES(MT_ATTRACT_BOX, 2, 0); // Attraction Shield
|
||||
SETMONITORCHANCES(MT_FORCE_BOX, 3, 3); // Force Shield
|
||||
SETMONITORCHANCES(MT_ARMAGEDDON_BOX, 2, 0); // Armageddon Shield
|
||||
SETMONITORCHANCES(MT_MIXUP_BOX, 0, 1); // Teleporters
|
||||
SETMONITORCHANCES(MT_RECYCLER_BOX, 0, 1); // Recycler
|
||||
SETMONITORCHANCES(MT_1UP_BOX, 1, 1); // 1-Up
|
||||
// =======================================
|
||||
// Total 16 32
|
||||
|
||||
#undef SETMONITORCHANCES
|
||||
|
||||
i = P_RandomKey(PR_UNDEFINED, numchoices); // Gotta love those random numbers!
|
||||
newmobj = P_SpawnMobj(mobj->x, mobj->y, mobj->z, spawnchance[i]);
|
||||
}
|
||||
else
|
||||
newmobj = P_SpawnMobj(mobj->x, mobj->y, mobj->z, mobj->type);
|
||||
|
||||
// Transfer flags2 (ambush, strongbox, objectflip)
|
||||
newmobj->flags2 = mobj->flags2;
|
||||
P_RemoveMobj(mobj); // make sure they disappear
|
||||
}
|
||||
|
||||
static boolean P_CanFlickerFuse(mobj_t *mobj)
|
||||
{
|
||||
switch (mobj->type)
|
||||
|
|
@ -10167,11 +10289,6 @@ static boolean P_FuseThink(mobj_t *mobj)
|
|||
|
||||
if (LUA_HookMobj(mobj, MOBJ_HOOK(MobjFuse)) || P_MobjWasRemoved(mobj))
|
||||
;
|
||||
else if (mobj->info->flags & MF_MONITOR)
|
||||
{
|
||||
P_MonitorFuseThink(mobj);
|
||||
return false;
|
||||
}
|
||||
else switch (mobj->type)
|
||||
{
|
||||
// gargoyle and snowman handled in P_PushableThinker, not here
|
||||
|
|
@ -10316,6 +10433,8 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
P_SetTarget(&mobj->hprev, NULL);
|
||||
if (mobj->itnext && P_MobjWasRemoved(mobj->itnext))
|
||||
P_SetTarget(&mobj->itnext, NULL);
|
||||
if (mobj->punt_ref && P_MobjWasRemoved(mobj->punt_ref))
|
||||
P_SetTarget(&mobj->punt_ref, NULL);
|
||||
|
||||
if (mobj->flags & MF_NOTHINK)
|
||||
return;
|
||||
|
|
@ -10826,6 +10945,10 @@ fixed_t P_GetMobjDefaultScale(mobj_t *mobj)
|
|||
{
|
||||
switch(mobj->type)
|
||||
{
|
||||
case MT_FLAMEJETFLAME:
|
||||
return 3*FRACUNIT;
|
||||
case MT_ITEMCLASH:
|
||||
return 2*FRACUNIT;
|
||||
case MT_SPECIALSTAGEARCH:
|
||||
return 5*FRACUNIT;
|
||||
case MT_SPECIALSTAGEBOMB:
|
||||
|
|
@ -11381,6 +11504,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
mobj->y + FINESINE((ang>>ANGLETOFINESHIFT) & FINEMASK), mobj->z, MT_DAYTONAPINETREE_SIDE);
|
||||
side->angle = ang;
|
||||
P_SetTarget(&side->target, mobj);
|
||||
P_SetTarget(&side->punt_ref, mobj);
|
||||
side->threshold = i;
|
||||
}
|
||||
break;
|
||||
|
|
@ -11865,6 +11989,7 @@ void P_RemoveMobj(mobj_t *mobj)
|
|||
}
|
||||
|
||||
P_SetTarget(&mobj->itnext, NULL);
|
||||
P_SetTarget(&mobj->punt_ref, NULL);
|
||||
|
||||
P_RemoveThingTID(mobj);
|
||||
P_DeleteMobjStringArgs(mobj);
|
||||
|
|
@ -12467,8 +12592,8 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
p->griefValue = 0;
|
||||
|
||||
K_InitStumbleIndicator(p);
|
||||
|
||||
K_InitSliptideZipIndicator(p);
|
||||
K_InitWavedashIndicator(p);
|
||||
K_InitTrickIndicator(p);
|
||||
|
||||
if (gametyperules & GTR_ITEMARROWS)
|
||||
{
|
||||
|
|
@ -12530,12 +12655,12 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
camera[G_PartyPosition(playernum)].freecam = false;
|
||||
}
|
||||
}
|
||||
else if (pcount == 1)
|
||||
else if (pcount == 1 && !p->spectator)
|
||||
{
|
||||
// If the first player enters the game, view them.
|
||||
for (i = 0; i <= r_splitscreen; ++i)
|
||||
{
|
||||
K_ToggleDirector(i, director);
|
||||
K_ToggleDirector(i, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -13743,7 +13868,16 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj)
|
|||
// Use per-thing collision for spikes unless the intangible flag is checked.
|
||||
if (!(mthing->thing_args[2] & TMSF_INTANGIBLE) && !metalrecording)
|
||||
{
|
||||
const fixed_t kSpriteRadius = 16 * mobj->scale;
|
||||
fixed_t x = FixedMul(mobj->radius - kSpriteRadius, FCOS(mobj->angle));
|
||||
fixed_t y = FixedMul(mobj->radius - kSpriteRadius, FSIN(mobj->angle));
|
||||
|
||||
mobj->sprxoff -= x;
|
||||
mobj->spryoff -= y;
|
||||
|
||||
P_UnsetThingPosition(mobj);
|
||||
mobj->x += x;
|
||||
mobj->y += y;
|
||||
mobj->flags &= ~(MF_NOBLOCKMAP | MF_NOCLIPHEIGHT);
|
||||
mobj->flags |= MF_SOLID;
|
||||
P_SetThingPosition(mobj);
|
||||
|
|
@ -15441,3 +15575,9 @@ void P_DeleteMobjStringArgs(mobj_t *mobj)
|
|||
mobj->script_stringargs[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
tic_t P_MobjIsReappearing(const mobj_t *mobj)
|
||||
{
|
||||
tic_t t = (!P_MobjWasRemoved(mobj->punt_ref) ? mobj->punt_ref : mobj)->reappear;
|
||||
return t - min(leveltime, t);
|
||||
}
|
||||
|
|
|
|||
16
src/p_mobj.h
16
src/p_mobj.h
|
|
@ -137,8 +137,8 @@ typedef enum
|
|||
MF_MISSILE = 1<<15,
|
||||
// Item is a spring.
|
||||
MF_SPRING = 1<<16,
|
||||
// Item box
|
||||
MF_MONITOR = 1<<17,
|
||||
// Object is elemental. If it is punted, it will evaporate.
|
||||
MF_ELEMENTAL = 1<<17,
|
||||
// Don't run the thinker for this object.
|
||||
MF_NOTHINK = 1<<18,
|
||||
// Don't adjust z if below or above floorz/ceilingz
|
||||
|
|
@ -149,8 +149,8 @@ typedef enum
|
|||
MF_SCENERY = 1<<21,
|
||||
// Painful (shit hurts).
|
||||
MF_PAIN = 1<<22,
|
||||
// This mobj will stick to any surface or solid object it touches.
|
||||
MF_STICKY = 1<<23,
|
||||
// Object cannot be punted by invincible players. (Default CAN be punted, if it deals damage or is solid.)
|
||||
MF_DONTPUNT = 1<<23,
|
||||
// Object uses terrain effects. (Overlays, footsteps, etc)
|
||||
MF_APPLYTERRAIN = 1<<24,
|
||||
// for chase camera, don't be blocked by things (partial clipping)
|
||||
|
|
@ -437,6 +437,14 @@ struct mobj_t
|
|||
|
||||
boolean frozen;
|
||||
|
||||
// Object was punted and is temporarily invisible and
|
||||
// intangible. This is the leveltime that it will
|
||||
// reappear.
|
||||
tic_t reappear;
|
||||
|
||||
// If punt_ref, set punt_ref->reappear, treat as if this->reappear
|
||||
mobj_t *punt_ref;
|
||||
|
||||
// WARNING: New fields must be added separately to savegame and Lua.
|
||||
};
|
||||
|
||||
|
|
|
|||
139
src/p_saveg.c
139
src/p_saveg.c
|
|
@ -65,7 +65,7 @@ savedata_cup_t cupsavedata;
|
|||
#define ARCHIVEBLOCK_RNG 0x7FAAB5BD
|
||||
|
||||
// Note: This cannot be bigger
|
||||
// than an UINT16
|
||||
// than an UINT16 (for now)
|
||||
typedef enum
|
||||
{
|
||||
AWAYVIEW = 0x0001,
|
||||
|
|
@ -75,12 +75,13 @@ typedef enum
|
|||
SKYBOXCENTER = 0x0010,
|
||||
HOVERHYUDORO = 0x0020,
|
||||
STUMBLE = 0x0040,
|
||||
SLIPTIDEZIP = 0x0080,
|
||||
WAVEDASH = 0x0080,
|
||||
RINGSHOOTER = 0x0100,
|
||||
WHIP = 0x0200,
|
||||
HAND = 0x0400,
|
||||
FLICKYATTACKER = 0x0800,
|
||||
FLICKYCONTROLLER = 0x1000,
|
||||
TRICKINDICATOR = 0x2000,
|
||||
} player_saveflags;
|
||||
|
||||
static inline void P_ArchivePlayer(savebuffer_t *save)
|
||||
|
|
@ -310,8 +311,11 @@ static void P_NetArchivePlayers(savebuffer_t *save)
|
|||
if (players[i].stumbleIndicator)
|
||||
flags |= STUMBLE;
|
||||
|
||||
if (players[i].sliptideZipIndicator)
|
||||
flags |= SLIPTIDEZIP;
|
||||
if (players[i].wavedashIndicator)
|
||||
flags |= WAVEDASH;
|
||||
|
||||
if (players[i].trickIndicator)
|
||||
flags |= TRICKINDICATOR;
|
||||
|
||||
if (players[i].whip)
|
||||
flags |= WHIP;
|
||||
|
|
@ -348,8 +352,11 @@ static void P_NetArchivePlayers(savebuffer_t *save)
|
|||
if (flags & STUMBLE)
|
||||
WRITEUINT32(save->p, players[i].stumbleIndicator->mobjnum);
|
||||
|
||||
if (flags & SLIPTIDEZIP)
|
||||
WRITEUINT32(save->p, players[i].sliptideZipIndicator->mobjnum);
|
||||
if (flags & WAVEDASH)
|
||||
WRITEUINT32(save->p, players[i].wavedashIndicator->mobjnum);
|
||||
|
||||
if (flags & TRICKINDICATOR)
|
||||
WRITEUINT32(save->p, players[i].trickIndicator->mobjnum);
|
||||
|
||||
if (flags & WHIP)
|
||||
WRITEUINT32(save->p, players[i].whip->mobjnum);
|
||||
|
|
@ -394,6 +401,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
|
|||
WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].currentwaypoint));
|
||||
WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].nextwaypoint));
|
||||
WRITEUINT32(save->p, players[i].airtime);
|
||||
WRITEUINT32(save->p, players[i].lastairtime);
|
||||
WRITEUINT8(save->p, players[i].startboost);
|
||||
WRITEUINT8(save->p, players[i].dropdashboost);
|
||||
|
||||
|
|
@ -536,9 +544,12 @@ static void P_NetArchivePlayers(savebuffer_t *save)
|
|||
|
||||
WRITEUINT8(save->p, players[i].tripwireReboundDelay);
|
||||
|
||||
WRITEUINT16(save->p, players[i].sliptideZip);
|
||||
WRITEUINT8(save->p, players[i].sliptideZipDelay);
|
||||
WRITEUINT16(save->p, players[i].sliptideZipBoost);
|
||||
WRITEUINT16(save->p, players[i].wavedash);
|
||||
WRITEUINT8(save->p, players[i].wavedashdelay);
|
||||
WRITEUINT16(save->p, players[i].wavedashboost);
|
||||
WRITEUINT16(save->p, players[i].trickcharge);
|
||||
|
||||
WRITEUINT16(save->p, players[i].infinitether);
|
||||
|
||||
WRITEUINT8(save->p, players[i].lastsafelap);
|
||||
|
||||
|
|
@ -556,6 +567,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
|
|||
WRITEINT16(save->p, players[i].incontrol);
|
||||
|
||||
WRITEUINT8(save->p, players[i].markedfordeath);
|
||||
WRITEUINT8(save->p, players[i].dotrickfx);
|
||||
|
||||
WRITEUINT8(save->p, players[i].ringboxdelay);
|
||||
WRITEUINT8(save->p, players[i].ringboxaward);
|
||||
|
|
@ -878,8 +890,11 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
|
|||
if (flags & STUMBLE)
|
||||
players[i].stumbleIndicator = (mobj_t *)(size_t)READUINT32(save->p);
|
||||
|
||||
if (flags & SLIPTIDEZIP)
|
||||
players[i].sliptideZipIndicator = (mobj_t *)(size_t)READUINT32(save->p);
|
||||
if (flags & WAVEDASH)
|
||||
players[i].wavedashIndicator = (mobj_t *)(size_t)READUINT32(save->p);
|
||||
|
||||
if (flags & TRICKINDICATOR)
|
||||
players[i].trickIndicator = (mobj_t *)(size_t)READUINT32(save->p);
|
||||
|
||||
if (flags & WHIP)
|
||||
players[i].whip = (mobj_t *)(size_t)READUINT32(save->p);
|
||||
|
|
@ -925,6 +940,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
|
|||
players[i].currentwaypoint = (waypoint_t *)(size_t)READUINT32(save->p);
|
||||
players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save->p);
|
||||
players[i].airtime = READUINT32(save->p);
|
||||
players[i].lastairtime = READUINT32(save->p);
|
||||
players[i].startboost = READUINT8(save->p);
|
||||
players[i].dropdashboost = READUINT8(save->p);
|
||||
|
||||
|
|
@ -1067,9 +1083,12 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
|
|||
|
||||
players[i].tripwireReboundDelay = READUINT8(save->p);
|
||||
|
||||
players[i].sliptideZip = READUINT16(save->p);
|
||||
players[i].sliptideZipDelay = READUINT8(save->p);
|
||||
players[i].sliptideZipBoost = READUINT16(save->p);
|
||||
players[i].wavedash = READUINT16(save->p);
|
||||
players[i].wavedashdelay = READUINT8(save->p);
|
||||
players[i].wavedashboost = READUINT16(save->p);
|
||||
players[i].trickcharge = READUINT16(save->p);
|
||||
|
||||
players[i].infinitether = READUINT16(save->p);
|
||||
|
||||
players[i].lastsafelap = READUINT8(save->p);
|
||||
|
||||
|
|
@ -1087,6 +1106,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
|
|||
players[i].incontrol = READINT16(save->p);
|
||||
|
||||
players[i].markedfordeath = READUINT8(save->p);
|
||||
players[i].dotrickfx = READUINT8(save->p);
|
||||
|
||||
players[i].ringboxdelay = READUINT8(save->p);
|
||||
players[i].ringboxaward = READUINT8(save->p);
|
||||
|
|
@ -2029,6 +2049,8 @@ static void ArchiveSectors(savebuffer_t *save)
|
|||
WRITEUINT8(save->p, diff3);
|
||||
if (diff3 & SD_DIFF4)
|
||||
WRITEUINT8(save->p, diff4);
|
||||
if (diff4 & SD_DIFF5)
|
||||
WRITEUINT8(save->p, diff5);
|
||||
if (diff & SD_FLOORHT)
|
||||
WRITEFIXED(save->p, ss->floorheight);
|
||||
if (diff & SD_CEILHT)
|
||||
|
|
@ -2668,9 +2690,16 @@ typedef enum
|
|||
MD2_FROZEN = 1<<28,
|
||||
MD2_TERRAIN = 1<<29,
|
||||
MD2_WATERSKIP = 1<<30,
|
||||
MD2_LIGHTLEVEL = (INT32)(1U<<31),
|
||||
MD2_MORE = (INT32)(1U<<31),
|
||||
} mobj_diff2_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MD3_LIGHTLEVEL = 1,
|
||||
MD3_REAPPEAR = 1<<1,
|
||||
MD3_PUNT_REF = 1<<2,
|
||||
} mobj_diff3_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
tc_mobj,
|
||||
|
|
@ -2781,12 +2810,14 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
|||
const mobj_t *mobj = (const mobj_t *)th;
|
||||
UINT32 diff;
|
||||
UINT32 diff2;
|
||||
UINT32 diff3;
|
||||
size_t j;
|
||||
|
||||
if (TypeIsNetSynced(mobj->type) == false)
|
||||
return;
|
||||
|
||||
diff2 = 0;
|
||||
diff3 = 0;
|
||||
|
||||
if (mobj->spawnpoint)
|
||||
{
|
||||
|
|
@ -2968,8 +2999,6 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
|||
|| (slope->normal.z != FRACUNIT))
|
||||
diff2 |= MD2_FLOORSPRITESLOPE;
|
||||
}
|
||||
if (mobj->lightlevel)
|
||||
diff2 |= MD2_LIGHTLEVEL;
|
||||
if (mobj->hitlag)
|
||||
diff2 |= MD2_HITLAG;
|
||||
if (mobj->waterskip)
|
||||
|
|
@ -2987,6 +3016,16 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
|||
if (mobj->terrain != NULL || mobj->terrainOverlay != NULL)
|
||||
diff2 |= MD2_TERRAIN;
|
||||
|
||||
if (mobj->lightlevel)
|
||||
diff3 |= MD3_LIGHTLEVEL;
|
||||
if (mobj->reappear)
|
||||
diff3 |= MD3_REAPPEAR;
|
||||
if (mobj->punt_ref)
|
||||
diff3 |= MD3_PUNT_REF;
|
||||
|
||||
if (diff3 != 0)
|
||||
diff2 |= MD2_MORE;
|
||||
|
||||
if (diff2 != 0)
|
||||
diff |= MD_MORE;
|
||||
|
||||
|
|
@ -2998,6 +3037,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
|||
WRITEUINT32(save->p, diff);
|
||||
if (diff & MD_MORE)
|
||||
WRITEUINT32(save->p, diff2);
|
||||
if (diff2 & MD2_MORE)
|
||||
WRITEUINT32(save->p, diff3);
|
||||
|
||||
WRITEFIXED(save->p, mobj->z); // Force this so 3dfloor problems don't arise.
|
||||
WRITEFIXED(save->p, mobj->floorz);
|
||||
|
|
@ -3235,10 +3276,6 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
|||
WRITEFIXED(save->p, slope->normal.y);
|
||||
WRITEFIXED(save->p, slope->normal.z);
|
||||
}
|
||||
if (diff2 & MD2_LIGHTLEVEL)
|
||||
{
|
||||
WRITEINT16(save->p, mobj->lightlevel);
|
||||
}
|
||||
if (diff2 & MD2_HITLAG)
|
||||
{
|
||||
WRITEINT32(save->p, mobj->hitlag);
|
||||
|
|
@ -3261,6 +3298,19 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
|
|||
WRITEUINT32(save->p, SaveMobjnum(mobj->terrainOverlay));
|
||||
}
|
||||
|
||||
if (diff3 & MD3_LIGHTLEVEL)
|
||||
{
|
||||
WRITEINT16(save->p, mobj->lightlevel);
|
||||
}
|
||||
if (diff3 & MD3_REAPPEAR)
|
||||
{
|
||||
WRITEUINT32(save->p, mobj->reappear);
|
||||
}
|
||||
if (diff3 & MD3_PUNT_REF)
|
||||
{
|
||||
WRITEUINT32(save->p, mobj->punt_ref->mobjnum);
|
||||
}
|
||||
|
||||
WRITEUINT32(save->p, mobj->mobjnum);
|
||||
}
|
||||
|
||||
|
|
@ -4134,6 +4184,7 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
|||
mobj_t *mobj;
|
||||
UINT32 diff;
|
||||
UINT32 diff2;
|
||||
UINT32 diff3;
|
||||
INT32 i;
|
||||
fixed_t z, floorz, ceilingz;
|
||||
ffloor_t *floorrover = NULL, *ceilingrover = NULL;
|
||||
|
|
@ -4145,6 +4196,11 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
|||
else
|
||||
diff2 = 0;
|
||||
|
||||
if (diff2 & MD2_MORE)
|
||||
diff3 = READUINT32(save->p);
|
||||
else
|
||||
diff3 = 0;
|
||||
|
||||
z = READFIXED(save->p); // Force this so 3dfloor problems don't arise.
|
||||
floorz = READFIXED(save->p);
|
||||
ceilingz = READFIXED(save->p);
|
||||
|
|
@ -4470,10 +4526,6 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
|||
|
||||
P_UpdateSlopeLightOffset(slope);
|
||||
}
|
||||
if (diff2 & MD2_LIGHTLEVEL)
|
||||
{
|
||||
mobj->lightlevel = READINT16(save->p);
|
||||
}
|
||||
if (diff2 & MD2_HITLAG)
|
||||
{
|
||||
mobj->hitlag = READINT32(save->p);
|
||||
|
|
@ -4500,6 +4552,19 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
|
|||
mobj->terrain = NULL;
|
||||
}
|
||||
|
||||
if (diff3 & MD3_LIGHTLEVEL)
|
||||
{
|
||||
mobj->lightlevel = READINT16(save->p);
|
||||
}
|
||||
if (diff3 & MD3_REAPPEAR)
|
||||
{
|
||||
mobj->reappear = READUINT32(save->p);
|
||||
}
|
||||
if (diff3 & MD3_PUNT_REF)
|
||||
{
|
||||
mobj->punt_ref = (mobj_t *)(size_t)READUINT32(save->p);
|
||||
}
|
||||
|
||||
// set sprev, snext, bprev, bnext, subsector
|
||||
P_SetThingPosition(mobj);
|
||||
|
||||
|
|
@ -5539,6 +5604,13 @@ static void P_RelinkPointers(void)
|
|||
if (!P_SetTarget(&mobj->terrainOverlay, P_FindNewPosition(temp)))
|
||||
CONS_Debug(DBG_GAMELOGIC, "terrainOverlay not found on %d\n", mobj->type);
|
||||
}
|
||||
if (mobj->punt_ref)
|
||||
{
|
||||
temp = (UINT32)(size_t)mobj->punt_ref;
|
||||
mobj->punt_ref = NULL;
|
||||
if (!P_SetTarget(&mobj->punt_ref, P_FindNewPosition(temp)))
|
||||
CONS_Debug(DBG_GAMELOGIC, "punt_ref not found on %d\n", mobj->type);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
|
|
@ -5622,12 +5694,19 @@ static void P_RelinkPointers(void)
|
|||
if (!P_SetTarget(&players[i].stumbleIndicator, P_FindNewPosition(temp)))
|
||||
CONS_Debug(DBG_GAMELOGIC, "stumbleIndicator not found on player %d\n", i);
|
||||
}
|
||||
if (players[i].sliptideZipIndicator)
|
||||
if (players[i].wavedashIndicator)
|
||||
{
|
||||
temp = (UINT32)(size_t)players[i].sliptideZipIndicator;
|
||||
players[i].sliptideZipIndicator = NULL;
|
||||
if (!P_SetTarget(&players[i].sliptideZipIndicator, P_FindNewPosition(temp)))
|
||||
CONS_Debug(DBG_GAMELOGIC, "sliptideZipIndicator not found on player %d\n", i);
|
||||
temp = (UINT32)(size_t)players[i].wavedashIndicator;
|
||||
players[i].wavedashIndicator = NULL;
|
||||
if (!P_SetTarget(&players[i].wavedashIndicator, P_FindNewPosition(temp)))
|
||||
CONS_Debug(DBG_GAMELOGIC, "wavedashIndicator not found on player %d\n", i);
|
||||
}
|
||||
if (players[i].trickIndicator)
|
||||
{
|
||||
temp = (UINT32)(size_t)players[i].trickIndicator;
|
||||
players[i].trickIndicator = NULL;
|
||||
if (!P_SetTarget(&players[i].trickIndicator, P_FindNewPosition(temp)))
|
||||
CONS_Debug(DBG_GAMELOGIC, "trickIndicator not found on player %d\n", i);
|
||||
}
|
||||
if (players[i].whip)
|
||||
{
|
||||
|
|
|
|||
33
src/p_user.c
33
src/p_user.c
|
|
@ -478,7 +478,7 @@ void P_ResetPlayer(player_t *player)
|
|||
player->onconveyor = 0;
|
||||
|
||||
//player->drift = player->driftcharge = 0;
|
||||
player->trickpanel = 0;
|
||||
player->trickpanel = TRICKSTATE_NONE;
|
||||
player->glanceDir = 0;
|
||||
player->fastfall = 0;
|
||||
|
||||
|
|
@ -1109,6 +1109,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
|||
P_SetTarget(&ghost->target, mobj);
|
||||
|
||||
P_SetScale(ghost, mobj->scale);
|
||||
ghost->scalespeed = mobj->scalespeed;
|
||||
ghost->destscale = mobj->scale;
|
||||
|
||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||
|
|
@ -1163,9 +1164,13 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
|||
ghost->old_angle = (mobj->player ? mobj->player->old_drawangle2 : mobj->old_angle2);
|
||||
ghost->old_pitch = mobj->old_pitch2;
|
||||
ghost->old_roll = mobj->old_roll2;
|
||||
ghost->old_scale = mobj->old_scale2;
|
||||
|
||||
K_ReduceVFX(ghost, mobj->player);
|
||||
|
||||
ghost->reappear = mobj->reappear;
|
||||
P_SetTarget(&ghost->punt_ref, mobj->punt_ref);
|
||||
|
||||
return ghost;
|
||||
}
|
||||
|
||||
|
|
@ -2465,18 +2470,21 @@ void P_MovePlayer(player_t *player)
|
|||
}
|
||||
else
|
||||
{
|
||||
K_KartMoveAnimation(player);
|
||||
|
||||
if (player->trickpanel == 2)
|
||||
if (player->trickpanel > TRICKSTATE_READY)
|
||||
{
|
||||
player->drawangle += ANGLE_22h;
|
||||
}
|
||||
else if (player->trickpanel >= 3)
|
||||
{
|
||||
player->drawangle -= ANGLE_22h;
|
||||
if (player->trickpanel <= TRICKSTATE_RIGHT) // right/forward
|
||||
{
|
||||
player->drawangle += ANGLE_22h;
|
||||
}
|
||||
else //if (player->trickpanel >= TRICKSTATE_LEFT) // left/back
|
||||
{
|
||||
player->drawangle -= ANGLE_22h;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
K_KartMoveAnimation(player);
|
||||
|
||||
player->drawangle = player->mo->angle;
|
||||
|
||||
if (player->aizdriftturn)
|
||||
|
|
@ -2709,9 +2717,6 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
|
|||
if (!(mo->flags & MF_SHOOTABLE) && (mo->type != MT_SPB)) // Don't want to give SPB MF_SHOOTABLE, to ensure it's undamagable through other means
|
||||
continue;
|
||||
|
||||
if (mo->flags & MF_MONITOR)
|
||||
continue; // Monitors cannot be 'nuked'.
|
||||
|
||||
if (abs(inflictor->x - mo->x) > radius || abs(inflictor->y - mo->y) > radius || abs(inflictor->z - mo->z) > radius)
|
||||
continue; // Workaround for possible integer overflow in the below -Red
|
||||
|
||||
|
|
@ -4056,7 +4061,8 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
PlayerPointerErase(player->followmobj);
|
||||
PlayerPointerErase(player->stumbleIndicator);
|
||||
PlayerPointerErase(player->sliptideZipIndicator);
|
||||
PlayerPointerErase(player->wavedashIndicator);
|
||||
PlayerPointerErase(player->trickIndicator);
|
||||
PlayerPointerErase(player->whip);
|
||||
PlayerPointerErase(player->hand);
|
||||
PlayerPointerErase(player->ringShooter);
|
||||
|
|
@ -4078,6 +4084,7 @@ void P_PlayerThink(player_t *player)
|
|||
if (P_IsObjectOnGround(player->mo)
|
||||
&& !P_PlayerInPain(player)) // This isn't airtime, but it's control loss all the same.
|
||||
{
|
||||
player->lastairtime = player->airtime;
|
||||
player->airtime = 0;
|
||||
}
|
||||
else
|
||||
|
|
|
|||
45
src/r_bbox.c
45
src/r_bbox.c
|
|
@ -204,29 +204,40 @@ void R_DrawThingBoundingBox(vissprite_t *vis)
|
|||
.color = R_GetBoundingBoxColor(vis->mobj),
|
||||
};
|
||||
|
||||
// 1--3
|
||||
// | |
|
||||
// 0--2
|
||||
if (vis->mobjflags & MF_PAPERCOLLISION)
|
||||
{
|
||||
// 0--1
|
||||
|
||||
// left
|
||||
draw_bbox_col(&bb, 0, tx - rc, ty - rs); // left
|
||||
draw_bbox_col(&bb, 1, tx + rc, ty + rs); // right
|
||||
draw_bbox_row(&bb, 0, 1); // connect both
|
||||
}
|
||||
else
|
||||
{
|
||||
// 1--3
|
||||
// | |
|
||||
// 0--2
|
||||
|
||||
draw_bbox_col(&bb, 0, tx, ty); // bottom
|
||||
draw_bbox_col(&bb, 1, tx - rc, ty + rs); // top
|
||||
// left
|
||||
|
||||
// right
|
||||
draw_bbox_col(&bb, 0, tx, ty); // bottom
|
||||
draw_bbox_col(&bb, 1, tx - rc, ty + rs); // top
|
||||
|
||||
tx += rs;
|
||||
ty += rc;
|
||||
// right
|
||||
|
||||
draw_bbox_col(&bb, 2, tx, ty); // bottom
|
||||
draw_bbox_col(&bb, 3, tx - rc, ty + rs); // top
|
||||
tx += rs;
|
||||
ty += rc;
|
||||
|
||||
// connect all four columns
|
||||
draw_bbox_col(&bb, 2, tx, ty); // bottom
|
||||
draw_bbox_col(&bb, 3, tx - rc, ty + rs); // top
|
||||
|
||||
draw_bbox_row(&bb, 0, 1);
|
||||
draw_bbox_row(&bb, 1, 3);
|
||||
draw_bbox_row(&bb, 3, 2);
|
||||
draw_bbox_row(&bb, 2, 0);
|
||||
// connect all four columns
|
||||
|
||||
draw_bbox_row(&bb, 0, 1);
|
||||
draw_bbox_row(&bb, 1, 3);
|
||||
draw_bbox_row(&bb, 3, 2);
|
||||
draw_bbox_row(&bb, 2, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static boolean is_tangible (mobj_t *thing)
|
||||
|
|
@ -240,7 +251,7 @@ static boolean is_tangible (mobj_t *thing)
|
|||
// These objects probably do nothing! :D
|
||||
if ((thing->flags & (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE
|
||||
|MF_PUSHABLE|MF_BOSS|MF_MISSILE|MF_SPRING
|
||||
|MF_MONITOR|MF_ENEMY|MF_PAIN|MF_STICKY
|
||||
|MF_ELEMENTAL|MF_ENEMY|MF_PAIN|MF_DONTPUNT
|
||||
|MF_PICKUPFROMBELOW)) == 0U)
|
||||
{
|
||||
return false;
|
||||
|
|
|
|||
10
src/r_fps.c
10
src/r_fps.c
|
|
@ -140,6 +140,10 @@ void R_InterpolateView(fixed_t frac)
|
|||
prevview = newview;
|
||||
}
|
||||
|
||||
viewx = R_LerpFixed(prevview->x, newview->x, frac);
|
||||
viewy = R_LerpFixed(prevview->y, newview->y, frac);
|
||||
viewz = R_LerpFixed(prevview->z, newview->z, frac);
|
||||
|
||||
viewangle = R_LerpAngle(prevview->angle, newview->angle, frac);
|
||||
aimingangle = R_LerpAngle(prevview->aim, newview->aim, frac);
|
||||
viewroll = R_LerpAngle(prevview->roll, newview->roll, frac);
|
||||
|
|
@ -147,12 +151,6 @@ void R_InterpolateView(fixed_t frac)
|
|||
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
|
||||
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
|
||||
|
||||
fixed_t zoom = R_LerpFixed(prevview->zoom, newview->zoom, frac);
|
||||
|
||||
viewx = R_LerpFixed(prevview->x, newview->x, frac) - FixedMul(viewcos, zoom);
|
||||
viewy = R_LerpFixed(prevview->y, newview->y, frac) - FixedMul(viewsin, zoom);
|
||||
viewz = R_LerpFixed(prevview->z, newview->z, frac);
|
||||
|
||||
viewplayer = newview->player;
|
||||
viewsector = R_PointInSubsector(viewx, viewy)->sector;
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@ struct viewvars_t {
|
|||
fixed_t x;
|
||||
fixed_t y;
|
||||
fixed_t z;
|
||||
fixed_t zoom;
|
||||
boolean sky;
|
||||
sector_t *sector;
|
||||
player_t *player;
|
||||
|
|
|
|||
|
|
@ -1244,7 +1244,6 @@ void R_SetupFrame(int s)
|
|||
newview->x = r_viewmobj->x;
|
||||
newview->y = r_viewmobj->y;
|
||||
newview->z = r_viewmobj->z;
|
||||
newview->zoom = 0;
|
||||
|
||||
R_SetupCommonFrame(player, r_viewmobj->subsector);
|
||||
}
|
||||
|
|
@ -1253,13 +1252,9 @@ void R_SetupFrame(int s)
|
|||
{
|
||||
r_viewmobj = NULL;
|
||||
|
||||
fixed_t x = player->mo ? player->mo->x : thiscam->x;
|
||||
fixed_t y = player->mo ? player->mo->y : thiscam->y;
|
||||
|
||||
newview->x = x;
|
||||
newview->y = y;
|
||||
newview->x = thiscam->x;
|
||||
newview->y = thiscam->y;
|
||||
newview->z = thiscam->z + (thiscam->height>>1);
|
||||
newview->zoom = FixedHypot(thiscam->x - x, thiscam->y - y);
|
||||
|
||||
R_SetupCommonFrame(player, thiscam->subsector);
|
||||
}
|
||||
|
|
@ -1272,7 +1267,6 @@ void R_SetupFrame(int s)
|
|||
newview->x = r_viewmobj->x;
|
||||
newview->y = r_viewmobj->y;
|
||||
newview->z = player->viewz;
|
||||
newview->zoom = 0;
|
||||
|
||||
R_SetupCommonFrame(player, r_viewmobj->subsector);
|
||||
}
|
||||
|
|
@ -1303,7 +1297,6 @@ void R_SkyboxFrame(int s)
|
|||
newview->x = r_viewmobj->x;
|
||||
newview->y = r_viewmobj->y;
|
||||
newview->z = r_viewmobj->z; // 26/04/17: use actual Z position instead of spawnpoint angle!
|
||||
newview->zoom = 0;
|
||||
|
||||
if (mapheaderinfo[gamemap-1])
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1586,13 +1586,22 @@ static void R_ProjectBoundingBox(mobj_t *thing, vissprite_t *vis)
|
|||
R_InterpolateMobjState(thing, FRACUNIT, &interp);
|
||||
}
|
||||
|
||||
// 1--3
|
||||
// | |
|
||||
// 0--2
|
||||
|
||||
// start in the (0) corner
|
||||
gx = interp.x - thing->radius - viewx;
|
||||
gy = interp.y - thing->radius - viewy;
|
||||
if (thing->flags & MF_PAPERCOLLISION)
|
||||
{
|
||||
// 0--1
|
||||
// start in the middle
|
||||
gx = interp.x - viewx;
|
||||
gy = interp.y - viewy;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 1--3
|
||||
// | |
|
||||
// 0--2
|
||||
// start in the (0) corner
|
||||
gx = interp.x - thing->radius - viewx;
|
||||
gy = interp.y - thing->radius - viewy;
|
||||
}
|
||||
|
||||
tz = FixedMul(gx, viewcos) + FixedMul(gy, viewsin);
|
||||
|
||||
|
|
@ -1620,8 +1629,16 @@ static void R_ProjectBoundingBox(mobj_t *thing, vissprite_t *vis)
|
|||
box->gx = tx;
|
||||
box->gy = tz;
|
||||
|
||||
box->scale = 2 * FixedMul(thing->radius, viewsin);
|
||||
box->xscale = 2 * FixedMul(thing->radius, viewcos);
|
||||
if (thing->flags & MF_PAPERCOLLISION)
|
||||
{
|
||||
box->scale = FixedMul(thing->radius, FCOS(viewangle - interp.angle));
|
||||
box->xscale = FixedMul(thing->radius, FSIN(viewangle - interp.angle));
|
||||
}
|
||||
else
|
||||
{
|
||||
box->scale = 2 * FixedMul(thing->radius, viewsin);
|
||||
box->xscale = 2 * FixedMul(thing->radius, viewcos);
|
||||
}
|
||||
|
||||
box->pz = interp.z;
|
||||
box->pzt = box->pz + box->thingheight;
|
||||
|
|
@ -3746,6 +3763,12 @@ boolean R_ThingVisible (mobj_t *thing)
|
|||
if (r_viewmobj && (thing == r_viewmobj || (r_viewmobj->player && r_viewmobj->player->followmobj == thing)))
|
||||
return false;
|
||||
|
||||
if (tic_t t = P_MobjIsReappearing(thing))
|
||||
{
|
||||
// Flicker back in
|
||||
return t <= 2*TICRATE && (leveltime & 1);
|
||||
}
|
||||
|
||||
if ((viewssnum == 0 && (thing->renderflags & RF_DONTDRAWP1))
|
||||
|| (viewssnum == 1 && (thing->renderflags & RF_DONTDRAWP2))
|
||||
|| (viewssnum == 2 && (thing->renderflags & RF_DONTDRAWP3))
|
||||
|
|
|
|||
|
|
@ -948,6 +948,9 @@ boolean S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32
|
|||
if (!listener)
|
||||
return false;
|
||||
|
||||
if (source->thinker.function.acp1 == (actionf_p1)P_MobjThinker && P_MobjIsReappearing(source))
|
||||
return false;
|
||||
|
||||
// Init listensource with default listener
|
||||
listensource.x = listener->x;
|
||||
listensource.y = listener->y;
|
||||
|
|
|
|||
|
|
@ -1119,6 +1119,10 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"fshld2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flame Shield burst"},
|
||||
{"fshld3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Flame Shield cooldown"},
|
||||
|
||||
// RR - Trick Panel
|
||||
{"trick0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Trick confirm"},
|
||||
{"trick1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Trick"},
|
||||
|
||||
// RR - Ballhog Charge
|
||||
{"bhog00", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR, "Ballhog charging"},
|
||||
{"bhog01", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR, "Ballhog charging"},
|
||||
|
|
|
|||
|
|
@ -1187,6 +1187,10 @@ typedef enum
|
|||
sfx_fshld2,
|
||||
sfx_fshld3,
|
||||
|
||||
// RR - Trick panels
|
||||
sfx_trick0,
|
||||
sfx_trick1,
|
||||
|
||||
// RR - Ballhog Charge
|
||||
sfx_bhog00,
|
||||
sfx_bhog01,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue