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:
Sally Coolatta 2020-08-19 00:55:36 -04:00
parent b081dd5d7e
commit 3e446a167c
24 changed files with 498 additions and 988 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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},

View file

@ -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:

View file

@ -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
},

View file

@ -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));
}

View file

@ -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))

View file

@ -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)));
}
/*--------------------------------------------------

View file

@ -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;
}
}
}
}

View file

@ -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)
{

View file

@ -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);

View file

@ -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;
}

View file

@ -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

View file

@ -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)
{

View file

@ -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)

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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)