mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-04 04:36:21 +00:00
Restructure how damage works in kart COMPLETELY
Instead of doing its best to avoid P_DamageMobj, it embraces it, using the damagetype system to decide how the player takes damage. Overall less stupid.
This commit is contained in:
parent
b081dd5d7e
commit
3e446a167c
24 changed files with 498 additions and 988 deletions
|
|
@ -5077,7 +5077,7 @@ static INT16 Consistancy(void)
|
|||
|
||||
mo = (mobj_t *)th;
|
||||
|
||||
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_MONITOR | MF_ENEMY | MF_PAIN | MF_STICKY))
|
||||
{
|
||||
ret -= mo->type;
|
||||
ret += mo->x;
|
||||
|
|
|
|||
|
|
@ -2966,7 +2966,8 @@ static void Command_Respawn(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (players[consoleplayer].mo && (players[consoleplayer].kartstuff[k_spinouttimer] || spbplace == players[consoleplayer].kartstuff[k_position])) // KART: Nice try, but no, you won't be cheesing spb anymore (x2)
|
||||
// todo: this probably isnt necessary anymore with v2
|
||||
if (players[consoleplayer].mo && (P_PlayerInPain(&players[consoleplayer]) || spbplace == players[consoleplayer].kartstuff[k_position])) // KART: Nice try, but no, you won't be cheesing spb anymore (x2)
|
||||
{
|
||||
CONS_Printf(M_GetText("Nice try.\n"));
|
||||
return;
|
||||
|
|
@ -2981,7 +2982,7 @@ static void Got_Respawn(UINT8 **cp, INT32 playernum)
|
|||
INT32 respawnplayer = READINT32(*cp);
|
||||
|
||||
// You can't respawn someone else. Nice try, there.
|
||||
if (respawnplayer != playernum || players[respawnplayer].kartstuff[k_spinouttimer] || spbplace == players[respawnplayer].kartstuff[k_position]) // srb2kart: "|| (!(gametyperules & GTR_CIRCUIT))"
|
||||
if (respawnplayer != playernum || P_PlayerInPain(&players[respawnplayer]) || spbplace == players[respawnplayer].kartstuff[k_position]) // srb2kart: "|| (!(gametyperules & GTR_CIRCUIT))"
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Illegal respawn command received from %s\n"), player_names[playernum]);
|
||||
if (server)
|
||||
|
|
|
|||
|
|
@ -10421,7 +10421,6 @@ static const char *const MOBJFLAG_LIST[] = {
|
|||
"SPRING",
|
||||
"MONITOR",
|
||||
"NOTHINK",
|
||||
"FIRE",
|
||||
"NOCLIPHEIGHT",
|
||||
"ENEMY",
|
||||
"SCENERY",
|
||||
|
|
@ -11258,21 +11257,21 @@ struct {
|
|||
|
||||
// for P_DamageMobj
|
||||
//// Damage types
|
||||
{"DMG_WATER",DMG_WATER},
|
||||
{"DMG_FIRE",DMG_FIRE},
|
||||
{"DMG_ELECTRIC",DMG_ELECTRIC},
|
||||
{"DMG_SPIKE",DMG_SPIKE},
|
||||
{"DMG_NUKE",DMG_NUKE},
|
||||
{"DMG_NORMAL",DMG_NORMAL},
|
||||
{"DMG_WIPEOUT",DMG_WIPEOUT},
|
||||
{"DMG_EXPLODE",DMG_EXPLODE},
|
||||
{"DMG_SQUISH",DMG_SQUISH},
|
||||
{"DMG_STING",DMG_STING},
|
||||
//// Death types
|
||||
{"DMG_INSTAKILL",DMG_INSTAKILL},
|
||||
{"DMG_DROWNED",DMG_DROWNED},
|
||||
{"DMG_SPACEDROWN",DMG_SPACEDROWN},
|
||||
{"DMG_DEATHPIT",DMG_DEATHPIT},
|
||||
{"DMG_CRUSHED",DMG_CRUSHED},
|
||||
{"DMG_SPECTATOR",DMG_SPECTATOR},
|
||||
//// Masks
|
||||
{"DMG_STEAL",DMG_CANTHURTSELF},
|
||||
{"DMG_CANTHURTSELF",DMG_CANTHURTSELF},
|
||||
{"DMG_DEATHMASK",DMG_DEATHMASK},
|
||||
{"DMG_TYPEMASK",DMG_TYPEMASK},
|
||||
|
||||
// Intermission types
|
||||
{"int_none",int_none},
|
||||
|
|
|
|||
|
|
@ -959,7 +959,7 @@ void G_ConsGhostTic(INT32 playernum)
|
|||
if (demosynced)
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n"));
|
||||
demosynced = false;
|
||||
P_DamageMobj(mobj, players[0].mo, players[0].mo, 1, 0);
|
||||
P_DamageMobj(mobj, players[0].mo, players[0].mo, 1, DMG_NORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1543,7 +1543,7 @@ void G_ReadMetalTic(mobj_t *metal)
|
|||
case METALDEATH:
|
||||
if (metal->tracer)
|
||||
P_RemoveMobj(metal->tracer);
|
||||
P_KillMobj(metal, NULL, NULL, 0);
|
||||
P_KillMobj(metal, NULL, NULL, DMG_NORMAL);
|
||||
/* FALLTHRU */
|
||||
case DEMOMARKER:
|
||||
default:
|
||||
|
|
|
|||
116
src/info.c
116
src/info.c
|
|
@ -1692,7 +1692,7 @@ state_t states[NUMSTATES] =
|
|||
{SPR_ELEC, 11 + FF_FULLBRIGHT, 1, {A_CapeChase}, 0, 0, S_CYBRAKDEMONELECTRICBARRIER24}, // S_CYBRAKDEMONELECTRICBARRIER23
|
||||
{SPR_ELEC, 11 + FF_FULLBRIGHT, 1, {A_CapeChase}, 0, 0, S_CYBRAKDEMONELECTRICBARRIER_PLAYSOUND}, // S_CYBRAKDEMONELECTRICBARRIER24
|
||||
{SPR_NULL, 0, 0, {A_RemoteAction}, -1, S_CYBRAKDEMON_DEINVINCIBLERIZE, S_CYBRAKDEMONELECTRICBARRIER_DIE2}, // S_CYBRAKDEMONELECTRICBARRIER_DIE1
|
||||
{SPR_NULL, 0, 0, {A_SetObjectFlags}, MF_PUSHABLE|MF_FIRE|MF_PAIN, 1, S_CYBRAKDEMONELECTRICBARRIER_DIE3}, // S_CYBRAKDEMONELECTRICBARRIER_DIE2
|
||||
{SPR_NULL, 0, 0, {A_SetObjectFlags}, MF_PUSHABLE|MF_PAIN, 1, S_CYBRAKDEMONELECTRICBARRIER_DIE3}, // S_CYBRAKDEMONELECTRICBARRIER_DIE2
|
||||
{SPR_NULL, 0, 20*TICRATE, {A_Scream}, 0, 0, S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS}, // S_CYBRAKDEMONELECTRICBARRIER_DIE3
|
||||
{SPR_NULL, 0, 0, {A_CheckRandom}, 10, S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS, S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMFAIL}, // S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHECK,
|
||||
{SPR_NULL, 0, 0, {A_CapeChase}, 0, 0, S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHOOSE}, // S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS,
|
||||
|
|
@ -5484,7 +5484,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
16*FRACUNIT, // radius
|
||||
24*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_s3kaa, // activesound
|
||||
MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE, // flags
|
||||
|
|
@ -5754,7 +5754,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
4*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_PAIN|MF_NOGRAVITY, // flags
|
||||
|
|
@ -5835,7 +5835,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
32*FRACUNIT, // radius
|
||||
72*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_PAIN|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
|
||||
|
|
@ -6132,7 +6132,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
13*FRACUNIT, // radius
|
||||
26*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
8*FRACUNIT, // damage
|
||||
sfx_None, // activesound
|
||||
MF_PAIN|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING, // flags
|
||||
|
|
@ -6213,7 +6213,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
24*FRACUNIT, // radius
|
||||
34*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_SPECIAL|MF_SHOOTABLE|MF_ENEMY|MF_SLIDEME, // flags
|
||||
|
|
@ -6243,7 +6243,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOBLOCKMAP|MF_FIRE|MF_PAIN, // flags
|
||||
MF_NOGRAVITY|MF_NOBLOCKMAP|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -6753,10 +6753,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
24*FRACUNIT, // radius
|
||||
84*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_FIRE|MF_PAIN, // flags
|
||||
MF_NOGRAVITY|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -6834,7 +6834,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
4*FRACUNIT, // radius
|
||||
4*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_WATER, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_PAIN, // flags
|
||||
|
|
@ -6942,7 +6942,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
48*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_ELECTRIC|(sfx_buzz2<<8), // mass
|
||||
DMG_NORMAL|(sfx_buzz2<<8), // mass
|
||||
3, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_MISSILE|MF_PAIN|MF_NOGRAVITY|MF_PAPERCOLLISION, // flags
|
||||
|
|
@ -6996,7 +6996,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
34*FRACUNIT, // radius
|
||||
68*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_mswing, // activesound
|
||||
MF_PAIN|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags
|
||||
|
|
@ -7023,7 +7023,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
20*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags
|
||||
|
|
@ -7508,10 +7508,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
48*FRACUNIT, // radius
|
||||
160*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_ELECTRIC, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_beelec, // activesound
|
||||
MF_PAIN|MF_FIRE|MF_NOGRAVITY|MF_PUSHABLE, // flags
|
||||
MF_PAIN|MF_NOGRAVITY|MF_PUSHABLE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -7562,7 +7562,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
24*FRACUNIT, // radius
|
||||
24*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_MISSILE|MF_PAIN|MF_NOGRAVITY, // flags
|
||||
|
|
@ -7589,10 +7589,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
24*FRACUNIT, // radius
|
||||
24*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_PAIN|MF_FIRE|MF_RUNSPAWNFUNC, // flags
|
||||
MF_PAIN|MF_RUNSPAWNFUNC, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -9069,7 +9069,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
12*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_PAIN|MF_NOGRAVITY, // flags
|
||||
|
|
@ -9096,10 +9096,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8*FRACUNIT, // radius
|
||||
14*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY|MF_FIRE, // flags
|
||||
MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -11067,7 +11067,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
4*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_s3k51, // activesound
|
||||
MF_NOBLOCKMAP|MF_MISSILE, // flags
|
||||
|
|
@ -12255,10 +12255,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8*FRACUNIT, // radius
|
||||
32*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_PAIN|MF_FIRE, // flags
|
||||
MF_NOGRAVITY|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -12741,10 +12741,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
17*FRACUNIT, // radius
|
||||
34*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_PAIN|MF_FIRE|MF_NOGRAVITY, // flags
|
||||
MF_SCENERY|MF_PAIN|MF_NOGRAVITY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -12768,10 +12768,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
34*FRACUNIT, // radius
|
||||
68*FRACUNIT, // height
|
||||
1, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_PAIN|MF_FIRE|MF_NOGRAVITY, // flags
|
||||
MF_SCENERY|MF_PAIN|MF_NOGRAVITY, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -13389,7 +13389,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
13*FRACUNIT, // radius
|
||||
24*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags
|
||||
|
|
@ -13416,7 +13416,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
15*FRACUNIT, // radius
|
||||
52*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags
|
||||
|
|
@ -13443,7 +13443,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
13*FRACUNIT, // radius
|
||||
24*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags
|
||||
|
|
@ -13470,7 +13470,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
15*FRACUNIT, // radius
|
||||
52*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags
|
||||
|
|
@ -13497,7 +13497,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
32*FRACUNIT, // radius
|
||||
96*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SCENERY|MF_PAIN, // flags
|
||||
|
|
@ -13524,7 +13524,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
20*FRACUNIT, // radius
|
||||
128*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SCENERY|MF_PAIN, // flags
|
||||
|
|
@ -13551,7 +13551,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
24*FRACUNIT, // radius
|
||||
224*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SCENERY|MF_PAIN, // flags
|
||||
|
|
@ -13578,7 +13578,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
24*FRACUNIT, // radius
|
||||
256*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SCENERY|MF_PAIN, // flags
|
||||
|
|
@ -13605,7 +13605,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
48*FRACUNIT, // radius
|
||||
96*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SOLID|MF_SCENERY|MF_PAIN, // flags
|
||||
|
|
@ -13632,7 +13632,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
13*FRACUNIT, // radius
|
||||
28*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags
|
||||
|
|
@ -13659,7 +13659,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
15*FRACUNIT, // radius
|
||||
60*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags
|
||||
|
|
@ -13686,7 +13686,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
13*FRACUNIT, // radius
|
||||
28*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOTHINK|MF_SCENERY|MF_PAIN|MF_NOGRAVITY, // flags
|
||||
|
|
@ -13713,7 +13713,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
15*FRACUNIT, // radius
|
||||
60*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_SPIKE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOTHINK|MF_SCENERY|MF_PAIN|MF_NOGRAVITY, // flags
|
||||
|
|
@ -14415,10 +14415,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_MISSILE|MF_FIRE, // flags
|
||||
MF_NOGRAVITY|MF_MISSILE|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -14496,10 +14496,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
16*FRACUNIT, // radius
|
||||
24*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_MISSILE|MF_FIRE|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC, // flags
|
||||
MF_NOGRAVITY|MF_MISSILE|MF_PAIN|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -14553,7 +14553,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_PAIN|MF_NOGRAVITY|MF_FIRE, // flags
|
||||
MF_SPECIAL|MF_PAIN|MF_NOGRAVITY|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -20288,10 +20288,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
4*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
1, // damage
|
||||
sfx_None, // activesound
|
||||
MF_FIRE|MF_MISSILE, // flags
|
||||
MF_PAIN|MF_MISSILE, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -20369,10 +20369,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8*FRACUNIT, // radius
|
||||
16*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_PAIN|MF_FIRE, // flags
|
||||
MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -20476,10 +20476,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
8*FRACUNIT, // radius
|
||||
8*FRACUNIT, // height
|
||||
0, // display offset
|
||||
DMG_FIRE, // mass
|
||||
DMG_NORMAL, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_MISSILE|MF_FIRE, // flags
|
||||
MF_NOGRAVITY|MF_MISSILE|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -24398,7 +24398,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_SPECIAL|MF_FIRE, // flags
|
||||
MF_NOGRAVITY|MF_SPECIAL|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -25775,7 +25775,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SCENERY|MF_NOGRAVITY|MF_FIRE|MF_PAIN, // flags
|
||||
MF_SCENERY|MF_NOGRAVITY|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -27451,7 +27451,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
20, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_FIRE, // flags
|
||||
MF_SPECIAL|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -27478,7 +27478,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
20, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_FIRE, // flags
|
||||
MF_SPECIAL|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -27640,7 +27640,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
20, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_FIRE, // flags
|
||||
MF_SPECIAL|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
@ -27775,7 +27775,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
100, // mass
|
||||
20, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_FIRE, // flags
|
||||
MF_SPECIAL|MF_PAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -739,7 +739,7 @@ static boolean K_BotSteerObjects(mobj_t *thing)
|
|||
}
|
||||
break;
|
||||
default:
|
||||
if (thing->flags & (MF_SOLID|MF_ENEMY|MF_BOSS|MF_PAIN|MF_MISSILE|MF_FIRE))
|
||||
if (thing->flags & (MF_SOLID|MF_ENEMY|MF_BOSS|MF_PAIN|MF_MISSILE))
|
||||
{
|
||||
K_SteerFromObject(globalsmuggle.botmo, thing, fulldist, xdist, false, 2 * (KART_FULLTURN + dodge));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
|
|||
else
|
||||
{
|
||||
// Player Damage
|
||||
P_DamageMobj(t2, t1, t1->target, 1, 0);
|
||||
P_DamageMobj(t2, t1, t1->target, 1, DMG_WIPEOUT);
|
||||
K_KartBouncing(t2, t1, false, false);
|
||||
S_StartSound(t2, sfx_s3k7b);
|
||||
}
|
||||
|
|
@ -64,7 +64,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
|
|||
t2->z += t2->height;
|
||||
|
||||
S_StartSound(t2, t2->info->deathsound);
|
||||
P_KillMobj(t2, t1, t1, 0);
|
||||
P_KillMobj(t2, t1, t1, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(t2, 8*FRACUNIT, false);
|
||||
P_InstaThrust(t2, R_PointToAngle2(t1->x, t1->y, t2->x, t2->y)+ANGLE_90, 16*FRACUNIT);
|
||||
|
|
@ -77,7 +77,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
|
|||
{
|
||||
damageitem = true;
|
||||
// Bomb death
|
||||
P_KillMobj(t2, t1, t1, 0);
|
||||
P_KillMobj(t2, t1, t1, DMG_NORMAL);
|
||||
}
|
||||
else if (t2->flags & MF_SPRING && (t1->type != MT_ORBINAUT_SHIELD && t1->type != MT_JAWZ_SHIELD))
|
||||
{
|
||||
|
|
@ -87,7 +87,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
|
|||
else if (t2->flags & MF_SHOOTABLE)
|
||||
{
|
||||
// Shootable damage
|
||||
P_DamageMobj(t2, t1, t1->target, 1, 0);
|
||||
P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL);
|
||||
damageitem = true;
|
||||
}
|
||||
|
||||
|
|
@ -100,7 +100,7 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
|
|||
t1->z += t1->height;
|
||||
|
||||
S_StartSound(t1, t1->info->deathsound);
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(t1, 8*FRACUNIT, false);
|
||||
P_InstaThrust(t1, R_PointToAngle2(t2->x, t2->y, t1->x, t1->y)+ANGLE_90, 16*FRACUNIT);
|
||||
|
|
@ -148,7 +148,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
|
|||
else
|
||||
{
|
||||
// Player Damage
|
||||
K_SpinPlayer(t2->player, t1->target, 0, t1, (t1->type == MT_BANANA || t1->type == MT_BANANA_SHIELD));
|
||||
P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL);
|
||||
}
|
||||
|
||||
damageitem = true;
|
||||
|
|
@ -165,7 +165,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
|
|||
t2->z += t2->height;
|
||||
|
||||
S_StartSound(t2, t2->info->deathsound);
|
||||
P_KillMobj(t2, t1, t1, 0);
|
||||
P_KillMobj(t2, t1, t1, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(t2, 8*FRACUNIT, false);
|
||||
P_InstaThrust(t2, R_PointToAngle2(t1->x, t1->y, t2->x, t2->y)+ANGLE_90, 16*FRACUNIT);
|
||||
|
|
@ -177,7 +177,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
|
|||
else if (t2->flags & MF_SHOOTABLE)
|
||||
{
|
||||
// Shootable damage
|
||||
P_DamageMobj(t2, t1, t1->target, 1, 0);
|
||||
P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL);
|
||||
damageitem = true;
|
||||
}
|
||||
|
||||
|
|
@ -190,7 +190,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
|
|||
t1->z += t1->height;
|
||||
|
||||
S_StartSound(t1, t1->info->deathsound);
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(t1, 8*FRACUNIT, false);
|
||||
P_InstaThrust(t1, R_PointToAngle2(t2->x, t2->y, t1->x, t1->y)+ANGLE_90, 16*FRACUNIT);
|
||||
|
|
@ -237,7 +237,7 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2)
|
|||
{
|
||||
// Melt item
|
||||
S_StartSound(t2, sfx_s3k43);
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
|
@ -289,7 +289,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2)
|
|||
// Bomb punting
|
||||
if ((t1->state >= &states[S_SSMINE1] && t1->state <= &states[S_SSMINE4])
|
||||
|| (t1->state >= &states[S_SSMINE_DEPLOY8] && t1->state <= &states[S_SSMINE_DEPLOY13]))
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
else
|
||||
K_PuntMine(t1, t2);
|
||||
}
|
||||
|
|
@ -297,7 +297,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2)
|
|||
|| t2->type == MT_ORBINAUT_SHIELD || t2->type == MT_JAWZ_SHIELD)
|
||||
{
|
||||
// Bomb death
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
|
||||
// Other Item Damage
|
||||
if (t2->eflags & MFE_VERTICALFLIP)
|
||||
|
|
@ -306,7 +306,7 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2)
|
|||
t2->z += t2->height;
|
||||
|
||||
S_StartSound(t2, t2->info->deathsound);
|
||||
P_KillMobj(t2, t1, t1, 0);
|
||||
P_KillMobj(t2, t1, t1, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(t2, 8*FRACUNIT, false);
|
||||
P_InstaThrust(t2, R_PointToAngle2(t1->x, t1->y, t2->x, t2->y)+ANGLE_90, 16*FRACUNIT);
|
||||
|
|
@ -314,9 +314,9 @@ boolean K_MineCollide(mobj_t *t1, mobj_t *t2)
|
|||
else if (t2->flags & MF_SHOOTABLE)
|
||||
{
|
||||
// Bomb death
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
// Shootable damage
|
||||
P_DamageMobj(t2, t1, t1->target, 1, 0);
|
||||
P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -329,15 +329,12 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2)
|
|||
if (t2->player->powers[pw_flashing])
|
||||
return true;
|
||||
|
||||
if (t1->state == &states[S_MINEEXPLOSION1])
|
||||
K_ExplodePlayer(t2->player, t1->target, t1);
|
||||
else
|
||||
K_SpinPlayer(t2->player, t1->target, 0, t1, false);
|
||||
P_DamageMobj(t2, t1, t1->target, 1, (t1->state == &states[S_MINEEXPLOSION1]) ? DMG_EXPLODE : DMG_NORMAL);
|
||||
}
|
||||
else if (t2->flags & MF_SHOOTABLE)
|
||||
{
|
||||
// Shootable damage
|
||||
P_DamageMobj(t2, t1, t1->target, 1, 0);
|
||||
P_DamageMobj(t2, t1, t1->target, 1, DMG_NORMAL);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -359,14 +356,14 @@ boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2)
|
|||
HU_DoCEcho(va("%s\\was hit by a kitchen sink.\\\\\\\\", player_names[t2->player-players]));
|
||||
I_OutputMsg("%s was hit by a kitchen sink.\n", player_names[t2->player-players]);
|
||||
P_DamageMobj(t2, t1, t1->target, 1, DMG_INSTAKILL);
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
}
|
||||
else if (t2->flags & MF_SHOOTABLE)
|
||||
{
|
||||
// Shootable damage
|
||||
P_KillMobj(t2, t2, t1->target, 0);
|
||||
P_KillMobj(t2, t2, t1->target, DMG_NORMAL);
|
||||
// This item damage
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -394,7 +391,7 @@ boolean K_SMKIceBlockCollide(mobj_t *t1, mobj_t *t2)
|
|||
return false;
|
||||
|
||||
if (t1->health)
|
||||
P_KillMobj(t1, t2, t2, 0);
|
||||
P_KillMobj(t1, t2, t2, DMG_NORMAL);
|
||||
|
||||
/*if (t2->player && (t2->player->kartstuff[k_invincibilitytimer] > 0
|
||||
|| t2->player->kartstuff[k_growshrinktimer] > 0))
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ UINT8 K_ColorRelativeLuminance(UINT8 r, UINT8 g, UINT8 b)
|
|||
|
||||
UINT16 K_RainbowColor(tic_t time)
|
||||
{
|
||||
return (UINT16)(SKINCOLOR_PINK + (time % (numskincolors - SKINCOLOR_PINK)));
|
||||
return (UINT16)(SKINCOLOR_PINK + (time % (SKINCOLOR_TAFFY - SKINCOLOR_PINK)));
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
|
|
|
|||
19
src/k_hud.c
19
src/k_hud.c
|
|
@ -4063,16 +4063,19 @@ void K_drawKartHUD(void)
|
|||
INT32 x = 0, y = 0;
|
||||
UINT16 c;
|
||||
|
||||
for (c = 1; c < MAXSKINCOLORS; c++)
|
||||
for (c = 0; c < numskincolors; c++)
|
||||
{
|
||||
UINT8 *cm = R_GetTranslationColormap(TC_RAINBOW, c, GTC_CACHE);
|
||||
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, FRACUNIT>>1, 0, faceprefix[stplyr->skin][FACE_WANTED], cm);
|
||||
|
||||
x += 16;
|
||||
if (x > BASEVIDWIDTH-16)
|
||||
if (skincolors[c].accessible)
|
||||
{
|
||||
x = 0;
|
||||
y += 16;
|
||||
UINT8 *cm = R_GetTranslationColormap(TC_RAINBOW, c, GTC_CACHE);
|
||||
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, FRACUNIT>>1, 0, faceprefix[stplyr->skin][FACE_WANTED], cm);
|
||||
|
||||
x += 16;
|
||||
if (x > BASEVIDWIDTH-16)
|
||||
{
|
||||
x = 0;
|
||||
y += 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
447
src/k_kart.c
447
src/k_kart.c
|
|
@ -1041,30 +1041,6 @@ fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against)
|
|||
return FixedMul(weight, mobj->scale);
|
||||
}
|
||||
|
||||
// This kind of wipeout happens with no rings -- doesn't remove a bumper, has no invulnerability, and is much shorter.
|
||||
static void K_DebtStingPlayer(player_t *player, INT32 length)
|
||||
{
|
||||
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0
|
||||
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||
|| ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
return;
|
||||
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
player->kartstuff[k_driftboost] = 0;
|
||||
player->kartstuff[k_drift] = 0;
|
||||
player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
player->kartstuff[k_spinouttype] = 2;
|
||||
player->kartstuff[k_spinouttimer] = length;
|
||||
player->kartstuff[k_wipeoutslow] = min(length-1, wipeoutslowtime+1);
|
||||
|
||||
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
|
||||
|
||||
K_DropHnextList(player, false);
|
||||
return;
|
||||
}
|
||||
|
||||
void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
|
||||
{
|
||||
mobj_t *fx;
|
||||
|
|
@ -1233,9 +1209,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
|
|||
{
|
||||
if (mobj1->player->rings <= 0)
|
||||
{
|
||||
K_DebtStingPlayer(mobj1->player, TICRATE + (4 * (mobj2->player->kartweight - mobj1->player->kartweight)));
|
||||
K_KartPainEnergyFling(mobj1->player);
|
||||
P_PlayRinglossSound(mobj1);
|
||||
P_DamageMobj(mobj1, mobj2, mobj2, 1, DMG_STING);
|
||||
}
|
||||
P_PlayerRingBurst(mobj1->player, 1);
|
||||
}
|
||||
|
|
@ -1259,9 +1233,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
|
|||
{
|
||||
if (mobj2->player->rings <= 0)
|
||||
{
|
||||
K_DebtStingPlayer(mobj2->player, TICRATE + (4 * (mobj1->player->kartweight - mobj2->player->kartweight)));
|
||||
K_KartPainEnergyFling(mobj2->player);
|
||||
P_PlayRinglossSound(mobj2);
|
||||
P_DamageMobj(mobj2, mobj1, mobj1, 1, DMG_STING);
|
||||
}
|
||||
P_PlayerRingBurst(mobj2->player, 1);
|
||||
}
|
||||
|
|
@ -2369,95 +2341,95 @@ void K_DoInstashield(player_t *player)
|
|||
P_SetTarget(&layerb->target, player->mo);
|
||||
}
|
||||
|
||||
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflictor, boolean trapitem)
|
||||
void K_BattleHitPlayer(player_t *player, player_t *victim, UINT8 points, boolean reducewanted)
|
||||
{
|
||||
UINT8 scoremultiply = 1;
|
||||
// PS: Inflictor is unused for all purposes here and is actually only ever relevant to Lua. It may be nil too.
|
||||
boolean force = false; // Used to check if Lua ShouldSpin should get us damaged reguardless of flashtics or heck knows what.
|
||||
UINT8 shouldForce = LUAh_ShouldSpin(player, inflictor, source);
|
||||
if (P_MobjWasRemoved(player->mo))
|
||||
return; // mobj was removed (in theory that shouldn't happen)
|
||||
if (shouldForce == 1)
|
||||
force = true;
|
||||
else if (shouldForce == 2)
|
||||
if (reducewanted == false)
|
||||
points = 1; // Force to 1
|
||||
|
||||
if (gametyperules & GTR_POINTLIMIT)
|
||||
{
|
||||
P_AddPlayerScore(player, points);
|
||||
K_SpawnBattlePoints(player, victim, points);
|
||||
}
|
||||
|
||||
if ((gametyperules & GTR_WANTED) && (reducewanted == true))
|
||||
{
|
||||
// Seems a little backwards, but the WANTED system is meant to prevent camping.
|
||||
// If you don't want people to go after you, then be proactive!
|
||||
player->kartstuff[k_wanted] -= wantedreduce;
|
||||
victim->kartstuff[k_wanted] -= (wantedreduce/2);
|
||||
}
|
||||
}
|
||||
|
||||
void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
UINT8 score = 1;
|
||||
boolean trapitem = false;
|
||||
|
||||
if (!(gametyperules & GTR_BUMPERS))
|
||||
return;
|
||||
|
||||
if ((gametyperules & GTR_POINTLIMIT) && !trapitem)
|
||||
if (player->powers[pw_flashing] || P_PlayerInPain(player))
|
||||
return;
|
||||
|
||||
if (inflictor && !P_MobjWasRemoved(inflictor))
|
||||
{
|
||||
if (inflictor->type == MT_BANANA && inflictor->health <= 1)
|
||||
{
|
||||
trapitem = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (gametyperules & GTR_POINTLIMIT)
|
||||
{
|
||||
if (K_IsPlayerWanted(player))
|
||||
scoremultiply = 3;
|
||||
score = 3;
|
||||
else if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] == 1)
|
||||
scoremultiply = 2;
|
||||
score = 2;
|
||||
}
|
||||
|
||||
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2)
|
||||
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||
|| ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
if (source && source->player && player != source->player)
|
||||
{
|
||||
if (!force) // if shoulddamage force, we go THROUGH that.
|
||||
{
|
||||
K_DoInstashield(player);
|
||||
return;
|
||||
}
|
||||
K_BattleHitPlayer(source->player, player, score, trapitem);
|
||||
}
|
||||
|
||||
if (LUAh_PlayerSpin(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case.
|
||||
return;
|
||||
|
||||
if (source && source != player->mo && source->player)
|
||||
K_PlayHitEmSound(source);
|
||||
|
||||
player->kartstuff[k_sneakertimer] = 0;
|
||||
player->kartstuff[k_numsneakers] = 0;
|
||||
player->kartstuff[k_driftboost] = 0;
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
|
||||
player->kartstuff[k_drift] = 0;
|
||||
player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
if (player->kartstuff[k_bumper] > 0)
|
||||
{
|
||||
if (source && source->player && player != source->player)
|
||||
if (player->kartstuff[k_bumper] == 1)
|
||||
{
|
||||
P_AddPlayerScore(source->player, scoremultiply);
|
||||
K_SpawnBattlePoints(source->player, player, scoremultiply);
|
||||
if (!trapitem)
|
||||
{
|
||||
source->player->kartstuff[k_wanted] -= wantedreduce;
|
||||
player->kartstuff[k_wanted] -= (wantedreduce/2);
|
||||
}
|
||||
mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!!
|
||||
P_SetTarget(&karmahitbox->target, player->mo);
|
||||
karmahitbox->destscale = player->mo->scale;
|
||||
P_SetScale(karmahitbox, player->mo->scale);
|
||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_bumper] > 0)
|
||||
{
|
||||
if (player->kartstuff[k_bumper] == 1)
|
||||
{
|
||||
mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!!
|
||||
P_SetTarget(&karmahitbox->target, player->mo);
|
||||
karmahitbox->destscale = player->mo->scale;
|
||||
P_SetScale(karmahitbox, player->mo->scale);
|
||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||
}
|
||||
player->kartstuff[k_bumper]--;
|
||||
if (K_IsPlayerWanted(player))
|
||||
K_CalculateBattleWanted();
|
||||
}
|
||||
player->kartstuff[k_bumper]--;
|
||||
|
||||
if (!player->kartstuff[k_bumper])
|
||||
{
|
||||
player->kartstuff[k_comebacktimer] = comebacktime;
|
||||
if (player->kartstuff[k_comebackmode] == 2)
|
||||
{
|
||||
mobj_t *poof = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EXPLODE);
|
||||
S_StartSound(poof, mobjinfo[MT_KARMAHITBOX].seesound);
|
||||
player->kartstuff[k_comebackmode] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
K_CheckBumpers();
|
||||
if (K_IsPlayerWanted(player))
|
||||
K_CalculateBattleWanted();
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_bumper] == 0)
|
||||
{
|
||||
player->kartstuff[k_comebacktimer] = comebacktime;
|
||||
|
||||
if (player->kartstuff[k_comebackmode] == 2)
|
||||
{
|
||||
mobj_t *poof = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EXPLODE);
|
||||
S_StartSound(poof, mobjinfo[MT_KARMAHITBOX].seesound);
|
||||
player->kartstuff[k_comebackmode] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
K_CheckBumpers();
|
||||
}
|
||||
|
||||
void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type)
|
||||
{
|
||||
(void)inflictor;
|
||||
(void)source;
|
||||
|
||||
player->kartstuff[k_spinouttype] = type;
|
||||
|
||||
if (player->kartstuff[k_spinouttype] <= 0) // type 0 is spinout, type 1 is wipeout, type 2 is no-invuln wipeout
|
||||
|
|
@ -2469,20 +2441,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|
|||
}
|
||||
|
||||
player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2;
|
||||
player->powers[pw_flashing] = K_GetKartFlashing(player);
|
||||
|
||||
P_PlayRinglossSound(player->mo);
|
||||
P_PlayerRingBurst(player, 5);
|
||||
K_PlayPainSound(player->mo);
|
||||
|
||||
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
|
||||
|
||||
player->kartstuff[k_instashield] = 15;
|
||||
if (cv_kartdebughuddrop.value && !modeattacking)
|
||||
K_DropItems(player);
|
||||
else
|
||||
K_DropHnextList(player, false);
|
||||
return;
|
||||
}
|
||||
|
||||
static void K_RemoveGrowShrink(player_t *player)
|
||||
|
|
@ -2508,89 +2467,10 @@ static void K_RemoveGrowShrink(player_t *player)
|
|||
P_RestoreMusic(player);
|
||||
}
|
||||
|
||||
void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
||||
void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
UINT8 scoremultiply = 1;
|
||||
// PS: Inflictor is unused for all purposes here and is actually only ever relevant to Lua. It may be nil too.
|
||||
|
||||
boolean force = false; // Used to check if Lua ShouldSquish should get us damaged reguardless of flashtics or heck knows what.
|
||||
UINT8 shouldForce = LUAh_ShouldSquish(player, inflictor, source);
|
||||
if (P_MobjWasRemoved(player->mo))
|
||||
return; // mobj was removed (in theory that shouldn't happen)
|
||||
if (shouldForce == 1)
|
||||
force = true;
|
||||
else if (shouldForce == 2)
|
||||
return;
|
||||
|
||||
if (gametyperules & GTR_POINTLIMIT)
|
||||
{
|
||||
if (K_IsPlayerWanted(player))
|
||||
scoremultiply = 3;
|
||||
else if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] == 1)
|
||||
scoremultiply = 2;
|
||||
}
|
||||
|
||||
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_invincibilitytimer] > 0
|
||||
|| player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||
|| ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
{
|
||||
if (!force) // You know the drill by now.
|
||||
{
|
||||
K_DoInstashield(player);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (LUAh_PlayerSquish(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case.
|
||||
return;
|
||||
|
||||
player->kartstuff[k_sneakertimer] = 0;
|
||||
player->kartstuff[k_numsneakers] = 0;
|
||||
player->kartstuff[k_driftboost] = 0;
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
|
||||
player->kartstuff[k_drift] = 0;
|
||||
player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
{
|
||||
if (source && source->player && player != source->player)
|
||||
{
|
||||
P_AddPlayerScore(source->player, scoremultiply);
|
||||
K_SpawnBattlePoints(source->player, player, scoremultiply);
|
||||
source->player->kartstuff[k_wanted] -= wantedreduce;
|
||||
player->kartstuff[k_wanted] -= (wantedreduce/2);
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_bumper] > 0)
|
||||
{
|
||||
if (player->kartstuff[k_bumper] == 1)
|
||||
{
|
||||
mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!!
|
||||
P_SetTarget(&karmahitbox->target, player->mo);
|
||||
karmahitbox->destscale = player->mo->scale;
|
||||
P_SetScale(karmahitbox, player->mo->scale);
|
||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||
}
|
||||
player->kartstuff[k_bumper]--;
|
||||
if (K_IsPlayerWanted(player))
|
||||
K_CalculateBattleWanted();
|
||||
}
|
||||
|
||||
if (!player->kartstuff[k_bumper])
|
||||
{
|
||||
player->kartstuff[k_comebacktimer] = comebacktime;
|
||||
if (player->kartstuff[k_comebackmode] == 2)
|
||||
{
|
||||
mobj_t *poof = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EXPLODE);
|
||||
S_StartSound(poof, mobjinfo[MT_KARMAHITBOX].seesound);
|
||||
player->kartstuff[k_comebackmode] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
K_CheckBumpers();
|
||||
}
|
||||
(void)inflictor;
|
||||
(void)source;
|
||||
|
||||
player->kartstuff[k_squishedtimer] = TICRATE;
|
||||
|
||||
|
|
@ -2602,123 +2482,29 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
|
|||
K_RemoveGrowShrink(player);
|
||||
}
|
||||
|
||||
player->powers[pw_flashing] = K_GetKartFlashing(player);
|
||||
|
||||
player->mo->flags |= MF_NOCLIP;
|
||||
|
||||
if (player->mo->state != &states[S_KART_SQUISH]) // Squash
|
||||
P_SetPlayerMobjState(player->mo, S_KART_SQUISH);
|
||||
|
||||
P_PlayRinglossSound(player->mo);
|
||||
P_PlayerRingBurst(player, 5);
|
||||
K_PlayPainSound(player->mo);
|
||||
|
||||
player->kartstuff[k_instashield] = 15;
|
||||
if (cv_kartdebughuddrop.value && !modeattacking)
|
||||
K_DropItems(player);
|
||||
else
|
||||
K_DropHnextList(player, false);
|
||||
return;
|
||||
}
|
||||
|
||||
void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A bit of a hack, we just throw the player up higher here and extend their spinout timer
|
||||
void K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) // A bit of a hack, we just throw the player up higher here and extend their spinout timer
|
||||
{
|
||||
UINT8 scoremultiply = 1;
|
||||
boolean force = false; // Used to check if Lua ShouldExplode should get us damaged reguardless of flashtics or heck knows what.
|
||||
UINT8 shouldForce = LUAh_ShouldExplode(player, inflictor, source);
|
||||
(void)source;
|
||||
|
||||
if (P_MobjWasRemoved(player->mo))
|
||||
return; // mobj was removed (in theory that shouldn't happen)
|
||||
if (shouldForce == 1)
|
||||
force = true;
|
||||
else if (shouldForce == 2)
|
||||
return;
|
||||
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
{
|
||||
if (K_IsPlayerWanted(player))
|
||||
scoremultiply = 3;
|
||||
else if (player->kartstuff[k_bumper] == 1)
|
||||
scoremultiply = 2;
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 // Do not check spinout, because SPB and Eggman should combo
|
||||
|| ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
|
||||
{
|
||||
if (!force) // ShouldDamage can bypass that, again.
|
||||
{
|
||||
K_DoInstashield(player);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (LUAh_PlayerExplode(player, inflictor, source)) // Same thing. Also make sure to let Instashield happen blah blah
|
||||
return;
|
||||
|
||||
if (source && source != player->mo && source->player)
|
||||
K_PlayHitEmSound(source);
|
||||
|
||||
player->mo->momz = 18*mapobjectscale*P_MobjFlip(player->mo); // please stop forgetting mobjflip checks!!!!
|
||||
player->mo->momz = 18*mapobjectscale*P_MobjFlip(player->mo); // please stop forgetting mobjflip checks!!!!
|
||||
player->mo->momx = player->mo->momy = 0;
|
||||
|
||||
player->kartstuff[k_sneakertimer] = 0;
|
||||
player->kartstuff[k_numsneakers] = 0;
|
||||
player->kartstuff[k_driftboost] = 0;
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
|
||||
player->kartstuff[k_drift] = 0;
|
||||
player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
// This is the only part that SHOULDN'T combo :VVVVV
|
||||
if ((gametyperules & GTR_BUMPERS) && !(player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2)))
|
||||
{
|
||||
if (source && source->player && player != source->player)
|
||||
{
|
||||
P_AddPlayerScore(source->player, scoremultiply);
|
||||
K_SpawnBattlePoints(source->player, player, scoremultiply);
|
||||
source->player->kartstuff[k_wanted] -= wantedreduce;
|
||||
player->kartstuff[k_wanted] -= (wantedreduce/2);
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_bumper] > 0)
|
||||
{
|
||||
if (player->kartstuff[k_bumper] == 1)
|
||||
{
|
||||
mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!!
|
||||
P_SetTarget(&karmahitbox->target, player->mo);
|
||||
karmahitbox->destscale = player->mo->scale;
|
||||
P_SetScale(karmahitbox, player->mo->scale);
|
||||
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
|
||||
}
|
||||
player->kartstuff[k_bumper]--;
|
||||
if (K_IsPlayerWanted(player))
|
||||
K_CalculateBattleWanted();
|
||||
}
|
||||
|
||||
if (!player->kartstuff[k_bumper])
|
||||
{
|
||||
player->kartstuff[k_comebacktimer] = comebacktime;
|
||||
if (player->kartstuff[k_comebackmode] == 2)
|
||||
{
|
||||
mobj_t *poof = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EXPLODE);
|
||||
S_StartSound(poof, mobjinfo[MT_KARMAHITBOX].seesound);
|
||||
player->kartstuff[k_comebackmode] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
K_CheckBumpers();
|
||||
}
|
||||
|
||||
player->kartstuff[k_spinouttype] = 1;
|
||||
player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2;
|
||||
|
||||
player->powers[pw_flashing] = K_GetKartFlashing(player);
|
||||
|
||||
if (inflictor && inflictor->type == MT_SPBEXPLOSION && inflictor->extravalue1)
|
||||
if (inflictor && !P_MobjWasRemoved(inflictor))
|
||||
{
|
||||
player->kartstuff[k_spinouttimer] = ((5*player->kartstuff[k_spinouttimer])/2)+1;
|
||||
player->mo->momz *= 2;
|
||||
if (inflictor->type == MT_SPBEXPLOSION && inflictor->extravalue1)
|
||||
{
|
||||
player->kartstuff[k_spinouttimer] = ((5*player->kartstuff[k_spinouttimer])/2)+1;
|
||||
player->mo->momz *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (player->mo->eflags & MFE_UNDERWATER)
|
||||
|
|
@ -2726,20 +2512,30 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
|
|||
|
||||
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
|
||||
|
||||
P_PlayRinglossSound(player->mo);
|
||||
P_PlayerRingBurst(player, 5);
|
||||
K_PlayPainSound(player->mo);
|
||||
|
||||
if (P_IsDisplayPlayer(player))
|
||||
P_StartQuake(64<<FRACBITS, 5);
|
||||
|
||||
player->kartstuff[k_instashield] = 15;
|
||||
K_DropItems(player);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void K_StealBumper(player_t *player, player_t *victim, boolean force)
|
||||
// This kind of wipeout happens with no rings -- doesn't remove a bumper, has no invulnerability, and is much shorter.
|
||||
void K_DebtStingPlayer(player_t *player, mobj_t *source)
|
||||
{
|
||||
INT32 length = TICRATE;
|
||||
|
||||
if (source->player)
|
||||
{
|
||||
length += (4 * (source->player->kartweight - player->kartweight));
|
||||
}
|
||||
|
||||
player->kartstuff[k_spinouttype] = 2;
|
||||
player->kartstuff[k_spinouttimer] = length;
|
||||
player->kartstuff[k_wipeoutslow] = min(length-1, wipeoutslowtime+1);
|
||||
|
||||
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
|
||||
}
|
||||
|
||||
void K_StealBumper(player_t *player, player_t *victim)
|
||||
{
|
||||
INT32 newbumper;
|
||||
angle_t newangle, diff;
|
||||
|
|
@ -2749,22 +2545,6 @@ void K_StealBumper(player_t *player, player_t *victim, boolean force)
|
|||
if (!(gametyperules & GTR_BUMPERS))
|
||||
return;
|
||||
|
||||
if (!force)
|
||||
{
|
||||
if (victim->kartstuff[k_bumper] <= 0) // || player->kartstuff[k_bumper] >= K_StartingBumperCount()+2
|
||||
return;
|
||||
|
||||
if (player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0)
|
||||
return;
|
||||
|
||||
if (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinouttype] != 2)
|
||||
|| victim->kartstuff[k_invincibilitytimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_hyudorotimer] > 0)
|
||||
{
|
||||
K_DoInstashield(victim);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (netgame && player->kartstuff[k_bumper] <= 0)
|
||||
CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[player-players]);
|
||||
|
||||
|
|
@ -4299,7 +4079,7 @@ killnext:
|
|||
banana->z += banana->height;
|
||||
|
||||
S_StartSound(banana, banana->info->deathsound);
|
||||
P_KillMobj(banana, inflictor, source, 0);
|
||||
P_KillMobj(banana, inflictor, source, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(banana, 8*FRACUNIT, false);
|
||||
if (inflictor)
|
||||
|
|
@ -4583,7 +4363,7 @@ void K_DropKitchenSink(player_t *player)
|
|||
if (player->mo->hnext->type != MT_SINK_SHIELD)
|
||||
return; //so we can just call this function regardless of what is being held
|
||||
|
||||
P_KillMobj(player->mo->hnext, NULL, NULL, 0);
|
||||
P_KillMobj(player->mo->hnext, NULL, NULL, DMG_NORMAL);
|
||||
|
||||
P_SetTarget(&player->mo->hnext, NULL);
|
||||
}
|
||||
|
|
@ -5752,7 +5532,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
if (player->kartstuff[k_ringdelay])
|
||||
player->kartstuff[k_ringdelay]--;
|
||||
|
||||
if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer])
|
||||
if (P_PlayerInPain(player))
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
else if (player->kartstuff[k_ringboost])
|
||||
player->kartstuff[k_ringboost]--;
|
||||
|
|
@ -5863,9 +5643,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
K_KartPlayerHUDUpdate(player);
|
||||
|
||||
if (gametype == GT_BATTLE && player->kartstuff[k_bumper] > 0
|
||||
&& !player->kartstuff[k_spinouttimer] && !player->kartstuff[k_squishedtimer]
|
||||
&& (player->respawn.state == RESPAWNST_DROP) && !player->powers[pw_flashing])
|
||||
if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] > 0 && !P_PlayerInPain(player) && !player->powers[pw_flashing])
|
||||
{
|
||||
player->kartstuff[k_wanted]++;
|
||||
if (battleovertime.enabled >= 10*TICRATE)
|
||||
|
|
@ -5875,7 +5653,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
player->kartstuff[k_killfield]++;
|
||||
if (player->kartstuff[k_killfield] > 4*TICRATE)
|
||||
{
|
||||
K_SpinPlayer(player, NULL, 0, NULL, false);
|
||||
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_NORMAL);
|
||||
//player->kartstuff[k_killfield] = 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -6654,7 +6432,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
player->kartstuff[k_driftend] = 0;
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_spinouttimer] > 0 || player->speed == 0)
|
||||
if (P_PlayerInPain(player) || player->speed <= 0)
|
||||
{
|
||||
// Stop drifting
|
||||
player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0;
|
||||
|
|
@ -6987,7 +6765,7 @@ static void K_KartSpindash(player_t *player)
|
|||
}
|
||||
}
|
||||
else if (chargetime < -TICRATE)
|
||||
K_SpinPlayer(player, NULL, 0, NULL, false);
|
||||
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_NORMAL);
|
||||
else
|
||||
{
|
||||
if (player->kartstuff[k_spindash] % 4 == 0)
|
||||
|
|
@ -7053,12 +6831,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
|||
else if (cmd->buttons & BT_ATTACK)
|
||||
player->pflags |= PF_ATTACKDOWN;
|
||||
|
||||
if (player && player->mo && player->mo->health > 0 && !player->spectator && !mapreset && leveltime > introtime
|
||||
&& player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_squishedtimer] == 0 && (player->respawn.state == RESPAWNST_NONE))
|
||||
if (player && player->mo && player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && !mapreset && leveltime > introtime)
|
||||
{
|
||||
// First, the really specific, finicky items that function without the item being directly in your item slot.
|
||||
// Karma item dropping
|
||||
if (player->kartstuff[k_comebackmode] && !player->kartstuff[k_comebacktimer])
|
||||
if (player->kartstuff[k_comebackmode])
|
||||
{
|
||||
if (ATTACK_IS_DOWN)
|
||||
{
|
||||
|
|
|
|||
11
src/k_kart.h
11
src/k_kart.h
|
|
@ -40,10 +40,13 @@ void K_KartPlayerHUDUpdate(player_t *player);
|
|||
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
|
||||
void K_KartPlayerAfterThink(player_t *player);
|
||||
void K_DoInstashield(player_t *player);
|
||||
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflictor, boolean trapitem);
|
||||
void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor);
|
||||
void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor);
|
||||
void K_StealBumper(player_t *player, player_t *victim, boolean force);
|
||||
void K_BattleHitPlayer(player_t *player, player_t *victim, UINT8 points, boolean reducewanted);
|
||||
void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source);
|
||||
void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type);
|
||||
void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source);
|
||||
void K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source);
|
||||
void K_DebtStingPlayer(player_t *player, mobj_t *source);
|
||||
void K_StealBumper(player_t *player, player_t *victim);
|
||||
void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source);
|
||||
void K_SpawnMineExplosion(mobj_t *source, UINT8 color);
|
||||
UINT16 K_DriftSparkColor(player_t *player, INT32 charge);
|
||||
|
|
|
|||
|
|
@ -3332,34 +3332,33 @@ static int lib_kSpawnBattlePoints(lua_State *L)
|
|||
static int lib_kSpinPlayer(lua_State *L)
|
||||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
mobj_t *inflictor = NULL;
|
||||
mobj_t *source = NULL;
|
||||
INT32 type = (INT32)luaL_optinteger(L, 3, 0);
|
||||
mobj_t *inflictor = NULL;
|
||||
boolean trapitem = lua_optboolean(L, 5);
|
||||
NOHUD
|
||||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
if (!lua_isnone(L, 2) && lua_isuserdata(L, 2))
|
||||
source = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
|
||||
if (!lua_isnone(L, 4) && lua_isuserdata(L, 4))
|
||||
inflictor = *((mobj_t **)luaL_checkudata(L, 4, META_MOBJ));
|
||||
K_SpinPlayer(player, source, type, inflictor, trapitem);
|
||||
inflictor = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
|
||||
if (!lua_isnone(L, 3) && lua_isuserdata(L, 3))
|
||||
source = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
||||
K_SpinPlayer(player, inflictor, source, type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lib_kSquishPlayer(lua_State *L)
|
||||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
mobj_t *source = NULL;
|
||||
mobj_t *inflictor = NULL;
|
||||
mobj_t *source = NULL;
|
||||
NOHUD
|
||||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
if (!lua_isnone(L, 2) && lua_isuserdata(L, 2))
|
||||
source = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
|
||||
if (!lua_isnone(L, 2) && lua_isuserdata(L, 2))
|
||||
inflictor = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
|
||||
K_SquishPlayer(player, source, inflictor);
|
||||
if (!lua_isnone(L, 3) && lua_isuserdata(L, 3))
|
||||
source = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
||||
K_SquishPlayer(player, inflictor, source);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -3372,10 +3371,10 @@ static int lib_kExplodePlayer(lua_State *L)
|
|||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
if (!lua_isnone(L, 2) && lua_isuserdata(L, 2))
|
||||
source = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
|
||||
inflictor = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
|
||||
if (!lua_isnone(L, 3) && lua_isuserdata(L, 3))
|
||||
inflictor = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
||||
K_ExplodePlayer(player, source, inflictor);
|
||||
source = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
||||
K_ExplodePlayer(player, inflictor, source);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -3383,13 +3382,12 @@ static int lib_kStealBumper(lua_State *L)
|
|||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
player_t *victim = *((player_t **)luaL_checkudata(L, 2, META_PLAYER));
|
||||
boolean force = lua_optboolean(L, 3);
|
||||
NOHUD
|
||||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
if (!victim)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
K_StealBumper(player, victim, force);
|
||||
K_StealBumper(player, victim);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,12 +61,6 @@ enum hook {
|
|||
hook_GameQuit,
|
||||
|
||||
// SRB2Kart
|
||||
hook_ShouldSpin,
|
||||
hook_ShouldExplode,
|
||||
hook_ShouldSquish,
|
||||
hook_PlayerSpin,
|
||||
hook_PlayerExplode,
|
||||
hook_PlayerSquish,
|
||||
hook_PlayerCmd,
|
||||
hook_IntermissionThinker,
|
||||
hook_VoteThinker,
|
||||
|
|
@ -115,14 +109,6 @@ void LUAh_PlayerQuit(player_t *plr, kickreason_t reason); // Hook for player qui
|
|||
boolean LUAh_MusicChange(const char *oldname, char *newname, UINT16 *mflags, boolean *looping,
|
||||
UINT32 *position, UINT32 *prefadems, UINT32 *fadeinms); // Hook for music changes
|
||||
|
||||
UINT8 LUAh_ShouldSpin(player_t *player, mobj_t *inflictor, mobj_t *source); // SRB2KART: Should player be spun out?
|
||||
UINT8 LUAh_ShouldExplode(player_t *player, mobj_t *inflictor, mobj_t *source); // SRB2KART: Should player be exploded?
|
||||
UINT8 LUAh_ShouldSquish(player_t *player, mobj_t *inflictor, mobj_t *source); // SRB2KART: Should player be squished?
|
||||
|
||||
boolean LUAh_PlayerSpin(player_t *player, mobj_t *inflictor, mobj_t *source); // SRB2KART: Hook for K_SpinPlayer. Allows Lua to execute code and/or overwrite its behavior.
|
||||
boolean LUAh_PlayerExplode(player_t *player, mobj_t *inflictor, mobj_t *source); // SRB2KART: Hook for K_ExplodePlayer. Allows Lua to execute code and/or overwrite its behavior.
|
||||
boolean LUAh_PlayerSquish(player_t *player, mobj_t *inflictor, mobj_t *source); // SRB2KART: Hook for K_SquishPlayer. Allows Lua to execute code and/or overwrite its behavior.
|
||||
|
||||
boolean LUAh_PlayerCmd(player_t *player, ticcmd_t *cmd); // Allows to write to player cmd before the game does anything with them.
|
||||
|
||||
void LUAh_IntermissionThinker(void); // Hook for Y_Ticker
|
||||
|
|
|
|||
|
|
@ -73,12 +73,6 @@ const char *const hookNames[hook_MAX+1] = {
|
|||
"GameQuit",
|
||||
|
||||
// SRB2Kart
|
||||
"ShouldSpin",
|
||||
"ShouldExplode",
|
||||
"ShouldSquish",
|
||||
"PlayerSpin",
|
||||
"PlayerExplode",
|
||||
"PlayerSquish",
|
||||
"PlayerCmd",
|
||||
"IntermissionThinker",
|
||||
"VoteThinker",
|
||||
|
|
@ -180,12 +174,6 @@ static int lib_addHook(lua_State *L)
|
|||
hook.s.str = Z_StrDup(luaL_checkstring(L, 2));
|
||||
strupr(hook.s.str);
|
||||
break;
|
||||
case hook_ShouldSpin:
|
||||
case hook_ShouldExplode:
|
||||
case hook_ShouldSquish:
|
||||
case hook_PlayerSpin:
|
||||
case hook_PlayerExplode:
|
||||
case hook_PlayerSquish:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -238,12 +226,6 @@ static int lib_addHook(lua_State *L)
|
|||
case hook_LinedefExecute:
|
||||
lastp = &linedefexecutorhooks;
|
||||
break;
|
||||
case hook_ShouldSpin:
|
||||
case hook_ShouldExplode:
|
||||
case hook_ShouldSquish:
|
||||
case hook_PlayerSpin:
|
||||
case hook_PlayerExplode:
|
||||
case hook_PlayerSquish:
|
||||
default:
|
||||
lastp = &roothook;
|
||||
break;
|
||||
|
|
@ -1911,270 +1893,6 @@ boolean LUAh_MusicChange(const char *oldname, char *newname, UINT16 *mflags, boo
|
|||
return hooked;
|
||||
}
|
||||
|
||||
// Hook for K_SpinPlayer. Determines if yes or no we should get damaged reguardless of circumstances.
|
||||
UINT8 LUAh_ShouldSpin(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
hook_p hookp;
|
||||
UINT8 shouldDamage = 0; // 0 = default, 1 = force yes, 2 = force no.
|
||||
if (!gL || !(hooksAvailable[hook_ShouldSpin/8] & (1<<(hook_ShouldSpin%8))))
|
||||
return 0;
|
||||
|
||||
lua_settop(gL, 0);
|
||||
|
||||
// We can afford not to check for mobj type because it will always be MT_PLAYER in this case.
|
||||
|
||||
for (hookp = roothook; hookp; hookp = hookp->next)
|
||||
if (hookp->type == hook_ShouldSpin)
|
||||
{
|
||||
if (lua_gettop(gL) == 0)
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
LUA_PushUserdata(gL, inflictor, META_MOBJ);
|
||||
LUA_PushUserdata(gL, source, META_MOBJ);
|
||||
}
|
||||
lua_pushfstring(gL, FMT_HOOKID, hookp->id);
|
||||
lua_gettable(gL, LUA_REGISTRYINDEX);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
if (lua_pcall(gL, 3, 1, 0)) {
|
||||
if (!hookp->error || cv_debug & DBG_LUA)
|
||||
CONS_Alert(CONS_WARNING,"%s\n",lua_tostring(gL, -1));
|
||||
lua_pop(gL, 1);
|
||||
hookp->error = true;
|
||||
continue;
|
||||
}
|
||||
if (!lua_isnil(gL, -1))
|
||||
{
|
||||
if (lua_toboolean(gL, -1))
|
||||
shouldDamage = 1; // Force yes
|
||||
else
|
||||
shouldDamage = 2; // Force no
|
||||
}
|
||||
lua_pop(gL, 1);
|
||||
}
|
||||
|
||||
lua_settop(gL, 0);
|
||||
return shouldDamage;
|
||||
}
|
||||
|
||||
// Hook for K_ExplodePlayer. Determines if yes or no we should get damaged reguardless of circumstances.
|
||||
UINT8 LUAh_ShouldExplode(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
hook_p hookp;
|
||||
UINT8 shouldDamage = 0; // 0 = default, 1 = force yes, 2 = force no.
|
||||
if (!gL || !(hooksAvailable[hook_ShouldExplode/8] & (1<<(hook_ShouldExplode%8))))
|
||||
return 0;
|
||||
|
||||
lua_settop(gL, 0);
|
||||
|
||||
// We can afford not to check for mobj type because it will always be MT_PLAYER in this case.
|
||||
|
||||
for (hookp = roothook; hookp; hookp = hookp->next)
|
||||
if (hookp->type == hook_ShouldExplode)
|
||||
{
|
||||
if (lua_gettop(gL) == 0)
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
LUA_PushUserdata(gL, inflictor, META_MOBJ);
|
||||
LUA_PushUserdata(gL, source, META_MOBJ);
|
||||
}
|
||||
lua_pushfstring(gL, FMT_HOOKID, hookp->id);
|
||||
lua_gettable(gL, LUA_REGISTRYINDEX);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
if (lua_pcall(gL, 3, 1, 0)) {
|
||||
if (!hookp->error || cv_debug & DBG_LUA)
|
||||
CONS_Alert(CONS_WARNING,"%s\n",lua_tostring(gL, -1));
|
||||
lua_pop(gL, 1);
|
||||
hookp->error = true;
|
||||
continue;
|
||||
}
|
||||
if (!lua_isnil(gL, -1))
|
||||
{
|
||||
if (lua_toboolean(gL, -1))
|
||||
shouldDamage = 1; // Force yes
|
||||
else
|
||||
shouldDamage = 2; // Force no
|
||||
}
|
||||
lua_pop(gL, 1);
|
||||
}
|
||||
|
||||
lua_settop(gL, 0);
|
||||
return shouldDamage;
|
||||
}
|
||||
|
||||
// Hook for K_SquishPlayer. Determines if yes or no we should get damaged reguardless of circumstances.
|
||||
UINT8 LUAh_ShouldSquish(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
hook_p hookp;
|
||||
UINT8 shouldDamage = 0; // 0 = default, 1 = force yes, 2 = force no.
|
||||
if (!gL || !(hooksAvailable[hook_ShouldSquish/8] & (1<<(hook_ShouldSquish%8))))
|
||||
return 0;
|
||||
|
||||
lua_settop(gL, 0);
|
||||
|
||||
// We can afford not to check for mobj type because it will always be MT_PLAYER in this case.
|
||||
|
||||
for (hookp = roothook; hookp; hookp = hookp->next)
|
||||
if (hookp->type == hook_ShouldSquish)
|
||||
{
|
||||
if (lua_gettop(gL) == 0)
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
LUA_PushUserdata(gL, inflictor, META_MOBJ);
|
||||
LUA_PushUserdata(gL, source, META_MOBJ);
|
||||
}
|
||||
lua_pushfstring(gL, FMT_HOOKID, hookp->id);
|
||||
lua_gettable(gL, LUA_REGISTRYINDEX);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
if (lua_pcall(gL, 3, 1, 0)) {
|
||||
if (!hookp->error || cv_debug & DBG_LUA)
|
||||
CONS_Alert(CONS_WARNING,"%s\n",lua_tostring(gL, -1));
|
||||
lua_pop(gL, 1);
|
||||
hookp->error = true;
|
||||
continue;
|
||||
}
|
||||
if (!lua_isnil(gL, -1))
|
||||
{
|
||||
if (lua_toboolean(gL, -1))
|
||||
shouldDamage = 1; // Force yes
|
||||
else
|
||||
shouldDamage = 2; // Force no
|
||||
}
|
||||
lua_pop(gL, 1);
|
||||
}
|
||||
|
||||
lua_settop(gL, 0);
|
||||
return shouldDamage;
|
||||
}
|
||||
|
||||
// Hook for K_SpinPlayer. This is used when the player has actually been spun out, but before anything has actually been done. This allows Lua to overwrite the behavior or to just perform actions.
|
||||
boolean LUAh_PlayerSpin(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
hook_p hookp;
|
||||
boolean hooked = false;
|
||||
if (!gL || !(hooksAvailable[hook_PlayerSpin/8] & (1<<(hook_PlayerSpin%8))))
|
||||
return 0;
|
||||
|
||||
lua_settop(gL, 0);
|
||||
|
||||
// We can afford not to look for target->type because it will always be MT_PLAYER.
|
||||
|
||||
for (hookp = roothook; hookp; hookp = hookp->next)
|
||||
if (hookp->type == hook_PlayerSpin)
|
||||
{
|
||||
if (lua_gettop(gL) == 0)
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
LUA_PushUserdata(gL, inflictor, META_MOBJ);
|
||||
LUA_PushUserdata(gL, source, META_MOBJ);
|
||||
}
|
||||
lua_pushfstring(gL, FMT_HOOKID, hookp->id);
|
||||
lua_gettable(gL, LUA_REGISTRYINDEX);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
if (lua_pcall(gL, 3, 1, 0)) {
|
||||
if (!hookp->error || cv_debug & DBG_LUA)
|
||||
CONS_Alert(CONS_WARNING,"%s\n",lua_tostring(gL, -1));
|
||||
lua_pop(gL, 1);
|
||||
hookp->error = true;
|
||||
continue;
|
||||
}
|
||||
if (lua_toboolean(gL, -1))
|
||||
hooked = true;
|
||||
lua_pop(gL, 1);
|
||||
}
|
||||
lua_settop(gL, 0);
|
||||
return hooked;
|
||||
}
|
||||
|
||||
// Hook for K_SquishPlayer. This is used when the player has actually been spun out, but before anything has actually been done. This allows Lua to overwrite the behavior or to just perform actions.
|
||||
boolean LUAh_PlayerSquish(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
hook_p hookp;
|
||||
boolean hooked = false;
|
||||
if (!gL || !(hooksAvailable[hook_PlayerSquish/8] & (1<<(hook_PlayerSquish%8))))
|
||||
return 0;
|
||||
|
||||
lua_settop(gL, 0);
|
||||
|
||||
// We can afford not to look for target->type because it will always be MT_PLAYER.
|
||||
|
||||
for (hookp = roothook; hookp; hookp = hookp->next)
|
||||
if (hookp->type == hook_PlayerSquish)
|
||||
{
|
||||
if (lua_gettop(gL) == 0)
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
LUA_PushUserdata(gL, inflictor, META_MOBJ);
|
||||
LUA_PushUserdata(gL, source, META_MOBJ);
|
||||
}
|
||||
lua_pushfstring(gL, FMT_HOOKID, hookp->id);
|
||||
lua_gettable(gL, LUA_REGISTRYINDEX);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
if (lua_pcall(gL, 3, 1, 0)) {
|
||||
if (!hookp->error || cv_debug & DBG_LUA)
|
||||
CONS_Alert(CONS_WARNING,"%s\n",lua_tostring(gL, -1));
|
||||
lua_pop(gL, 1);
|
||||
hookp->error = true;
|
||||
continue;
|
||||
}
|
||||
if (lua_toboolean(gL, -1))
|
||||
hooked = true;
|
||||
lua_pop(gL, 1);
|
||||
}
|
||||
lua_settop(gL, 0);
|
||||
return hooked;
|
||||
}
|
||||
|
||||
// Hook for K_ExplodePlayer. This is used when the player has actually been spun out, but before anything has actually been done. This allows Lua to overwrite the behavior or to just perform actions.
|
||||
boolean LUAh_PlayerExplode(player_t *player, mobj_t *inflictor, mobj_t *source)
|
||||
{
|
||||
hook_p hookp;
|
||||
boolean hooked = false;
|
||||
if (!gL || !(hooksAvailable[hook_PlayerExplode/8] & (1<<(hook_PlayerExplode%8))))
|
||||
return 0;
|
||||
|
||||
lua_settop(gL, 0);
|
||||
|
||||
// We can afford not to look for target->type because it will always be MT_PLAYER.
|
||||
|
||||
for (hookp = roothook; hookp; hookp = hookp->next)
|
||||
if (hookp->type == hook_PlayerExplode)
|
||||
{
|
||||
if (lua_gettop(gL) == 0)
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
LUA_PushUserdata(gL, inflictor, META_MOBJ);
|
||||
LUA_PushUserdata(gL, source, META_MOBJ);
|
||||
}
|
||||
lua_pushfstring(gL, FMT_HOOKID, hookp->id);
|
||||
lua_gettable(gL, LUA_REGISTRYINDEX);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
lua_pushvalue(gL, -4);
|
||||
if (lua_pcall(gL, 3, 1, 0)) {
|
||||
if (!hookp->error || cv_debug & DBG_LUA)
|
||||
CONS_Alert(CONS_WARNING,"%s\n",lua_tostring(gL, -1));
|
||||
lua_pop(gL, 1);
|
||||
hookp->error = true;
|
||||
continue;
|
||||
}
|
||||
if (lua_toboolean(gL, -1))
|
||||
hooked = true;
|
||||
lua_pop(gL, 1);
|
||||
}
|
||||
lua_settop(gL, 0);
|
||||
return hooked;
|
||||
}
|
||||
|
||||
// Hook for Y_VoteTicker
|
||||
void LUAh_VoteThinker(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -376,7 +376,7 @@ void Command_Hurtme_f(void)
|
|||
return;
|
||||
}
|
||||
|
||||
P_DamageMobj(players[consoleplayer].mo, NULL, NULL, atoi(COM_Argv(1)), 0);
|
||||
P_DamageMobj(players[consoleplayer].mo, NULL, NULL, atoi(COM_Argv(1)), DMG_NORMAL);
|
||||
}
|
||||
|
||||
void Command_RTeleport_f(void)
|
||||
|
|
|
|||
|
|
@ -4167,7 +4167,7 @@ void A_AttractChase(mobj_t *actor)
|
|||
sparkle->angle = (actor->target->angle + (offset>>1)) + (offset * actor->target->player->kartstuff[k_sparkleanim]);
|
||||
actor->target->player->kartstuff[k_sparkleanim] = (actor->target->player->kartstuff[k_sparkleanim]+1) % 20;
|
||||
|
||||
P_KillMobj(actor, actor->target, actor->target, 0);
|
||||
P_KillMobj(actor, actor->target, actor->target, DMG_NORMAL);
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
|
@ -4506,11 +4506,7 @@ static inline boolean PIT_MineExplode(mobj_t *thing)
|
|||
thing->z - grenade->z) > explodedist)
|
||||
return true; // Too far away
|
||||
|
||||
if (thing->player) // Looks like we're going to have to need a seperate function for this too
|
||||
K_ExplodePlayer(thing->player, grenade->target, grenade);
|
||||
else
|
||||
P_DamageMobj(thing, grenade, grenade->target, 1, 0);
|
||||
|
||||
P_DamageMobj(thing, grenade, grenade->target, 1, DMG_EXPLODE);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -5029,7 +5025,7 @@ void A_MinusPopup(mobj_t *actor)
|
|||
}
|
||||
P_RadiusAttack(actor, actor, 2*actor->radius, 0, true);
|
||||
if (actor->tracer)
|
||||
P_DamageMobj(actor->tracer, actor, actor, 1, 0);
|
||||
P_DamageMobj(actor->tracer, actor, actor, 1, DMG_NORMAL);
|
||||
|
||||
actor->flags = (actor->flags & ~MF_NOCLIPTHING)|MF_SPECIAL|MF_SHOOTABLE;
|
||||
}
|
||||
|
|
@ -5500,7 +5496,7 @@ void A_UnidusBall(mobj_t *actor)
|
|||
boolean skull = (actor->target->flags2 & MF2_SKULLFLY) == MF2_SKULLFLY;
|
||||
if (actor->target->state == &states[actor->target->info->painstate])
|
||||
{
|
||||
P_KillMobj(actor, NULL, NULL, 0);
|
||||
P_KillMobj(actor, NULL, NULL, DMG_NORMAL);
|
||||
return;
|
||||
}
|
||||
switch(actor->extravalue2)
|
||||
|
|
@ -5859,7 +5855,7 @@ void A_RingExplode(mobj_t *actor)
|
|||
if (mo2->flags & MF_SHOOTABLE)
|
||||
{
|
||||
actor->flags2 |= MF2_DEBRIS;
|
||||
P_DamageMobj(mo2, actor, actor->target, 1, 0);
|
||||
P_DamageMobj(mo2, actor, actor->target, 1, DMG_NORMAL);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
|
@ -6801,7 +6797,7 @@ void A_EggmanBox(mobj_t *actor)
|
|||
return;
|
||||
}
|
||||
|
||||
P_DamageMobj(actor->target, actor, actor, 1, 0); // Ow!
|
||||
P_DamageMobj(actor->target, actor, actor, 1, DMG_NORMAL); // Ow!
|
||||
}
|
||||
|
||||
// Function: A_TurretFire
|
||||
|
|
@ -9455,7 +9451,7 @@ void A_RandomShadowFrame(mobj_t *actor)
|
|||
&& P_IsObjectOnGround(actor->target)
|
||||
&& actor->z == actor->target->z)
|
||||
{
|
||||
P_DamageMobj(actor->target, actor, actor, 1, 0);
|
||||
P_DamageMobj(actor->target, actor, actor, 1, DMG_NORMAL);
|
||||
P_InstaThrust(actor->target, actor->angle, 16<<FRACBITS);
|
||||
fire = P_SpawnMobj(actor->target->x, actor->target->y, actor->target->z, MT_THOK);
|
||||
P_SetMobjStateNF(fire, S_QUICKBOOM1);
|
||||
|
|
@ -9500,7 +9496,7 @@ void A_RoamingShadowThinker(mobj_t *actor)
|
|||
{
|
||||
// send them flying and spawn the WIND!
|
||||
P_InstaThrust(actor->target, 0, 0);
|
||||
P_DamageMobj(actor->target, actor, actor, 1, 0);
|
||||
P_DamageMobj(actor->target, actor, actor, 1, DMG_NORMAL);
|
||||
P_SetObjectMomZ(actor->target, 16<<FRACBITS, false);
|
||||
S_StartSound(actor->target, sfx_wind1);
|
||||
|
||||
|
|
@ -11191,7 +11187,7 @@ void A_RemoteDamage(mobj_t *actor)
|
|||
if (target->player)
|
||||
K_DoIngameRespawn(target->player);
|
||||
else
|
||||
P_KillMobj(target, source, source, 0);
|
||||
P_KillMobj(target, source, source, DMG_NORMAL);
|
||||
}
|
||||
else if (locvar2 == 2) // Remove mobj!
|
||||
{
|
||||
|
|
@ -11201,7 +11197,7 @@ void A_RemoteDamage(mobj_t *actor)
|
|||
P_RemoveMobj(target);
|
||||
}
|
||||
else // default: Damage mobj!
|
||||
P_DamageMobj(target, source, source, 1, 0);
|
||||
P_DamageMobj(target, source, source, 1, DMG_NORMAL);
|
||||
}
|
||||
|
||||
// Function: A_HomingChase
|
||||
|
|
@ -11447,7 +11443,7 @@ void A_VileAttack(mobj_t *actor)
|
|||
return;
|
||||
|
||||
S_StartSound(actor, soundtoplay);
|
||||
P_DamageMobj(actor->target, actor, actor, 1, 0);
|
||||
P_DamageMobj(actor->target, actor, actor, 1, DMG_NORMAL);
|
||||
//actor->target->momz = 1000*FRACUNIT/actor->target->info->mass; // How id did it
|
||||
actor->target->momz += FixedMul(10*FRACUNIT, actor->scale)*P_MobjFlip(actor->target); // How we're doing it
|
||||
if (explosionType != MT_NULL)
|
||||
|
|
@ -11488,7 +11484,7 @@ void A_VileAttack(mobj_t *actor)
|
|||
continue;
|
||||
|
||||
S_StartSound(actor, soundtoplay);
|
||||
P_DamageMobj(players[i].mo, actor, actor, 1, 0);
|
||||
P_DamageMobj(players[i].mo, actor, actor, 1, DMG_NORMAL);
|
||||
//actor->target->momz = 1000*FRACUNIT/actor->target->info->mass; // How id did it
|
||||
players[i].mo->momz += FixedMul(10*FRACUNIT, actor->scale)*P_MobjFlip(players[i].mo); // How we're doing it
|
||||
if (explosionType != MT_NULL)
|
||||
|
|
@ -13266,7 +13262,7 @@ void A_Boss5FindWaypoint(mobj_t *actor)
|
|||
nowaypoints:
|
||||
// no waypoints at all, guess the mobj has to disappear
|
||||
if (actor->health)
|
||||
P_KillMobj(actor, NULL, NULL, 0);
|
||||
P_KillMobj(actor, NULL, NULL, DMG_NORMAL);
|
||||
else
|
||||
P_RemoveMobj(actor);
|
||||
return;
|
||||
|
|
@ -13815,7 +13811,7 @@ static boolean PIT_TNTExplode(mobj_t *nearby)
|
|||
{
|
||||
mobj_t *tar = barrel->target; // temporarily store barrel's target
|
||||
P_SetTarget(&barrel->target, NULL);
|
||||
P_DamageMobj(nearby, barrel, NULL, 1, 0);
|
||||
P_DamageMobj(nearby, barrel, NULL, 1, DMG_NORMAL);
|
||||
if (!P_MobjWasRemoved(barrel))
|
||||
P_SetTarget(&barrel->target, tar);
|
||||
}
|
||||
|
|
@ -13824,7 +13820,7 @@ static boolean PIT_TNTExplode(mobj_t *nearby)
|
|||
P_DamageMobj(nearby,
|
||||
(barrel->target) ? barrel->target : barrel,
|
||||
(barrel->target) ? barrel->target : barrel,
|
||||
1, 0);
|
||||
1, DMG_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2370,7 +2370,7 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
|
|||
thing->momz = FixedMul(6*FRACUNIT, thing->scale);
|
||||
P_SetThingPosition(thing);
|
||||
if (thing->flags & MF_SHOOTABLE)
|
||||
P_DamageMobj(thing, puncher, puncher, 1, 0);
|
||||
P_DamageMobj(thing, puncher, puncher, 1, DMG_NORMAL);
|
||||
else if (thing->type == MT_RING || thing->type == MT_COIN || thing->type == MT_RANDOMITEM)
|
||||
{
|
||||
thing->momz = FixedMul(3*FRACUNIT, thing->scale);
|
||||
|
|
|
|||
207
src/p_inter.c
207
src/p_inter.c
|
|
@ -212,12 +212,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
/////ENEMIES & BOSSES!!/////////////////////////////////
|
||||
////////////////////////////////////////////////////////
|
||||
|
||||
P_DamageMobj(toucher, special, special, 1, 0);
|
||||
return;
|
||||
}
|
||||
else if (special->flags & MF_FIRE)
|
||||
{
|
||||
P_DamageMobj(toucher, special, special, 1, DMG_FIRE);
|
||||
P_DamageMobj(toucher, special, special, 1, DMG_NORMAL);
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
|
@ -269,7 +264,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
|
||||
special->momx = special->momy = special->momz = 0;
|
||||
P_SetTarget(&special->target, toucher);
|
||||
P_KillMobj(special, toucher, toucher, 0);
|
||||
P_KillMobj(special, toucher, toucher, DMG_NORMAL);
|
||||
break;
|
||||
case MT_KARMAHITBOX:
|
||||
if (!special->target->player)
|
||||
|
|
@ -281,15 +276,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
if (special->target->player->exiting || player->exiting)
|
||||
return;
|
||||
|
||||
if (special->target->player->kartstuff[k_comebacktimer]
|
||||
|| special->target->player->kartstuff[k_spinouttimer]
|
||||
|| special->target->player->kartstuff[k_squishedtimer])
|
||||
if (P_PlayerInPain(special->target->player))
|
||||
return;
|
||||
|
||||
if (!special->target->player->kartstuff[k_comebackmode])
|
||||
{
|
||||
if (player->kartstuff[k_growshrinktimer] || player->kartstuff[k_squishedtimer]
|
||||
|| player->kartstuff[k_hyudorotimer] || player->kartstuff[k_spinouttimer]
|
||||
|| player->kartstuff[k_hyudorotimer] || P_PlayerInPain(player)
|
||||
|| player->kartstuff[k_invincibilitytimer] || player->powers[pw_flashing])
|
||||
return;
|
||||
else
|
||||
|
|
@ -327,11 +320,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
special->target->player->karthud[khud_yougotem] = 2*TICRATE;
|
||||
|
||||
if (special->target->player->kartstuff[k_comebackpoints] >= 2)
|
||||
K_StealBumper(special->target->player, player, true);
|
||||
K_StealBumper(special->target->player, player);
|
||||
|
||||
special->target->player->kartstuff[k_comebacktimer] = comebacktime;
|
||||
|
||||
K_ExplodePlayer(player, special->target, special);
|
||||
P_DamageMobj(toucher, special, special->target, 1, DMG_EXPLODE);
|
||||
}
|
||||
}
|
||||
else if (special->target->player->kartstuff[k_comebackmode] == 1 && P_CanPickupItem(player, 1))
|
||||
|
|
@ -355,7 +348,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
special->target->player->kartstuff[k_comebackpoints]++;
|
||||
|
||||
if (special->target->player->kartstuff[k_comebackpoints] >= 2)
|
||||
K_StealBumper(special->target->player, player, true);
|
||||
K_StealBumper(special->target->player, player);
|
||||
special->target->player->kartstuff[k_comebacktimer] = comebacktime;
|
||||
|
||||
player->kartstuff[k_itemroulette] = 1;
|
||||
|
|
@ -390,7 +383,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
special->target->player->karthud[khud_yougotem] = 2*TICRATE;
|
||||
|
||||
if (special->target->player->kartstuff[k_comebackpoints] >= 2)
|
||||
K_StealBumper(special->target->player, player, true);
|
||||
K_StealBumper(special->target->player, player);
|
||||
|
||||
special->target->player->kartstuff[k_comebacktimer] = comebacktime;
|
||||
|
||||
|
|
@ -443,7 +436,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
P_RemoveMobj(special);
|
||||
}
|
||||
else
|
||||
K_SpinPlayer(player, special->target, 0, special, false);
|
||||
{
|
||||
P_DamageMobj(player->mo, special, special->target, 1, DMG_NORMAL);
|
||||
}
|
||||
return;
|
||||
/*case MT_EERIEFOG:
|
||||
special->frame &= ~FF_TRANS80;
|
||||
|
|
@ -464,13 +459,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
|| player->kartstuff[k_growshrinktimer] > 0
|
||||
|| player->kartstuff[k_flamedash] > 0)
|
||||
{
|
||||
P_KillMobj(special, toucher, toucher, 0);
|
||||
P_KillMobj(special, toucher, toucher, DMG_NORMAL);
|
||||
return;
|
||||
}
|
||||
|
||||
// no interaction
|
||||
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||
|| player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0)
|
||||
|| player->kartstuff[k_squishedtimer] > 0 || P_PlayerInPain(player))
|
||||
return;
|
||||
|
||||
// attach to player!
|
||||
|
|
@ -538,9 +533,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
return;
|
||||
|
||||
// Don't immediately pick up spilled rings
|
||||
if (special->threshold > 0
|
||||
|| player->kartstuff[k_squishedtimer]
|
||||
|| player->kartstuff[k_spinouttimer])
|
||||
if (special->threshold > 0 || P_PlayerInPain(player))
|
||||
return;
|
||||
|
||||
if (!(P_CanPickupItem(player, 0)))
|
||||
|
|
@ -677,7 +670,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
|
||||
S_StartSound(toucher, special->info->deathsound); // was NULL, but changed to player so you could hear others pick up rings
|
||||
P_KillMobj(special, NULL, toucher, 0);
|
||||
P_KillMobj(special, NULL, toucher, DMG_NORMAL);
|
||||
special->shadowscale = 0;
|
||||
}
|
||||
|
||||
|
|
@ -1269,7 +1262,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
mobj_t *segment = target;
|
||||
while (segment->tracer != NULL)
|
||||
{
|
||||
P_KillMobj(segment->tracer, NULL, NULL, 0);
|
||||
P_KillMobj(segment->tracer, NULL, NULL, DMG_NORMAL);
|
||||
segment = segment->tracer;
|
||||
}
|
||||
break;
|
||||
|
|
@ -1345,7 +1338,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
A_Scream(target);
|
||||
target->momx = target->momy = target->momz = 0;
|
||||
if (target->target && target->target->health)
|
||||
P_KillMobj(target->target, target, source, 0);
|
||||
P_KillMobj(target->target, target, source, DMG_NORMAL);
|
||||
break;
|
||||
|
||||
case MT_PLAYER:
|
||||
|
|
@ -1356,23 +1349,8 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
if (target->player && target->player->pflags & PF_GAMETYPEOVER)
|
||||
break;
|
||||
|
||||
if (damagetype == DMG_DROWNED) // drowned
|
||||
{
|
||||
target->movedir = damagetype; // we're MOVING the Damage Into anotheR function... Okay, this is a bit of a hack.
|
||||
if (target->player->charflags & SF_MACHINE)
|
||||
S_StartSound(target, sfx_fizzle);
|
||||
else
|
||||
S_StartSound(target, sfx_drown);
|
||||
// Don't jump up when drowning
|
||||
}
|
||||
else
|
||||
{
|
||||
P_SetObjectMomZ(target, 14*FRACUNIT, false);
|
||||
if (damagetype == DMG_SPIKE) // Spikes
|
||||
S_StartSound(target, sfx_spkdth);
|
||||
else
|
||||
P_PlayDeathSound(target);
|
||||
}
|
||||
P_SetObjectMomZ(target, 14*FRACUNIT, false);
|
||||
P_PlayDeathSound(target);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -1450,7 +1428,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
if (target->type == MT_FROGGER)
|
||||
{
|
||||
if (target->tracer && !P_MobjWasRemoved(target->tracer))
|
||||
P_KillMobj(target->tracer, inflictor, source, 0);
|
||||
P_KillMobj(target->tracer, inflictor, source, DMG_NORMAL);
|
||||
}
|
||||
|
||||
if (target->type == MT_FROGGER || target->type == MT_ROBRA_HEAD || target->type == MT_BLUEROBRA_HEAD) // clean hnext list
|
||||
|
|
@ -1458,7 +1436,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
mobj_t *cur = target->hnext;
|
||||
while (cur && !P_MobjWasRemoved(cur))
|
||||
{
|
||||
P_KillMobj(cur, inflictor, source, 0);
|
||||
P_KillMobj(cur, inflictor, source, DMG_NORMAL);
|
||||
cur = cur->hnext;
|
||||
}
|
||||
}
|
||||
|
|
@ -1644,12 +1622,19 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou
|
|||
(void)inflictor;
|
||||
(void)damage;
|
||||
|
||||
// SRB2Kart: We want to hurt ourselves
|
||||
// SRB2Kart: We want to hurt ourselves, so it's now DMG_CANTHURTSELF
|
||||
if (damagetype & DMG_CANTHURTSELF)
|
||||
{
|
||||
// You can't kill yourself, idiot...
|
||||
if (source == target)
|
||||
return false;
|
||||
|
||||
if (G_GametypeHasTeams())
|
||||
{
|
||||
// Don't hurt your team, either!
|
||||
if (source->player->ctfteam == target->player->ctfteam)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -1817,20 +1802,24 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
|
||||
if (player) // Player is the target
|
||||
{
|
||||
const UINT8 type = (damagetype & DMG_TYPEMASK);
|
||||
const boolean combo = (type == DMG_EXPLODE); // This damage type can be comboed from other damage
|
||||
INT16 ringburst = 5;
|
||||
|
||||
if (player->pflags & PF_GODMODE)
|
||||
return false;
|
||||
|
||||
if (!force)
|
||||
{
|
||||
if (player->exiting)
|
||||
return false;
|
||||
|
||||
if (player->pflags & PF_GODMODE)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Player hits another player
|
||||
if (!force && source && source->player)
|
||||
{
|
||||
if (!P_PlayerHitsPlayer(target, inflictor, source, damage, damagetype))
|
||||
return false;
|
||||
// Player hits another player
|
||||
if (source && source->player)
|
||||
{
|
||||
if (!P_PlayerHitsPlayer(target, inflictor, source, damage, damagetype))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Instant-Death
|
||||
|
|
@ -1839,27 +1828,119 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
else if (LUAh_MobjDamage(target, inflictor, source, damage, damagetype))
|
||||
return true;
|
||||
|
||||
if (inflictor && (inflictor->type == MT_ORBINAUT || inflictor->type == MT_ORBINAUT_SHIELD
|
||||
|| inflictor->type == MT_JAWZ || inflictor->type == MT_JAWZ_SHIELD || inflictor->type == MT_JAWZ_DUD
|
||||
|| inflictor->type == MT_SMK_THWOMP || inflictor->player))
|
||||
// Check if the player is allowed to be damaged!
|
||||
// If not, then spawn the instashield effect instead.
|
||||
if (!force)
|
||||
{
|
||||
player->kartstuff[k_sneakertimer] = 0;
|
||||
player->kartstuff[k_numsneakers] = 0;
|
||||
if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0)
|
||||
{
|
||||
// Full invulnerability
|
||||
K_DoInstashield(player);
|
||||
return false;
|
||||
}
|
||||
|
||||
K_SpinPlayer(player, source, 1, inflictor, false);
|
||||
K_KartPainEnergyFling(player);
|
||||
if (combo == false)
|
||||
{
|
||||
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2))
|
||||
{
|
||||
// Post-hit invincibility
|
||||
K_DoInstashield(player);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (P_IsDisplayPlayer(player))
|
||||
P_StartQuake(32<<FRACBITS, 5);
|
||||
if (gametyperules & GTR_BUMPERS)
|
||||
{
|
||||
if ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)
|
||||
{
|
||||
// No bumpers, can't be hurt
|
||||
K_DoInstashield(player);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (damagetype & DMG_STEAL)
|
||||
{
|
||||
// Gametype does not have bumpers, steal damage is intended to not do anything
|
||||
// (No instashield is intentional)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We successfully hit 'em!
|
||||
if (type != DMG_STING)
|
||||
{
|
||||
if (source && source != player->mo && source->player)
|
||||
{
|
||||
K_PlayHitEmSound(source);
|
||||
|
||||
if (damagetype & DMG_STEAL)
|
||||
{
|
||||
K_StealBumper(source->player, player);
|
||||
}
|
||||
}
|
||||
|
||||
K_RemoveBumper(player, inflictor, source);
|
||||
}
|
||||
|
||||
player->kartstuff[k_sneakertimer] = player->kartstuff[k_numsneakers] = 0;
|
||||
player->kartstuff[k_driftboost] = 0;
|
||||
player->kartstuff[k_ringboost] = 0;
|
||||
|
||||
player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DMG_STING:
|
||||
K_DebtStingPlayer(player, source);
|
||||
K_KartPainEnergyFling(player);
|
||||
ringburst = 0;
|
||||
break;
|
||||
case DMG_EXPLODE:
|
||||
K_ExplodePlayer(player, inflictor, source);
|
||||
break;
|
||||
case DMG_WIPEOUT:
|
||||
if (P_IsDisplayPlayer(player))
|
||||
P_StartQuake(32<<FRACBITS, 5);
|
||||
|
||||
K_SpinPlayer(player, inflictor, source, 1);
|
||||
K_KartPainEnergyFling(player);
|
||||
break;
|
||||
case DMG_NORMAL:
|
||||
default:
|
||||
K_SpinPlayer(player, inflictor, source, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
if (type != DMG_STING)
|
||||
player->powers[pw_flashing] = K_GetKartFlashing(player);
|
||||
|
||||
P_PlayRinglossSound(player->mo);
|
||||
P_PlayerRingBurst(player, ringburst);
|
||||
K_PlayPainSound(player->mo);
|
||||
|
||||
if ((type == DMG_EXPLODE) || (cv_kartdebughuddrop.value && !modeattacking))
|
||||
{
|
||||
K_DropItems(player);
|
||||
}
|
||||
else
|
||||
{
|
||||
K_SpinPlayer(player, source, 0, inflictor, false);
|
||||
K_DropHnextList(player, false);
|
||||
}
|
||||
|
||||
player->kartstuff[k_instashield] = 15;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (damagetype & DMG_STEAL)
|
||||
{
|
||||
// Not a player, steal damage is intended to not do anything
|
||||
return false;
|
||||
}
|
||||
|
||||
// do the damage
|
||||
if (damagetype & DMG_DEATHMASK)
|
||||
target->health = 0;
|
||||
|
|
|
|||
|
|
@ -460,23 +460,21 @@ typedef struct BasicFF_s
|
|||
|
||||
/* Damage/death types, for P_DamageMobj and related */
|
||||
//// Damage types
|
||||
//#define DMG_NORMAL 0 (unneeded?)
|
||||
#define DMG_WATER 1
|
||||
#define DMG_FIRE 2
|
||||
#define DMG_ELECTRIC 3
|
||||
#define DMG_SPIKE 4
|
||||
#define DMG_NUKE 5 // bomb shield
|
||||
//#define DMG_SPECIALSTAGE 6
|
||||
#define DMG_NORMAL 0x00
|
||||
#define DMG_WIPEOUT 0x01 // Normal, but with extra flashy effects
|
||||
#define DMG_EXPLODE 0x02
|
||||
#define DMG_SQUISH 0x03
|
||||
#define DMG_STING 0x04
|
||||
//// Death types - cannot be combined with damage types
|
||||
#define DMG_INSTAKILL 0x80
|
||||
#define DMG_DROWNED 0x80+1
|
||||
#define DMG_SPACEDROWN 0x80+2
|
||||
#define DMG_DEATHPIT 0x80+3
|
||||
#define DMG_CRUSHED 0x80+4
|
||||
#define DMG_SPECTATOR 0x80+5
|
||||
#define DMG_DEATHPIT 0x81
|
||||
#define DMG_CRUSHED 0x82
|
||||
#define DMG_SPECTATOR 0x83
|
||||
// Masks
|
||||
#define DMG_STEAL 0x20 // Flag - can steal bumpers, will only deal damage to players, and will not deal damage outside Battle Mode.
|
||||
#define DMG_CANTHURTSELF 0x40 // Flag - cannot hurt your self or your team
|
||||
#define DMG_DEATHMASK DMG_INSTAKILL // if bit 7 is set, this is a death type instead of a damage type
|
||||
#define DMG_DEATHMASK DMG_INSTAKILL // if bit 7 is set, this is a death type instead of a damage type
|
||||
#define DMG_TYPEMASK 0x0F // Get type without any flags
|
||||
|
||||
void P_ForceFeed(const player_t *player, INT32 attack, INT32 fade, tic_t duration, INT32 period);
|
||||
void P_ForceConstant(const BasicFF_t *FFInfo);
|
||||
|
|
|
|||
88
src/p_map.c
88
src/p_map.c
|
|
@ -627,8 +627,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (tmthing->flags & MF_SHOOTABLE && thing->health > 0)
|
||||
{
|
||||
UINT32 damagetype = (thing->info->mass & 0xFF);
|
||||
if (!damagetype && thing->flags & MF_FIRE) // BURN!
|
||||
damagetype = DMG_FIRE;
|
||||
|
||||
if (P_DamageMobj(tmthing, thing, thing, 1, damagetype) && (damagetype = (thing->info->mass>>8)))
|
||||
S_StartSound(thing, damagetype);
|
||||
}
|
||||
|
|
@ -644,8 +643,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (thing->flags & MF_SHOOTABLE && tmthing->health > 0)
|
||||
{
|
||||
UINT32 damagetype = (tmthing->info->mass & 0xFF);
|
||||
if (!damagetype && tmthing->flags & MF_FIRE) // BURN!
|
||||
damagetype = DMG_FIRE;
|
||||
|
||||
if (P_DamageMobj(thing, tmthing, tmthing, 1, damagetype) && (damagetype = (tmthing->info->mass>>8)))
|
||||
S_StartSound(tmthing, damagetype);
|
||||
}
|
||||
|
|
@ -738,13 +736,13 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
thing = oldthing;
|
||||
P_SetTarget(&tmthing, oldtmthing);*/
|
||||
|
||||
if (tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_squishedtimer]
|
||||
if (P_PlayerInPain(tmthing->player)
|
||||
|| tmthing->player->powers[pw_flashing] || tmthing->player->kartstuff[k_hyudorotimer]
|
||||
|| tmthing->player->kartstuff[k_justbumped] || tmthing->scale > thing->scale + (mapobjectscale/8))
|
||||
return true;
|
||||
|
||||
// Player Damage
|
||||
K_SpinPlayer(tmthing->player, thing, 0, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), false);
|
||||
P_DamageMobj(tmthing, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), thing, 1, DMG_NORMAL);
|
||||
S_StartSound(thing, sfx_s3k44);
|
||||
}
|
||||
else
|
||||
|
|
@ -796,13 +794,13 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
thing = oldthing;
|
||||
P_SetTarget(&tmthing, oldtmthing);*/
|
||||
|
||||
if (thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_squishedtimer]
|
||||
if (P_PlayerInPain(thing->player)
|
||||
|| thing->player->powers[pw_flashing] || thing->player->kartstuff[k_hyudorotimer]
|
||||
|| thing->player->kartstuff[k_justbumped] || thing->scale > tmthing->scale + (mapobjectscale/8))
|
||||
return true;
|
||||
|
||||
// Player Damage
|
||||
K_SpinPlayer(thing->player, tmthing, 0, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), false);
|
||||
P_DamageMobj(thing, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), tmthing, 1, DMG_NORMAL);
|
||||
S_StartSound(tmthing, sfx_s3k44);
|
||||
}
|
||||
else
|
||||
|
|
@ -987,6 +985,8 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
// missiles can hit other things
|
||||
if (tmthing->flags & MF_MISSILE)
|
||||
{
|
||||
UINT8 damagetype = tmthing->info->mass;
|
||||
|
||||
// see if it went over / under
|
||||
if (tmthing->z > thing->z + thing->height)
|
||||
return true; // overhead
|
||||
|
|
@ -1014,15 +1014,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
}
|
||||
|
||||
// damage / explode
|
||||
if (tmthing->flags & MF_ENEMY) // An actual ENEMY! (Like the deton, for example)
|
||||
{
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT8 damagetype = tmthing->info->mass;
|
||||
P_DamageMobj(thing, tmthing, tmthing->target, 1, damagetype);
|
||||
}
|
||||
P_DamageMobj(thing, tmthing, tmthing->target, 1, damagetype);
|
||||
|
||||
// don't traverse any more
|
||||
return false;
|
||||
|
|
@ -1109,11 +1101,11 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
{
|
||||
if (thing->z + thing->height <= tmthing->z + FixedMul(FRACUNIT, tmthing->scale)
|
||||
&& thing->z + thing->height + thing->momz >= tmthing->z + FixedMul(FRACUNIT, tmthing->scale) + tmthing->momz)
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_SPIKE);
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_NORMAL);
|
||||
}
|
||||
else if (thing->z >= tmthing->z + tmthing->height - FixedMul(FRACUNIT, tmthing->scale)
|
||||
&& thing->z + thing->momz <= tmthing->z + tmthing->height - FixedMul(FRACUNIT, tmthing->scale) + tmthing->momz)
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_SPIKE);
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_NORMAL);
|
||||
}
|
||||
else if (thing->type == MT_SPIKE && thing->flags & MF_SOLID && tmthing->player) // unfortunate player falls into spike?!
|
||||
{
|
||||
|
|
@ -1121,11 +1113,11 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
{
|
||||
if (tmthing->z + tmthing->height <= thing->z - FixedMul(FRACUNIT, thing->scale)
|
||||
&& tmthing->z + tmthing->height + tmthing->momz >= thing->z - FixedMul(FRACUNIT, thing->scale))
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_SPIKE);
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_NORMAL);
|
||||
}
|
||||
else if (tmthing->z >= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale)
|
||||
&& tmthing->z + tmthing->momz <= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale))
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_SPIKE);
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_NORMAL);
|
||||
}
|
||||
|
||||
if (tmthing->type == MT_WALLSPIKE && tmthing->flags & MF_SOLID && thing->player) // wall spike impales player
|
||||
|
|
@ -1141,7 +1133,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
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, tmthing, tmthing, 1, DMG_SPIKE);
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_NORMAL);
|
||||
}
|
||||
else if (thing->type == MT_WALLSPIKE && thing->flags & MF_SOLID && tmthing->player)
|
||||
{
|
||||
|
|
@ -1173,7 +1165,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
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(tmthing, thing, thing, 1, DMG_SPIKE);
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1216,19 +1208,19 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam)
|
||||
{
|
||||
if (tmthing->scale > thing->scale + (mapobjectscale/8)) // SRB2kart - Handle squishes first!
|
||||
K_SquishPlayer(thing->player, tmthing, tmthing);
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_SQUISH);
|
||||
else if (thing->scale > tmthing->scale + (mapobjectscale/8))
|
||||
K_SquishPlayer(tmthing->player, thing, tmthing);
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_SQUISH);
|
||||
else if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) // SRB2kart - Then invincibility!
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, 0);
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT);
|
||||
else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer])
|
||||
P_DamageMobj(tmthing, thing, thing, 1, 0);
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT);
|
||||
else if ((tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)
|
||||
&& !(thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield!
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, 0);
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT);
|
||||
else if ((thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)
|
||||
&& !(tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield!
|
||||
P_DamageMobj(tmthing, thing, thing, 1, 0);
|
||||
&& !(tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD))
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1315,34 +1307,26 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
mo1 = thing;
|
||||
mo2 = tmthing;
|
||||
|
||||
if ((gametyperules & GTR_BUMPERS) && tmthing->player->kartstuff[k_pogospring])
|
||||
{
|
||||
K_StealBumper(tmthing->player, thing->player, false);
|
||||
K_SpinPlayer(thing->player, tmthing, 0, tmthing, false);
|
||||
}
|
||||
if (tmthing->player->kartstuff[k_pogospring])
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT|DMG_STEAL);
|
||||
}
|
||||
else if (P_IsObjectOnGround(tmthing) && thing->momz < 0)
|
||||
{
|
||||
zbounce = true;
|
||||
|
||||
if ((gametyperules & GTR_BUMPERS) && thing->player->kartstuff[k_pogospring])
|
||||
{
|
||||
K_StealBumper(thing->player, tmthing->player, false);
|
||||
K_SpinPlayer(tmthing->player, thing, 0, thing, false);
|
||||
}
|
||||
if (thing->player->kartstuff[k_pogospring])
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT|DMG_STEAL);
|
||||
}
|
||||
|
||||
if ((gametyperules & GTR_BUMPERS))
|
||||
{
|
||||
if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer]) && !(thing->player->powers[pw_flashing])) // Don't steal bumpers while intangible
|
||||
{
|
||||
K_StealBumper(thing->player, tmthing->player, false);
|
||||
K_SpinPlayer(tmthing->player, thing, 0, tmthing, false);
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT|DMG_STEAL);
|
||||
}
|
||||
else if (tmthing->player->kartstuff[k_sneakertimer] && !(thing->player->kartstuff[k_sneakertimer]) && !(tmthing->player->powers[pw_flashing]))
|
||||
{
|
||||
K_StealBumper(tmthing->player, thing->player, false);
|
||||
K_SpinPlayer(thing->player, tmthing, 0, thing, false);
|
||||
P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT|DMG_STEAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1366,9 +1350,9 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
|| tmthing->player->kartstuff[k_growshrinktimer] > 0)
|
||||
{
|
||||
if (thing->type == MT_BLUEROBRA_JOINT)
|
||||
P_KillMobj(thing->target, tmthing, tmthing, 0);
|
||||
P_KillMobj(thing->target, tmthing, tmthing, DMG_NORMAL);
|
||||
else
|
||||
P_KillMobj(thing, tmthing, tmthing, 0);
|
||||
P_KillMobj(thing, tmthing, tmthing, DMG_NORMAL);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
|
@ -1391,7 +1375,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (tmthing->player->kartstuff[k_invincibilitytimer] > 0
|
||||
|| tmthing->player->kartstuff[k_growshrinktimer] > 0)
|
||||
{
|
||||
P_KillMobj(thing, tmthing, tmthing, 0);
|
||||
P_KillMobj(thing, tmthing, tmthing, DMG_NORMAL);
|
||||
return true; // kill
|
||||
}
|
||||
|
||||
|
|
@ -1422,7 +1406,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
if (tmthing->player->kartstuff[k_invincibilitytimer] > 0
|
||||
|| tmthing->player->kartstuff[k_growshrinktimer] > 0)
|
||||
{
|
||||
P_KillMobj(thing, tmthing, tmthing, 0);
|
||||
P_KillMobj(thing, tmthing, tmthing, DMG_NORMAL);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1445,7 +1429,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
|||
else
|
||||
{
|
||||
if (thing->flags2 & MF2_AMBUSH)
|
||||
P_DamageMobj(tmthing, thing, thing, 1, 0);
|
||||
P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT);
|
||||
K_KartBouncing(tmthing, thing, false, true);
|
||||
}
|
||||
|
||||
|
|
@ -3343,7 +3327,7 @@ static void P_CheckLavaWall(mobj_t *mo, sector_t *sec)
|
|||
continue;
|
||||
}
|
||||
|
||||
P_DamageMobj(mo, NULL, NULL, 1, DMG_FIRE);
|
||||
P_DamageMobj(mo, NULL, NULL, 1, DMG_NORMAL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -3875,7 +3859,7 @@ static boolean PIT_RadiusAttack(mobj_t *thing)
|
|||
if (thing == bombspot) // ignore the bomb itself (Deton fix)
|
||||
return true;
|
||||
|
||||
if (bombsource && thing->type == bombsource->type && (bombdamagetype & DMG_CANTHURTSELF)) // ignore the type of guys who dropped the bomb (Jetty-Syn Bomber or Skim can bomb eachother, but not themselves.)
|
||||
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 true;
|
||||
|
||||
if ((thing->flags & (MF_MONITOR|MF_SHOOTABLE)) != MF_SHOOTABLE)
|
||||
|
|
@ -4053,7 +4037,7 @@ static boolean PIT_ChangeSector(mobj_t *thing, boolean realcrush)
|
|||
}
|
||||
|
||||
if (realcrush && crushchange)
|
||||
P_DamageMobj(thing, NULL, NULL, 1, 0);
|
||||
P_DamageMobj(thing, NULL, NULL, 1, DMG_NORMAL);
|
||||
|
||||
// keep checking (crush other things)
|
||||
return true;
|
||||
|
|
|
|||
48
src/p_mobj.c
48
src/p_mobj.c
|
|
@ -1520,7 +1520,7 @@ void P_XYMovement(mobj_t *mo)
|
|||
{
|
||||
// This Item Damage
|
||||
S_StartSound(mo, mo->info->deathsound);
|
||||
P_KillMobj(mo, NULL, NULL, 0);
|
||||
P_KillMobj(mo, NULL, NULL, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(mo, 8*FRACUNIT, false);
|
||||
P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x + xmove, mo->y + ymove)+ANGLE_90, 16*FRACUNIT);
|
||||
|
|
@ -1673,7 +1673,7 @@ void P_XYMovement(mobj_t *mo)
|
|||
{
|
||||
// This Item Damage
|
||||
S_StartSound(mo, mo->info->deathsound);
|
||||
P_KillMobj(mo, NULL, NULL, 0);
|
||||
P_KillMobj(mo, NULL, NULL, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(mo, 8*FRACUNIT, false);
|
||||
P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x + xmove, mo->y + ymove)+ANGLE_90, 16*FRACUNIT);
|
||||
|
|
@ -2184,7 +2184,7 @@ boolean P_ZMovement(mobj_t *mo)
|
|||
// Kill enemies, bosses and minecarts that fall into death pits.
|
||||
if (mo->health)
|
||||
{
|
||||
P_KillMobj(mo, NULL, NULL, 0);
|
||||
P_KillMobj(mo, NULL, NULL, DMG_NORMAL);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -3220,7 +3220,7 @@ void P_DestroyRobots(void)
|
|||
continue;
|
||||
|
||||
// Found a target enemy
|
||||
P_KillMobj(mo, players[consoleplayer].mo, players[consoleplayer].mo, 0);
|
||||
P_KillMobj(mo, players[consoleplayer].mo, players[consoleplayer].mo, DMG_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5565,7 +5565,7 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
|||
}
|
||||
else if (mobj->health > 0)
|
||||
{
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
P_KillMobj(mobj, NULL, NULL, DMG_NORMAL);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
|
@ -5616,7 +5616,7 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
|||
}
|
||||
else if (mobj->health > 0)
|
||||
{
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
P_KillMobj(mobj, NULL, NULL, DMG_NORMAL);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
|
@ -5672,15 +5672,6 @@ static boolean P_MobjPushableThink(mobj_t *mobj)
|
|||
{
|
||||
P_MobjCheckWater(mobj);
|
||||
P_PushableThinker(mobj);
|
||||
|
||||
// Extinguish fire objects in water. (Yes, it's extraordinarily rare to have a pushable flame object, but Brak uses such a case.)
|
||||
if (mobj->flags & MF_FIRE && mobj->type != MT_PUMA && mobj->type != MT_FIREBALL
|
||||
&& (mobj->eflags & (MFE_UNDERWATER | MFE_TOUCHWATER)))
|
||||
{
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -5756,10 +5747,7 @@ static boolean P_MobjDeadThink(mobj_t *mobj)
|
|||
MT_SONIC3KBOSSEXPLODE);
|
||||
S_StartSound(explosion, sfx_s3kb4);
|
||||
}
|
||||
if (mobj->movedir == DMG_DROWNED)
|
||||
P_SetObjectMomZ(mobj, -FRACUNIT/2, true); // slower fall from drowning
|
||||
else
|
||||
P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true);
|
||||
P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true);
|
||||
}
|
||||
break;
|
||||
case MT_METALSONIC_RACE:
|
||||
|
|
@ -6399,7 +6387,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
case MT_MINEEXPLOSION:
|
||||
if ((mobj->z < mobj->floorz - mobj->height) || (mobj->z > mobj->ceilingz + mobj->height))
|
||||
{
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
P_KillMobj(mobj, NULL, NULL, DMG_NORMAL);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -7670,7 +7658,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
|
||||
if (mobj->movecount > 8*TICRATE)
|
||||
{
|
||||
P_KillMobj(mobj, mobj->target, mobj->target, 0);
|
||||
P_KillMobj(mobj, mobj->target, mobj->target, DMG_NORMAL);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -7697,7 +7685,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
}
|
||||
else if (mobj->extravalue1) // lost your player somehow, DIE
|
||||
{
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
P_KillMobj(mobj, NULL, NULL, DMG_NORMAL);
|
||||
break;
|
||||
}
|
||||
else
|
||||
|
|
@ -7826,7 +7814,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
{
|
||||
S_StartSound(mobj->tracer, sfx_s3k77);
|
||||
mobj->tracer->flags &= ~MF_NOGRAVITY;
|
||||
P_KillMobj(mobj, mobj->tracer, mobj->tracer, 0);
|
||||
P_KillMobj(mobj, mobj->tracer, mobj->tracer, DMG_NORMAL);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -7853,7 +7841,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
}
|
||||
else if (mobj->extravalue1) // lost your player somehow, DIE
|
||||
{
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
P_KillMobj(mobj, NULL, NULL, DMG_NORMAL);
|
||||
break;
|
||||
}
|
||||
else
|
||||
|
|
@ -8210,14 +8198,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
default:
|
||||
// check mobj against possible water content, before movement code
|
||||
P_MobjCheckWater(mobj);
|
||||
|
||||
// Extinguish fire objects in water
|
||||
if (mobj->flags & MF_FIRE && mobj->type != MT_PUMA && mobj->type != MT_FIREBALL
|
||||
&& (mobj->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER)))
|
||||
{
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
|
|
@ -8537,7 +8517,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
|| mobj->type == MT_BALLHOG)
|
||||
{
|
||||
S_StartSound(mobj, mobj->info->deathsound);
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
P_KillMobj(mobj, NULL, NULL, DMG_NORMAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -8548,7 +8528,7 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
mobj->z += mobj->height;
|
||||
|
||||
S_StartSound(mobj, mobj->info->deathsound);
|
||||
P_KillMobj(mobj, NULL, NULL, 0);
|
||||
P_KillMobj(mobj, NULL, NULL, DMG_NORMAL);
|
||||
|
||||
P_SetObjectMomZ(mobj, 8*FRACUNIT, false);
|
||||
P_InstaThrust(mobj, R_PointToAngle2(0, 0, mobj->momx, mobj->momy) + ANGLE_90, 16*FRACUNIT);
|
||||
|
|
|
|||
22
src/p_mobj.h
22
src/p_mobj.h
|
|
@ -137,28 +137,26 @@ typedef enum
|
|||
MF_MONITOR = 1<<17,
|
||||
// Don't run the thinker for this object.
|
||||
MF_NOTHINK = 1<<18,
|
||||
// Fire object. Doesn't harm if you have fire shield.
|
||||
MF_FIRE = 1<<19,
|
||||
// Don't adjust z if below or above floorz/ceilingz
|
||||
MF_NOCLIPHEIGHT = 1<<20,
|
||||
MF_NOCLIPHEIGHT = 1<<19,
|
||||
// This mobj is an enemy!
|
||||
MF_ENEMY = 1<<21,
|
||||
MF_ENEMY = 1<<20,
|
||||
// Scenery (uses scenery thinker).
|
||||
MF_SCENERY = 1<<22,
|
||||
MF_SCENERY = 1<<21,
|
||||
// Painful (shit hurts).
|
||||
MF_PAIN = 1<<23,
|
||||
MF_PAIN = 1<<22,
|
||||
// This mobj will stick to any surface or solid object it touches.
|
||||
MF_STICKY = 1<<24,
|
||||
MF_STICKY = 1<<23,
|
||||
// NiGHTS hidden item. Goes to seestate and turns MF_SPECIAL when paralooped.
|
||||
MF_NIGHTSITEM = 1<<25,
|
||||
MF_NIGHTSITEM = 1<<24,
|
||||
// for chase camera, don't be blocked by things (partial clipping)
|
||||
MF_NOCLIPTHING = 1<<26,
|
||||
MF_NOCLIPTHING = 1<<25,
|
||||
// Missile bounces like a grenade.
|
||||
MF_GRENADEBOUNCE = 1<<27,
|
||||
MF_GRENADEBOUNCE = 1<<26,
|
||||
// Run the action thinker on spawn.
|
||||
MF_RUNSPAWNFUNC = 1<<28,
|
||||
MF_RUNSPAWNFUNC = 1<<27,
|
||||
// Don't remap in Encore mode. (Not a drawflag so that it's settable by mobjinfo.)
|
||||
MF_DONTENCOREMAP = 1<<29,
|
||||
MF_DONTENCOREMAP = 1<<28,
|
||||
// free: to and including 1<<31
|
||||
} mobjflag_t;
|
||||
|
||||
|
|
|
|||
12
src/p_spec.c
12
src/p_spec.c
|
|
@ -3828,7 +3828,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
|||
if (mo2->spawnpoint->angle != line->tag)
|
||||
continue;
|
||||
|
||||
P_KillMobj(mo2, NULL, mo, 0);
|
||||
P_KillMobj(mo2, NULL, mo, DMG_NORMAL);
|
||||
}
|
||||
|
||||
if (!(line->flags & ML_NOCLIMB))
|
||||
|
|
@ -4438,7 +4438,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||
{
|
||||
case 1: // Damage (Generic)
|
||||
if (roversector || P_MobjReadyToTrigger(player->mo, sector))
|
||||
P_DamageMobj(player->mo, NULL, NULL, 1, 0);
|
||||
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_NORMAL);
|
||||
break;
|
||||
case 2: // Damage (Water) // SRB2kart - These three damage types are now offroad sectors
|
||||
case 3: // Damage (Fire)
|
||||
|
|
@ -4446,7 +4446,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||
break;
|
||||
case 5: // Spikes
|
||||
if (roversector || P_MobjReadyToTrigger(player->mo, sector))
|
||||
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPIKE);
|
||||
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_NORMAL);
|
||||
break;
|
||||
case 6: // Death Pit (Camera Mod)
|
||||
case 7: // Death Pit (No Camera Mod)
|
||||
|
|
@ -4565,7 +4565,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
|||
mo2 = (mobj_t *)th;
|
||||
if (mo2->type != MT_EGGTRAP)
|
||||
continue;
|
||||
P_KillMobj(mo2, NULL, player->mo, 0);
|
||||
P_KillMobj(mo2, NULL, player->mo, DMG_NORMAL);
|
||||
}
|
||||
|
||||
// clear the special so you can't push the button twice.
|
||||
|
|
@ -5862,9 +5862,9 @@ void T_LaserFlash(laserthink_t *flash)
|
|||
continue;
|
||||
|
||||
if (thing->flags & MF_SHOOTABLE)
|
||||
P_DamageMobj(thing, NULL, NULL, 1, 0);
|
||||
P_DamageMobj(thing, NULL, NULL, 1, DMG_NORMAL);
|
||||
else if (thing->type == MT_EGGSHIELD)
|
||||
P_KillMobj(thing, NULL, NULL, 0);
|
||||
P_KillMobj(thing, NULL, NULL, DMG_NORMAL);
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
|
|||
55
src/p_user.c
55
src/p_user.c
|
|
@ -463,12 +463,14 @@ UINT8 P_FindHighestLap(void)
|
|||
//
|
||||
boolean P_PlayerInPain(player_t *player)
|
||||
{
|
||||
// no silly, sliding isn't pain
|
||||
if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate] && player->powers[pw_flashing])
|
||||
if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer] || player->respawn.state != RESPAWNST_NONE)
|
||||
return true;
|
||||
|
||||
if (player->mo->state == &states[S_KART_SQUISH])
|
||||
return true;
|
||||
if (gametyperules & GTR_KARMA)
|
||||
{
|
||||
if (player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer])
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1937,19 +1939,22 @@ static void P_3dMovement(player_t *player)
|
|||
player->aiming = cmd->aiming<<FRACBITS;
|
||||
|
||||
// Forward movement
|
||||
if (!(P_PlayerInPain(player) && !onground))
|
||||
if (!P_PlayerInPain(player))
|
||||
{
|
||||
movepushforward = K_3dKartMovement(player, onground);
|
||||
if (onground)
|
||||
{
|
||||
movepushforward = K_3dKartMovement(player, onground);
|
||||
|
||||
if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration...
|
||||
movepushforward = FixedMul(movepushforward, player->mo->movefactor);
|
||||
if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration...
|
||||
movepushforward = FixedMul(movepushforward, player->mo->movefactor);
|
||||
|
||||
totalthrust.x += P_ReturnThrustX(player->mo, movepushangle, movepushforward);
|
||||
totalthrust.y += P_ReturnThrustY(player->mo, movepushangle, movepushforward);
|
||||
}
|
||||
else if (!(player->kartstuff[k_spinouttimer]))
|
||||
{
|
||||
K_MomentumToFacing(player);
|
||||
totalthrust.x += P_ReturnThrustX(player->mo, movepushangle, movepushforward);
|
||||
totalthrust.y += P_ReturnThrustY(player->mo, movepushangle, movepushforward);
|
||||
}
|
||||
else
|
||||
{
|
||||
K_MomentumToFacing(player);
|
||||
}
|
||||
}
|
||||
|
||||
if ((totalthrust.x || totalthrust.y)
|
||||
|
|
@ -2525,7 +2530,7 @@ static void P_NukeAllPlayers(player_t *player)
|
|||
if (players[i].mo->health <= 0)
|
||||
continue;
|
||||
|
||||
P_DamageMobj(players[i].mo, player->mo, player->mo, 1, 0);
|
||||
P_DamageMobj(players[i].mo, player->mo, player->mo, 1, DMG_NORMAL);
|
||||
}
|
||||
|
||||
CONS_Printf(M_GetText("%s caused a world of pain.\n"), player_names[player-players]);
|
||||
|
|
@ -2540,25 +2545,11 @@ static void P_NukeAllPlayers(player_t *player)
|
|||
//
|
||||
void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
|
||||
{
|
||||
const fixed_t ns = 60 * mapobjectscale;
|
||||
mobj_t *mo;
|
||||
angle_t fa;
|
||||
thinker_t *think;
|
||||
INT32 i;
|
||||
|
||||
radius = FixedMul(radius, mapobjectscale);
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
fa = (i*(FINEANGLES/16));
|
||||
mo = P_SpawnMobj(inflictor->x, inflictor->y, inflictor->z, MT_SUPERSPARK);
|
||||
if (!P_MobjWasRemoved(mo))
|
||||
{
|
||||
mo->momx = FixedMul(FINESINE(fa),ns);
|
||||
mo->momy = FixedMul(FINECOSINE(fa),ns);
|
||||
}
|
||||
}
|
||||
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
|
|
@ -2579,9 +2570,9 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
|
|||
continue;
|
||||
|
||||
if (mo->flags & MF_BOSS || mo->type == MT_PLAYER) //don't OHKO bosses nor players!
|
||||
P_DamageMobj(mo, inflictor, source, 1, DMG_NUKE);
|
||||
P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF);
|
||||
else
|
||||
P_DamageMobj(mo, inflictor, source, 1000, DMG_NUKE);
|
||||
P_DamageMobj(mo, inflictor, source, 1000, DMG_NORMAL|DMG_CANTHURTSELF);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4538,7 +4529,7 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
// Strength counts up to diminish fade.
|
||||
if (player->powers[pw_flashing] && player->powers[pw_flashing] < UINT16_MAX &&
|
||||
(player->spectator || player->powers[pw_flashing] < K_GetKartFlashing(player)))
|
||||
(player->spectator || !P_PlayerInPain(player)))
|
||||
player->powers[pw_flashing]--;
|
||||
|
||||
if (player->powers[pw_nocontrol] & ((1<<15)-1) && player->powers[pw_nocontrol] < UINT16_MAX)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue