Merge remote-tracking branch 'refs/remotes/origin/sal-misc'

This commit is contained in:
TehRealSalt 2018-03-28 23:09:48 -04:00
commit 86eec2b895
11 changed files with 199 additions and 278 deletions

View file

@ -6598,6 +6598,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_PLAYERARROW_ROULETTE", "S_PLAYERARROW_ROULETTE",
"S_PLAYERBOMB", // Player bomb overlay "S_PLAYERBOMB", // Player bomb overlay
"S_PLAYERITEM", // Player item overlay
"S_PLAYERBOMB_WHEEL", "S_PLAYERBOMB_WHEEL",
#ifdef SEENAMES #ifdef SEENAMES

View file

@ -451,128 +451,72 @@ boolean F_IntroResponder(event_t *event)
// CREDITS // CREDITS
// ========= // =========
static const char *credits[] = { static const char *credits[] = {
"\1Sonic Robo Blast II", "\1SRB2 Kart",
"\1Credits", "\1Credits",
"", "",
"\1Game Design", "\1Game Design",
"Ben \"Mystic\" Geyer", "\"Iceman404\" aka \"VelocitOni\"",
"\"SSNTails\"", "\"ZarroTsu\"",
"Johnny \"Sonikku\" Wallbank", "\"Chaos Zero 64\"",
"", "",
"\1Programming", "\1Programming",
"Alam \"GBC\" Arias", "Sean \"Sryder\" Ryder",
"Logan \"GBA\" Arias", "Ehab \"wolfs\" Saeed",
"Tim \"RedEnchilada\" Bordelon", "\"ZarroTsu\"",
"Callum Dickinson", "Sally \"TehRealSalt\" Cochenour",
"Scott \"Graue\" Feeney", "\"Lat\'\"",
"Nathan \"Jazz\" Giroux", "\"Chaos Zero 64\"",
"Thomas \"Shadow Hog\" Igoe", "\"Monster Iestyn\"",
"Iestyn \"Monster Iestyn\" Jealous",
"Ronald \"Furyhunter\" Kinard", // The SDL2 port
"John \"JTE\" Muniz",
"Ehab \"Wolfy\" Saeed",
"\"SSNTails\"",
"Matthew \"Inuyasha\" Walsh",
"",
"\1Programming",
"\1Assistance",
"\"chi.miru\"", // Red's secret weapon, the REAL reason slopes exist (also helped port drawing code from ZDoom)
"Andrew \"orospakr\" Clunis",
"Gregor \"Oogaland\" Dick",
"Louis-Antoine \"LJSonic\" de Moulins", // for fixing 2.1's netcode (de Rochefort doesn't quite fit on the screen sorry lol)
"Vivian \"toaster\" Grannell", "Vivian \"toaster\" Grannell",
"Julio \"Chaos Zero 64\" Guir",
"\"Kalaron\"", // Coded some of Sryder13's collection of OpenGL fixes, especially fog
"Matthew \"Shuffle\" Marsalko",
"Steven \"StroggOnMeth\" McGranahan",
"\"Morph\"", // For SRB2Morphed stuff
"Colin \"Sonict\" Pfaff",
"Sean \"Sryder13\" Ryder",
"Ben \"Cue\" Woodford",
"", "",
"\1Sprite Artists", "\1Artists",
"Odi \"Iceman404\" Atunzu", "\"Iceman404\"",
"Victor \"VAdaPEGA\" Ara\x1Fjo", // Araújo -- sorry for our limited font! D: "\"Blade\"",
"Jim \"MotorRoach\" DeMello", "\"CoatRack\"",
"Desmond \"Blade\" DesJardins", "James \"SeventhSentinel\" Hall",
"Sherman \"CoatRack\" DesJardins", "Sally \"TehRealSalt\" Cochenour", // Eggman
"Andrew \"Senku Niola\" Moran", "\"Chaos Zero 64\"",
"David \"Instant Sonic\" Spencer Jr.", "\"ZarroTsu\"",
"\"SSNTails\"", "\"Spherallic\"",
"",
"\1Texture Artists",
"Ryan \"Blaze Hedgehog\" Bloom",
"Buddy \"KinkaJoy\" Fischer",
"Vivian \"toaster\" Grannell",
"Kepa \"Nev3r\" Iceta",
"Jarrett \"JEV3\" Voight",
"", "",
"\1Music and Sound", "\1Music and Sound",
"\1Production", "\"Charyb\"",
"Malcolm \"RedXVI\" Brown", "James \"SeventhSentinel\" Hall",
"David \"Bulmybag\" Bulmer", "Karl Brueggemann",
"Paul \"Boinciel\" Clempson", "\"MaxieDaMan\"",
"Cyan Helkaraxe",
"Kepa \"Nev3r\" Iceta",
"Iestyn \"Monster Iestyn\" Jealous",
"Jarel \"Arrow\" Jones",
"Stefan \"Stuf\" Rimalia",
"Shane Mychal Sexton",
"\"Spazzo\"",
"David \"Big Wave Dave\" Spencer Sr.",
"David \"Instant Sonic\" Spencer Jr.",
"\"SSNTails\"",
"", "",
"\1Level Design", "\1Level Design",
"Matthew \"Fawfulfan\" Chapman", "\"Blitz-T\"",
"Paul \"Boinciel\" Clempson", "\"Chromatian\"",
"Desmond \"Blade\" DesJardins", "Sean \"Sryder\" Ryder",
"Sherman \"CoatRack\" DesJardins", "\"Blade\"",
"Ben \"Mystic\" Geyer", "\"CoatRack\"",
"Nathan \"Jazz\" Giroux", "\"Boinciel\"",
"Dan \"Blitzzo\" Hagerstrand", "\"Ryuspark\"",
"Kepa \"Nev3r\" Iceta", "\"ZarroTsu\"",
"Thomas \"Shadow Hog\" Igoe", "\"Tyrannosaur Chao\" aka \"Chaotic Chao\"",
"Erik \"Torgo\" Nielsen", "James \"SeventhSentinel\" Hall",
"Wessel \"Spherallic\" Smit", "Sally \"TehRealSalt\" Cochenour",
"\"Spazzo\"", "\"Chaos Zero 64\"",
"\"SSNTails\"", "\"D00D64-X\"",
"Rob Tisdell", "\"Simsmagic\"",
"Jarrett \"JEV3\" Voight",
"Johnny \"Sonikku\" Wallbank",
"Matthew \"Inuyasha\" Walsh",
"Marco \"Digiku\" Zafra",
"",
"\1Boss Design",
"Ben \"Mystic\" Geyer",
"Thomas \"Shadow Hog\" Igoe",
"John \"JTE\" Muniz",
"Samuel \"Prime 2.0\" Peters",
"\"SSNTails\"",
"Johnny \"Sonikku\" Wallbank",
"", "",
"\1Testing", "\1Testing",
"Hank \"FuriousFox\" Brannock", "\"Jeck Jims\"",
"Cody \"SRB2 Playah\" Koester", "\"Fooruman\"",
"Skye \"OmegaVelocity\" Meredith", "\"CyberIF\"",
"Stephen \"HEDGESMFG\" Moellering", "\"Dani\"",
"Nick \"ST218\" Molina", "\"VirtAnderson\"",
"Samuel \"Prime 2.0\" Peters",
"Colin \"Sonict\" Pfaff",
"Bill \"Tets\" Reed",
"", "",
"\1Special Thanks", "\1Special Thanks",
"Doom Legacy Project", "Sonic Team Jr. & SRB2",
"iD Software", "Bandit \"Bippy\" Cochenour", // i <3 my dog
"Alex \"MistaED\" Fuller",
"FreeDoom Project", // Used some of the mancubus and rocket launcher sprites for Brak
"Randi Heit (<!>)", // For their MSPaint <!> sprite that we nicked
"", "",
"\1Produced By", "\1Produced By",
"Sonic Team Junior", "Kart Krew",
"", "",
"\1Published By", "\1In Memory of",
"A 28K dialup modem", "\"Tyler52\"",
"", "",
"\1Thank you", "\1Thank you",
"\1for playing!", "\1for playing!",
@ -583,7 +527,7 @@ static struct {
UINT32 x, y; UINT32 x, y;
const char *patch; const char *patch;
} credits_pics[] = { } credits_pics[] = {
{ 8, 80+200* 1, "CREDIT01"}, /*{ 8, 80+200* 1, "CREDIT01"},
{ 4, 80+200* 2, "CREDIT13"}, { 4, 80+200* 2, "CREDIT13"},
{250, 80+200* 3, "CREDIT12"}, {250, 80+200* 3, "CREDIT12"},
{ 8, 80+200* 4, "CREDIT03"}, { 8, 80+200* 4, "CREDIT03"},
@ -591,10 +535,8 @@ static struct {
{ 8, 80+200* 6, "CREDIT04"}, { 8, 80+200* 6, "CREDIT04"},
{112, 80+200* 7, "CREDIT10"}, {112, 80+200* 7, "CREDIT10"},
{240, 80+200* 8, "CREDIT05"}, {240, 80+200* 8, "CREDIT05"},
{120, 80+200* 9, "CREDIT06"}, {120, 80+200* 9, "CREDIT06"},*/
{ 8, 80+200*10, "CREDIT07"}, {112, 80+200*10, "TYLER52"},
{ 8, 80+200*11, "CREDIT08"},
{112, 80+200*12, "CREDIT09"},
{0, 0, NULL} {0, 0, NULL}
}; };
@ -636,7 +578,13 @@ void F_CreditDrawer(void)
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
// Draw background pictures first // Draw background
V_DrawSciencePatch(0, 0 - FixedMul(32<<FRACBITS, FixedDiv(animtimer%280, 280)), V_SNAPTOTOP, W_CachePatchName("CREDTILE", PU_CACHE), FRACUNIT);
V_DrawSciencePatch(0, 0 - FixedMul(40<<FRACBITS, FixedDiv(animtimer%70, 70)), V_SNAPTOTOP, ttcheckers, FRACUNIT);
V_DrawSciencePatch(280<<FRACBITS, 0 - FixedMul(40<<FRACBITS, FixedDiv(animtimer%70, 70)), V_SNAPTOTOP, ttcheckers, FRACUNIT);
// Draw pictures
for (i = 0; credits_pics[i].patch; i++) for (i = 0; credits_pics[i].patch; i++)
V_DrawSciencePatch(credits_pics[i].x<<FRACBITS, (credits_pics[i].y<<FRACBITS) - 4*(animtimer<<FRACBITS)/5, 0, W_CachePatchName(credits_pics[i].patch, PU_CACHE), FRACUNIT>>1); V_DrawSciencePatch(credits_pics[i].x<<FRACBITS, (credits_pics[i].y<<FRACBITS) - 4*(animtimer<<FRACBITS)/5, 0, W_CachePatchName(credits_pics[i].patch, PU_CACHE), FRACUNIT>>1);
@ -718,7 +666,7 @@ boolean F_CreditResponder(event_t *event)
break; break;
} }
if (!(timesBeaten) && !(netgame || multiplayer)) if (/*!(timesBeaten) && */!(netgame || multiplayer))
return false; return false;
if (event->type != ev_keydown) if (event->type != ev_keydown)

