From b36fd5c5f96ae73da91bab203a579162f491c00b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 22 Oct 2017 17:26:43 -0400 Subject: [PATCH] Did you know: Battle Mode - Different sizes for the balloons, depending on how many you have - Balloons are fullbright, cast shadows, and stick closer to players - Mega Mushrooms can now appear - Can steal items with Boo in Battle Mode now, as intended - Death pits make you lose only 1 balloon - Balloons disappear properly if you use Boo - Boo item icon should no longer appear if you're out of balloons - You can now properly respawn in Battle Mode - Can no longer collide with items if you are already holding one --- src/dehacked.c | 4 +- src/g_game.c | 6 +- src/info.c | 234 +++++++++++++++++++++++++------------------------ src/info.h | 4 +- src/k_kart.c | 121 +++++++++++++------------ src/p_inter.c | 56 ++++++++++-- src/p_mobj.c | 108 ++++++++++++++++------- src/p_spec.c | 4 +- src/p_user.c | 24 +++-- 9 files changed, 327 insertions(+), 234 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 54c07bb7..f482eec9 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6382,7 +6382,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_SINKTRAIL3", // Battle Mode balloon - "S_BATTLEBALLOON", + "S_BATTLEBALLOON1", + "S_BATTLEBALLOON2", + "S_BATTLEBALLOON3", // Pokey "S_POKEY1", diff --git a/src/g_game.c b/src/g_game.c index effd2127..d73e90d0 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2188,6 +2188,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart INT32 starpostwp; INT32 offroad; + INT32 balloon; score = players[player].score; lives = players[player].lives; @@ -2242,6 +2243,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart starpostwp = players[player].kartstuff[k_starpostwp]; offroad = players[player].kartstuff[k_offroad]; + balloon = players[player].kartstuff[k_balloon]; p = &players[player]; memset(p, 0, sizeof (*p)); @@ -2297,6 +2299,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync p->kartstuff[k_offroad] = offroad; + p->kartstuff[k_balloon] = balloon; // Don't do anything immediately p->pflags |= PF_USEDOWN; @@ -2801,7 +2804,8 @@ boolean G_GametypeHasTeams(void) // boolean G_GametypeHasSpectators(void) { - return (gametype != GT_COOP && gametype != GT_COMPETITION && gametype != GT_RACE); + return (gametype != GT_COOP && gametype != GT_COMPETITION && gametype != GT_RACE + && gametype != GT_MATCH); // srb2kart: temporary? } // diff --git a/src/info.c b/src/info.c index 264cf574..0ac52481 100644 --- a/src/info.c +++ b/src/info.c @@ -2718,7 +2718,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, 0, 1, {NULL}, 0, 0, S_BATTLEBALLOON}, // S_BATTLEBALLOON + {SPR_KBLN, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BATTLEBALLOON1}, // S_BATTLEBALLOON1 + {SPR_KBLN, 1|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BATTLEBALLOON2}, // S_BATTLEBALLOON2 + {SPR_KBLN, 2|FF_FULLBRIGHT, 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 @@ -15136,138 +15138,138 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = }, { // MT_BATTLEBALLOON1 - -1, // doomednum - S_BATTLEBALLOON,// 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 - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -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 + S_NULL // raisestate }, { // MT_BATTLEBALLOON2 - -1, // doomednum - S_BATTLEBALLOON,// 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 - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -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 + S_NULL // raisestate }, { // MT_BATTLEBALLOON3 - -1, // doomednum - S_BATTLEBALLOON,// 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 - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -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 + S_NULL // raisestate }, { // MT_BATTLEBALLOON4 - -1, // doomednum - S_BATTLEBALLOON,// 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 - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -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 + S_NULL // raisestate }, { // MT_BATTLEBALLOON5 - -1, // doomednum - S_BATTLEBALLOON,// 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 - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -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 + S_NULL // raisestate }, { // MT_LAKITU diff --git a/src/info.h b/src/info.h index ba016069..fc996cd4 100644 --- a/src/info.h +++ b/src/info.h @@ -3225,7 +3225,9 @@ typedef enum state S_SINKTRAIL3, // Battle Mode balloons - S_BATTLEBALLOON, + S_BATTLEBALLOON1, + S_BATTLEBALLOON2, + S_BATTLEBALLOON3, // Lakitu S_LAKITU1, diff --git a/src/k_kart.c b/src/k_kart.c index f653b0db..e59df3ee 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -685,7 +685,7 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = /*Boo*/ { 1, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo /*Mushroom*/ { 1, 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*/ { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega 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 @@ -1633,8 +1633,8 @@ void K_SpinPlayer(player_t *player, mobj_t *source) //return; } - if (source && source->player) - source->player->score++; + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); K_CheckBalloons(); } @@ -1697,8 +1697,8 @@ void K_SquishPlayer(player_t *player, mobj_t *source) //return; } - if (source && source->player) - source->player->score++; + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); K_CheckBalloons(); } @@ -1750,8 +1750,8 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju //return; } - if (source && source->player) - source->player->score++; + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); K_CheckBalloons(); } @@ -2156,15 +2156,15 @@ static void K_DoBooSteal(player_t *player) INT32 stealplayer = 0; // The player that's getting stolen from INT32 prandom = 0; - if (!multiplayer) + if (!multiplayer || (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0)) return; for (i = 0; i < MAXPLAYERS; i++) { if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE - && !players[i].exiting && !players[i].powers[pw_super] && !((netgame || multiplayer) && players[i].spectator) - && players[i].kartstuff[k_position] < player->kartstuff[k_position] && player != &players[i] - && (gametype == GT_MATCH && players[i].kartstuff[k_balloon] > 0) + && player != &players[i] && !players[i].exiting && !players[i].powers[pw_super] && !(players[i].spectator) + && ((gametype == GT_RACE && players[i].kartstuff[k_position] < player->kartstuff[k_position]) + || (gametype == GT_MATCH && players[i].kartstuff[k_balloon] > 0)) && (players[i].kartstuff[k_star] || players[i].kartstuff[k_mushroom] || players[i].kartstuff[k_goldshroom] || players[i].kartstuff[k_megashroom] || players[i].kartstuff[k_lightning] || players[i].kartstuff[k_blueshell] @@ -2623,30 +2623,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (gametype == GT_RACE) K_KartUpdatePosition(player); - else if (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0) // dead in match? BOO! - { - player->kartstuff[k_bootaketimer] = bootime; - player->kartstuff[k_magnet] = 0; // reset all those dang items - player->kartstuff[k_boo] = 0; - player->kartstuff[k_mushroom] = 0; - player->kartstuff[k_megashroom] = 0; - player->kartstuff[k_goldshroom] = 0; - player->kartstuff[k_star] = 0; - player->kartstuff[k_triplebanana] = 0; - player->kartstuff[k_fakeitem] = 0; - player->kartstuff[k_banana] = 0; - player->kartstuff[k_greenshell] = 0; - player->kartstuff[k_redshell] = 0; - player->kartstuff[k_laserwisp] = 0; - player->kartstuff[k_triplegreenshell] = 0; - player->kartstuff[k_bobomb] = 0; - player->kartstuff[k_blueshell] = 0; - player->kartstuff[k_jaws] = 0; - player->kartstuff[k_fireflower] = 0; - player->kartstuff[k_tripleredshell] = 0; - player->kartstuff[k_lightning] = 0; - player->kartstuff[k_kitchensink] = 0; - } // Position Taunt // If you were behind someone but just passed them, taunt at them! @@ -3195,32 +3171,62 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_boostcharge] = 0; } + + if (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0) // dead in match? BOO! + { + player->kartstuff[k_bootaketimer] = bootime; + player->kartstuff[k_magnet] = 0; // reset all those dang items + player->kartstuff[k_boo] = 0; + player->kartstuff[k_mushroom] = 0; + player->kartstuff[k_megashroom] = 0; + player->kartstuff[k_goldshroom] = 0; + player->kartstuff[k_star] = 0; + player->kartstuff[k_triplebanana] = 0; + player->kartstuff[k_fakeitem] = 0; + player->kartstuff[k_banana] = 0; + player->kartstuff[k_greenshell] = 0; + player->kartstuff[k_redshell] = 0; + player->kartstuff[k_laserwisp] = 0; + player->kartstuff[k_triplegreenshell] = 0; + player->kartstuff[k_bobomb] = 0; + player->kartstuff[k_blueshell] = 0; + player->kartstuff[k_jaws] = 0; + player->kartstuff[k_fireflower] = 0; + player->kartstuff[k_tripleredshell] = 0; + player->kartstuff[k_lightning] = 0; + player->kartstuff[k_kitchensink] = 0; + } } void K_CheckBalloons(void) { UINT8 i; + UINT8 numingame = 0; INT8 winnernum = -1; - - if (gameaction == ga_completed) - return; - if (!D_NumPlayers()) + if (gameaction == ga_completed) return; for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i] || players[i].spectator || players[i].kartstuff[k_balloon] <= 0) + if (!playeringame[i] || players[i].spectator) // not even in-game :V continue; - if (winnernum > -1) - return; + numingame++; + if (players[i].kartstuff[k_balloon] <= 0) // if you don't have any balloons, you're probably not a winner + continue; + else if (winnernum > -1) // TWO winners? that's dumb :V + return; winnernum = i; } - players[winnernum].score += 20; - CONS_Printf(M_GetText("%s has recieved 20 points for surviving!\n"), player_names[winnernum]); + if (numingame <= 1) + return; + + P_AddPlayerScore(&players[winnernum], numingame); + CONS_Printf(M_GetText("%s recieved %d points for surviving!\n"), player_names[winnernum], numingame); // numingame/2 == 1 ? "" : "s" + if (server) SendNetXCmd(XD_EXITLEVEL, NULL, 0); } @@ -3679,31 +3685,32 @@ static void K_drawKartRetroItem(void) // The only actual reason is to make triple/double/single mushrooms line up this way in the code below // This shouldn't have any actual baring over how it functions // Boo is first, because we're drawing it on top of the player's current item - if ((stplyr->kartstuff[k_bootaketimer] > 0 - || stplyr->kartstuff[k_boostolentimer] > 0) && (leveltime & 2)) localpatch = kp_boosteal; - else if (stplyr->kartstuff[k_boostolentimer] > 0 && !(leveltime & 2)) localpatch = kp_noitem; + if ((stplyr->kartstuff[k_bootaketimer] > 0 || stplyr->kartstuff[k_boostolentimer] > 0) + && !(gametype == GT_MATCH && stplyr->kartstuff[k_balloon] <= 0) + && (leveltime & 2)) localpatch = kp_boosteal; + else if (stplyr->kartstuff[k_boostolentimer] > 0 && !(leveltime & 2)) localpatch = kp_noitem; else if (stplyr->kartstuff[k_kitchensink] == 1) localpatch = kp_kitchensink; - else if (stplyr->kartstuff[k_lightning] == 1) localpatch = kp_lightning; - else if (stplyr->kartstuff[k_tripleredshell]) localpatch = kp_tripleredshell; // &8 + else if (stplyr->kartstuff[k_lightning] == 1) localpatch = kp_lightning; + else if (stplyr->kartstuff[k_tripleredshell]) localpatch = kp_tripleredshell; // &8 else if (stplyr->kartstuff[k_fireflower] == 1) localpatch = kp_fireflower; - else if (stplyr->kartstuff[k_blueshell] == 1) localpatch = kp_blueshell; - else if (stplyr->kartstuff[k_bobomb]) localpatch = kp_bobomb; // &2 + else if (stplyr->kartstuff[k_blueshell] == 1) localpatch = kp_blueshell; + else if (stplyr->kartstuff[k_bobomb]) localpatch = kp_bobomb; // &2 else if (stplyr->kartstuff[k_triplegreenshell]) localpatch = kp_triplegreenshell; // &8 else if (stplyr->kartstuff[k_redshell]) localpatch = kp_redshell; // &2 - else if (stplyr->kartstuff[k_greenshell]) localpatch = kp_greenshell; // &2 - else if (stplyr->kartstuff[k_banana]) localpatch = kp_banana; // &2 + else if (stplyr->kartstuff[k_greenshell]) localpatch = kp_greenshell; // &2 + else if (stplyr->kartstuff[k_banana]) localpatch = kp_banana; // &2 else if (stplyr->kartstuff[k_fakeitem] & 2) localpatch = kp_fakeitem; else if (stplyr->kartstuff[k_triplebanana]) localpatch = kp_triplebanana; // &8 - else if (stplyr->kartstuff[k_star] == 1) localpatch = kp_star; + else if (stplyr->kartstuff[k_star] == 1) localpatch = kp_star; else if (stplyr->kartstuff[k_goldshroom] == 1 - || (stplyr->kartstuff[k_goldshroomtimer] > 1 && (leveltime & 1))) localpatch = kp_goldshroom; + || (stplyr->kartstuff[k_goldshroomtimer] > 1 && (leveltime & 1))) localpatch = kp_goldshroom; else if (stplyr->kartstuff[k_goldshroomtimer] > 1 && !(leveltime & 1)) localpatch = kp_noitem; else if (stplyr->kartstuff[k_megashroom] == 1 - || (stplyr->kartstuff[k_growshrinktimer] > 1 && (leveltime & 1))) localpatch = kp_megashroom; + || (stplyr->kartstuff[k_growshrinktimer] > 1 && (leveltime & 1))) localpatch = kp_megashroom; else if (stplyr->kartstuff[k_growshrinktimer] > 1 && !(leveltime & 1)) localpatch = kp_noitem; else if (stplyr->kartstuff[k_mushroom] & 4) localpatch = kp_triplemushroom; else if (stplyr->kartstuff[k_mushroom] & 2) localpatch = kp_doublemushroom; - else if (stplyr->kartstuff[k_mushroom] == 1) localpatch = kp_mushroom; + else if (stplyr->kartstuff[k_mushroom] == 1) localpatch = kp_mushroom; else if (stplyr->kartstuff[k_boo] == 1) localpatch = kp_boo; else if (stplyr->kartstuff[k_magnet] == 1) localpatch = kp_magnet; diff --git a/src/p_inter.c b/src/p_inter.c index bd0ad18c..42e8976f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -150,6 +150,30 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) //if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics) // return false; + if (player->kartstuff[k_bootaketimer] + || player->kartstuff[k_boostolentimer] + || player->kartstuff[k_magnet] + || player->kartstuff[k_boo] + || player->kartstuff[k_mushroom] + || player->kartstuff[k_megashroom] + || player->kartstuff[k_goldshroom] + || player->kartstuff[k_star] + || player->kartstuff[k_triplebanana] == 0x8 + || player->kartstuff[k_fakeitem] == 0x2 + || player->kartstuff[k_banana] == 0x2 + || player->kartstuff[k_greenshell] == 0x2 + || player->kartstuff[k_redshell] == 0x2 + || player->kartstuff[k_laserwisp] + || player->kartstuff[k_triplegreenshell] == 0x8 + || player->kartstuff[k_bobomb] == 0x2 + || player->kartstuff[k_blueshell] + || player->kartstuff[k_jaws] == 0x4 + || player->kartstuff[k_fireflower] + || player->kartstuff[k_tripleredshell] == 0x8 + || player->kartstuff[k_lightning] + || player->kartstuff[k_kitchensink]) + return false; + return true; } @@ -2224,7 +2248,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) for (w=0; w < MAXPLAYERS; w++) { if (players[w].pflags & PF_TAGIT) - P_AddPlayerScore(&players[w], 100); + P_AddPlayerScore(&players[w], 1); } target->player->pflags |= PF_TAGGED; @@ -2594,7 +2618,7 @@ static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sou // The tag occurs so long as you aren't shooting another tagger with friendlyfire on. if (source->player->pflags & PF_TAGIT && !(player->pflags & PF_TAGIT)) { - P_AddPlayerScore(source->player, 100); //award points to tagger. + P_AddPlayerScore(source->player, 1); //award points to tagger. P_HitDeathMessages(player, inflictor, source); if (gametype == GT_TAG) //survivor @@ -2708,21 +2732,21 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) P_ResetPlayer(player); P_SetPlayerMobjState(player->mo, player->mo->info->deathstate); - if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG))) + /*if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG))) { P_PlayerFlagBurst(player, false); if (source && source->player) { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) - P_AddPlayerScore(source->player, 25); + P_AddPlayerScore(source->player, 1); } } if (source && source->player && !player->powers[pw_super]) //don't score points against super players { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) - P_AddPlayerScore(source->player, 100); + P_AddPlayerScore(source->player, 1); } // If the player was super, tell them he/she ain't so super nomore. @@ -2732,6 +2756,20 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) HU_SetCEchoFlags(0); HU_SetCEchoDuration(5); HU_DoCEcho(va("%s\\is no longer super.\\\\\\\\", player_names[player-players])); + }*/ + + if (player->kartstuff[k_balloon]) + { + 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; } } @@ -2868,11 +2906,11 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN S_StartSound(player->mo, sfx_spkdth); } - if (source && source->player && !player->powers[pw_super]) //don't score points against super players + /*if (source && source->player && !player->powers[pw_super]) //don't score points against super players { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) - P_AddPlayerScore(source->player, 50); + P_AddPlayerScore(source->player, 1); } if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG))) @@ -2882,9 +2920,9 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) - P_AddPlayerScore(source->player, 25); + P_AddPlayerScore(source->player, 1); } - } + }*/ // Ring loss sound plays despite hitting spikes P_PlayRinglossSound(player->mo); // Ringledingle! diff --git a/src/p_mobj.c b/src/p_mobj.c index 44eebe56..13e241d4 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6581,21 +6581,21 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { - INT32 zfixds = 56; - INT32 DIST = FixedMul(zfixds, mobj->target->scale); - INT32 HEIGHT; - const fixed_t radius = DIST*FRACUNIT; // mobj's distance from its Target, or Radius. + fixed_t HEIGHT; + fixed_t radius = 56*mobj->target->scale; // 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) - zfixds = 64; + 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) + radius = 32*mobj->target->scale; else - zfixds = 56; + 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_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + || 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) mobj->angle += FixedAngle(mobj->info->speed); else if (mobj->type == MT_TRIPLEBANANASHIELD2) mobj->angle = (mobj->target->angle + ANGLE_135); @@ -6604,10 +6604,6 @@ void P_MobjThinker(mobj_t *mobj) else mobj->angle = (mobj->target->angle + ANGLE_180); - if (mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) - mobj->color = mobj->target->color; - // If the player is on the ceiling, then flip your items as well. if (mobj->target->eflags & MFE_VERTICALFLIP) { @@ -6620,6 +6616,27 @@ 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) + { + mobj->color = mobj->target->color; + + if (!(mobj->target->player->kartstuff[k_balloon] & 4)) + P_SetMobjState(mobj, S_BATTLEBALLOON2); + else if (!(mobj->target->player->kartstuff[k_balloon] & 2)) + P_SetMobjState(mobj, S_BATTLEBALLOON3); + + 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; @@ -8369,10 +8386,11 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_GREENITEM: case MT_GREENSHIELD: 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_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_FAKEITEM: case MT_FAKESHIELD: case MT_BOMBITEM: case MT_BOMBSHIELD: - case MT_FIREBALL: P_SpawnShadowMobj(mobj); default: break; @@ -9123,41 +9141,49 @@ void P_SpawnPlayer(INT32 playernum) // Spawn with a pity shield if necessary. //P_DoPityCheck(p); - if (gametype == GT_MATCH && p->playerstate != PST_REBORN) // srb2kart + if (gametype == GT_MATCH && (leveltime < 1 || p->kartstuff[k_balloon] > 0)) // srb2kart { angle_t newangle, diff; fixed_t newx; fixed_t newy; mobj_t *mo, *mo2, *mo3, *mo4, *mo5; - - switch (cv_kartballoons.value) // Fallthrough intentional + + if (leveltime < 1) // Start of the map? { - case 5: - p->kartstuff[k_balloon] |= 0x16; - case 4: - 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; - break; + 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; + } } 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) { @@ -9166,6 +9192,10 @@ void P_SpawnPlayer(INT32 playernum) P_SetTarget(&mo2->target, mobj); mo2->angle = diff; mo2->color = mobj->color; + if (mobj->flags2 & MF2_DONTDRAW) + mo2->flags2 |= MF2_DONTDRAW; + else + mo2->flags2 &= !MF2_DONTDRAW; } if (p->kartstuff[k_balloon] & 4) @@ -9175,6 +9205,10 @@ void P_SpawnPlayer(INT32 playernum) 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) @@ -9184,6 +9218,10 @@ void P_SpawnPlayer(INT32 playernum) 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) @@ -9193,6 +9231,10 @@ void P_SpawnPlayer(INT32 playernum) 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; } } } diff --git a/src/p_spec.c b/src/p_spec.c index 27a408c7..3ef62ab3 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3878,7 +3878,7 @@ DoneSection2: mo->spawnpoint = bflagpoint; mo->flags2 |= MF2_JUSTATTACKED; redscore += 1; - P_AddPlayerScore(player, 250); + P_AddPlayerScore(player, 5); } } break; @@ -3911,7 +3911,7 @@ DoneSection2: mo->spawnpoint = rflagpoint; mo->flags2 |= MF2_JUSTATTACKED; bluescore += 1; - P_AddPlayerScore(player, 250); + P_AddPlayerScore(player, 5); } } break; diff --git a/src/p_user.c b/src/p_user.c index 8c066834..594f2078 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -853,13 +853,13 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor) // Point penalty for hitting a hazard during tag. // Discourages players from intentionally hurting themselves to avoid being tagged. - if (gametype == GT_TAG && (!(player->pflags & PF_TAGGED) && !(player->pflags & PF_TAGIT))) + /*if (gametype == GT_TAG && (!(player->pflags & PF_TAGGED) && !(player->pflags & PF_TAGIT))) { - //if (player->score >= 50) - // player->score -= 50; - //else - // player->score = 0; - } + if (player->score >= 50) + player->score -= 50; + else + player->score = 0; + }*/ P_ResetPlayer(player); P_SetPlayerMobjState(player->mo, player->mo->info->painstate); @@ -1007,9 +1007,6 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) { UINT32 oldscore; - return; // SRB2kart - no score. - // This will probably be temporary until we do battle modes? - if (player->bot) player = &players[consoleplayer]; @@ -7973,13 +7970,12 @@ static void P_DeathThink(player_t *player) } //player->kartstuff[k_lakitu] = 48; // See G_PlayerReborn in g_game.c - // SRB2kart - spawn automatically after 1.5 seconds - if (player->deadtimer > (TICRATE + TICRATE/2) && (gametype == GT_RACE || player->spectator)) + // SRB2kart - spawn automatically after 1 second + if (player->deadtimer > TICRATE) player->playerstate = PST_REBORN; - // SRB2kart - spawn after 1.5 seconds & Button press - if ((cmd->buttons & BT_JUMP || cmd->buttons & BT_ACCELERATE) && player->deadtimer > (TICRATE + TICRATE/2) - && (gametype == GT_RACE || player->spectator)) + // SRB2kart - spawn after 5 tics & Button press + if ((cmd->buttons & BT_JUMP || cmd->buttons & BT_ACCELERATE) && player->deadtimer > 5) player->playerstate = PST_REBORN; // Single player auto respawn