From cc01d2c3f02274184c25b6094fdb509ad59bbde5 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 1 Nov 2017 18:46:35 -0400 Subject: [PATCH] Balloon revamp Supports arbitrary balloon counts now --- src/d_netcmd.c | 3 +- src/d_netcmd.h | 1 + src/dehacked.c | 6 +-- src/info.c | 110 +------------------------------------- src/info.h | 6 +-- src/k_kart.c | 142 +++++++++++++++++++++++++++++++++---------------- src/p_inter.c | 30 ++++------- src/p_mobj.c | 119 +++++++---------------------------------- 8 files changed, 132 insertions(+), 285 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5a83d4f6..8f4e63aa 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -316,8 +316,9 @@ consvar_t cv_lightning = {"lightning", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {5, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {99, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t speedometer_cons_t[] = {{0, "Off"}, {1, "Kilometers"}, {2, "Miles"}, {3, "Fracunits"}, {0, NULL}}; consvar_t cv_speedometer = {"speedometer", "Kilometers", CV_SAVE, speedometer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // use tics in display diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 25a9ee89..75d3a0ba 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -107,6 +107,7 @@ extern consvar_t cv_blueshell, cv_jaws, cv_fireflower, cv_tripleredshell, cv_lig extern consvar_t cv_karthud; extern consvar_t cv_kartcc; extern consvar_t cv_kartballoons; +extern consvar_t cv_kartfrantic; extern consvar_t cv_speedometer; extern consvar_t cv_collideminimum; diff --git a/src/dehacked.c b/src/dehacked.c index 4c04a8d5..dba84072 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6985,11 +6985,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_SINK", // Kitchen Sink Stuff "MT_SINKTRAIL", - "MT_BATTLEBALLOON1", // Battle Mode balloon stuff - "MT_BATTLEBALLOON2", - "MT_BATTLEBALLOON3", - "MT_BATTLEBALLOON4", - "MT_BATTLEBALLOON5", + "MT_BATTLEBALLOON", // Battle Mode balloon "MT_LAKITU", diff --git a/src/info.c b/src/info.c index b72a5eae..c53af0a0 100644 --- a/src/info.c +++ b/src/info.c @@ -15139,115 +15139,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_BATTLEBALLOON1 - -1, // doomednum - S_BATTLEBALLOON1,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate - }, - - { // MT_BATTLEBALLOON2 - -1, // doomednum - S_BATTLEBALLOON1,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate - }, - - { // MT_BATTLEBALLOON3 - -1, // doomednum - S_BATTLEBALLOON1,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate - }, - - { // MT_BATTLEBALLOON4 - -1, // doomednum - S_BATTLEBALLOON1,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate - }, - - { // MT_BATTLEBALLOON5 + { // MT_BATTLEBALLOON -1, // doomednum S_BATTLEBALLOON1,// spawnstate 1000, // spawnhealth diff --git a/src/info.h b/src/info.h index 55cc83a9..f701c5fb 100644 --- a/src/info.h +++ b/src/info.h @@ -3977,11 +3977,7 @@ typedef enum mobj_type MT_SINK, // Kitchen Sink Stuff MT_SINKTRAIL, - MT_BATTLEBALLOON1, // Battle Mode balloons - MT_BATTLEBALLOON2, - MT_BATTLEBALLOON3, - MT_BATTLEBALLOON4, - MT_BATTLEBALLOON5, + MT_BATTLEBALLOON, // Battle Mode balloons MT_LAKITU, diff --git a/src/k_kart.c b/src/k_kart.c index ab4a073f..7473f87b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -303,6 +303,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartcc); CV_RegisterVar(&cv_kartballoons); + CV_RegisterVar(&cv_kartfrantic); CV_RegisterVar(&cv_speedometer); CV_RegisterVar(&cv_collideminimum); CV_RegisterVar(&cv_collidesoundnum); @@ -987,6 +988,12 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) player->kartstuff[k_itemclose] = 0; // Reset the item window closer. + if (cv_kartfrantic.value) // Stupid items + { + pdis = (13*pdis/14); // multiply... + pdis += distvar; // then set everyone back another place... + } + if (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF) useodds = 0; // Battle Mode @@ -1636,23 +1643,12 @@ void K_SpinPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH) + if (gametype != GT_RACE) { - if (player->kartstuff[k_balloon] & 16) - player->kartstuff[k_balloon] &= ~16; - else if (player->kartstuff[k_balloon] & 8) - player->kartstuff[k_balloon] &= ~8; - else if (player->kartstuff[k_balloon] & 4) - player->kartstuff[k_balloon] &= ~4; - else if (player->kartstuff[k_balloon] & 2) - player->kartstuff[k_balloon] &= ~2; - else if (player->kartstuff[k_balloon] & 1) - { - player->kartstuff[k_balloon] &= ~1; + player->kartstuff[k_balloon]--; + + if (player->kartstuff[k_balloon] <= 0) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); - //P_DamageMobj(player->mo, NULL, NULL, 10000); - //return; - } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1701,23 +1697,12 @@ void K_SquishPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH) + if (gametype != GT_RACE) { - if (player->kartstuff[k_balloon] & 16) - player->kartstuff[k_balloon] &= ~16; - else if (player->kartstuff[k_balloon] & 8) - player->kartstuff[k_balloon] &= ~8; - else if (player->kartstuff[k_balloon] & 4) - player->kartstuff[k_balloon] &= ~4; - else if (player->kartstuff[k_balloon] & 2) - player->kartstuff[k_balloon] &= ~2; - else if (player->kartstuff[k_balloon] & 1) - { - player->kartstuff[k_balloon] &= ~1; + player->kartstuff[k_balloon]--; + + if (player->kartstuff[k_balloon] <= 0) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); - //P_DamageMobj(player->mo, NULL, NULL, 10000); - //return; - } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1755,23 +1740,12 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH) + if (gametype != GT_RACE) { - if (player->kartstuff[k_balloon] & 16) - player->kartstuff[k_balloon] &= ~16; - else if (player->kartstuff[k_balloon] & 8) - player->kartstuff[k_balloon] &= ~8; - else if (player->kartstuff[k_balloon] & 4) - player->kartstuff[k_balloon] &= ~4; - else if (player->kartstuff[k_balloon] & 2) - player->kartstuff[k_balloon] &= ~2; - else if (player->kartstuff[k_balloon] & 1) - { - player->kartstuff[k_balloon] &= ~1; + player->kartstuff[k_balloon]--; + + if (player->kartstuff[k_balloon] <= 0) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); - //P_DamageMobj(player->mo, NULL, NULL, 10000); - //return; - } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1801,6 +1775,84 @@ 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) source; + if (gametype == GT_RACE) + return; + + if (player->health <= 0 || victim->health <= 0) + return; + + if (player == victim) + 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) + || (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)) + return; + + victim->kartstuff[k_mushroomtimer] = 0; + victim->kartstuff[k_driftboost] = 0; + + CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); + + 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) + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[victim-players]); + + 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]; + + player->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); + + player->kartstuff[k_spinouttype] = 0; + + P_PlayRinglossSound(player->mo); + + if (P_IsLocalPlayer(player)) + { + 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) { mobj_t *mobj; diff --git a/src/p_inter.c b/src/p_inter.c index 5658a131..d95e190a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2019,16 +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_BATTLEBALLOON1 && target->target->player->kartstuff[k_balloon] & 1) - target->target->player->kartstuff[k_balloon] &= ~1; - else if (target->type == MT_BATTLEBALLOON2 && target->target->player->kartstuff[k_balloon] & 2) - target->target->player->kartstuff[k_balloon] &= ~2; - else if (target->type == MT_BATTLEBALLOON3 && target->target->player->kartstuff[k_balloon] & 4) - target->target->player->kartstuff[k_balloon] &= ~4; - else if (target->type == MT_BATTLEBALLOON4 && target->target->player->kartstuff[k_balloon] & 8) - target->target->player->kartstuff[k_balloon] &= ~8; - else if (target->type == MT_BATTLEBALLOON5 && target->target->player->kartstuff[k_balloon] & 16) - target->target->player->kartstuff[k_balloon] &= ~16; + else if (target->type == MT_BATTLEBALLOON && target->target->player->kartstuff[k_balloon] >= target->threshold) + target->target->player->kartstuff[k_triplebanana] = target->threshold-1; } // @@ -2751,18 +2743,14 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) HU_DoCEcho(va("%s\\is no longer super.\\\\\\\\", player_names[player-players])); }*/ - if (player->kartstuff[k_balloon]) + if (gametype != GT_RACE) { - if (player->kartstuff[k_balloon] & 16) - player->kartstuff[k_balloon] &= ~16; - else if (player->kartstuff[k_balloon] & 8) - player->kartstuff[k_balloon] &= ~8; - else if (player->kartstuff[k_balloon] & 4) - player->kartstuff[k_balloon] &= ~4; - else if (player->kartstuff[k_balloon] & 2) - player->kartstuff[k_balloon] &= ~2; - else if (player->kartstuff[k_balloon] & 1) - player->kartstuff[k_balloon] &= ~1; + player->kartstuff[k_balloon]--; + + if (player->kartstuff[k_balloon] <= 0) + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + + K_CheckBalloons(); } } diff --git a/src/p_mobj.c b/src/p_mobj.c index ffce0300..48e25a31 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6582,11 +6582,7 @@ void P_MobjThinker(mobj_t *mobj) case MT_TRIPLEBANANASHIELD1: case MT_TRIPLEBANANASHIELD2: case MT_TRIPLEBANANASHIELD3: - case MT_BATTLEBALLOON1: - case MT_BATTLEBALLOON2: - case MT_BATTLEBALLOON3: - case MT_BATTLEBALLOON4: - case MT_BATTLEBALLOON5: + 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) { @@ -6595,7 +6591,7 @@ void P_MobjThinker(mobj_t *mobj) 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_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + else if (mobj->type == MT_BATTLEBALLOON) radius = 32*mobj->target->scale; else radius = 56*mobj->target->scale; @@ -6603,10 +6599,8 @@ void P_MobjThinker(mobj_t *mobj) //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_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) - if ((mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) && !((mobj->target->player-players) & 1)) + || 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); @@ -6629,14 +6623,13 @@ void P_MobjThinker(mobj_t *mobj) HEIGHT = mobj->target->height / 5; } - if (mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + if (mobj->type == MT_BATTLEBALLOON) { mobj->color = mobj->target->color; - if (!(mobj->target->player->kartstuff[k_balloon] & 2)) + if (mobj->target->player->kartstuff[k_balloon] <= 1) P_SetMobjState(mobj, S_BATTLEBALLOON3); - else if (!(mobj->target->player->kartstuff[k_balloon] & 4)) + else if (mobj->target->player->kartstuff[k_balloon] == 2) P_SetMobjState(mobj, S_BATTLEBALLOON2); if (mobj->target->flags2 & MF2_DONTDRAW) @@ -6677,11 +6670,7 @@ void P_MobjThinker(mobj_t *mobj) || (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_BATTLEBALLOON1 && !(mobj->target->player->kartstuff[k_balloon] & 1)) - || (mobj->type == MT_BATTLEBALLOON2 && !(mobj->target->player->kartstuff[k_balloon] & 2)) - || (mobj->type == MT_BATTLEBALLOON3 && !(mobj->target->player->kartstuff[k_balloon] & 4)) - || (mobj->type == MT_BATTLEBALLOON4 && !(mobj->target->player->kartstuff[k_balloon] & 8)) - || (mobj->type == MT_BATTLEBALLOON5 && !(mobj->target->player->kartstuff[k_balloon] & 16))) + || (mobj->type == MT_BATTLEBALLOON && (mobj->target->player->kartstuff[k_balloon] <= mobj->threshold))) { P_RemoveMobj(mobj); return; @@ -8555,8 +8544,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_TRIPLEGREENSHIELD1: case MT_TRIPLEGREENSHIELD2: case MT_TRIPLEGREENSHIELD3: case MT_REDITEM: case MT_REDSHIELD: case MT_REDITEMDUD: case MT_TRIPLEREDSHIELD1: case MT_TRIPLEREDSHIELD2: case MT_TRIPLEREDSHIELD3: - case MT_BATTLEBALLOON1: case MT_BATTLEBALLOON2: case MT_BATTLEBALLOON3: - case MT_BATTLEBALLOON4: case MT_BATTLEBALLOON5: case MT_FIREBALL: + case MT_BATTLEBALLOON: case MT_FIREBALL: case MT_FAKEITEM: case MT_FAKESHIELD: case MT_BOMBITEM: case MT_BOMBSHIELD: P_SpawnShadowMobj(mobj); @@ -9414,98 +9402,31 @@ void P_SpawnPlayer(INT32 playernum) if (gametype != GT_RACE && (leveltime < 1 || p->kartstuff[k_balloon] > 0)) // srb2kart { + INT32 i; angle_t newangle, diff; fixed_t newx; fixed_t newy; - mobj_t *mo, *mo2, *mo3, *mo4, *mo5; + mobj_t *mo; if (leveltime < 1) // Start of the map? - { - p->kartstuff[k_balloon] = 0; // Reset those balloons! - switch (cv_kartballoons.value) - { - case 5: - p->kartstuff[k_balloon] |= 0x16; - case 4: // Fallthru's are intentional - p->kartstuff[k_balloon] |= 0x08; - case 3: - p->kartstuff[k_balloon] |= 0x04; - case 2: - p->kartstuff[k_balloon] |= 0x02; - case 1: - p->kartstuff[k_balloon] |= 0x01; - break; - default: - p->kartstuff[k_balloon] = 0x01|0x02|0x04; // 3 balloons - break; - } - } + p->kartstuff[k_balloon] = cv_kartballoons.value; // Reset those balloons! 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); - mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON1); - mo->threshold = 10; - P_SetTarget(&mo->target, mobj); - mo->angle = 0; - mo->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo->flags2 |= MF2_DONTDRAW; - else - mo->flags2 &= ~MF2_DONTDRAW; - - if (p->kartstuff[k_balloon] & 2) + for (i = 0; i < cv_kartballoons.value; i++) { - mo2 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON2); - mo2->threshold = 10; - P_SetTarget(&mo2->target, mobj); - mo2->angle = diff; - mo2->color = mobj->color; + mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON); + mo->threshold = i; + P_SetTarget(&mo->target, mobj); + mo->angle = (diff * (i-1)); + mo->color = mobj->color; if (mobj->flags2 & MF2_DONTDRAW) - mo2->flags2 |= MF2_DONTDRAW; + mo->flags2 |= MF2_DONTDRAW; else - mo2->flags2 &= ~MF2_DONTDRAW; - } - - if (p->kartstuff[k_balloon] & 4) - { - mo3 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON3); - mo3->threshold = 10; - P_SetTarget(&mo3->target, mobj); - mo3->angle = diff*2; - mo3->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo3->flags2 |= MF2_DONTDRAW; - else - mo3->flags2 &= ~MF2_DONTDRAW; - } - - if (p->kartstuff[k_balloon] & 8) - { - mo4 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON4); - mo4->threshold = 10; - P_SetTarget(&mo4->target, mobj); - mo4->angle = diff*3; - mo4->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo4->flags2 |= MF2_DONTDRAW; - else - mo4->flags2 &= ~MF2_DONTDRAW; - } - - if (p->kartstuff[k_balloon] & 16) - { - mo5 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON5); - mo5->threshold = 10; - P_SetTarget(&mo5->target, mobj); - mo5->angle = diff*4; - mo5->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo5->flags2 |= MF2_DONTDRAW; - else - mo5->flags2 &= ~MF2_DONTDRAW; + mo->flags2 &= ~MF2_DONTDRAW; } } }