From 2f061a531a8bca5ba5558d38d61e44008d18dbb7 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 7 Oct 2018 11:40:06 +0100 Subject: [PATCH 1/5] Karma Eggman. Does what it says on the egg. Tried very hard not to merge conflict with `frameperfectegg`. Also includes some adjustments to: * Horizontal offset of Eggman countdown in splitscreen again. It's not perfectly centered either way, but on second thought I like this better. * Sound of Lat`'s Mine/SPB explosions - now uses same sound as Karma bombing, instead of that shitty paraloop. * Correctly wipe k_eggmanblame when it is appropriate to do so. --- src/dehacked.c | 1 + src/g_game.c | 1 + src/info.c | 3 ++- src/info.h | 1 + src/k_kart.c | 34 +++++++++++++++++++++++-------- src/p_inter.c | 55 ++++++++++++++++++++++++++++++++++++++------------ src/p_mobj.c | 11 ++++++---- 7 files changed, 80 insertions(+), 26 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 2efdb6bc..e0ec5b6c 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6708,6 +6708,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAYERBOMB", // Player bomb overlay "S_PLAYERITEM", // Player item overlay + "S_PLAYERFAKE", // Player fake overlay "S_KARMAWHEEL", // Karma player wheels diff --git a/src/g_game.c b/src/g_game.c index e501fa56..cfffd689 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2519,6 +2519,7 @@ void G_PlayerReborn(INT32 player) p->kartstuff[k_comebackpoints] = comebackpoints; p->kartstuff[k_comebacktimer] = comebacktime; p->kartstuff[k_wanted] = wanted; + p->kartstuff[k_eggmanblame] = -1; // Don't do anything immediately p->pflags |= PF_USEDOWN; diff --git a/src/info.c b/src/info.c index c0fb24fb..40327462 100644 --- a/src/info.c +++ b/src/info.c @@ -3006,6 +3006,7 @@ state_t states[NUMSTATES] = {SPR_PBOM, FF_ANIMATE, -1, {NULL}, 3, 3, S_NULL}, // S_PLAYERBOMB {SPR_RNDM, FF_ANIMATE, -1, {NULL}, 23, 3, S_NULL}, // S_PLAYERITEM + {SPR_FITM, FF_ANIMATE, -1, {NULL}, 23, 3, S_NULL}, // S_PLAYERFAKE {SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL @@ -17132,7 +17133,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = sfx_kc2e, // seesound 8, // reactiontime sfx_s3k4e, // attacksound - S_NULL, // painstate + S_PLAYERFAKE, // painstate 0, // painchance sfx_None, // painsound S_NULL, // meleestate diff --git a/src/info.h b/src/info.h index d0f4be59..9241363e 100644 --- a/src/info.h +++ b/src/info.h @@ -3554,6 +3554,7 @@ typedef enum state S_PLAYERBOMB, S_PLAYERITEM, + S_PLAYERFAKE, S_KARMAWHEEL, diff --git a/src/k_kart.c b/src/k_kart.c index b032f0fe..d0235223 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4398,8 +4398,11 @@ void K_StripOther(player_t *player) player->kartstuff[k_invincibilitytimer] = 0; player->kartstuff[k_growshrinktimer] = 0; - player->kartstuff[k_eggmanexplode] = 0; - player->kartstuff[k_eggmanblame] = 0; + if (player->kartstuff[k_eggmanexplode]) + { + player->kartstuff[k_eggmanexplode] = 0; + player->kartstuff[k_eggmanblame] = -1; + } } // @@ -4444,14 +4447,29 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { mobj_t *newitem; + if (player->kartstuff[k_comebackmode] == 1) + { + newitem = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RANDOMITEM); + newitem->threshold = 69; // selected "randomly". + } + else + { + newitem = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FAKEITEM); + if (player->kartstuff[k_eggmanblame] >= 0 + && player->kartstuff[k_eggmanblame] < MAXPLAYERS + && playeringame[player->kartstuff[k_eggmanblame]] + && !players[player->kartstuff[k_eggmanblame]].spectator + && players[player->kartstuff[k_eggmanblame]].mo) + P_SetTarget(&newitem->target, players[player->kartstuff[k_eggmanblame]].mo); + player->kartstuff[k_eggmanblame] = -1; + } + + newitem->flags2 = (player->mo->flags2 & MF2_OBJECTFLIP); + newitem->fuse = 15*TICRATE; // selected randomly. + player->kartstuff[k_comebackmode] = 0; player->kartstuff[k_comebacktimer] = comebacktime; S_StartSound(player->mo, sfx_s254); - - newitem = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RANDOMITEM); - newitem->flags2 = (player->mo->flags2 & MF2_OBJECTFLIP); - newitem->fuse = 15*TICRATE; // selected randomly. - newitem->threshold = 69; // selected "randomly". } // Eggman Monitor exploding else if (player->kartstuff[k_eggmanexplode]) @@ -5937,7 +5955,7 @@ static void K_drawKartItem(void) // Quick Eggman numbers if (stplyr->kartstuff[k_eggmanexplode] > 1 /*&& stplyr->kartstuff[k_eggmanexplode] <= 3*TICRATE*/) - V_DrawScaledPatch(ITEM_X+17-offset, ITEM_Y+13-offset, V_HUDTRANS|splitflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]); + V_DrawScaledPatch(ITEM_X+17, ITEM_Y+13-offset, V_HUDTRANS|splitflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]); } void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, boolean playing) diff --git a/src/p_inter.c b/src/p_inter.c index bd02da42..6ee1dfdf 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -456,10 +456,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) { - if (player->kartstuff[k_comebackmode] != 0 || player->kartstuff[k_comebacktimer]) + if (player->kartstuff[k_comebackmode] || player->kartstuff[k_comebacktimer]) return; - if (player->kartstuff[k_comebackmode] == 0) - player->kartstuff[k_comebackmode] = 1; + player->kartstuff[k_comebackmode] = 1; } special->momx = special->momy = special->momz = 0; @@ -479,21 +478,22 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) { - /*if (player->kartstuff[k_comebackmode] != 0 || player->kartstuff[k_comebacktimer]) + if (player->kartstuff[k_comebackmode] || player->kartstuff[k_comebacktimer]) return; - if (player->kartstuff[k_comebackmode] == 0) - player->kartstuff[k_comebackmode] = 2;*/ - return; + player->kartstuff[k_comebackmode] = 2; + } + else + { + K_DropItems(player); //K_StripItems(player); + K_StripOther(player); + player->kartstuff[k_itemroulette] = 1; + player->kartstuff[k_roulettetype] = 2; } { mobj_t *poof = P_SpawnMobj(special->x, special->y, special->z, MT_EXPLODE); S_StartSound(poof, special->info->deathsound); - K_DropItems(player); //K_StripItems(player); - K_StripOther(player); - player->kartstuff[k_itemroulette] = 1; - player->kartstuff[k_roulettetype] = 2; if (special->target && special->target->player && (G_RaceGametype() || special->target->player->kartstuff[k_bumper] > 0)) player->kartstuff[k_eggmanblame] = special->target->player-players; @@ -503,7 +503,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_RemoveMobj(special); return; } - break; case MT_KARMAHITBOX: if (!special->target->player) return; @@ -519,7 +518,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) || special->target->player->kartstuff[k_squishedtimer]) return; - if (special->target->player->kartstuff[k_comebackmode] == 0) + if (!special->target->player->kartstuff[k_comebackmode]) { if (player->kartstuff[k_growshrinktimer] || player->kartstuff[k_squishedtimer] || player->kartstuff[k_hyudorotimer] || player->kartstuff[k_spinouttimer] @@ -580,6 +579,36 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) player->kartstuff[k_itemroulette] = 1; player->kartstuff[k_roulettetype] = 1; } + else if (special->target->player->kartstuff[k_comebackmode] == 2 && P_CanPickupItem(player, 2)) + { + mobj_t *poof = P_SpawnMobj(special->x, special->y, special->z, MT_EXPLODE); + S_StartSound(poof, special->info->seesound); + + special->target->player->kartstuff[k_comebackmode] = 0; + special->target->player->kartstuff[k_comebackpoints]++; + + if (netgame && cv_hazardlog.value) + CONS_Printf(M_GetText("%s gave an \"item\" to %s.\n"), player_names[special->target->player-players], player_names[player-players]); + if (special->target->player->kartstuff[k_comebackpoints] >= 3) + K_StealBumper(special->target->player, player, true); + special->target->player->kartstuff[k_comebacktimer] = comebacktime; + + K_DropItems(player); //K_StripItems(player); + K_StripOther(player); + + player->kartstuff[k_itemroulette] = 1; + player->kartstuff[k_roulettetype] = 2; + + if (special->target->player->kartstuff[k_eggmanblame] >= 0 + && special->target->player->kartstuff[k_eggmanblame] < MAXPLAYERS + && playeringame[special->target->player->kartstuff[k_eggmanblame]] + && !players[special->target->player->kartstuff[k_eggmanblame]].spectator) + player->kartstuff[k_eggmanblame] = special->target->player->kartstuff[k_eggmanblame]; + else + player->kartstuff[k_eggmanblame] = -1; + + special->target->player->kartstuff[k_eggmanblame] = -1; + } return; // ***************************************** // diff --git a/src/p_mobj.c b/src/p_mobj.c index d400f013..ac5794ef 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8239,7 +8239,7 @@ void P_MobjThinker(mobj_t *mobj) return; case MT_MINEEXPLOSIONSOUND: if (mobj->health == 100) - S_StartSound(mobj, sfx_prloop); + S_StartSound(mobj, sfx_s3k4e); mobj->health--; break; case MT_BOOSTFLAME: @@ -8363,7 +8363,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->destscale = mobj->target->destscale; P_SetScale(mobj, mobj->target->scale); mobj->color = mobj->target->color; - mobj->colorized = (mobj->target->player->kartstuff[k_comebackmode] == 1); + mobj->colorized = (mobj->target->player->kartstuff[k_comebackmode]); if (mobj->target->player->kartstuff[k_comebacktimer] > 0) { @@ -8377,12 +8377,15 @@ void P_MobjThinker(mobj_t *mobj) } else { - if (mobj->target->player->kartstuff[k_comebackmode] == 0 + if (!mobj->target->player->kartstuff[k_comebackmode] && mobj->state != &states[mobj->info->spawnstate]) P_SetMobjState(mobj, mobj->info->spawnstate); else if (mobj->target->player->kartstuff[k_comebackmode] == 1 && mobj->state != &states[mobj->info->seestate]) P_SetMobjState(mobj, mobj->info->seestate); + else if (mobj->target->player->kartstuff[k_comebackmode] == 2 + && mobj->state != &states[mobj->info->painstate]) + P_SetMobjState(mobj, mobj->info->painstate); if (mobj->target->player->powers[pw_flashing] && (leveltime & 1)) mobj->flags2 |= MF2_DONTDRAW; @@ -8749,7 +8752,7 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s if (P_MobjWasRemoved(mobj)) return; } - else if (mobj->type == MT_RANDOMITEM && mobj->threshold == 69 && mobj->fuse <= TICRATE) + else if (((mobj->type == MT_RANDOMITEM && mobj->threshold == 69) || mobj->type == MT_FAKEITEM) && mobj->fuse <= TICRATE) mobj->flags2 ^= MF2_DONTDRAW; } From 76eebe6cf771c95a016c0e5c78c4cfc1b7e60a15 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 9 Oct 2018 21:09:39 +0100 Subject: [PATCH 2/5] If you hit a one-bumper person with a karma fake, you get to come back immediately! --- src/p_inter.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/p_inter.c b/src/p_inter.c index e6527f30..ca467933 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -592,6 +592,22 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) mobj_t *poof = P_SpawnMobj(special->x, special->y, special->z, MT_EXPLODE); S_StartSound(poof, special->info->seesound); + if (player->kartstuff[k_bumper] == 1) // If you have only one bumper left, and see if it's a 1v1 + { + INT32 numingame = 0; + INT32 i; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator || players[i].kartstuff[k_bumper] <= 0) + continue; + numingame++; + } + + if (numingame <= 2) // If so, then an extra two karma points so they are 100% certain to switch places; it's annoying to end matches with a fake kill + special->target->player->kartstuff[k_comebackpoints] += 2; + } + special->target->player->kartstuff[k_comebackmode] = 0; special->target->player->kartstuff[k_comebackpoints]++; From 66d00b7cc66b95996e10e5fd5577766407d4dae7 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 9 Oct 2018 22:24:44 +0100 Subject: [PATCH 3/5] HitEm sound for K_ExplodePlayer --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 427a780d..9f70f0f6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1924,6 +1924,9 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju return; } + if (source && source != player->mo && source->player) + K_PlayHitEmSound(source); + player->mo->momz = 18*(mapheaderinfo[gamemap-1]->mobj_scale); player->mo->momx = player->mo->momy = 0; From a8a1f1b4445c6ec08ca58a17478a98a2d1e304f6 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 9 Oct 2018 22:40:42 +0100 Subject: [PATCH 4/5] Spawn a poof if you get hit while karmegg. (I've moved the comebacktimer set into one level up from that conditional; don't worry, I checked - there's nowhere that accesses this field while you have bumpers, it's just always set here for some dastardly reason.) --- src/k_kart.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9f70f0f6..dbf8f796 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1796,11 +1796,20 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem K_CalculateBattleWanted(); } + if (!player->kartstuff[k_bumper]) + { + player->kartstuff[k_comebacktimer] = comebacktime; + if (player->kartstuff[k_comebackmode]) + { + 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_comebacktimer] = comebacktime; - player->kartstuff[k_spinouttype] = type; if (player->kartstuff[k_spinouttype] <= 0) @@ -1878,11 +1887,20 @@ void K_SquishPlayer(player_t *player, mobj_t *source) K_CalculateBattleWanted(); } + if (!player->kartstuff[k_bumper]) + { + player->kartstuff[k_comebacktimer] = comebacktime; + if (player->kartstuff[k_comebackmode]) + { + 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_comebacktimer] = comebacktime; - player->kartstuff[k_squishedtimer] = 2*TICRATE; player->powers[pw_flashing] = K_GetKartFlashing(player); @@ -1957,11 +1975,20 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju K_CalculateBattleWanted(); } + if (!player->kartstuff[k_bumper]) + { + player->kartstuff[k_comebacktimer] = comebacktime; + if (player->kartstuff[k_comebackmode]) + { + 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_comebacktimer] = comebacktime; - player->kartstuff[k_spinouttype] = 1; player->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); From e248cf9421979581ad205aa6f41f5328f9de8b27 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 9 Oct 2018 22:44:43 +0100 Subject: [PATCH 5/5] Sal's request --- src/k_kart.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index dbf8f796..89882425 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1799,7 +1799,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem if (!player->kartstuff[k_bumper]) { player->kartstuff[k_comebacktimer] = comebacktime; - if (player->kartstuff[k_comebackmode]) + 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); @@ -1890,7 +1890,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) if (!player->kartstuff[k_bumper]) { player->kartstuff[k_comebacktimer] = comebacktime; - if (player->kartstuff[k_comebackmode]) + 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); @@ -1978,7 +1978,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju if (!player->kartstuff[k_bumper]) { player->kartstuff[k_comebacktimer] = comebacktime; - if (player->kartstuff[k_comebackmode]) + 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);