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
This commit is contained in:
TehRealSalt 2017-10-22 17:26:43 -04:00
parent f84485c680
commit b36fd5c5f9
9 changed files with 327 additions and 234 deletions

View File

@ -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",

View File

@ -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?
}
//

View File

@ -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

View File

@ -3225,7 +3225,9 @@ typedef enum state
S_SINKTRAIL3,
// Battle Mode balloons
S_BATTLEBALLOON,
S_BATTLEBALLOON1,
S_BATTLEBALLOON2,
S_BATTLEBALLOON3,
// Lakitu
S_LAKITU1,

View File

@ -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;

View File

@ -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!

View File

@ -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;
}
}
}

View File

@ -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;

View File

@ -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