From 9a822fae8046c6178dd6eedcd887f936756648fd Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 2 Nov 2017 20:43:03 -0400 Subject: [PATCH] Balloon stealing! Mushroom is back! --- src/info.c | 8 +-- src/k_kart.c | 94 ++++++++++++++++++++---------------- src/k_kart.h | 1 + src/p_inter.c | 4 +- src/p_mobj.c | 131 ++++++++++++++++++++++++++++++++++++-------------- 5 files changed, 154 insertions(+), 84 deletions(-) diff --git a/src/info.c b/src/info.c index c53af0a0..df9579f4 100644 --- a/src/info.c +++ b/src/info.c @@ -2708,9 +2708,9 @@ state_t states[NUMSTATES] = {SPR_SITR, 1, 5, {NULL}, 0, 0, S_SINKTRAIL3}, // S_SINKTRAIL2 {SPR_SITR, 2, 3, {NULL}, 0, 0, S_NULL}, // S_SINKTRAIL3 - {SPR_KBLN, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BATTLEBALLOON1}, // S_BATTLEBALLOON1 - {SPR_KBLN, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_BATTLEBALLOON2}, // S_BATTLEBALLOON2 - {SPR_KBLN, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BATTLEBALLOON3}, // S_BATTLEBALLOON3 + {SPR_KBLN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_BATTLEBALLOON1}, // S_BATTLEBALLOON1 + {SPR_KBLN, FF_FULLBRIGHT|1, -1, {NULL}, 0, 0, S_BATTLEBALLOON2}, // S_BATTLEBALLOON2 + {SPR_KBLN, FF_FULLBRIGHT|2, -1, {NULL}, 0, 0, S_BATTLEBALLOON3}, // S_BATTLEBALLOON3 {SPR_LAKI, 0, 64, {NULL}, 1, 0, S_LAKITU2}, // S_LAKITU1 {SPR_LAKI, 1, 35, {NULL}, 0, 0, S_NULL}, // S_LAKITU2 @@ -15155,7 +15155,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound - 5*FRACUNIT, // speed + 4*FRACUNIT, // speed 8*FRACUNIT, // radius 16*FRACUNIT, // height 0, // display offset diff --git a/src/k_kart.c b/src/k_kart.c index 3b267d9a..458357e3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -692,16 +692,16 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = //P-Odds 0 1 2 3 4 5 6 7 8 9 /*Magnet*/ { 0, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet /*Boo*/ { 0, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo - /*Mushroom*/ { 0, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom + /*Mushroom*/ { 5, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom /*Mega Mushroom*/ { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star /*Triple Banana*/ { 2, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana - /*Fake Item*/ { 6, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item - /*Banana*/ { 6, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Green Shell*/ { 6, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell + /*Fake Item*/ { 5, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item + /*Banana*/ { 5, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Green Shell*/ { 5, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell /*Red Shell*/ { 2, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell /*Triple Green Shell*/ { 2, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell /*Bob-omb*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb @@ -1184,6 +1184,12 @@ void K_KartBouncer(void) K_SwapMomentum(players[j].mo, players[i].mo, true); else K_SwapMomentum(players[i].mo, players[j].mo, false); + + if (players[i].kartstuff[k_mushroomtimer] && !(players[j].kartstuff[k_mushroomtimer])) + K_StealBalloon(&players[i], &players[j]); + else if (players[j].kartstuff[k_mushroomtimer] && !(players[i].kartstuff[k_mushroomtimer])) + K_StealBalloon(&players[j], &players[i]); + players[i].collide[j] = true; players[j].collide[i] = true; } @@ -1776,8 +1782,13 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju return; } -/*void K_StealBalloon(player_t *player, player_t *victim) +void K_StealBalloon(player_t *player, player_t *victim) { + INT32 newballoon; + angle_t newangle, diff; + fixed_t newx, newy; + mobj_t *newmo; + //(void) source; if (gametype == GT_RACE) return; @@ -1785,13 +1796,13 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju if (player->health <= 0 || victim->health <= 0) return; - if (player == victim) + if (victim->kartstuff[k_balloon] <= 0) // || player->kartstuff[k_balloon] >= cv_kartballoons.value+2 return; if ((player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) - || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootaketimer] > 0 || player->kartstuff[k_balloon] >= 3) + || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootaketimer] > 0) || (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinout] > 0) - || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootaketimer] > 0 || victim->kartstuff[k_balloon] <= 0)) + || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootaketimer] > 0)) return; victim->kartstuff[k_mushroomtimer] = 0; @@ -1799,31 +1810,30 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); + newballoon = player->kartstuff[k_balloon]; + newangle = player->mo->angle; + if (newballoon <= 1) + diff = 0; + else + diff = FixedAngle(360*FRACUNIT/newballoon); + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + + newmo = P_SpawnMobj(newx, newy, player->mo->z, MT_BATTLEBALLOON); + newmo->threshold = newballoon; + P_SetTarget(&newmo->tracer, victim->mo); + P_SetTarget(&newmo->target, player->mo); + newmo->angle = (diff * (newballoon-1)); + newmo->color = victim->skincolor; + + if (newballoon+1 <= 1) + P_SetMobjState(newmo, S_BATTLEBALLOON3); + else if (newballoon+1 == 2) + P_SetMobjState(newmo, S_BATTLEBALLOON2); + else + P_SetMobjState(newmo, S_BATTLEBALLOON1); + player->kartstuff[k_balloon]++; - - { - angle_t newangle, diff; - fixed_t newx; - fixed_t newy; - mobj_t *mo; - - newangle = player->mo->angle; - diff = FixedAngle(360*FRACUNIT/cv_kartballoons.value); - newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); - newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); - - mo = P_SpawnMobj(newx, newy, player->mo->z, MT_BATTLEBALLOON); - mo->threshold = 10; - P_SetTarget(&mo->target, player->mo); - P_SetTarget(&mo->tracer, victim->mo); - mo->angle = 0; - mo->color = player->mo->color; - if (player->mo->flags2 & MF2_DONTDRAW) - mo->flags2 |= MF2_DONTDRAW; - else - mo->flags2 &= ~MF2_DONTDRAW; - } - victim->kartstuff[k_balloon]--; if (victim->kartstuff[k_balloon] <= 0) @@ -1832,27 +1842,27 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju P_AddPlayerScore(player, 1); K_CheckBalloons(); - player->kartstuff[k_spinouttype] = 1; - player->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); - player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; + victim->kartstuff[k_spinouttype] = 1; + victim->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); + victim->kartstuff[k_spinout] = victim->kartstuff[k_spinouttimer]; - player->powers[pw_flashing] = flashingtics; + victim->powers[pw_flashing] = flashingtics; - if (!(player->mo->state >= &states[S_KART_SPIN1] && player->mo->state <= &states[S_KART_SPIN8])) - P_SetPlayerMobjState(player->mo, S_KART_SPIN1); + if (!(victim->mo->state >= &states[S_KART_SPIN1] && victim->mo->state <= &states[S_KART_SPIN8])) + P_SetPlayerMobjState(victim->mo, S_KART_SPIN1); - player->kartstuff[k_spinouttype] = 0; + victim->kartstuff[k_spinouttype] = 0; - P_PlayRinglossSound(player->mo); + P_PlayRinglossSound(victim->mo); - if (P_IsLocalPlayer(player)) + if (P_IsLocalPlayer(victim)) { quake.intensity = 64*FRACUNIT; quake.time = 5; } return; -}*/ +} 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) { diff --git a/src/k_kart.h b/src/k_kart.h index bf5a5387..6eb17fd7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -20,6 +20,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source); +void K_StealBalloon(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); void K_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); diff --git a/src/p_inter.c b/src/p_inter.c index d95e190a..6d8bdd54 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2019,8 +2019,8 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) target->target->player->kartstuff[k_triplebanana] &= ~2; else if (target->type == MT_TRIPLEBANANASHIELD3 && target->target->player->kartstuff[k_triplebanana] & 4) target->target->player->kartstuff[k_triplebanana] &= ~4; - else if (target->type == MT_BATTLEBALLOON && target->target->player->kartstuff[k_balloon] >= target->threshold) - target->target->player->kartstuff[k_triplebanana] = target->threshold-1; + /*else if (target->type == MT_BATTLEBALLOON && target->target->player->kartstuff[k_balloon] > target->threshold-1) + target->target->player->kartstuff[k_balloon] = target->threshold-1;*/ } // diff --git a/src/p_mobj.c b/src/p_mobj.c index 48e25a31..5950df38 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6582,28 +6582,21 @@ void P_MobjThinker(mobj_t *mobj) case MT_TRIPLEBANANASHIELD1: case MT_TRIPLEBANANASHIELD2: case MT_TRIPLEBANANASHIELD3: - case MT_BATTLEBALLOON: if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { fixed_t HEIGHT; - fixed_t radius = 56*mobj->target->scale; // mobj's distance from its Target, or Radius. + fixed_t radius; // mobj's distance from its Target, or Radius. if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) radius = 64*mobj->target->scale; - else if (mobj->type == MT_BATTLEBALLOON) - radius = 32*mobj->target->scale; else radius = 56*mobj->target->scale; //mobj->angle += FixedAngle(12*FRACUNIT); // mobj's actual speed. if (mobj->type == MT_TRIPLEGREENSHIELD1 || mobj->type == MT_TRIPLEGREENSHIELD2 || mobj->type == MT_TRIPLEGREENSHIELD3 - || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3 - || mobj->type == MT_BATTLEBALLOON) - if ((mobj->type == MT_BATTLEBALLOON) && !((mobj->target->player-players) & 1)) - mobj->angle -= FixedAngle(mobj->info->speed); - else - mobj->angle += FixedAngle(mobj->info->speed); + || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3) + mobj->angle += FixedAngle(mobj->info->speed); else if (mobj->type == MT_TRIPLEBANANASHIELD2) mobj->angle = (mobj->target->angle + ANGLE_135); else if (mobj->type == MT_TRIPLEBANANASHIELD3) @@ -6623,26 +6616,6 @@ void P_MobjThinker(mobj_t *mobj) HEIGHT = mobj->target->height / 5; } - if (mobj->type == MT_BATTLEBALLOON) - { - mobj->color = mobj->target->color; - - if (mobj->target->player->kartstuff[k_balloon] <= 1) - P_SetMobjState(mobj, S_BATTLEBALLOON3); - else if (mobj->target->player->kartstuff[k_balloon] == 2) - P_SetMobjState(mobj, S_BATTLEBALLOON2); - - if (mobj->target->flags2 & MF2_DONTDRAW) - mobj->flags2 |= MF2_DONTDRAW; - else - mobj->flags2 &= ~MF2_DONTDRAW; - - if (mobj->target->eflags & MFE_VERTICALFLIP) - HEIGHT += 4*FRACUNIT; - else - HEIGHT -= 4*FRACUNIT; - } - // Shrink your items if the player shrunk too. mobj->scale = mobj->target->scale; @@ -6669,8 +6642,90 @@ void P_MobjThinker(mobj_t *mobj) || (mobj->type == MT_TRIPLEBANANASHIELD2 && !(mobj->target->player->kartstuff[k_triplebanana] & 2)) || (mobj->type == MT_TRIPLEBANANASHIELD3 && !(mobj->target->player->kartstuff[k_triplebanana] & 4)) || (mobj->type == MT_BOMBSHIELD && !(mobj->target->player->kartstuff[k_bobomb] & 1)) - || (mobj->type == MT_FAKESHIELD && !(mobj->target->player->kartstuff[k_fakeitem] & 1)) - || (mobj->type == MT_BATTLEBALLOON && (mobj->target->player->kartstuff[k_balloon] <= mobj->threshold))) + || (mobj->type == MT_FAKESHIELD && !(mobj->target->player->kartstuff[k_fakeitem] & 1))) + { + P_RemoveMobj(mobj); + return; + } + } + else if ((mobj->health > 0 + && (!mobj->target || !mobj->target->player || !mobj->target->player->mo || mobj->target->player->health <= 0 || mobj->target->player->spectator)) + || (mobj->health <= 0 && mobj->z <= mobj->floorz) + || P_CheckDeathPitCollide(mobj)) // When in death state + { + P_RemoveMobj(mobj); + return; + } + break; + case MT_BATTLEBALLOON: + if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo + && mobj->target->player->health > 0 && !mobj->target->player->spectator) + { + fixed_t rad = 32*mobj->target->scale; + fixed_t offz; + angle_t ang, diff; + + if (!((mobj->target->player-players) & 1)) + ang = (FixedAngle(mobj->info->speed) * -1); + else + ang = FixedAngle(mobj->info->speed); + + if (mobj->target->player->kartstuff[k_balloon] <= 1) + diff = 0; + else + diff = FixedAngle(360*FRACUNIT/mobj->target->player->kartstuff[k_balloon]); + + ang = (ang*leveltime) + (diff * (mobj->threshold-1)); + + // If the player is on the ceiling, then flip your items as well. + if (mobj->target->eflags & MFE_VERTICALFLIP) + { + mobj->eflags |= MFE_VERTICALFLIP; + offz = mobj->target->height / 2; + } + else + { + mobj->eflags &= ~MFE_VERTICALFLIP; + offz = mobj->target->height / 5; + } + + if (mobj->target->flags2 & MF2_DONTDRAW) + mobj->flags2 |= MF2_DONTDRAW; + else + mobj->flags2 &= ~MF2_DONTDRAW; + + if (mobj->target->eflags & MFE_VERTICALFLIP) + offz += 4*FRACUNIT; + else + offz -= 4*FRACUNIT; + + if (mobj->tracer && mobj->tracer->player && mobj->tracer->player->mo + && mobj->tracer->player->health > 0 && !mobj->tracer->player->spectator) // STOLEN + mobj->color = mobj->tracer->player->skincolor; // don't do star flashing for stolen balloons + else + mobj->color = mobj->target->color; // but do so if it belongs to you :B + + if (mobj->target->player->kartstuff[k_balloon] <= 1) + P_SetMobjState(mobj, S_BATTLEBALLOON3); + else if (mobj->target->player->kartstuff[k_balloon] == 2) + P_SetMobjState(mobj, S_BATTLEBALLOON2); + else + P_SetMobjState(mobj, S_BATTLEBALLOON1); + + // Shrink your items if the player shrunk too. + mobj->scale = mobj->target->scale; + + P_UnsetThingPosition(mobj); + { + const angle_t fa = ang>>ANGLETOFINESHIFT; + mobj->x = mobj->target->x + FixedMul(FINECOSINE(fa), rad); + mobj->y = mobj->target->y + FixedMul(FINESINE(fa), rad); + mobj->z = mobj->target->z + offz; + P_SetThingPosition(mobj); + } + + // Was this so hard? + if (mobj->target->player->kartstuff[k_balloon] <= mobj->threshold) { P_RemoveMobj(mobj); return; @@ -9400,7 +9455,7 @@ void P_SpawnPlayer(INT32 playernum) overheadarrow->flags2 |= MF2_DONTDRAW; P_SetScale(overheadarrow, mobj->destscale); - if (gametype != GT_RACE && (leveltime < 1 || p->kartstuff[k_balloon] > 0)) // srb2kart + if (gametype != GT_RACE && ((leveltime < 1 || D_NumPlayers() <= 1) || p->kartstuff[k_balloon] > 0)) // srb2kart { INT32 i; angle_t newangle, diff; @@ -9408,15 +9463,19 @@ void P_SpawnPlayer(INT32 playernum) fixed_t newy; mobj_t *mo; - if (leveltime < 1) // Start of the map? + if (leveltime < 1 || D_NumPlayers() <= 1) // Start of the map? p->kartstuff[k_balloon] = cv_kartballoons.value; // Reset those balloons! + if (p->kartstuff[k_balloon] <= 1) + diff = 0; + else + diff = FixedAngle(360*FRACUNIT/p->kartstuff[k_balloon]); + newangle = mobj->angle; - diff = FixedAngle(360*FRACUNIT/cv_kartballoons.value); newx = mobj->x + P_ReturnThrustX(mobj, newangle + ANGLE_180, 64*FRACUNIT); newy = mobj->y + P_ReturnThrustY(mobj, newangle + ANGLE_180, 64*FRACUNIT); - for (i = 0; i < cv_kartballoons.value; i++) + for (i = 0; i < p->kartstuff[k_balloon]; i++) { mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON); mo->threshold = i;