View file

@ -2907,7 +2907,8 @@ state_t states[NUMSTATES] =
{SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE {SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE
{SPR_PBOM, FF_ANIMATE, -1, {NULL}, 3, 3, S_NULL}, // S_PLAYERBOMB {SPR_PBOM, FF_ANIMATE, -1, {NULL}, 3, 3, S_NULL}, // S_PLAYERBOMB
{SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERBOMB_WHEEL {SPR_RNDM, FF_ANIMATE, -1, {NULL}, 23, 3, S_NULL}, // S_PLAYERITEM
{SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERWHEEL
#ifdef SEENAMES #ifdef SEENAMES
{SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK

View file

@ -3430,7 +3430,8 @@ typedef enum state
S_PLAYERARROW_ROULETTE, S_PLAYERARROW_ROULETTE,
S_PLAYERBOMB, S_PLAYERBOMB,
S_PLAYERBOMB_WHEEL, S_PLAYERITEM,
S_PLAYERWHEEL,
#ifdef SEENAMES #ifdef SEENAMES
S_NAMECHECK, S_NAMECHECK,

View file

@ -3225,14 +3225,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
if (player->kartstuff[k_bootimer] > 0) if (player->kartstuff[k_bootimer] > 0)
{ {
if ((player == &players[displayplayer] if ((player == &players[displayplayer] && !splitscreen)
|| (splitscreen && player == &players[secondarydisplayplayer]) || (!(player == &players[displayplayer] && !splitscreen)
|| (splitscreen > 1 && player == &players[thirddisplayplayer])
|| (splitscreen > 2 && player == &players[fourthdisplayplayer]))
|| (!(player == &players[displayplayer]
|| (splitscreen && player == &players[secondarydisplayplayer])
|| (splitscreen > 1 && player == &players[thirddisplayplayer])
|| (splitscreen > 2 && player == &players[fourthdisplayplayer]))
&& (player->kartstuff[k_bootimer] < 1*TICRATE/2 || player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) && (player->kartstuff[k_bootimer] < 1*TICRATE/2 || player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2))))
{ {
if (leveltime & 1) if (leveltime & 1)
@ -3266,6 +3260,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
if (player->kartstuff[k_comebacktimer] > 0) if (player->kartstuff[k_comebacktimer] > 0)
{ {
if (player->mo->tracer->state != &states[S_PLAYERBOMB])
P_SetMobjState(player->mo->tracer, S_PLAYERBOMB);
if (player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1)) if (player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1))
player->mo->tracer->flags2 &= ~MF2_DONTDRAW; player->mo->tracer->flags2 &= ~MF2_DONTDRAW;
else else
@ -3273,15 +3270,23 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; player->powers[pw_flashing] = player->kartstuff[k_comebacktimer];
} }
else if (player->kartstuff[k_comebackmode] != 0)
player->mo->tracer->flags2 |= MF2_DONTDRAW;
else else
{
if (player->kartstuff[k_comebackmode] == 0
&& player->mo->tracer->state != &states[S_PLAYERBOMB])
P_SetMobjState(player->mo->tracer, S_PLAYERBOMB);
else if (player->kartstuff[k_comebackmode] == 1
&& player->mo->tracer->state != &states[S_PLAYERITEM])
P_SetMobjState(player->mo->tracer, S_PLAYERITEM);
player->mo->tracer->flags2 &= ~MF2_DONTDRAW; player->mo->tracer->flags2 &= ~MF2_DONTDRAW;
} }
}
else if (G_RaceGametype() || player->kartstuff[k_balloon] > 0) else if (G_RaceGametype() || player->kartstuff[k_balloon] > 0)
{ {
player->mo->flags2 &= ~MF2_SHADOW; player->mo->flags2 &= ~MF2_SHADOW;
if (player->mo->tracer && player->mo->tracer->state == &states[S_PLAYERBOMB]) if (player->mo->tracer
&& (player->mo->tracer->state == &states[S_PLAYERBOMB]
|| player->mo->tracer->state == &states[S_PLAYERITEM]))
P_RemoveMobj(player->mo->tracer); P_RemoveMobj(player->mo->tracer);
} }
} }
@ -4746,7 +4751,7 @@ static void K_drawKartMinimap(void)
x = MINI_X - (AutomapPic->width/2); x = MINI_X - (AutomapPic->width/2);
y = MINI_Y - (AutomapPic->height/2); y = MINI_Y - (AutomapPic->height/2);
if (splitscreen == 2) if (splitscreen)
splitflags = 0; splitflags = 0;
if (mirrormode) if (mirrormode)
@ -4754,7 +4759,7 @@ static void K_drawKartMinimap(void)
else else
V_DrawScaledPatch(x, y, splitflags, AutomapPic); V_DrawScaledPatch(x, y, splitflags, AutomapPic);
if (splitscreen != 2) if (!splitscreen)
{ {
splitflags &= ~minimaptrans; splitflags &= ~minimaptrans;
splitflags |= V_HUDTRANSHALF; splitflags |= V_HUDTRANSHALF;
@ -4763,13 +4768,28 @@ static void K_drawKartMinimap(void)
// Player's tiny icons on the Automap. // Player's tiny icons on the Automap.
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if (i == displayplayer && splitscreen != 2) if (i == displayplayer && !splitscreen)
continue; // Do displayplayer later continue; // Do displayplayer later
if (players[i].mo && !players[i].spectator) if (players[i].mo && !players[i].spectator)
K_drawKartMinimapHead(&players[i], x, y, splitflags, AutomapPic); {
if (G_BattleGametype() && players[i].kartstuff[k_balloon] <= 0)
continue;
if (players[i].kartstuff[k_bootimer] > 0)
{
if ((players[i].kartstuff[k_bootimer] < 1*TICRATE/2
|| players[i].kartstuff[k_bootimer] > bootime-(1*TICRATE/2))
&& !(leveltime & 1))
;
else
continue;
} }
if (splitscreen == 2) K_drawKartMinimapHead(&players[i], x, y, splitflags, AutomapPic);
}
}
if (splitscreen)
return; // Don't need this for splits return; // Don't need this for splits
splitflags &= ~V_HUDTRANSHALF; splitflags &= ~V_HUDTRANSHALF;
@ -4782,13 +4802,18 @@ static void K_drawBattleFullscreen(void)
{ {
INT32 x = BASEVIDWIDTH/2; INT32 x = BASEVIDWIDTH/2;
INT32 y = -64+(stplyr->kartstuff[k_cardanimation]); // card animation goes from 0 to 164, 164 is the middle of the screen INT32 y = -64+(stplyr->kartstuff[k_cardanimation]); // card animation goes from 0 to 164, 164 is the middle of the screen
INT32 splitflags = V_SNAPTOTOP; // I don't feel like properly supporting non-green resolutions, so you can have a misuse of SNAPTO instead
fixed_t scale = FRACUNIT; fixed_t scale = FRACUNIT;
if (splitscreen) if (splitscreen)
{ {
if ((splitscreen == 1 && stplyr == &players[secondarydisplayplayer]) if ((splitscreen == 1 && stplyr == &players[secondarydisplayplayer])
|| (splitscreen > 1 && (stplyr == &players[thirddisplayplayer] || stplyr == &players[fourthdisplayplayer]))) || (splitscreen > 1 && (stplyr == &players[thirddisplayplayer]
|| (stplyr == &players[fourthdisplayplayer] && splitscreen > 2))))
{
y = 232-(stplyr->kartstuff[k_cardanimation]/2); y = 232-(stplyr->kartstuff[k_cardanimation]/2);
splitflags = V_SNAPTOBOTTOM;
}
else else
y = -32+(stplyr->kartstuff[k_cardanimation]/2); y = -32+(stplyr->kartstuff[k_cardanimation]/2);
@ -4796,7 +4821,8 @@ static void K_drawBattleFullscreen(void)
{ {
scale /= 2; scale /= 2;
if (stplyr == &players[secondarydisplayplayer] || stplyr == &players[fourthdisplayplayer]) if (stplyr == &players[secondarydisplayplayer]
|| (stplyr == &players[fourthdisplayplayer] && splitscreen > 2))
x = 3*BASEVIDWIDTH/4; x = 3*BASEVIDWIDTH/4;
else else
x = BASEVIDWIDTH/4; x = BASEVIDWIDTH/4;
@ -4815,9 +4841,9 @@ static void K_drawBattleFullscreen(void)
if (stplyr == &players[displayplayer]) if (stplyr == &players[displayplayer])
V_DrawFadeScreen(); V_DrawFadeScreen();
if (stplyr->kartstuff[k_balloon]) if (stplyr->kartstuff[k_balloon])
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battlewin, NULL); V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battlewin, NULL);
else if (splitscreen < 2) else if (splitscreen < 2)
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battlelose, NULL); V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battlelose, NULL);
} }
else if (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && comeback) else if (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && comeback)
{ {
@ -4841,22 +4867,23 @@ static void K_drawBattleFullscreen(void)
if (splitscreen > 2) if (splitscreen > 2)
ty = (BASEVIDHEIGHT/4)+33; ty = (BASEVIDHEIGHT/4)+33;
if ((splitscreen == 1 && stplyr == &players[secondarydisplayplayer]) if ((splitscreen == 1 && stplyr == &players[secondarydisplayplayer])
|| stplyr == &players[thirddisplayplayer] || stplyr == &players[fourthdisplayplayer]) || (stplyr == &players[thirddisplayplayer] && splitscreen > 1)
|| (stplyr == &players[fourthdisplayplayer] && splitscreen > 2))
ty += (BASEVIDHEIGHT/2); ty += (BASEVIDHEIGHT/2);
} }
else else
V_DrawFadeScreen(); V_DrawFadeScreen();
if (!comebackshowninfo) if (!comebackshowninfo)
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battleinfo, NULL); V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battleinfo, NULL);
else else
V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battlewait, NULL); V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, splitflags, kp_battlewait, NULL);
if (splitscreen > 1) if (splitscreen > 1)
V_DrawString(x-(txoff/2), ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE)); V_DrawString(x-(txoff/2), ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
else else
{ {
V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, K_calcSplitFlags(0), kp_timeoutsticker, NULL); V_DrawFixedPatch(x<<FRACBITS, ty<<FRACBITS, scale, 0, kp_timeoutsticker, NULL);
V_DrawKartString(x-txoff, ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE)); V_DrawKartString(x-txoff, ty, 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE));
} }
} }
@ -4979,6 +5006,9 @@ void K_drawKartHUD(void)
// This is handled by console/menu values // This is handled by console/menu values
K_initKartHUD(); K_initKartHUD();
if (splitscreen == 2) // Player 4 in 3P is basically the minimap :p
K_drawKartMinimap();
// Draw full screen stuff that turns off the rest of the HUD // Draw full screen stuff that turns off the rest of the HUD
if ((G_BattleGametype()) if ((G_BattleGametype())
&& (stplyr->exiting && (stplyr->exiting
@ -5007,8 +5037,8 @@ void K_drawKartHUD(void)
K_drawKartPlayerCheck(); K_drawKartPlayerCheck();
} }
if ((splitscreen == 0 && cv_kartminimap.value) || splitscreen == 2) if (splitscreen == 0 && cv_kartminimap.value)
K_drawKartMinimap(); K_drawKartMinimap(); // 3P splitscreen is handled above
// If the item window is closing, draw it closing! // If the item window is closing, draw it closing!
if (stplyr->kartstuff[k_itemclose]) if (stplyr->kartstuff[k_itemclose])

View file

@ -3632,8 +3632,6 @@ void A_AttractChase(mobj_t *actor)
|| !P_CheckSight(actor, actor->tracer)) // You have to be able to SEE it...sorta || !P_CheckSight(actor, actor->tracer)) // You have to be able to SEE it...sorta
{ {
// Lost attracted rings don't through walls anymore. // Lost attracted rings don't through walls anymore.
if (actor->tracer && actor->tracer->player)
actor->tracer->player->kartstuff[k_comebackmode] = 0;
actor->flags &= ~MF_NOCLIP; actor->flags &= ~MF_NOCLIP;
P_SetTarget(&actor->tracer, NULL); P_SetTarget(&actor->tracer, NULL);
return; return;
@ -8145,6 +8143,7 @@ void A_ItemPop(mobj_t *actor)
if (actor->info->deathsound) if (actor->info->deathsound)
S_StartSound(remains, actor->info->deathsound); S_StartSound(remains, actor->info->deathsound);
if (!(G_BattleGametype() && actor->target->player->kartstuff[k_balloon] <= 0))
actor->target->player->kartstuff[k_itemroulette] = 1; actor->target->player->kartstuff[k_itemroulette] = 1;
remains->flags2 &= ~MF2_AMBUSH; remains->flags2 &= ~MF2_AMBUSH;

View file

@ -158,8 +158,8 @@ boolean P_CanPickupItem(player_t *player, boolean weapon)
//if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics) //if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics)
// return false; // return false;
if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) // No balloons in Match /*if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) // No balloons in Match
return false; return false;*/
if (player->kartstuff[k_bootaketimer] || player->kartstuff[k_boostolentimer] if (player->kartstuff[k_bootaketimer] || player->kartstuff[k_boostolentimer]
|| player->kartstuff[k_growshrinktimer] > 1 || player->kartstuff[k_goldshroomtimer]) // Item-specific timer going off || player->kartstuff[k_growshrinktimer] > 1 || player->kartstuff[k_goldshroomtimer]) // Item-specific timer going off
@ -414,35 +414,16 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
switch (special->type) switch (special->type)
{ {
case MT_RANDOMITEM: // SRB2kart case MT_RANDOMITEM: // SRB2kart
if (!P_CanPickupItem(player, false))
return;
if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0)
{ {
if (player->kartstuff[k_comebackmode] == 0 && !player->kartstuff[k_comebacktimer]) if (player->kartstuff[k_comebackmode] == 1 || player->kartstuff[k_comebacktimer])
{
if (special->tracer)
return; return;
P_SetTarget(&special->tracer, toucher); if (player->kartstuff[k_comebackmode] == 0)
player->kartstuff[k_comebackmode] = 1; player->kartstuff[k_comebackmode] = 1;
} }
return;
}
if (!P_CanPickupItem(player, false) && special->tracer != toucher)
return;
if (G_BattleGametype() && special->tracer && special->tracer->player)
{
special->tracer->player->kartstuff[k_comebackmode] = 0;
special->tracer->player->kartstuff[k_comebackpoints]++;
if (netgame && cv_hazardlog.value)
CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[special->tracer->player-players], player_names[player-players]);
if (special->tracer->player->kartstuff[k_comebackpoints] >= 3)
K_StealBalloon(special->tracer->player, player, true);
special->tracer->player->kartstuff[k_comebacktimer] = comebacktime;
}
special->momx = special->momy = special->momz = 0; special->momx = special->momy = special->momz = 0;
P_SetTarget(&special->target, toucher); P_SetTarget(&special->target, toucher);
@ -2128,7 +2109,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
{ {
P_SetTarget(&target->target, source); P_SetTarget(&target->target, source);
source->player->numboxes++; source->player->numboxes++;
if ((cv_itemrespawn.value && gametype != GT_COOP && (modifiedgame || netgame || multiplayer))) if (cv_itemrespawn.value && (netgame || multiplayer))
{ {
target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation
} }

View file

@ -211,7 +211,6 @@ extern size_t iquehead, iquetail;
extern consvar_t cv_gravity, cv_viewheight; extern consvar_t cv_gravity, cv_viewheight;
void P_RespawnSpecials(void); void P_RespawnSpecials(void);
void P_RespawnBattleSpecials(void);
mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type); mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);

View file

@ -1653,33 +1653,60 @@ static boolean PIT_CheckThing(mobj_t *thing)
|| thing->player->kartstuff[k_bootimer] || thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_bootimer] || thing->player->kartstuff[k_spinouttimer]
|| thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped] || thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped]
|| (G_BattleGametype() && (thing->player->kartstuff[k_balloon] <= 0 || (G_BattleGametype() && (thing->player->kartstuff[k_balloon] <= 0
&& (thing->player->kartstuff[k_comebacktimer] || thing->player->kartstuff[k_comebackmode] == 1))) && (thing->player->kartstuff[k_comebacktimer])))
|| tmthing->player->kartstuff[k_growshrinktimer] || tmthing->player->kartstuff[k_squishedtimer] || tmthing->player->kartstuff[k_growshrinktimer] || tmthing->player->kartstuff[k_squishedtimer]
|| tmthing->player->kartstuff[k_bootimer] || tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_bootimer] || tmthing->player->kartstuff[k_spinouttimer]
|| tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped] || tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped]
|| (G_BattleGametype() && (tmthing->player->kartstuff[k_balloon] <= 0 || (G_BattleGametype() && (tmthing->player->kartstuff[k_balloon] <= 0
&& (tmthing->player->kartstuff[k_comebacktimer] || tmthing->player->kartstuff[k_comebackmode] == 1)))) && (tmthing->player->kartstuff[k_comebacktimer]))))
{ {
return true; return true;
} }
if (G_BattleGametype()) if (G_BattleGametype())
{ {
if ((thing->player->kartstuff[k_balloon] <= 0 && thing->player->kartstuff[k_comebackmode] == 0) if (thing->player->kartstuff[k_balloon] <= 0 || tmthing->player->kartstuff[k_balloon] <= 0)
|| (tmthing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_comebackmode] == 0))
{ {
if (tmthing->player->kartstuff[k_balloon] > 0) if (thing->player->kartstuff[k_comebackmode] == 0
&& tmthing->player->kartstuff[k_balloon] > 0)
{ {
K_ExplodePlayer(tmthing->player, thing); K_ExplodePlayer(tmthing->player, thing);
thing->player->kartstuff[k_comebacktimer] = comebacktime; thing->player->kartstuff[k_comebacktimer] = comebacktime;
return true; return true;
} }
else if (thing->player->kartstuff[k_balloon] > 0) else if (tmthing->player->kartstuff[k_comebackmode] == 0
&& thing->player->kartstuff[k_balloon] > 0)
{ {
K_ExplodePlayer(thing->player, tmthing); K_ExplodePlayer(thing->player, tmthing);
tmthing->player->kartstuff[k_comebacktimer] = comebacktime; tmthing->player->kartstuff[k_comebacktimer] = comebacktime;
return true; return true;
} }
else if (thing->player->kartstuff[k_comebackmode] == 1
&& tmthing->player->kartstuff[k_balloon] > 0)
{
thing->player->kartstuff[k_comebackmode] = 0;
thing->player->kartstuff[k_comebackpoints]++;
if (netgame && cv_hazardlog.value)
CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[thing->player-players], player_names[tmthing->player-players]);
tmthing->player->kartstuff[k_itemroulette] = 1;
if (thing->player->kartstuff[k_comebackpoints] >= 3)
K_StealBalloon(thing->player, tmthing->player, true);
thing->player->kartstuff[k_comebacktimer] = comebacktime;
return true;
}
else if (tmthing->player->kartstuff[k_comebackmode] == 1
&& thing->player->kartstuff[k_balloon] > 0)
{
tmthing->player->kartstuff[k_comebackmode] = 0;
tmthing->player->kartstuff[k_comebackpoints]++;
if (netgame && cv_hazardlog.value)
CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[tmthing->player-players], player_names[thing->player-players]);
thing->player->kartstuff[k_itemroulette] = 1;
if (tmthing->player->kartstuff[k_comebackpoints] >= 3)
K_StealBalloon(tmthing->player, thing->player, true);
tmthing->player->kartstuff[k_comebacktimer] = comebacktime;
return true;
}
} }
} }

