diff --git a/src/dehacked.c b/src/dehacked.c index 27fa61e70..3e113072a 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6598,6 +6598,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAYERARROW_ROULETTE", "S_PLAYERBOMB", // Player bomb overlay + "S_PLAYERITEM", // Player item overlay "S_PLAYERBOMB_WHEEL", #ifdef SEENAMES diff --git a/src/info.c b/src/info.c index f7b6fed7c..4a75ac2c0 100644 --- a/src/info.c +++ b/src/info.c @@ -2907,7 +2907,8 @@ state_t states[NUMSTATES] = {SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE {SPR_PBOM, FF_ANIMATE, -1, {NULL}, 3, 3, S_NULL}, // S_PLAYERBOMB - {SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERBOMB_WHEEL + {SPR_RNDM, FF_ANIMATE, -1, {NULL}, 23, 3, S_NULL}, // S_PLAYERITEM + {SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERWHEEL #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK diff --git a/src/info.h b/src/info.h index c8e6758a2..f619b5984 100644 --- a/src/info.h +++ b/src/info.h @@ -3430,7 +3430,8 @@ typedef enum state S_PLAYERARROW_ROULETTE, S_PLAYERBOMB, - S_PLAYERBOMB_WHEEL, + S_PLAYERITEM, + S_PLAYERWHEEL, #ifdef SEENAMES S_NAMECHECK, diff --git a/src/k_kart.c b/src/k_kart.c index 4f04f46a2..ceee25f2e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3266,6 +3266,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_comebacktimer] > 0) { + if (player->mo->tracer->state != &states[S_PLAYERBOMB]) + P_SetMobjState(player->mo->tracer, S_PLAYERBOMB); + if (player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1)) player->mo->tracer->flags2 &= ~MF2_DONTDRAW; else @@ -3273,15 +3276,23 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; } - else if (player->kartstuff[k_comebackmode] != 0) - player->mo->tracer->flags2 |= MF2_DONTDRAW; else + { + if (player->kartstuff[k_comebackmode] == 0 + && player->mo->tracer->state != &states[S_PLAYERBOMB]) + P_SetMobjState(player->mo->tracer, S_PLAYERBOMB); + else if (player->kartstuff[k_comebackmode] == 1 + && player->mo->tracer->state != &states[S_PLAYERITEM]) + P_SetMobjState(player->mo->tracer, S_PLAYERITEM); player->mo->tracer->flags2 &= ~MF2_DONTDRAW; + } } else if (G_RaceGametype() || player->kartstuff[k_balloon] > 0) { player->mo->flags2 &= ~MF2_SHADOW; - if (player->mo->tracer && player->mo->tracer->state == &states[S_PLAYERBOMB]) + if (player->mo->tracer + && (player->mo->tracer->state == &states[S_PLAYERBOMB] + || player->mo->tracer->state == &states[S_PLAYERITEM])) P_RemoveMobj(player->mo->tracer); } } diff --git a/src/p_enemy.c b/src/p_enemy.c index 788cafa15..b84866835 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3632,8 +3632,6 @@ void A_AttractChase(mobj_t *actor) || !P_CheckSight(actor, actor->tracer)) // You have to be able to SEE it...sorta { // Lost attracted rings don't through walls anymore. - if (actor->tracer && actor->tracer->player) - actor->tracer->player->kartstuff[k_comebackmode] = 0; actor->flags &= ~MF_NOCLIP; P_SetTarget(&actor->tracer, NULL); return; @@ -8145,7 +8143,8 @@ void A_ItemPop(mobj_t *actor) if (actor->info->deathsound) S_StartSound(remains, actor->info->deathsound); - actor->target->player->kartstuff[k_itemroulette] = 1; + if (!(G_BattleGametype() && actor->target->player->kartstuff[k_balloon] <= 0)) + actor->target->player->kartstuff[k_itemroulette] = 1; remains->flags2 &= ~MF2_AMBUSH; diff --git a/src/p_inter.c b/src/p_inter.c index e24a3ddff..d77940dc4 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -158,8 +158,8 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) //if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics) // return false; - if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) // No balloons in Match - return false; + /*if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) // No balloons in Match + return false;*/ if (player->kartstuff[k_bootaketimer] || player->kartstuff[k_boostolentimer] || player->kartstuff[k_growshrinktimer] > 1 || player->kartstuff[k_goldshroomtimer]) // Item-specific timer going off @@ -414,34 +414,15 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) switch (special->type) { case MT_RANDOMITEM: // SRB2kart + if (!P_CanPickupItem(player, false)) + return; + if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) { - if (player->kartstuff[k_comebackmode] == 0 && !player->kartstuff[k_comebacktimer]) - { - if (special->tracer) - return; - P_SetTarget(&special->tracer, toucher); + if (player->kartstuff[k_comebackmode] == 1 || player->kartstuff[k_comebacktimer]) + return; + if (player->kartstuff[k_comebackmode] == 0) player->kartstuff[k_comebackmode] = 1; - } - return; - } - - if (!P_CanPickupItem(player, false) && special->tracer != toucher) - return; - - if (G_BattleGametype() && special->tracer && special->tracer->player) - { - special->tracer->player->kartstuff[k_comebackmode] = 0; - - special->tracer->player->kartstuff[k_comebackpoints]++; - - if (netgame && cv_hazardlog.value) - CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[special->tracer->player-players], player_names[player-players]); - - if (special->tracer->player->kartstuff[k_comebackpoints] >= 3) - K_StealBalloon(special->tracer->player, player, true); - - special->tracer->player->kartstuff[k_comebacktimer] = comebacktime; } special->momx = special->momy = special->momz = 0; @@ -2128,7 +2109,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) { P_SetTarget(&target->target, source); source->player->numboxes++; - if ((cv_itemrespawn.value && gametype != GT_COOP && (modifiedgame || netgame || multiplayer))) + if (cv_itemrespawn.value && (netgame || multiplayer)) { target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation } diff --git a/src/p_map.c b/src/p_map.c index 15b8f7d8f..6935be9d1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1653,33 +1653,60 @@ static boolean PIT_CheckThing(mobj_t *thing) || thing->player->kartstuff[k_bootimer] || thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped] || (G_BattleGametype() && (thing->player->kartstuff[k_balloon] <= 0 - && (thing->player->kartstuff[k_comebacktimer] || thing->player->kartstuff[k_comebackmode] == 1))) + && (thing->player->kartstuff[k_comebacktimer]))) || tmthing->player->kartstuff[k_growshrinktimer] || tmthing->player->kartstuff[k_squishedtimer] || tmthing->player->kartstuff[k_bootimer] || tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped] || (G_BattleGametype() && (tmthing->player->kartstuff[k_balloon] <= 0 - && (tmthing->player->kartstuff[k_comebacktimer] || tmthing->player->kartstuff[k_comebackmode] == 1)))) + && (tmthing->player->kartstuff[k_comebacktimer])))) { return true; } if (G_BattleGametype()) { - if ((thing->player->kartstuff[k_balloon] <= 0 && thing->player->kartstuff[k_comebackmode] == 0) - || (tmthing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_comebackmode] == 0)) + if (thing->player->kartstuff[k_balloon] <= 0 || tmthing->player->kartstuff[k_balloon] <= 0) { - if (tmthing->player->kartstuff[k_balloon] > 0) + if (thing->player->kartstuff[k_comebackmode] == 0 + && tmthing->player->kartstuff[k_balloon] > 0) { K_ExplodePlayer(tmthing->player, thing); thing->player->kartstuff[k_comebacktimer] = comebacktime; return true; } - else if (thing->player->kartstuff[k_balloon] > 0) + else if (tmthing->player->kartstuff[k_comebackmode] == 0 + && thing->player->kartstuff[k_balloon] > 0) { K_ExplodePlayer(thing->player, tmthing); tmthing->player->kartstuff[k_comebacktimer] = comebacktime; return true; } + else if (thing->player->kartstuff[k_comebackmode] == 1 + && tmthing->player->kartstuff[k_balloon] > 0) + { + thing->player->kartstuff[k_comebackmode] = 0; + thing->player->kartstuff[k_comebackpoints]++; + if (netgame && cv_hazardlog.value) + CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[thing->player-players], player_names[tmthing->player-players]); + tmthing->player->kartstuff[k_itemroulette] = 1; + if (thing->player->kartstuff[k_comebackpoints] >= 3) + K_StealBalloon(thing->player, tmthing->player, true); + thing->player->kartstuff[k_comebacktimer] = comebacktime; + return true; + } + else if (tmthing->player->kartstuff[k_comebackmode] == 1 + && thing->player->kartstuff[k_balloon] > 0) + { + tmthing->player->kartstuff[k_comebackmode] = 0; + tmthing->player->kartstuff[k_comebackpoints]++; + if (netgame && cv_hazardlog.value) + CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[tmthing->player-players], player_names[thing->player-players]); + thing->player->kartstuff[k_itemroulette] = 1; + if (tmthing->player->kartstuff[k_comebackpoints] >= 3) + K_StealBalloon(tmthing->player, thing->player, true); + tmthing->player->kartstuff[k_comebacktimer] = comebacktime; + return true; + } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 353f78443..6374c407f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5969,13 +5969,6 @@ void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on y if (!dest || dest->health <= 0 || !dest->player || !source->tracer) return; - if (dest->player && dest->player->kartstuff[k_comebackmode] == 1) - { - P_TeleportMove(source, dest->x+dest->momx, dest->y+dest->momy, dest->z+dest->momz); - source->angle = dest->angle; - return; - } - // change angle source->angle = R_PointToAngle2(source->x, source->y, tx, ty); @@ -8282,6 +8275,12 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s P_RemoveMobj(mobj); // make sure they disappear return; case MT_RANDOMITEM: + if (G_BattleGametype() && numgotboxes < (4*nummapboxes/5)) + { + mobj->fuse = 2; + break; + } + numgotboxes = 0; // Respawn from mapthing if you have one! if (mobj->spawnpoint) { diff --git a/src/p_setup.c b/src/p_setup.c index 4cecb9414..1986380da 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -991,7 +991,7 @@ static void P_LoadThings(void) || mt->type == 1702) // MT_AXISTRANSFERLINE continue; // These were already spawned - if (mt->type == MT_RANDOMITEM) // MT_RANDOMITEM + if (mt->type == mobjinfo[MT_RANDOMITEM].doomednum) nummapboxes++; mt->mobj = NULL;