diff --git a/src/d_clisrv.c b/src/d_clisrv.c index b291d9013..45fa7cc5b 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -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; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index d496e7127..ed0ad76be 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -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) diff --git a/src/dehacked.c b/src/dehacked.c index a1a599338..6925b02f1 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -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}, diff --git a/src/g_demo.c b/src/g_demo.c index d8719802f..15fd6512d 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -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: diff --git a/src/info.c b/src/info.c index 23e7a7069..17ea99c48 100644 --- a/src/info.c +++ b/src/info.c @@ -1692,7 +1692,7 @@ state_t states[NUMSTATES] = {SPR_ELEC, 11 + FF_FULLBRIGHT, 1, {A_CapeChase}, 0, 0, S_CYBRAKDEMONELECTRICBARRIER24}, // S_CYBRAKDEMONELECTRICBARRIER23 {SPR_ELEC, 11 + FF_FULLBRIGHT, 1, {A_CapeChase}, 0, 0, S_CYBRAKDEMONELECTRICBARRIER_PLAYSOUND}, // S_CYBRAKDEMONELECTRICBARRIER24 {SPR_NULL, 0, 0, {A_RemoteAction}, -1, S_CYBRAKDEMON_DEINVINCIBLERIZE, S_CYBRAKDEMONELECTRICBARRIER_DIE2}, // S_CYBRAKDEMONELECTRICBARRIER_DIE1 - {SPR_NULL, 0, 0, {A_SetObjectFlags}, MF_PUSHABLE|MF_FIRE|MF_PAIN, 1, S_CYBRAKDEMONELECTRICBARRIER_DIE3}, // S_CYBRAKDEMONELECTRICBARRIER_DIE2 + {SPR_NULL, 0, 0, {A_SetObjectFlags}, MF_PUSHABLE|MF_PAIN, 1, S_CYBRAKDEMONELECTRICBARRIER_DIE3}, // S_CYBRAKDEMONELECTRICBARRIER_DIE2 {SPR_NULL, 0, 20*TICRATE, {A_Scream}, 0, 0, S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS}, // S_CYBRAKDEMONELECTRICBARRIER_DIE3 {SPR_NULL, 0, 0, {A_CheckRandom}, 10, S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS, S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMFAIL}, // S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHECK, {SPR_NULL, 0, 0, {A_CapeChase}, 0, 0, S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHOOSE}, // S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS, @@ -5484,7 +5484,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 16*FRACUNIT, // radius 24*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_s3kaa, // activesound MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE, // flags @@ -5754,7 +5754,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 4*FRACUNIT, // radius 8*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound MF_PAIN|MF_NOGRAVITY, // flags @@ -5835,7 +5835,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 32*FRACUNIT, // radius 72*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_PAIN|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags @@ -6132,7 +6132,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 13*FRACUNIT, // radius 26*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 8*FRACUNIT, // damage sfx_None, // activesound MF_PAIN|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING, // flags @@ -6213,7 +6213,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 24*FRACUNIT, // radius 34*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_NOGRAVITY|MF_SPECIAL|MF_SHOOTABLE|MF_ENEMY|MF_SLIDEME, // flags @@ -6243,7 +6243,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOBLOCKMAP|MF_FIRE|MF_PAIN, // flags + MF_NOGRAVITY|MF_NOBLOCKMAP|MF_PAIN, // flags S_NULL // raisestate }, @@ -6753,10 +6753,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 24*FRACUNIT, // radius 84*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_FIRE|MF_PAIN, // flags + MF_NOGRAVITY|MF_PAIN, // flags S_NULL // raisestate }, @@ -6834,7 +6834,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 4*FRACUNIT, // radius 4*FRACUNIT, // height 0, // display offset - DMG_WATER, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_PAIN, // flags @@ -6942,7 +6942,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 48*FRACUNIT, // radius 8*FRACUNIT, // height 0, // display offset - DMG_ELECTRIC|(sfx_buzz2<<8), // mass + DMG_NORMAL|(sfx_buzz2<<8), // mass 3, // damage sfx_None, // activesound MF_NOBLOCKMAP|MF_MISSILE|MF_PAIN|MF_NOGRAVITY|MF_PAPERCOLLISION, // flags @@ -6996,7 +6996,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 34*FRACUNIT, // radius 68*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 1, // damage sfx_mswing, // activesound MF_PAIN|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags @@ -7023,7 +7023,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 20*FRACUNIT, // radius 32*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags @@ -7508,10 +7508,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 48*FRACUNIT, // radius 160*FRACUNIT, // height 0, // display offset - DMG_ELECTRIC, // mass + DMG_NORMAL, // mass 1, // damage sfx_beelec, // activesound - MF_PAIN|MF_FIRE|MF_NOGRAVITY|MF_PUSHABLE, // flags + MF_PAIN|MF_NOGRAVITY|MF_PUSHABLE, // flags S_NULL // raisestate }, @@ -7562,7 +7562,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 24*FRACUNIT, // radius 24*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound MF_NOBLOCKMAP|MF_MISSILE|MF_PAIN|MF_NOGRAVITY, // flags @@ -7589,10 +7589,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 24*FRACUNIT, // radius 24*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound - MF_PAIN|MF_FIRE|MF_RUNSPAWNFUNC, // flags + MF_PAIN|MF_RUNSPAWNFUNC, // flags S_NULL // raisestate }, @@ -9069,7 +9069,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 12*FRACUNIT, // radius 8*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound MF_PAIN|MF_NOGRAVITY, // flags @@ -9096,10 +9096,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 8*FRACUNIT, // radius 14*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY|MF_FIRE, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY, // flags S_NULL // raisestate }, @@ -11067,7 +11067,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 4*FRACUNIT, // radius 8*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 1, // damage sfx_s3k51, // activesound MF_NOBLOCKMAP|MF_MISSILE, // flags @@ -12255,10 +12255,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 8*FRACUNIT, // radius 32*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_PAIN|MF_FIRE, // flags + MF_NOGRAVITY|MF_PAIN, // flags S_NULL // raisestate }, @@ -12741,10 +12741,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 17*FRACUNIT, // radius 34*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound - MF_SCENERY|MF_PAIN|MF_FIRE|MF_NOGRAVITY, // flags + MF_SCENERY|MF_PAIN|MF_NOGRAVITY, // flags S_NULL // raisestate }, @@ -12768,10 +12768,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 34*FRACUNIT, // radius 68*FRACUNIT, // height 1, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound - MF_SCENERY|MF_PAIN|MF_FIRE|MF_NOGRAVITY, // flags + MF_SCENERY|MF_PAIN|MF_NOGRAVITY, // flags S_NULL // raisestate }, @@ -13389,7 +13389,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 13*FRACUNIT, // radius 24*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags @@ -13416,7 +13416,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 15*FRACUNIT, // radius 52*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags @@ -13443,7 +13443,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 13*FRACUNIT, // radius 24*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags @@ -13470,7 +13470,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 15*FRACUNIT, // radius 52*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags @@ -13497,7 +13497,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 32*FRACUNIT, // radius 96*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SCENERY|MF_PAIN, // flags @@ -13524,7 +13524,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 20*FRACUNIT, // radius 128*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SCENERY|MF_PAIN, // flags @@ -13551,7 +13551,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 24*FRACUNIT, // radius 224*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SCENERY|MF_PAIN, // flags @@ -13578,7 +13578,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 24*FRACUNIT, // radius 256*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SCENERY|MF_PAIN, // flags @@ -13605,7 +13605,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 48*FRACUNIT, // radius 96*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SCENERY|MF_PAIN, // flags @@ -13632,7 +13632,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 13*FRACUNIT, // radius 28*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags @@ -13659,7 +13659,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 15*FRACUNIT, // radius 60*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_SCENERY|MF_PAIN|MF_NOGRAVITY|MF_RUNSPAWNFUNC, // flags @@ -13686,7 +13686,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 13*FRACUNIT, // radius 28*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_NOTHINK|MF_SCENERY|MF_PAIN|MF_NOGRAVITY, // flags @@ -13713,7 +13713,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 15*FRACUNIT, // radius 60*FRACUNIT, // height 0, // display offset - DMG_SPIKE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound MF_NOTHINK|MF_SCENERY|MF_PAIN|MF_NOGRAVITY, // flags @@ -14415,10 +14415,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 8*FRACUNIT, // radius 8*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_MISSILE|MF_FIRE, // flags + MF_NOGRAVITY|MF_MISSILE|MF_PAIN, // flags S_NULL // raisestate }, @@ -14496,10 +14496,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 16*FRACUNIT, // radius 24*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_MISSILE|MF_FIRE|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC, // flags + MF_NOGRAVITY|MF_MISSILE|MF_PAIN|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC, // flags S_NULL // raisestate }, @@ -14553,7 +14553,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_SPECIAL|MF_PAIN|MF_NOGRAVITY|MF_FIRE, // flags + MF_SPECIAL|MF_PAIN|MF_NOGRAVITY|MF_PAIN, // flags S_NULL // raisestate }, @@ -20288,10 +20288,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 4*FRACUNIT, // radius 8*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 1, // damage sfx_None, // activesound - MF_FIRE|MF_MISSILE, // flags + MF_PAIN|MF_MISSILE, // flags S_NULL // raisestate }, @@ -20369,10 +20369,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 8*FRACUNIT, // radius 16*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound - MF_PAIN|MF_FIRE, // flags + MF_PAIN, // flags S_NULL // raisestate }, @@ -20476,10 +20476,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 8*FRACUNIT, // radius 8*FRACUNIT, // height 0, // display offset - DMG_FIRE, // mass + DMG_NORMAL, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_MISSILE|MF_FIRE, // flags + MF_NOGRAVITY|MF_MISSILE|MF_PAIN, // flags S_NULL // raisestate }, @@ -24398,7 +24398,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_SPECIAL|MF_FIRE, // flags + MF_NOGRAVITY|MF_SPECIAL|MF_PAIN, // flags S_NULL // raisestate }, @@ -25775,7 +25775,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 0, // mass 0, // damage sfx_None, // activesound - MF_SCENERY|MF_NOGRAVITY|MF_FIRE|MF_PAIN, // flags + MF_SCENERY|MF_NOGRAVITY|MF_PAIN, // flags S_NULL // raisestate }, @@ -27451,7 +27451,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 20, // damage sfx_None, // activesound - MF_SPECIAL|MF_FIRE, // flags + MF_SPECIAL|MF_PAIN, // flags S_NULL // raisestate }, @@ -27478,7 +27478,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 20, // damage sfx_None, // activesound - MF_SPECIAL|MF_FIRE, // flags + MF_SPECIAL|MF_PAIN, // flags S_NULL // raisestate }, @@ -27640,7 +27640,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 20, // damage sfx_None, // activesound - MF_SPECIAL|MF_FIRE, // flags + MF_SPECIAL|MF_PAIN, // flags S_NULL // raisestate }, @@ -27775,7 +27775,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 20, // damage sfx_None, // activesound - MF_SPECIAL|MF_FIRE, // flags + MF_SPECIAL|MF_PAIN, // flags S_NULL // raisestate }, diff --git a/src/k_botsearch.c b/src/k_botsearch.c index 603e93175..d5a08d2ad 100644 --- a/src/k_botsearch.c +++ b/src/k_botsearch.c @@ -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)); } diff --git a/src/k_collide.c b/src/k_collide.c index 6ebdf650b..56747a47f 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -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)) diff --git a/src/k_color.c b/src/k_color.c index 7372b2227..6cfe4d5a8 100644 --- a/src/k_color.c +++ b/src/k_color.c @@ -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))); } /*-------------------------------------------------- diff --git a/src/k_hud.c b/src/k_hud.c index 1187354bd..e89d28796 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -4063,16 +4063,19 @@ void K_drawKartHUD(void) INT32 x = 0, y = 0; UINT16 c; - for (c = 1; c < MAXSKINCOLORS; c++) + for (c = 0; c < numskincolors; c++) { - UINT8 *cm = R_GetTranslationColormap(TC_RAINBOW, c, GTC_CACHE); - V_DrawFixedPatch(x<>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<>1, 0, faceprefix[stplyr->skin][FACE_WANTED], cm); + + x += 16; + if (x > BASEVIDWIDTH-16) + { + x = 0; + y += 16; + } } } } diff --git a/src/k_kart.c b/src/k_kart.c index b361f26aa..93b184c2d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1041,30 +1041,6 @@ fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) return FixedMul(weight, mobj->scale); } -// This kind of wipeout happens with no rings -- doesn't remove a bumper, has no invulnerability, and is much shorter. -static void K_DebtStingPlayer(player_t *player, INT32 length) -{ - if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0 - || player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 - || ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) - return; - - player->kartstuff[k_ringboost] = 0; - player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_drift] = 0; - player->kartstuff[k_driftcharge] = 0; - player->kartstuff[k_pogospring] = 0; - - player->kartstuff[k_spinouttype] = 2; - player->kartstuff[k_spinouttimer] = length; - player->kartstuff[k_wipeoutslow] = min(length-1, wipeoutslowtime+1); - - P_SetPlayerMobjState(player->mo, S_KART_SPINOUT); - - K_DropHnextList(player, false); - return; -} - void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) { mobj_t *fx; @@ -1233,9 +1209,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) { if (mobj1->player->rings <= 0) { - K_DebtStingPlayer(mobj1->player, TICRATE + (4 * (mobj2->player->kartweight - mobj1->player->kartweight))); - K_KartPainEnergyFling(mobj1->player); - P_PlayRinglossSound(mobj1); + P_DamageMobj(mobj1, mobj2, mobj2, 1, DMG_STING); } P_PlayerRingBurst(mobj1->player, 1); } @@ -1259,9 +1233,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) { if (mobj2->player->rings <= 0) { - K_DebtStingPlayer(mobj2->player, TICRATE + (4 * (mobj1->player->kartweight - mobj2->player->kartweight))); - K_KartPainEnergyFling(mobj2->player); - P_PlayRinglossSound(mobj2); + P_DamageMobj(mobj2, mobj1, mobj1, 1, DMG_STING); } P_PlayerRingBurst(mobj2->player, 1); } @@ -2369,95 +2341,95 @@ void K_DoInstashield(player_t *player) P_SetTarget(&layerb->target, player->mo); } -void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflictor, boolean trapitem) +void K_BattleHitPlayer(player_t *player, player_t *victim, UINT8 points, boolean reducewanted) { - UINT8 scoremultiply = 1; - // PS: Inflictor is unused for all purposes here and is actually only ever relevant to Lua. It may be nil too. - boolean force = false; // Used to check if Lua ShouldSpin should get us damaged reguardless of flashtics or heck knows what. - UINT8 shouldForce = LUAh_ShouldSpin(player, inflictor, source); - if (P_MobjWasRemoved(player->mo)) - return; // mobj was removed (in theory that shouldn't happen) - if (shouldForce == 1) - force = true; - else if (shouldForce == 2) + if (reducewanted == false) + points = 1; // Force to 1 + + if (gametyperules & GTR_POINTLIMIT) + { + P_AddPlayerScore(player, points); + K_SpawnBattlePoints(player, victim, points); + } + + if ((gametyperules & GTR_WANTED) && (reducewanted == true)) + { + // Seems a little backwards, but the WANTED system is meant to prevent camping. + // If you don't want people to go after you, then be proactive! + player->kartstuff[k_wanted] -= wantedreduce; + victim->kartstuff[k_wanted] -= (wantedreduce/2); + } +} + +void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source) +{ + UINT8 score = 1; + boolean trapitem = false; + + if (!(gametyperules & GTR_BUMPERS)) return; - if ((gametyperules & GTR_POINTLIMIT) && !trapitem) + if (player->powers[pw_flashing] || P_PlayerInPain(player)) + return; + + if (inflictor && !P_MobjWasRemoved(inflictor)) + { + if (inflictor->type == MT_BANANA && inflictor->health <= 1) + { + trapitem = true; + } + } + + if (gametyperules & GTR_POINTLIMIT) { if (K_IsPlayerWanted(player)) - scoremultiply = 3; + score = 3; else if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] == 1) - scoremultiply = 2; + score = 2; } - if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2) - || player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 - || ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) + if (source && source->player && player != source->player) { - if (!force) // if shoulddamage force, we go THROUGH that. - { - K_DoInstashield(player); - return; - } + K_BattleHitPlayer(source->player, player, score, trapitem); } - if (LUAh_PlayerSpin(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case. - return; - - if (source && source != player->mo && source->player) - K_PlayHitEmSound(source); - - player->kartstuff[k_sneakertimer] = 0; - player->kartstuff[k_numsneakers] = 0; - player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_ringboost] = 0; - - player->kartstuff[k_drift] = 0; - player->kartstuff[k_driftcharge] = 0; - player->kartstuff[k_pogospring] = 0; - - if (gametyperules & GTR_BUMPERS) + if (player->kartstuff[k_bumper] > 0) { - if (source && source->player && player != source->player) + if (player->kartstuff[k_bumper] == 1) { - P_AddPlayerScore(source->player, scoremultiply); - K_SpawnBattlePoints(source->player, player, scoremultiply); - if (!trapitem) - { - source->player->kartstuff[k_wanted] -= wantedreduce; - player->kartstuff[k_wanted] -= (wantedreduce/2); - } + mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!! + P_SetTarget(&karmahitbox->target, player->mo); + karmahitbox->destscale = player->mo->scale; + P_SetScale(karmahitbox, player->mo->scale); + CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]); } - if (player->kartstuff[k_bumper] > 0) - { - if (player->kartstuff[k_bumper] == 1) - { - mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!! - P_SetTarget(&karmahitbox->target, player->mo); - karmahitbox->destscale = player->mo->scale; - P_SetScale(karmahitbox, player->mo->scale); - CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]); - } - player->kartstuff[k_bumper]--; - if (K_IsPlayerWanted(player)) - K_CalculateBattleWanted(); - } + player->kartstuff[k_bumper]--; - if (!player->kartstuff[k_bumper]) - { - player->kartstuff[k_comebacktimer] = comebacktime; - if (player->kartstuff[k_comebackmode] == 2) - { - mobj_t *poof = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EXPLODE); - S_StartSound(poof, mobjinfo[MT_KARMAHITBOX].seesound); - player->kartstuff[k_comebackmode] = 0; - } - } - - K_CheckBumpers(); + if (K_IsPlayerWanted(player)) + K_CalculateBattleWanted(); } + if (player->kartstuff[k_bumper] == 0) + { + player->kartstuff[k_comebacktimer] = comebacktime; + + if (player->kartstuff[k_comebackmode] == 2) + { + mobj_t *poof = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EXPLODE); + S_StartSound(poof, mobjinfo[MT_KARMAHITBOX].seesound); + player->kartstuff[k_comebackmode] = 0; + } + } + + K_CheckBumpers(); +} + +void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type) +{ + (void)inflictor; + (void)source; + player->kartstuff[k_spinouttype] = type; if (player->kartstuff[k_spinouttype] <= 0) // type 0 is spinout, type 1 is wipeout, type 2 is no-invuln wipeout @@ -2469,20 +2441,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto } player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2; - player->powers[pw_flashing] = K_GetKartFlashing(player); - - P_PlayRinglossSound(player->mo); - P_PlayerRingBurst(player, 5); - K_PlayPainSound(player->mo); - P_SetPlayerMobjState(player->mo, S_KART_SPINOUT); - - player->kartstuff[k_instashield] = 15; - if (cv_kartdebughuddrop.value && !modeattacking) - K_DropItems(player); - else - K_DropHnextList(player, false); - return; } static void K_RemoveGrowShrink(player_t *player) @@ -2508,89 +2467,10 @@ static void K_RemoveGrowShrink(player_t *player) P_RestoreMusic(player); } -void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor) +void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source) { - UINT8 scoremultiply = 1; - // PS: Inflictor is unused for all purposes here and is actually only ever relevant to Lua. It may be nil too. - - boolean force = false; // Used to check if Lua ShouldSquish should get us damaged reguardless of flashtics or heck knows what. - UINT8 shouldForce = LUAh_ShouldSquish(player, inflictor, source); - if (P_MobjWasRemoved(player->mo)) - return; // mobj was removed (in theory that shouldn't happen) - if (shouldForce == 1) - force = true; - else if (shouldForce == 2) - return; - - if (gametyperules & GTR_POINTLIMIT) - { - if (K_IsPlayerWanted(player)) - scoremultiply = 3; - else if ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] == 1) - scoremultiply = 2; - } - - if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_invincibilitytimer] > 0 - || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 - || ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) - { - if (!force) // You know the drill by now. - { - K_DoInstashield(player); - return; - } - } - - if (LUAh_PlayerSquish(player, inflictor, source)) // Let Lua do its thing or overwrite if it wants to. Make sure to let any possible instashield happen because we didn't get "damaged" in this case. - return; - - player->kartstuff[k_sneakertimer] = 0; - player->kartstuff[k_numsneakers] = 0; - player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_ringboost] = 0; - - player->kartstuff[k_drift] = 0; - player->kartstuff[k_driftcharge] = 0; - player->kartstuff[k_pogospring] = 0; - - if (gametyperules & GTR_BUMPERS) - { - if (source && source->player && player != source->player) - { - P_AddPlayerScore(source->player, scoremultiply); - K_SpawnBattlePoints(source->player, player, scoremultiply); - source->player->kartstuff[k_wanted] -= wantedreduce; - player->kartstuff[k_wanted] -= (wantedreduce/2); - } - - if (player->kartstuff[k_bumper] > 0) - { - if (player->kartstuff[k_bumper] == 1) - { - mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!! - P_SetTarget(&karmahitbox->target, player->mo); - karmahitbox->destscale = player->mo->scale; - P_SetScale(karmahitbox, player->mo->scale); - CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]); - } - player->kartstuff[k_bumper]--; - if (K_IsPlayerWanted(player)) - K_CalculateBattleWanted(); - } - - if (!player->kartstuff[k_bumper]) - { - player->kartstuff[k_comebacktimer] = comebacktime; - if (player->kartstuff[k_comebackmode] == 2) - { - mobj_t *poof = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EXPLODE); - S_StartSound(poof, mobjinfo[MT_KARMAHITBOX].seesound); - player->kartstuff[k_comebackmode] = 0; - } - } - - K_CheckBumpers(); - } + (void)inflictor; + (void)source; player->kartstuff[k_squishedtimer] = TICRATE; @@ -2602,123 +2482,29 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor) K_RemoveGrowShrink(player); } - player->powers[pw_flashing] = K_GetKartFlashing(player); - player->mo->flags |= MF_NOCLIP; if (player->mo->state != &states[S_KART_SQUISH]) // Squash P_SetPlayerMobjState(player->mo, S_KART_SQUISH); - - P_PlayRinglossSound(player->mo); - P_PlayerRingBurst(player, 5); - K_PlayPainSound(player->mo); - - player->kartstuff[k_instashield] = 15; - if (cv_kartdebughuddrop.value && !modeattacking) - K_DropItems(player); - else - K_DropHnextList(player, false); - return; } -void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A bit of a hack, we just throw the player up higher here and extend their spinout timer +void K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) // A bit of a hack, we just throw the player up higher here and extend their spinout timer { - UINT8 scoremultiply = 1; - boolean force = false; // Used to check if Lua ShouldExplode should get us damaged reguardless of flashtics or heck knows what. - UINT8 shouldForce = LUAh_ShouldExplode(player, inflictor, source); + (void)source; - if (P_MobjWasRemoved(player->mo)) - return; // mobj was removed (in theory that shouldn't happen) - if (shouldForce == 1) - force = true; - else if (shouldForce == 2) - return; - - if (gametyperules & GTR_BUMPERS) - { - if (K_IsPlayerWanted(player)) - scoremultiply = 3; - else if (player->kartstuff[k_bumper] == 1) - scoremultiply = 2; - } - - if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 // Do not check spinout, because SPB and Eggman should combo - || ((gametyperules & GTR_BUMPERS) && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) - { - if (!force) // ShouldDamage can bypass that, again. - { - K_DoInstashield(player); - return; - } - } - - if (LUAh_PlayerExplode(player, inflictor, source)) // Same thing. Also make sure to let Instashield happen blah blah - return; - - if (source && source != player->mo && source->player) - K_PlayHitEmSound(source); - - player->mo->momz = 18*mapobjectscale*P_MobjFlip(player->mo); // please stop forgetting mobjflip checks!!!! + player->mo->momz = 18*mapobjectscale*P_MobjFlip(player->mo); // please stop forgetting mobjflip checks!!!! player->mo->momx = player->mo->momy = 0; - player->kartstuff[k_sneakertimer] = 0; - player->kartstuff[k_numsneakers] = 0; - player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_ringboost] = 0; - - player->kartstuff[k_drift] = 0; - player->kartstuff[k_driftcharge] = 0; - player->kartstuff[k_pogospring] = 0; - - // This is the only part that SHOULDN'T combo :VVVVV - if ((gametyperules & GTR_BUMPERS) && !(player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2))) - { - if (source && source->player && player != source->player) - { - P_AddPlayerScore(source->player, scoremultiply); - K_SpawnBattlePoints(source->player, player, scoremultiply); - source->player->kartstuff[k_wanted] -= wantedreduce; - player->kartstuff[k_wanted] -= (wantedreduce/2); - } - - if (player->kartstuff[k_bumper] > 0) - { - if (player->kartstuff[k_bumper] == 1) - { - mobj_t *karmahitbox = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_KARMAHITBOX); // Player hitbox is too small!! - P_SetTarget(&karmahitbox->target, player->mo); - karmahitbox->destscale = player->mo->scale; - P_SetScale(karmahitbox, player->mo->scale); - CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]); - } - player->kartstuff[k_bumper]--; - if (K_IsPlayerWanted(player)) - K_CalculateBattleWanted(); - } - - if (!player->kartstuff[k_bumper]) - { - player->kartstuff[k_comebacktimer] = comebacktime; - if (player->kartstuff[k_comebackmode] == 2) - { - mobj_t *poof = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_EXPLODE); - S_StartSound(poof, mobjinfo[MT_KARMAHITBOX].seesound); - player->kartstuff[k_comebackmode] = 0; - } - } - - K_CheckBumpers(); - } - player->kartstuff[k_spinouttype] = 1; player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2; - player->powers[pw_flashing] = K_GetKartFlashing(player); - - if (inflictor && inflictor->type == MT_SPBEXPLOSION && inflictor->extravalue1) + if (inflictor && !P_MobjWasRemoved(inflictor)) { - player->kartstuff[k_spinouttimer] = ((5*player->kartstuff[k_spinouttimer])/2)+1; - player->mo->momz *= 2; + if (inflictor->type == MT_SPBEXPLOSION && inflictor->extravalue1) + { + player->kartstuff[k_spinouttimer] = ((5*player->kartstuff[k_spinouttimer])/2)+1; + player->mo->momz *= 2; + } } if (player->mo->eflags & MFE_UNDERWATER) @@ -2726,20 +2512,30 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b P_SetPlayerMobjState(player->mo, S_KART_SPINOUT); - P_PlayRinglossSound(player->mo); - P_PlayerRingBurst(player, 5); - K_PlayPainSound(player->mo); - if (P_IsDisplayPlayer(player)) P_StartQuake(64<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) { diff --git a/src/k_kart.h b/src/k_kart.h index 10a556c9c..a745ca796 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -40,10 +40,13 @@ void K_KartPlayerHUDUpdate(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerAfterThink(player_t *player); void K_DoInstashield(player_t *player); -void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflictor, boolean trapitem); -void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor); -void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor); -void K_StealBumper(player_t *player, player_t *victim, boolean force); +void K_BattleHitPlayer(player_t *player, player_t *victim, UINT8 points, boolean reducewanted); +void K_RemoveBumper(player_t *player, mobj_t *inflictor, mobj_t *source); +void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type); +void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source); +void K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); +void K_DebtStingPlayer(player_t *player, mobj_t *source); +void K_StealBumper(player_t *player, player_t *victim); void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source); void K_SpawnMineExplosion(mobj_t *source, UINT8 color); UINT16 K_DriftSparkColor(player_t *player, INT32 charge); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 603e2be23..a6005946f 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -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; } diff --git a/src/lua_hook.h b/src/lua_hook.h index 306686100..5770be7a5 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -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 diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 85a109ee0..d4383b281 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -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) { diff --git a/src/m_cheat.c b/src/m_cheat.c index c4cc1719c..e86db331d 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -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) diff --git a/src/p_enemy.c b/src/p_enemy.c index a9fdd1454..395051baa 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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<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<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); } } diff --git a/src/p_floor.c b/src/p_floor.c index 8aff86421..f8f7fef2d 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -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); diff --git a/src/p_inter.c b/src/p_inter.c index 0d3ab7967..4ad79dbc4 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -212,12 +212,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) /////ENEMIES & BOSSES!!///////////////////////////////// //////////////////////////////////////////////////////// - P_DamageMobj(toucher, special, special, 1, 0); - return; - } - else if (special->flags & MF_FIRE) - { - P_DamageMobj(toucher, special, special, 1, DMG_FIRE); + P_DamageMobj(toucher, special, special, 1, DMG_NORMAL); return; } else @@ -269,7 +264,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->momx = special->momy = special->momz = 0; P_SetTarget(&special->target, toucher); - P_KillMobj(special, toucher, toucher, 0); + P_KillMobj(special, toucher, toucher, DMG_NORMAL); break; case MT_KARMAHITBOX: if (!special->target->player) @@ -281,15 +276,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (special->target->player->exiting || player->exiting) return; - if (special->target->player->kartstuff[k_comebacktimer] - || special->target->player->kartstuff[k_spinouttimer] - || special->target->player->kartstuff[k_squishedtimer]) + if (P_PlayerInPain(special->target->player)) return; if (!special->target->player->kartstuff[k_comebackmode]) { if (player->kartstuff[k_growshrinktimer] || player->kartstuff[k_squishedtimer] - || player->kartstuff[k_hyudorotimer] || player->kartstuff[k_spinouttimer] + || player->kartstuff[k_hyudorotimer] || P_PlayerInPain(player) || player->kartstuff[k_invincibilitytimer] || player->powers[pw_flashing]) return; else @@ -327,11 +320,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->karthud[khud_yougotem] = 2*TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) - K_StealBumper(special->target->player, player, true); + K_StealBumper(special->target->player, player); special->target->player->kartstuff[k_comebacktimer] = comebacktime; - K_ExplodePlayer(player, special->target, special); + P_DamageMobj(toucher, special, special->target, 1, DMG_EXPLODE); } } else if (special->target->player->kartstuff[k_comebackmode] == 1 && P_CanPickupItem(player, 1)) @@ -355,7 +348,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->kartstuff[k_comebackpoints]++; if (special->target->player->kartstuff[k_comebackpoints] >= 2) - K_StealBumper(special->target->player, player, true); + K_StealBumper(special->target->player, player); special->target->player->kartstuff[k_comebacktimer] = comebacktime; player->kartstuff[k_itemroulette] = 1; @@ -390,7 +383,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->karthud[khud_yougotem] = 2*TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) - K_StealBumper(special->target->player, player, true); + K_StealBumper(special->target->player, player); special->target->player->kartstuff[k_comebacktimer] = comebacktime; @@ -443,7 +436,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_RemoveMobj(special); } else - K_SpinPlayer(player, special->target, 0, special, false); + { + P_DamageMobj(player->mo, special, special->target, 1, DMG_NORMAL); + } return; /*case MT_EERIEFOG: special->frame &= ~FF_TRANS80; @@ -464,13 +459,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_flamedash] > 0) { - P_KillMobj(special, toucher, toucher, 0); + P_KillMobj(special, toucher, toucher, DMG_NORMAL); return; } // no interaction if (player->powers[pw_flashing] > 0 || player->kartstuff[k_hyudorotimer] > 0 - || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0) + || player->kartstuff[k_squishedtimer] > 0 || P_PlayerInPain(player)) return; // attach to player! @@ -538,9 +533,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; // Don't immediately pick up spilled rings - if (special->threshold > 0 - || player->kartstuff[k_squishedtimer] - || player->kartstuff[k_spinouttimer]) + if (special->threshold > 0 || P_PlayerInPain(player)) return; if (!(P_CanPickupItem(player, 0))) @@ -677,7 +670,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } S_StartSound(toucher, special->info->deathsound); // was NULL, but changed to player so you could hear others pick up rings - P_KillMobj(special, NULL, toucher, 0); + P_KillMobj(special, NULL, toucher, DMG_NORMAL); special->shadowscale = 0; } @@ -1269,7 +1262,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget mobj_t *segment = target; while (segment->tracer != NULL) { - P_KillMobj(segment->tracer, NULL, NULL, 0); + P_KillMobj(segment->tracer, NULL, NULL, DMG_NORMAL); segment = segment->tracer; } break; @@ -1345,7 +1338,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget A_Scream(target); target->momx = target->momy = target->momz = 0; if (target->target && target->target->health) - P_KillMobj(target->target, target, source, 0); + P_KillMobj(target->target, target, source, DMG_NORMAL); break; case MT_PLAYER: @@ -1356,23 +1349,8 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget if (target->player && target->player->pflags & PF_GAMETYPEOVER) break; - if (damagetype == DMG_DROWNED) // drowned - { - target->movedir = damagetype; // we're MOVING the Damage Into anotheR function... Okay, this is a bit of a hack. - if (target->player->charflags & SF_MACHINE) - S_StartSound(target, sfx_fizzle); - else - S_StartSound(target, sfx_drown); - // Don't jump up when drowning - } - else - { - P_SetObjectMomZ(target, 14*FRACUNIT, false); - if (damagetype == DMG_SPIKE) // Spikes - S_StartSound(target, sfx_spkdth); - else - P_PlayDeathSound(target); - } + P_SetObjectMomZ(target, 14*FRACUNIT, false); + P_PlayDeathSound(target); } break; @@ -1450,7 +1428,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget if (target->type == MT_FROGGER) { if (target->tracer && !P_MobjWasRemoved(target->tracer)) - P_KillMobj(target->tracer, inflictor, source, 0); + P_KillMobj(target->tracer, inflictor, source, DMG_NORMAL); } if (target->type == MT_FROGGER || target->type == MT_ROBRA_HEAD || target->type == MT_BLUEROBRA_HEAD) // clean hnext list @@ -1458,7 +1436,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget mobj_t *cur = target->hnext; while (cur && !P_MobjWasRemoved(cur)) { - P_KillMobj(cur, inflictor, source, 0); + P_KillMobj(cur, inflictor, source, DMG_NORMAL); cur = cur->hnext; } } @@ -1644,12 +1622,19 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou (void)inflictor; (void)damage; - // SRB2Kart: We want to hurt ourselves + // SRB2Kart: We want to hurt ourselves, so it's now DMG_CANTHURTSELF if (damagetype & DMG_CANTHURTSELF) { // You can't kill yourself, idiot... if (source == target) return false; + + if (G_GametypeHasTeams()) + { + // Don't hurt your team, either! + if (source->player->ctfteam == target->player->ctfteam) + return false; + } } return true; @@ -1817,20 +1802,24 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (player) // Player is the target { + const UINT8 type = (damagetype & DMG_TYPEMASK); + const boolean combo = (type == DMG_EXPLODE); // This damage type can be comboed from other damage + INT16 ringburst = 5; + + if (player->pflags & PF_GODMODE) + return false; + if (!force) { if (player->exiting) return false; - if (player->pflags & PF_GODMODE) - return false; - } - - // Player hits another player - if (!force && source && source->player) - { - if (!P_PlayerHitsPlayer(target, inflictor, source, damage, damagetype)) - return false; + // Player hits another player + if (source && source->player) + { + if (!P_PlayerHitsPlayer(target, inflictor, source, damage, damagetype)) + return false; + } } // Instant-Death @@ -1839,27 +1828,119 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da else if (LUAh_MobjDamage(target, inflictor, source, damage, damagetype)) return true; - if (inflictor && (inflictor->type == MT_ORBINAUT || inflictor->type == MT_ORBINAUT_SHIELD - || inflictor->type == MT_JAWZ || inflictor->type == MT_JAWZ_SHIELD || inflictor->type == MT_JAWZ_DUD - || inflictor->type == MT_SMK_THWOMP || inflictor->player)) + // Check if the player is allowed to be damaged! + // If not, then spawn the instashield effect instead. + if (!force) { - player->kartstuff[k_sneakertimer] = 0; - player->kartstuff[k_numsneakers] = 0; + if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0) + { + // Full invulnerability + K_DoInstashield(player); + return false; + } - K_SpinPlayer(player, source, 1, inflictor, false); - K_KartPainEnergyFling(player); + if (combo == false) + { + if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2)) + { + // Post-hit invincibility + K_DoInstashield(player); + return false; + } + } - if (P_IsDisplayPlayer(player)) - P_StartQuake(32<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<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; diff --git a/src/p_local.h b/src/p_local.h index 83cafb993..a010cd37b 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -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); diff --git a/src/p_map.c b/src/p_map.c index 21912e37d..d00e0b413 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -627,8 +627,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->flags & MF_SHOOTABLE && thing->health > 0) { UINT32 damagetype = (thing->info->mass & 0xFF); - if (!damagetype && thing->flags & MF_FIRE) // BURN! - damagetype = DMG_FIRE; + if (P_DamageMobj(tmthing, thing, thing, 1, damagetype) && (damagetype = (thing->info->mass>>8))) S_StartSound(thing, damagetype); } @@ -644,8 +643,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->flags & MF_SHOOTABLE && tmthing->health > 0) { UINT32 damagetype = (tmthing->info->mass & 0xFF); - if (!damagetype && tmthing->flags & MF_FIRE) // BURN! - damagetype = DMG_FIRE; + if (P_DamageMobj(thing, tmthing, tmthing, 1, damagetype) && (damagetype = (tmthing->info->mass>>8))) S_StartSound(tmthing, damagetype); } @@ -738,13 +736,13 @@ static boolean PIT_CheckThing(mobj_t *thing) thing = oldthing; P_SetTarget(&tmthing, oldtmthing);*/ - if (tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_squishedtimer] + if (P_PlayerInPain(tmthing->player) || tmthing->player->powers[pw_flashing] || tmthing->player->kartstuff[k_hyudorotimer] || tmthing->player->kartstuff[k_justbumped] || tmthing->scale > thing->scale + (mapobjectscale/8)) return true; // Player Damage - K_SpinPlayer(tmthing->player, thing, 0, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), false); + P_DamageMobj(tmthing, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), thing, 1, DMG_NORMAL); S_StartSound(thing, sfx_s3k44); } else @@ -796,13 +794,13 @@ static boolean PIT_CheckThing(mobj_t *thing) thing = oldthing; P_SetTarget(&tmthing, oldtmthing);*/ - if (thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_squishedtimer] + if (P_PlayerInPain(thing->player) || thing->player->powers[pw_flashing] || thing->player->kartstuff[k_hyudorotimer] || thing->player->kartstuff[k_justbumped] || thing->scale > tmthing->scale + (mapobjectscale/8)) return true; // Player Damage - K_SpinPlayer(thing->player, tmthing, 0, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), false); + P_DamageMobj(thing, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), tmthing, 1, DMG_NORMAL); S_StartSound(tmthing, sfx_s3k44); } else @@ -987,6 +985,8 @@ static boolean PIT_CheckThing(mobj_t *thing) // missiles can hit other things if (tmthing->flags & MF_MISSILE) { + UINT8 damagetype = tmthing->info->mass; + // see if it went over / under if (tmthing->z > thing->z + thing->height) return true; // overhead @@ -1014,15 +1014,7 @@ static boolean PIT_CheckThing(mobj_t *thing) } // damage / explode - if (tmthing->flags & MF_ENEMY) // An actual ENEMY! (Like the deton, for example) - { - P_DamageMobj(thing, tmthing, tmthing, 1, 0); - } - else - { - UINT8 damagetype = tmthing->info->mass; - P_DamageMobj(thing, tmthing, tmthing->target, 1, damagetype); - } + P_DamageMobj(thing, tmthing, tmthing->target, 1, damagetype); // don't traverse any more return false; @@ -1109,11 +1101,11 @@ static boolean PIT_CheckThing(mobj_t *thing) { if (thing->z + thing->height <= tmthing->z + FixedMul(FRACUNIT, tmthing->scale) && thing->z + thing->height + thing->momz >= tmthing->z + FixedMul(FRACUNIT, tmthing->scale) + tmthing->momz) - P_DamageMobj(thing, tmthing, tmthing, 1, DMG_SPIKE); + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_NORMAL); } else if (thing->z >= tmthing->z + tmthing->height - FixedMul(FRACUNIT, tmthing->scale) && thing->z + thing->momz <= tmthing->z + tmthing->height - FixedMul(FRACUNIT, tmthing->scale) + tmthing->momz) - P_DamageMobj(thing, tmthing, tmthing, 1, DMG_SPIKE); + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_NORMAL); } else if (thing->type == MT_SPIKE && thing->flags & MF_SOLID && tmthing->player) // unfortunate player falls into spike?! { @@ -1121,11 +1113,11 @@ static boolean PIT_CheckThing(mobj_t *thing) { if (tmthing->z + tmthing->height <= thing->z - FixedMul(FRACUNIT, thing->scale) && tmthing->z + tmthing->height + tmthing->momz >= thing->z - FixedMul(FRACUNIT, thing->scale)) - P_DamageMobj(tmthing, thing, thing, 1, DMG_SPIKE); + P_DamageMobj(tmthing, thing, thing, 1, DMG_NORMAL); } else if (tmthing->z >= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale) && tmthing->z + tmthing->momz <= thing->z + thing->height + FixedMul(FRACUNIT, thing->scale)) - P_DamageMobj(tmthing, thing, thing, 1, DMG_SPIKE); + P_DamageMobj(tmthing, thing, thing, 1, DMG_NORMAL); } if (tmthing->type == MT_WALLSPIKE && tmthing->flags & MF_SOLID && thing->player) // wall spike impales player @@ -1141,7 +1133,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->z + thing->height > bottomz // above bottom && thing->z < topz) // below top // don't check angle, the player was clearly in the way in this case - P_DamageMobj(thing, tmthing, tmthing, 1, DMG_SPIKE); + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_NORMAL); } else if (thing->type == MT_WALLSPIKE && thing->flags & MF_SOLID && tmthing->player) { @@ -1173,7 +1165,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (touchangle > ANGLE_180) touchangle = InvAngle(touchangle); if (touchangle <= ANGLE_22h) // if you touched it at this close an angle, you get poked! - P_DamageMobj(tmthing, thing, thing, 1, DMG_SPIKE); + P_DamageMobj(tmthing, thing, thing, 1, DMG_NORMAL); } } @@ -1216,19 +1208,19 @@ static boolean PIT_CheckThing(mobj_t *thing) if (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam) { if (tmthing->scale > thing->scale + (mapobjectscale/8)) // SRB2kart - Handle squishes first! - K_SquishPlayer(thing->player, tmthing, tmthing); + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_SQUISH); else if (thing->scale > tmthing->scale + (mapobjectscale/8)) - K_SquishPlayer(tmthing->player, thing, tmthing); + P_DamageMobj(tmthing, thing, thing, 1, DMG_SQUISH); else if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) // SRB2kart - Then invincibility! - P_DamageMobj(thing, tmthing, tmthing, 1, 0); + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT); else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) - P_DamageMobj(tmthing, thing, thing, 1, 0); + P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT); else if ((tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) && !(thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! - P_DamageMobj(thing, tmthing, tmthing, 1, 0); + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT); else if ((thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) - && !(tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! - P_DamageMobj(tmthing, thing, thing, 1, 0); + && !(tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) + P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT); } } @@ -1315,34 +1307,26 @@ static boolean PIT_CheckThing(mobj_t *thing) mo1 = thing; mo2 = tmthing; - if ((gametyperules & GTR_BUMPERS) && tmthing->player->kartstuff[k_pogospring]) - { - K_StealBumper(tmthing->player, thing->player, false); - K_SpinPlayer(thing->player, tmthing, 0, tmthing, false); - } + if (tmthing->player->kartstuff[k_pogospring]) + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT|DMG_STEAL); } else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) { zbounce = true; - if ((gametyperules & GTR_BUMPERS) && thing->player->kartstuff[k_pogospring]) - { - K_StealBumper(thing->player, tmthing->player, false); - K_SpinPlayer(tmthing->player, thing, 0, thing, false); - } + if (thing->player->kartstuff[k_pogospring]) + P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT|DMG_STEAL); } if ((gametyperules & GTR_BUMPERS)) { if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer]) && !(thing->player->powers[pw_flashing])) // Don't steal bumpers while intangible { - K_StealBumper(thing->player, tmthing->player, false); - K_SpinPlayer(tmthing->player, thing, 0, tmthing, false); + P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT|DMG_STEAL); } else if (tmthing->player->kartstuff[k_sneakertimer] && !(thing->player->kartstuff[k_sneakertimer]) && !(tmthing->player->powers[pw_flashing])) { - K_StealBumper(tmthing->player, thing->player, false); - K_SpinPlayer(thing->player, tmthing, 0, thing, false); + P_DamageMobj(thing, tmthing, tmthing, 1, DMG_WIPEOUT|DMG_STEAL); } } @@ -1366,9 +1350,9 @@ static boolean PIT_CheckThing(mobj_t *thing) || tmthing->player->kartstuff[k_growshrinktimer] > 0) { if (thing->type == MT_BLUEROBRA_JOINT) - P_KillMobj(thing->target, tmthing, tmthing, 0); + P_KillMobj(thing->target, tmthing, tmthing, DMG_NORMAL); else - P_KillMobj(thing, tmthing, tmthing, 0); + P_KillMobj(thing, tmthing, tmthing, DMG_NORMAL); return true; } else @@ -1391,7 +1375,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->player->kartstuff[k_invincibilitytimer] > 0 || tmthing->player->kartstuff[k_growshrinktimer] > 0) { - P_KillMobj(thing, tmthing, tmthing, 0); + P_KillMobj(thing, tmthing, tmthing, DMG_NORMAL); return true; // kill } @@ -1422,7 +1406,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->player->kartstuff[k_invincibilitytimer] > 0 || tmthing->player->kartstuff[k_growshrinktimer] > 0) { - P_KillMobj(thing, tmthing, tmthing, 0); + P_KillMobj(thing, tmthing, tmthing, DMG_NORMAL); return true; } @@ -1445,7 +1429,7 @@ static boolean PIT_CheckThing(mobj_t *thing) else { if (thing->flags2 & MF2_AMBUSH) - P_DamageMobj(tmthing, thing, thing, 1, 0); + P_DamageMobj(tmthing, thing, thing, 1, DMG_WIPEOUT); K_KartBouncing(tmthing, thing, false, true); } @@ -3343,7 +3327,7 @@ static void P_CheckLavaWall(mobj_t *mo, sector_t *sec) continue; } - P_DamageMobj(mo, NULL, NULL, 1, DMG_FIRE); + P_DamageMobj(mo, NULL, NULL, 1, DMG_NORMAL); return; } } @@ -3875,7 +3859,7 @@ static boolean PIT_RadiusAttack(mobj_t *thing) if (thing == bombspot) // ignore the bomb itself (Deton fix) return true; - if (bombsource && thing->type == bombsource->type && (bombdamagetype & DMG_CANTHURTSELF)) // ignore the type of guys who dropped the bomb (Jetty-Syn Bomber or Skim can bomb eachother, but not themselves.) + if ((bombdamagetype & DMG_CANTHURTSELF) && bombsource && thing->type == bombsource->type) // ignore the type of guys who dropped the bomb (Jetty-Syn Bomber or Skim can bomb eachother, but not themselves.) return true; if ((thing->flags & (MF_MONITOR|MF_SHOOTABLE)) != MF_SHOOTABLE) @@ -4053,7 +4037,7 @@ static boolean PIT_ChangeSector(mobj_t *thing, boolean realcrush) } if (realcrush && crushchange) - P_DamageMobj(thing, NULL, NULL, 1, 0); + P_DamageMobj(thing, NULL, NULL, 1, DMG_NORMAL); // keep checking (crush other things) return true; diff --git a/src/p_mobj.c b/src/p_mobj.c index 246146a2e..5b9120e40 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1520,7 +1520,7 @@ void P_XYMovement(mobj_t *mo) { // This Item Damage S_StartSound(mo, mo->info->deathsound); - P_KillMobj(mo, NULL, NULL, 0); + P_KillMobj(mo, NULL, NULL, DMG_NORMAL); P_SetObjectMomZ(mo, 8*FRACUNIT, false); P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x + xmove, mo->y + ymove)+ANGLE_90, 16*FRACUNIT); @@ -1673,7 +1673,7 @@ void P_XYMovement(mobj_t *mo) { // This Item Damage S_StartSound(mo, mo->info->deathsound); - P_KillMobj(mo, NULL, NULL, 0); + P_KillMobj(mo, NULL, NULL, DMG_NORMAL); P_SetObjectMomZ(mo, 8*FRACUNIT, false); P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x + xmove, mo->y + ymove)+ANGLE_90, 16*FRACUNIT); @@ -2184,7 +2184,7 @@ boolean P_ZMovement(mobj_t *mo) // Kill enemies, bosses and minecarts that fall into death pits. if (mo->health) { - P_KillMobj(mo, NULL, NULL, 0); + P_KillMobj(mo, NULL, NULL, DMG_NORMAL); } return false; } @@ -3220,7 +3220,7 @@ void P_DestroyRobots(void) continue; // Found a target enemy - P_KillMobj(mo, players[consoleplayer].mo, players[consoleplayer].mo, 0); + P_KillMobj(mo, players[consoleplayer].mo, players[consoleplayer].mo, DMG_NORMAL); } } @@ -5565,7 +5565,7 @@ static void P_MobjSceneryThink(mobj_t *mobj) } else if (mobj->health > 0) { - P_KillMobj(mobj, NULL, NULL, 0); + P_KillMobj(mobj, NULL, NULL, DMG_NORMAL); return; } break; @@ -5616,7 +5616,7 @@ static void P_MobjSceneryThink(mobj_t *mobj) } else if (mobj->health > 0) { - P_KillMobj(mobj, NULL, NULL, 0); + P_KillMobj(mobj, NULL, NULL, DMG_NORMAL); return; } break; @@ -5672,15 +5672,6 @@ static boolean P_MobjPushableThink(mobj_t *mobj) { P_MobjCheckWater(mobj); P_PushableThinker(mobj); - - // Extinguish fire objects in water. (Yes, it's extraordinarily rare to have a pushable flame object, but Brak uses such a case.) - if (mobj->flags & MF_FIRE && mobj->type != MT_PUMA && mobj->type != MT_FIREBALL - && (mobj->eflags & (MFE_UNDERWATER | MFE_TOUCHWATER))) - { - P_KillMobj(mobj, NULL, NULL, 0); - return false; - } - return true; } @@ -5756,10 +5747,7 @@ static boolean P_MobjDeadThink(mobj_t *mobj) MT_SONIC3KBOSSEXPLODE); S_StartSound(explosion, sfx_s3kb4); } - if (mobj->movedir == DMG_DROWNED) - P_SetObjectMomZ(mobj, -FRACUNIT/2, true); // slower fall from drowning - else - P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true); + P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true); } break; case MT_METALSONIC_RACE: @@ -6399,7 +6387,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) case MT_MINEEXPLOSION: if ((mobj->z < mobj->floorz - mobj->height) || (mobj->z > mobj->ceilingz + mobj->height)) { - P_KillMobj(mobj, NULL, NULL, 0); + P_KillMobj(mobj, NULL, NULL, DMG_NORMAL); break; } @@ -7670,7 +7658,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (mobj->movecount > 8*TICRATE) { - P_KillMobj(mobj, mobj->target, mobj->target, 0); + P_KillMobj(mobj, mobj->target, mobj->target, DMG_NORMAL); break; } @@ -7697,7 +7685,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } else if (mobj->extravalue1) // lost your player somehow, DIE { - P_KillMobj(mobj, NULL, NULL, 0); + P_KillMobj(mobj, NULL, NULL, DMG_NORMAL); break; } else @@ -7826,7 +7814,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { S_StartSound(mobj->tracer, sfx_s3k77); mobj->tracer->flags &= ~MF_NOGRAVITY; - P_KillMobj(mobj, mobj->tracer, mobj->tracer, 0); + P_KillMobj(mobj, mobj->tracer, mobj->tracer, DMG_NORMAL); break; } @@ -7853,7 +7841,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } else if (mobj->extravalue1) // lost your player somehow, DIE { - P_KillMobj(mobj, NULL, NULL, 0); + P_KillMobj(mobj, NULL, NULL, DMG_NORMAL); break; } else @@ -8210,14 +8198,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) default: // check mobj against possible water content, before movement code P_MobjCheckWater(mobj); - - // Extinguish fire objects in water - if (mobj->flags & MF_FIRE && mobj->type != MT_PUMA && mobj->type != MT_FIREBALL - && (mobj->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))) - { - P_KillMobj(mobj, NULL, NULL, 0); - return false; - } break; } return true; @@ -8537,7 +8517,7 @@ void P_MobjThinker(mobj_t *mobj) || mobj->type == MT_BALLHOG) { S_StartSound(mobj, mobj->info->deathsound); - P_KillMobj(mobj, NULL, NULL, 0); + P_KillMobj(mobj, NULL, NULL, DMG_NORMAL); } else { @@ -8548,7 +8528,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->z += mobj->height; S_StartSound(mobj, mobj->info->deathsound); - P_KillMobj(mobj, NULL, NULL, 0); + P_KillMobj(mobj, NULL, NULL, DMG_NORMAL); P_SetObjectMomZ(mobj, 8*FRACUNIT, false); P_InstaThrust(mobj, R_PointToAngle2(0, 0, mobj->momx, mobj->momy) + ANGLE_90, 16*FRACUNIT); diff --git a/src/p_mobj.h b/src/p_mobj.h index 9557bf6fb..eaf97c441 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -137,28 +137,26 @@ typedef enum MF_MONITOR = 1<<17, // Don't run the thinker for this object. MF_NOTHINK = 1<<18, - // Fire object. Doesn't harm if you have fire shield. - MF_FIRE = 1<<19, // Don't adjust z if below or above floorz/ceilingz - MF_NOCLIPHEIGHT = 1<<20, + MF_NOCLIPHEIGHT = 1<<19, // This mobj is an enemy! - MF_ENEMY = 1<<21, + MF_ENEMY = 1<<20, // Scenery (uses scenery thinker). - MF_SCENERY = 1<<22, + MF_SCENERY = 1<<21, // Painful (shit hurts). - MF_PAIN = 1<<23, + MF_PAIN = 1<<22, // This mobj will stick to any surface or solid object it touches. - MF_STICKY = 1<<24, + MF_STICKY = 1<<23, // NiGHTS hidden item. Goes to seestate and turns MF_SPECIAL when paralooped. - MF_NIGHTSITEM = 1<<25, + MF_NIGHTSITEM = 1<<24, // for chase camera, don't be blocked by things (partial clipping) - MF_NOCLIPTHING = 1<<26, + MF_NOCLIPTHING = 1<<25, // Missile bounces like a grenade. - MF_GRENADEBOUNCE = 1<<27, + MF_GRENADEBOUNCE = 1<<26, // Run the action thinker on spawn. - MF_RUNSPAWNFUNC = 1<<28, + MF_RUNSPAWNFUNC = 1<<27, // Don't remap in Encore mode. (Not a drawflag so that it's settable by mobjinfo.) - MF_DONTENCOREMAP = 1<<29, + MF_DONTENCOREMAP = 1<<28, // free: to and including 1<<31 } mobjflag_t; diff --git a/src/p_spec.c b/src/p_spec.c index 040947328..58921d046 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3828,7 +3828,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (mo2->spawnpoint->angle != line->tag) continue; - P_KillMobj(mo2, NULL, mo, 0); + P_KillMobj(mo2, NULL, mo, DMG_NORMAL); } if (!(line->flags & ML_NOCLIMB)) @@ -4438,7 +4438,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers { case 1: // Damage (Generic) if (roversector || P_MobjReadyToTrigger(player->mo, sector)) - P_DamageMobj(player->mo, NULL, NULL, 1, 0); + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_NORMAL); break; case 2: // Damage (Water) // SRB2kart - These three damage types are now offroad sectors case 3: // Damage (Fire) @@ -4446,7 +4446,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers break; case 5: // Spikes if (roversector || P_MobjReadyToTrigger(player->mo, sector)) - P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPIKE); + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_NORMAL); break; case 6: // Death Pit (Camera Mod) case 7: // Death Pit (No Camera Mod) @@ -4565,7 +4565,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers mo2 = (mobj_t *)th; if (mo2->type != MT_EGGTRAP) continue; - P_KillMobj(mo2, NULL, player->mo, 0); + P_KillMobj(mo2, NULL, player->mo, DMG_NORMAL); } // clear the special so you can't push the button twice. @@ -5862,9 +5862,9 @@ void T_LaserFlash(laserthink_t *flash) continue; if (thing->flags & MF_SHOOTABLE) - P_DamageMobj(thing, NULL, NULL, 1, 0); + P_DamageMobj(thing, NULL, NULL, 1, DMG_NORMAL); else if (thing->type == MT_EGGSHIELD) - P_KillMobj(thing, NULL, NULL, 0); + P_KillMobj(thing, NULL, NULL, DMG_NORMAL); } break; diff --git a/src/p_user.c b/src/p_user.c index fc4993c65..1169e6042 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -463,12 +463,14 @@ UINT8 P_FindHighestLap(void) // boolean P_PlayerInPain(player_t *player) { - // no silly, sliding isn't pain - if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate] && player->powers[pw_flashing]) + if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer] || player->respawn.state != RESPAWNST_NONE) return true; - if (player->mo->state == &states[S_KART_SQUISH]) - return true; + if (gametyperules & GTR_KARMA) + { + if (player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) + return true; + } return false; } @@ -1937,19 +1939,22 @@ static void P_3dMovement(player_t *player) player->aiming = cmd->aiming<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)