View file

@ -5969,13 +5969,6 @@ void P_Attract(mobj_t *source, mobj_t *dest, boolean nightsgrab) // Home in on y
if (!dest || dest->health <= 0 || !dest->player || !source->tracer) if (!dest || dest->health <= 0 || !dest->player || !source->tracer)
return; return;
if (dest->player && dest->player->kartstuff[k_comebackmode] == 1)
{
P_TeleportMove(source, dest->x+dest->momx, dest->y+dest->momy, dest->z+dest->momz);
source->angle = dest->angle;
return;
}
// change angle // change angle
source->angle = R_PointToAngle2(source->x, source->y, tx, ty); source->angle = R_PointToAngle2(source->x, source->y, tx, ty);
@ -8282,6 +8275,9 @@ for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) s
P_RemoveMobj(mobj); // make sure they disappear P_RemoveMobj(mobj); // make sure they disappear
return; return;
case MT_RANDOMITEM: case MT_RANDOMITEM:
if (G_BattleGametype())
break;
// Respawn from mapthing if you have one! // Respawn from mapthing if you have one!
if (mobj->spawnpoint) if (mobj->spawnpoint)
{ {
@ -9372,10 +9368,39 @@ void P_RespawnSpecials(void)
mobj_t *mo = NULL; mobj_t *mo = NULL;
mapthing_t *mthing = NULL; mapthing_t *mthing = NULL;
if (G_BattleGametype()) // Battle Mode vers if (G_BattleGametype() && numgotboxes >= (4*nummapboxes/5)) // Battle Mode respawns all boxes in a different way
{ {
P_RespawnBattleSpecials(); thinker_t *th;
return;
for (th = thinkercap.next; th != &thinkercap; th = th->next)
{
mobj_t *box;
mobj_t *newmobj;
if (th->function.acp1 != (actionf_p1)P_MobjThinker) // not a mobj
continue;
box = (mobj_t *)th;
if (box->type != MT_RANDOMITEM || box->threshold != 68 || box->fuse) // only popped items
continue;
// Respawn from mapthing if you have one!
if (box->spawnpoint)
{
P_SpawnMapThing(box->spawnpoint);
newmobj = box->spawnpoint->mobj; // this is set to the new mobj in P_SpawnMapThing
}
else
newmobj = P_SpawnMobj(box->x, box->y, box->z, box->type);
// Transfer flags2 (strongbox, objectflip)
newmobj->flags2 = box->flags2;
P_RemoveMobj(box); // make sure they disappear
continue;
}
numgotboxes = 0;
} }
// only respawn items when cv_itemrespawn is on // only respawn items when cv_itemrespawn is on
@ -9469,97 +9494,6 @@ void P_RespawnSpecials(void)
iquetail = (iquetail+1)&(ITEMQUESIZE-1); iquetail = (iquetail+1)&(ITEMQUESIZE-1);
} }
//
// P_RespawnBattleSpecials
//
void P_RespawnBattleSpecials(void)
{
fixed_t x, y, z;
subsector_t *ss;
mobj_t *mo = NULL;
mapthing_t *mthing = NULL;
// only respawn items when cv_itemrespawn is on
if (!cv_itemrespawn.value)
return;
// Didn't collect enough boxes
if (numgotboxes < (4*nummapboxes/5))
return;
// wait a teeeensy bit after collecting everything
if (leveltime - itemrespawntime[iquehead-1] < (tic_t)cv_itemrespawntime.value*(5*TICRATE))
return;
while (iquehead != iquetail) // respawn EVERYTHING in que!
{
mthing = itemrespawnque[iquetail];
#ifdef PARANOIA
if (!mthing)
I_Error("itemrespawnque[iquetail] is NULL!");
#endif
if (mthing)
{
mobjtype_t i;
x = mthing->x << FRACBITS;
y = mthing->y << FRACBITS;
ss = R_PointInSubsector(x, y);
// find which type to spawn
for (i = 0; i < NUMMOBJTYPES; i++)
if (mthing->type == mobjinfo[i].doomednum)
break;
//CTF rings should continue to respawn as normal rings outside of CTF.
if (gametype != GT_CTF)
{
if (i == MT_REDTEAMRING || i == MT_BLUETEAMRING)
i = MT_RING;
}
if (mthing->options & MTF_OBJECTFLIP)
{
z = (
#ifdef ESLOPE
ss->sector->c_slope ? P_GetZAt(ss->sector->c_slope, x, y) :
#endif
ss->sector->ceilingheight) - (mthing->options >> ZSHIFT) * FRACUNIT;
if (mthing->options & MTF_AMBUSH
&& (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || P_WeaponOrPanel(i)))
z -= 24*FRACUNIT;
z -= mobjinfo[i].height; // Don't forget the height!
}
else
{
z = (
#ifdef ESLOPE
ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, x, y) :
#endif
ss->sector->floorheight) + (mthing->options >> ZSHIFT) * FRACUNIT;
if (mthing->options & MTF_AMBUSH
&& (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || P_WeaponOrPanel(i)))
z += 24*FRACUNIT;
}
mo = P_SpawnMobj(x, y, z, i);
mo->spawnpoint = mthing;
mo->angle = ANGLE_45 * (mthing->angle/45);
if (mthing->options & MTF_OBJECTFLIP)
{
mo->eflags |= MFE_VERTICALFLIP;
mo->flags2 |= MF2_OBJECTFLIP;
}
}
// pull it from the que
iquetail = (iquetail+1)&(ITEMQUESIZE-1);
}
numgotboxes = 0;
}
// //
// P_SpawnPlayer // P_SpawnPlayer
// Called when a player is spawned on the level. // Called when a player is spawned on the level.

View file

@ -991,7 +991,7 @@ static void P_LoadThings(void)
|| mt->type == 1702) // MT_AXISTRANSFERLINE || mt->type == 1702) // MT_AXISTRANSFERLINE
continue; // These were already spawned continue; // These were already spawned
if (mt->type == MT_RANDOMITEM) // MT_RANDOMITEM if (mt->type == mobjinfo[MT_RANDOMITEM].doomednum)
nummapboxes++; nummapboxes++;
mt->mobj = NULL; mt->mobj = NULL;