diff --git a/src/command.c b/src/command.c index 89d09b35..a1f0a46b 100644 --- a/src/command.c +++ b/src/command.c @@ -67,7 +67,7 @@ CV_PossibleValue_t karthud_cons_t[] = { {0, "Off"}, {1, "Default"}, {2, "SNES"}, {3, "MK64"}, {0, NULL}}; CV_PossibleValue_t kartspeed_cons_t[] = { - {0, "Relaxed"}, {1, "Standard"}, {2, "Turbo"}, + {0, "Easy"}, {1, "Normal"}, {2, "Hard"}, {0, NULL}}; #define COM_BUF_SIZE 8192 // command buffer size diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 9190853e..0d3b9141 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1319,7 +1319,7 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime) else netbuffer->u.serverinfo.iszone = 0; - netbuffer->u.serverinfo.actnum = mapheaderinfo[gamemap-1]->actnum; + netbuffer->u.serverinfo.actnum = 0; //mapheaderinfo[gamemap-1]->actnum p = PutFileNeeded(); @@ -1636,15 +1636,16 @@ static void CL_LoadReceivedSavegame(void) if (P_LoadNetGame()) { - const INT32 actnum = mapheaderinfo[gamemap-1]->actnum; CONS_Printf(M_GetText("Map is now \"%s"), G_BuildMapName(gamemap)); - if (strcmp(mapheaderinfo[gamemap-1]->lvlttl, "")) + if (strlen(mapheaderinfo[gamemap-1]->lvlttl) > 0) { CONS_Printf(": %s", mapheaderinfo[gamemap-1]->lvlttl); - if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE)) + if (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) + CONS_Printf(" %s", mapheaderinfo[gamemap-1]->zonttl); + else if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE)) CONS_Printf(M_GetText(" ZONE")); - if (actnum > 0) - CONS_Printf(" %2d", actnum); + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) + CONS_Printf(" %s", mapheaderinfo[gamemap-1]->actnum); } CONS_Printf("\"\n"); } diff --git a/src/d_main.c b/src/d_main.c index c0de6133..b12dcdbf 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -702,7 +702,7 @@ void D_SRB2Loop(void) else if (rendertimeout < entertic) // in case the server hang or netsplit { // Lagless camera! Yay! - /* + /* Not yay, it ruins Kart's drift :y if (gamestate == GS_LEVEL && netgame) { if (camera.chase) @@ -812,11 +812,6 @@ void D_StartTitle(void) CON_ToggleOff(); // Reset the palette -#ifdef HWRENDER - if (rendermode == render_opengl) - HWR_SetPaletteColor(0); - else -#endif if (rendermode != render_none) V_SetPaletteLump("PLAYPAL"); } @@ -1325,7 +1320,7 @@ void D_SRB2Main(void) CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n"); R_Init(); - // setting up sound + // setting up sound if (dedicated) { nosound = true; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 05b5ee4f..02e5efa8 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -220,7 +220,7 @@ static CV_PossibleValue_t competitionboxes_cons_t[] = {{0, "Normal"}, {1, "Rando static CV_PossibleValue_t matchboxes_cons_t[] = {{0, "Normal"}, {1, "Random"}, {2, "Non-Random"}, {3, "None"}, {0, NULL}}; -//static CV_PossibleValue_t chances_cons_t[] = {{0, "MIN"}, {9, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t chances_cons_t[] = {{0, "MIN"}, {9, "MAX"}, {0, NULL}}; static CV_PossibleValue_t match_scoring_cons_t[] = {{0, "Normal"}, {1, "Classic"}, {0, NULL}}; static CV_PossibleValue_t pause_cons_t[] = {{0, "Server"}, {1, "All"}, {0, NULL}}; @@ -315,7 +315,7 @@ consvar_t cv_matchboxes = {"matchboxes", "Normal", CV_NETVAR|CV_CHEAT, matchboxe consvar_t cv_specialrings = {"specialrings", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_powerstones = {"powerstones", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; -/*consvar_t cv_recycler = {"tv_recycler", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_recycler = {"tv_recycler", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_teleporters = {"tv_teleporter", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_superring = {"tv_superring", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_supersneakers = {"tv_supersneaker", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -326,10 +326,9 @@ consvar_t cv_ringshield = {"tv_ringshield", "5", CV_NETVAR|CV_CHEAT, chanc consvar_t cv_forceshield = {"tv_forceshield", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_bombshield = {"tv_bombshield", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_1up = {"tv_1up", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_eggmanbox = {"tv_eggman", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};*/ +consvar_t cv_eggmanbox = {"tv_eggman", "5", CV_NETVAR|CV_CHEAT, chances_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // SRB2kart - consvar_t cv_sneaker = {"sneaker", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_rocketsneaker = {"rocketsneaker", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_invincibility = {"invincibility", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -357,7 +356,7 @@ consvar_t cv_kartminimap = {"kartminimap", "4", CV_SAVE, kartminimap_cons_t, NUL consvar_t cv_kartcheck = {"kartcheck", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartstarsfx_cons_t[] = {{0, "Music"}, {1, "SMK"}, {0, NULL}}; consvar_t cv_kartstarsfx = {"kartstarsfx", "SMK", CV_SAVE, kartstarsfx_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartspeed = {"kartspeed", "Standard", CV_NETVAR|CV_CALL|CV_NOINIT, kartspeed_cons_t, KartSpeed_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartspeed = {"kartspeed", "Normal", CV_NETVAR|CV_CALL|CV_NOINIT, kartspeed_cons_t, KartSpeed_OnChange, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {12, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR|CV_CHEAT, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOINIT, CV_OnOff, KartFrantic_OnChange, 0, NULL, NULL, 0, 0, NULL}; @@ -374,13 +373,6 @@ consvar_t cv_kartdebugamount = {"kartdebugamount", "1", CV_NETVAR|CV_CHEAT, kart static CV_PossibleValue_t votetime_cons_t[] = {{10, "MIN"}, {3600, "MAX"}, {0, NULL}}; consvar_t cv_votetime = {"votetime", "20", CV_NETVAR, votetime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t cv_collideminimum_cons_t[] = {{1, "MIN"}, {16384, "MAX"}, {0, NULL}}; -consvar_t cv_collideminimum = {"collide_minspeed", "25", CV_NETVAR, cv_collideminimum_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t cv_collidesoundnum_cons_t[] = {{1, "MIN"}, {1208, "MAX"}, {0, NULL}}; -consvar_t cv_collidesoundnum = {"collide_soundnum", "231", CV_NETVAR, cv_collidesoundnum_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_collidesounds = {"collide_sounds", "Yes", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; -// - consvar_t cv_ringslinger = {"ringslinger", "No", CV_NETVAR|CV_NOSHOWHELP|CV_CALL|CV_CHEAT, CV_YesNo, Ringslinger_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_gravity = {"gravity", "0.8", CV_RESTRICT|CV_FLOAT|CV_CALL, NULL, Gravity_OnChange, 0, NULL, NULL, 0, 0, NULL}; @@ -615,7 +607,7 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_competitionboxes); CV_RegisterVar(&cv_matchboxes); - /*CV_RegisterVar(&cv_recycler); + CV_RegisterVar(&cv_recycler); CV_RegisterVar(&cv_teleporters); CV_RegisterVar(&cv_superring); CV_RegisterVar(&cv_supersneakers); @@ -626,7 +618,7 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_forceshield); CV_RegisterVar(&cv_bombshield); CV_RegisterVar(&cv_1up); - CV_RegisterVar(&cv_eggmanbox);*/ + CV_RegisterVar(&cv_eggmanbox); K_RegisterKartStuff(); // SRB2kart @@ -1982,13 +1974,18 @@ void D_SetupVote(void) SendNetXCmd(XD_SETUPVOTE, buf, p - buf); } -void D_ModifyClientVote(SINT8 voted) +void D_ModifyClientVote(SINT8 voted, UINT8 splitplayer) { char buf[1]; char *p = buf; - WRITESINT8(p, voted); - SendNetXCmd(XD_MODIFYVOTE, &buf, 1); + if (splitplayer > 0) // Don't actually send anything for splitscreen + votes[splitplayer] = voted; + else + { + WRITESINT8(p, voted); + SendNetXCmd(XD_MODIFYVOTE, &buf, 1); + } } void D_PickVote(void) @@ -3242,6 +3239,8 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) P_CheckSurvivors(); else if (G_BattleGametype()) K_CheckBalloons(); // SRB2Kart + else if (G_RaceGametype()) + P_CheckRacers(); // also SRB2Kart } // @@ -4528,10 +4527,20 @@ static void Command_Showmap_f(void) { if (gamestate == GS_LEVEL) { - if (mapheaderinfo[gamemap-1]->actnum) - CONS_Printf("%s (%d): %s %d\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum); + if (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) + { + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) + CONS_Printf("%s (%d): %s %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl, mapheaderinfo[gamemap-1]->actnum); + else + CONS_Printf("%s (%d): %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl); + } else - CONS_Printf("%s (%d): %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl); + { + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) + CONS_Printf("%s (%d): %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum); + else + CONS_Printf("%s (%d): %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl); + } } else CONS_Printf(M_GetText("You must be in a level to use this.\n")); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 851b6b6e..80793195 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -103,10 +103,10 @@ extern consvar_t cv_pause; extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_respawntime; -/*extern consvar_t cv_teleporters, cv_superring, cv_supersneakers, cv_invincibility; +extern consvar_t cv_teleporters, cv_superring, cv_supersneakers, cv_invincibility; extern consvar_t cv_jumpshield, cv_watershield, cv_ringshield, cv_forceshield, cv_bombshield; extern consvar_t cv_1up, cv_eggmanbox; -extern consvar_t cv_recycler;*/ +extern consvar_t cv_recycler; // SRB2kart items extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana; @@ -129,12 +129,7 @@ extern consvar_t cv_speedometer; extern consvar_t cv_votetime; -extern consvar_t cv_collideminimum; -extern consvar_t cv_collidesoundnum; -extern consvar_t cv_collidesounds; - extern consvar_t cv_kartdebugitem, cv_kartdebugamount; -// extern consvar_t cv_itemfinder; @@ -255,7 +250,7 @@ void Command_Retry_f(void); void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore void D_MapChange(INT32 pmapnum, INT32 pgametype, boolean pultmode, boolean presetplayers, INT32 pdelay, boolean pskipprecutscene, boolean pfromlevelselect); void D_SetupVote(void); -void D_ModifyClientVote(SINT8 voted); +void D_ModifyClientVote(SINT8 voted, UINT8 splitplayer); void D_PickVote(void); void ObjectPlace_OnChange(void); boolean IsPlayerAdmin(INT32 playernum); diff --git a/src/d_player.h b/src/d_player.h index 5ab83e55..d39ab918 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -293,8 +293,15 @@ typedef enum k_jmp, // In Mario Kart, letting go of the jump button stops the drift k_offroad, // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed k_pogospring, // Pogo spring bounce effect + k_brakestop, // Wait until you've made a complete stop for a few tics before letting brake go in reverse. k_itemroulette, // Used for the roulette when deciding what item to give you (was "pw_kartitem") + k_roulettetype, // Used for the roulette, for deciding type (currently only used for Battle, to give you better items from Karma items) + + // Item held stuff + k_itemtype, // KITEM_ constant for item number + k_itemamount, // Amount of said item + k_itemheld, // Are you holding an item? 1 = normal hold, 2 = rotation hold // Some items use timers for their duration or effects k_attractiontimer, // Duration of Lightning Shield's item-break and item box pull @@ -306,19 +313,14 @@ typedef enum k_squishedtimer, // Squished frame timer k_rocketsneakertimer, // Rocket Sneaker duration timer k_invincibilitytimer, // Invincibility timer - k_eggmanheld, // Eggman monitor held, separate from itemtype so it doesn't stop you from getting items + k_deathsentence, // 30 seconds to live... (SPB murder timer (not actually 30 sec, I just couldn't help the FF reference :p)) + k_eggmanheld, // Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items k_spinouttimer, // Spin-out from a banana peel or oil slick (was "pw_bananacam") k_justbumped, // Prevent players from endlessly bumping into each other k_poweritemtimer, // Battle mode, how long before you're allowed another power item (Invincibility, Grow) k_comebacktimer, // Battle mode, how long before you become a bomb after death k_sadtimer, // How long you've been sad - // Each item needs its own power slot, for the HUD and held use - // *** ADDING A NEW ITEM? ADD IT TO K_DoHyudoroSteal PLEASE!! -Salt *** - k_itemtype, // KITEM_ constant for item number - k_itemamount, // Amount of said item - k_itemheld, // Are you holding an item? 1 = normal hold, 2 = rotation hold - // Battle Mode vars k_balloon, // Number of balloons left k_comebackpoints, // Number of times you've bombed or gave an item to someone; once it's 3 it gets set back to 0 and you're given a balloon diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index 0a751148..afb052ce 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -25,18 +25,13 @@ typedef enum { BT_ACCELERATE = 1, // Accelerate - BT_DRIFT = 1<<2, // Drift (direction is cmd->angleturn) + BT_DRIFT = 1<<2, // Drift (direction is cmd->driftturn) BT_BRAKE = 1<<3, // Brake BT_ATTACK = 1<<4, // Use Item BT_FORWARD = 1<<5, // Aim Item Forward BT_BACKWARD = 1<<6, // Aim Item Backward - //BT_SPECTATE = 1<<7, // Toggle Spectate - // Want more button space? Help get rid of this hack :V - BT_DRIFTLEFT = 1<<7, // Drift left hack - BT_DRIFTRIGHT = 1<<8, // Drift right hack - - // free: 1<<9 to 1<<12 + // free: 1<<7 to 1<<12 // Lua garbage BT_CUSTOM1 = 1<<13, @@ -64,6 +59,7 @@ typedef struct INT16 angleturn; // <<16 for angle delta - saved as 1 byte into demos INT16 aiming; // vertical aiming, see G_BuildTicCmd UINT16 buttons; + INT16 driftturn; // SRB2Kart: Used for getting drift turn speed } ATTRPACK ticcmd_t; #if defined(_MSC_VER) diff --git a/src/dehacked.c b/src/dehacked.c index 81a10170..32030e77 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1136,10 +1136,12 @@ static void readlevelheader(MYFILE *f, INT32 num) } else if (fastcmp(word, "ACT")) { - if (i >= 0 && i < 20) // 0 for no act number, TTL1 through TTL19 + /*if (i >= 0 && i < 20) // 0 for no act number, TTL1 through TTL19 mapheaderinfo[num-1]->actnum = (UINT8)i; else - deh_warning("Level header %d: invalid act number %d", num, i); + deh_warning("Level header %d: invalid act number %d", num, i);*/ + deh_strlcpy(mapheaderinfo[num-1]->actnum, word2, + sizeof(mapheaderinfo[num-1]->actnum), va("Level header %d: actnum", num)); } else if (fastcmp(word, "NEXTLEVEL")) { @@ -6241,7 +6243,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTSMOKE4", "S_DRIFTSMOKE5", - // Magnet Burst + // Lightning Shield Burst // Sneaker Fire Trail "S_KARTFIRE1", @@ -7294,9 +7296,13 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTSTEPPEDDOWN", // used for ramp sectors "VERTICALFLIP", // Vertically flip sprite/allow upside-down physics "GOOWATER", // Goo water - "\x01", // free: 1<<7 (name un-matchable) + "JUSTBOUNCEDWALL", // SRB2Kart: Mobj already bounced off a wall this tic "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement + "DRAWONLYFORP1", // SRB2Kart: Splitscreen sprite draw flags + "DRAWONLYFORP2", + "DRAWONLYFORP3", + "DRAWONLYFORP4", NULL }; @@ -7553,8 +7559,14 @@ static const char *const KARTSTUFF_LIST[] = { "JMP", "OFFROAD", "POGOSPRING", + "BRAKESTOP", "ITEMROULETTE", + "ROULETTETYPE", + + "ITEMTYPE", + "ITEMAMOUNT", + "ITEMHELD", "ATTRACTIONTIMER", "HYUDOROTIMER", @@ -7565,19 +7577,17 @@ static const char *const KARTSTUFF_LIST[] = { "SQUISHEDTIMER", "ROCKETSNEAKERTIMER", "INVINCIBILITYTIMER", + "DEATHSENTENCE", + "EGGMANHELD", "SPINOUTTIMER", "JUSTBUMPED", "POWERITEMTIMER", "COMEBACKTIMER", "SADTIMER", - "ITEMTYPE", - "ITEMAMOUNT", - "ITEMHELD", - "BALLOON", "COMEBACKPOINTS", - "COMEBACKMODE" + "COMEBACKMODE", }; static const char *const HUDITEMS_LIST[] = { @@ -7999,9 +8009,6 @@ struct { {"BT_ATTACK",BT_ATTACK}, {"BT_FORWARD",BT_FORWARD}, {"BT_BACKWARD",BT_BACKWARD}, - //{"BT_SPECTATE",BT_SPECTATE}, - {"BT_DRIFTLEFT",BT_DRIFTLEFT}, - {"BT_DRIFTRIGHT",BT_DRIFTRIGHT}, {"BT_CUSTOM1",BT_CUSTOM1}, // Lua customizable {"BT_CUSTOM2",BT_CUSTOM2}, // Lua customizable {"BT_CUSTOM3",BT_CUSTOM3}, // Lua customizable diff --git a/src/doomstat.h b/src/doomstat.h index d8dfd594..b3f64723 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -220,7 +220,7 @@ typedef struct char lvlttl[22]; ///< Level name without "Zone". (21 character limit instead of 32, 21 characters can display on screen max anyway) char subttl[33]; ///< Subtitle for level char zonttl[22]; ///< "ZONE" replacement name - UINT8 actnum; ///< Act number or 0 for none. + char actnum[3]; ///< SRB2Kart: Now a 2 character long string. UINT16 typeoflevel; ///< Combination of typeoflevel flags. INT16 nextlevel; ///< Map number of next level, or 1100-1102 to end. char musname[7]; ///< Music track to play. "" for no music. @@ -445,6 +445,10 @@ extern boolean franticitems; extern boolean mirrormode; extern boolean comeback; +extern tic_t instaitemcooldown; +extern tic_t spbincoming; +extern UINT8 spbplayer; + extern boolean legitimateexit; extern boolean comebackshowninfo; extern tic_t curlap, bestlap; diff --git a/src/g_game.c b/src/g_game.c index 4d04052a..4f824e2c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -242,7 +242,7 @@ INT32 cheats; //for multiplayer cheat commands // SRB2Kart // Cvars that we don't want changed mid-game -UINT8 gamespeed; // Game's current speed (or difficulty, or cc, or etc); 0-2 for relaxed, standard, & turbo +UINT8 gamespeed; // Game's current speed (or difficulty, or cc, or etc); 0 for easy, 1 for normal, 2 for hard boolean mirrormode; // Mirror Mode currently enabled? boolean franticitems; // Frantic items currently enabled? boolean comeback; // Battle Mode's karma comeback is on/off @@ -252,6 +252,11 @@ INT16 votelevels[4]; // Levels that were rolled by the host SINT8 votes[MAXPLAYERS]; // Each player's vote SINT8 pickedvote; // What vote the host rolls +// Server-sided variables +tic_t instaitemcooldown; // Cooldown before any more lightning/blue shell is awarded +tic_t spbincoming; // Timer before blue shell hits, can switch targets at this point +UINT8 spbplayer; // Player num that used the last blue shell + // Client-sided variables (NEVER use in anything that needs to be synced with other players) boolean legitimateexit; // Did this client actually finish the match? boolean comebackshowninfo; // Have you already seen the "ATTACK OR PROTECT" message? @@ -1150,16 +1155,15 @@ angle_t localangle, localangle2, localangle3, localangle4; boolean camspin, camspin2, camspin3, camspin4; static fixed_t forwardmove[2] = {25<>16, 50<>16}; -static fixed_t sidemove[2] = {25<>16, 50<>16}; // faster! +static fixed_t sidemove[2] = {2<>16, 4<>16}; static fixed_t angleturn[3] = {400, 800, 200}; // + slow turn void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { - boolean forcestrafe = false; INT32 laim, th, tspeed, forward, side, axis; //i const INT32 speed = 1; // these ones used for multiple conditions - boolean turnleft, turnright, invertmouse, mouseaiming, lookaxis, analog, analogjoystickmove, gamepadjoystickmove, kbl, rd; + boolean turnleft, turnright, invertmouse, mouseaiming, lookaxis, analogjoystickmove, gamepadjoystickmove, kbl, rd; player_t *player; camera_t *thiscam; angle_t lang; @@ -1231,7 +1235,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) lookaxis = cv_lookaxis2.value; analogjoystickmove = cv_usejoystick2.value && !Joystick2.bGamepadStyle; gamepadjoystickmove = cv_usejoystick2.value && Joystick2.bGamepadStyle; - analog = cv_analog2.value; break; case 3: mouseaiming = false; @@ -1239,7 +1242,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) lookaxis = cv_lookaxis3.value; analogjoystickmove = cv_usejoystick3.value && !Joystick3.bGamepadStyle; gamepadjoystickmove = cv_usejoystick3.value && Joystick3.bGamepadStyle; - analog = cv_analog3.value; break; case 4: mouseaiming = false; @@ -1247,7 +1249,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) lookaxis = cv_lookaxis4.value; analogjoystickmove = cv_usejoystick4.value && !Joystick4.bGamepadStyle; gamepadjoystickmove = cv_usejoystick4.value && Joystick4.bGamepadStyle; - analog = cv_analog4.value; break; case 1: default: @@ -1256,7 +1257,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) lookaxis = cv_lookaxis.value; analogjoystickmove = cv_usejoystick.value && !Joystick.bGamepadStyle; gamepadjoystickmove = cv_usejoystick.value && Joystick.bGamepadStyle; - analog = cv_analog.value; break; } @@ -1292,49 +1292,66 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else tspeed = speed; + cmd->driftturn = 0; + // let movement keys cancel each other out - if (analog) // Analog + if (turnright && !(turnleft)) { - if (turnright) - cmd->angleturn = (INT16)(cmd->angleturn - angleturn[tspeed]); - if (turnleft) - cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]); + cmd->angleturn = (INT16)(cmd->angleturn - angleturn[tspeed]); + cmd->driftturn = (INT16)(cmd->driftturn - angleturn[tspeed]); + } + else if (turnleft && !(turnright)) + { + cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]); + cmd->driftturn = (INT16)(cmd->driftturn + angleturn[tspeed]); } - if (analog || twodlevel - || (player->mo && (player->mo->flags2 & MF2_TWOD)) - || (!demoplayback && (player->climbing - || (player->pflags & PF_NIGHTSMODE) - || (player->pflags & PF_SLIDING) - || (player->pflags & PF_FORCESTRAFE)))) // Analog - forcestrafe = true; + if (analogjoystickmove && axis != 0) + { + // JOYAXISRANGE should be 1023 (divide by 1024) + cmd->angleturn = (INT16)(cmd->angleturn - ((axis * angleturn[1]) >> 10)); // ANALOG! + cmd->driftturn = (INT16)(cmd->driftturn - ((axis * angleturn[1]) >> 10)); + } - if (forcestrafe) // Analog + // Specator mouse turning + if (player->spectator) + { + cmd->angleturn = (INT16)(cmd->angleturn - (mousex*(mirrormode ? -1 : 1)*8)); + cmd->driftturn = (INT16)(cmd->driftturn - (mousex*(mirrormode ? -1 : 1)*8)); + } + + // Bounce pad strafing + if (!demoplayback && ((player->pflags & PF_FORCESTRAFE) || (player->kartstuff[k_pogospring]))) { if (turnright) - side += sidemove[speed]; + side += sidemove[1]; if (turnleft) - side -= sidemove[speed]; - + side -= sidemove[1]; if (analogjoystickmove && axis != 0) { // JOYAXISRANGE is supposed to be 1023 (divide by 1024) - side += ((axis * sidemove[1]) >> 10); + side += ((axis * sidemove[0]) >> 10); } } - else - { - if (turnright && !(turnleft)) - cmd->angleturn = (INT16)(cmd->angleturn - angleturn[tspeed]); - else if (turnleft && !(turnright)) - cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]); - if (analogjoystickmove && axis != 0) - { - // JOYAXISRANGE should be 1023 (divide by 1024) - cmd->angleturn = (INT16)(cmd->angleturn - ((axis * angleturn[1]) >> 10)); // ANALOG! - } - } + //{ SRB2kart - Drift support + // limit turning to angleturn[1] to stop mouselook letting you look too fast + if (cmd->angleturn > angleturn[1]) + cmd->angleturn = angleturn[1]; + else if (cmd->angleturn < -angleturn[1]) + cmd->angleturn = -angleturn[1]; + + if (cmd->driftturn > angleturn[1]) + cmd->driftturn = angleturn[1]; + else if (cmd->driftturn < -angleturn[1]) + cmd->driftturn = -angleturn[1]; + + if (player->mo) + cmd->angleturn = K_GetKartTurnValue(player, cmd->angleturn); + + // SRB2kart - no additional angle if not moving + if ((player->mo && player->speed > 0) || (leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE) || (player->spectator || objectplacing)) + lang += (cmd->angleturn<<16); if (player->spectator || objectplacing) // SRB2Kart: spectators need special controls { @@ -1392,7 +1409,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (InputDown(gc_fire, ssplayer) || (cv_usejoystick.value && axis > 0)) cmd->buttons |= BT_ATTACK; - // drift button + // drift with any button/key axis = JoyAxis(AXISDRIFT, ssplayer); if (InputDown(gc_drift, ssplayer) || (cv_usejoystick.value && axis > 0)) cmd->buttons |= BT_DRIFT; @@ -1405,6 +1422,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (InputDown(gc_custom3, ssplayer)) cmd->buttons |= BT_CUSTOM3; + // Reset camera if (InputDown(gc_camreset, ssplayer)) { if (thiscam->chase && !rd) @@ -1414,7 +1432,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else rd = false; - // player aiming shit, ahhhh... + // spectator aiming shit, ahhhh... { INT32 player_invert = invertmouse ? -1 : 1; INT32 screen_invert = @@ -1463,15 +1481,13 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) cmd->aiming = G_ClipAimingPitch(&laim); } - if (player->spectator) - cmd->angleturn = (INT16)(cmd->angleturn - (mousex*(mirrormode ? -1 : 1)*8)); - mousex = mousey = mlooky = 0; if (forward > MAXPLMOVE) forward = MAXPLMOVE; else if (forward < -MAXPLMOVE) forward = -MAXPLMOVE; + if (side > MAXPLMOVE) side = MAXPLMOVE; else if (side < -MAXPLMOVE) @@ -1479,86 +1495,20 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // No additional acceleration when moving forward/backward and strafing simultaneously. // do this AFTER we cap to MAXPLMOVE so people can't find ways to cheese around this. - if (!forcestrafe && forward && side) + // SRB2Kart: We don't need this; we WANT bounce strafing to plain stack on top of normal movement. + /*if (!bouncestrafe && forward && side) { forward = FixedMul(forward, 3*FRACUNIT/4); side = FixedMul(side, 3*FRACUNIT/4); - } + }*/ - //Silly hack to make 2d mode *somewhat* playable with no chasecam. - if ((twodlevel || (player->mo && player->mo->flags2 & MF2_TWOD)) && !thiscam->chase) - { - INT32 temp = forward; - forward = side; - side = temp; - } - - if (cmd->buttons & BT_BRAKE && !forward) // Sal: If you're not accelerating, but going forward, then you should just lose your momentum. Request from Sev - { - cmd->forwardmove = (SINT8)(cmd->forwardmove / 2); - cmd->sidemove = (SINT8)(cmd->sidemove / 2); - } - else + if (forward || side) { cmd->forwardmove = (SINT8)(cmd->forwardmove + forward); - if (mirrormode) - cmd->sidemove = (SINT8)(cmd->sidemove - side); - else - cmd->sidemove = (SINT8)(cmd->sidemove + side); + cmd->sidemove = (SINT8)(cmd->sidemove + side); } - if (ssplayer == 2 && player->bot == 1) { - if (!player->powers[pw_tailsfly] && (cmd->forwardmove || cmd->sidemove || cmd->buttons)) - { - player->bot = 2; // A player-controlled bot. Returns to AI when it respawns. - //CV_SetValue(&cv_analog2, true); - } - else - { - G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); // empty, or external driver - B_BuildTiccmd(player, cmd); - } - } - - //{ SRB2kart - Drift support - axis = JoyAxis(AXISTURN, ssplayer); - if (mirrormode) - axis = -axis; - - // TODO: Remove this hack please :( - if (cmd->angleturn > 0) // Drifting to the left - cmd->buttons |= BT_DRIFTLEFT; - else - cmd->buttons &= ~BT_DRIFTLEFT; - - if (cmd->angleturn < 0) // Drifting to the right - cmd->buttons |= BT_DRIFTRIGHT; - else - cmd->buttons &= ~BT_DRIFTRIGHT; - //} - - if (analog) { - cmd->angleturn = (INT16)(thiscam->angle >> 16); - if (player->awayviewtics) - cmd->angleturn = (INT16)(player->awayviewmobj->angle >> 16); - } - else - { - // limit turning to angleturn[1] to stop mouselook letting you look too fast - if (cmd->angleturn > angleturn[1]) - cmd->angleturn = angleturn[1]; - else if (cmd->angleturn < -angleturn[1]) - cmd->angleturn = -angleturn[1]; - - if (player->mo) - cmd->angleturn = K_GetKartTurnValue(player, cmd->angleturn); - - // SRB2kart - no additional angle if not moving - if ((player->mo && player->speed > 0) || (leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE) || (player->spectator || objectplacing)) - lang += (cmd->angleturn<<16); - - cmd->angleturn = (INT16)(lang >> 16); - } + cmd->angleturn = (INT16)(lang >> 16); if (!hu_stopped) { @@ -2481,15 +2431,10 @@ void G_PlayerReborn(INT32 player) mapmusname[6] = 0; mapmusflags = mapheaderinfo[gamemap-1]->mustrack & MUSIC_TRACKMASK; } - //SRB2kart - leveltime stuff - if (leveltime > 157) - { - S_ChangeMusic(mapmusname, mapmusflags, true); - if (p->laps == (unsigned)(cv_numlaps.value - 1)) - S_SpeedMusic(1.2f); - } } + P_RestoreMusic(p); + if (leveltime > 157 && !p->spectator) p->kartstuff[k_lakitu] = 48; // Lakitu Spawner @@ -2867,11 +2812,11 @@ void G_DoReborn(INT32 playernum) player_t *player = &players[playernum]; boolean starpost = false; - if (modeattacking) + /*if (modeattacking) // Not needed for SRB2Kart. { M_EndModeAttackRun(); return; - } + }*/ // Make sure objectplace is OFF when you first start the level! OP_ResetObjectplace(); @@ -3209,9 +3154,12 @@ INT16 G_RandMap(INT16 tolflags, INT16 pprevmap, boolean dontadd, boolean ignoreb else { ix = okmaps[M_RandomKey(numokmaps)]; - for (bufx = NUMMAPS; bufx > 0; bufx--) - randmapbuffer[bufx] = randmapbuffer[bufx-1]; - randmapbuffer[0] = ix; + if (!dontadd) + { + for (bufx = NUMMAPS; bufx > 0; bufx--) + randmapbuffer[bufx] = randmapbuffer[bufx-1]; + randmapbuffer[0] = ix; + } } Z_Free(okmaps); @@ -3663,6 +3611,7 @@ void G_LoadGameData(void) // Saves the main data file, which stores information such as emblems found, etc. void G_SaveGameData(boolean force) { + const boolean wasmodified = modifiedgame; size_t length; INT32 i, j; UINT8 btemp; @@ -3679,8 +3628,9 @@ void G_SaveGameData(boolean force) return; } - if (modifiedgame && !savemoddata - && !force) // SRB2Kart: for enabling unlocks online in modified servers + if (force) // SRB2Kart: for enabling unlocks online, even if the game is modified + modifiedgame = savemoddata; // L-let's just sort of... hack around the cheat protection, because I'm too worried about just removing it @@; + else if (modifiedgame && !savemoddata) { free(savebuffer); save_p = savebuffer = NULL; @@ -3779,6 +3729,9 @@ void G_SaveGameData(boolean force) FIL_WriteFile(va(pandf, srb2home, gamedatafilename), savebuffer, length); free(savebuffer); save_p = savebuffer = NULL; + + if (force) // Eeeek, I'm sorry for my sins! + modifiedgame = wasmodified; } #define VERSIONSIZE 16 @@ -4146,10 +4099,10 @@ char *G_BuildMapTitle(INT32 mapnum) { size_t len = 1; const char *zonetext = NULL; - const INT32 actnum = mapheaderinfo[mapnum-1]->actnum; + const char *actnum = NULL; len += strlen(mapheaderinfo[mapnum-1]->lvlttl); - if (strcmp(mapheaderinfo[mapnum-1]->zonttl, "")) + if (strlen(mapheaderinfo[mapnum-1]->zonttl) > 0) { zonetext = M_GetText(mapheaderinfo[mapnum-1]->zonttl); len += strlen(zonetext) + 1; // ' ' + zonetext @@ -4159,14 +4112,17 @@ char *G_BuildMapTitle(INT32 mapnum) zonetext = M_GetText("ZONE"); len += strlen(zonetext) + 1; // ' ' + zonetext } - if (actnum > 0) - len += 1 + 11; // ' ' + INT32 + if (strlen(mapheaderinfo[mapnum-1]->actnum) > 0) + { + actnum = M_GetText(mapheaderinfo[mapnum-1]->actnum); + len += strlen(actnum) + 1; // ' ' + actnum + } title = Z_Malloc(len, PU_STATIC, NULL); sprintf(title, "%s", mapheaderinfo[mapnum-1]->lvlttl); if (zonetext) sprintf(title + strlen(title), " %s", zonetext); - if (actnum > 0) sprintf(title + strlen(title), " %d", actnum); + if (actnum) sprintf(title + strlen(title), " %s", actnum); } return title; @@ -4191,6 +4147,7 @@ char *G_BuildMapTitle(INT32 mapnum) #define ZT_ANGLE 0x04 #define ZT_BUTTONS 0x08 #define ZT_AIMING 0x10 +#define ZT_DRIFT 0x20 #define DEMOMARKER 0x80 // demoend static ticcmd_t oldcmd; @@ -4248,6 +4205,7 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n) dest[i].angleturn = SHORT(src[i].angleturn); dest[i].aiming = (INT16)SHORT(src[i].aiming); dest[i].buttons = (UINT16)SHORT(src[i].buttons); + dest[i].driftturn = (INT16)SHORT(src[i].driftturn); } return dest; } @@ -4271,6 +4229,8 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) oldcmd.buttons = (oldcmd.buttons & (BT_FORWARD|BT_BACKWARD)) | (READUINT16(demo_p) & ~(BT_FORWARD|BT_BACKWARD)); if (ziptic & ZT_AIMING) oldcmd.aiming = READINT16(demo_p); + if (ziptic & ZT_DRIFT) + oldcmd.driftturn = READINT16(demo_p); G_CopyTiccmd(cmd, &oldcmd, 1); @@ -4327,6 +4287,13 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum) ziptic |= ZT_AIMING; } + if (cmd->driftturn != oldcmd.driftturn) + { + WRITEINT16(demo_p,cmd->driftturn); + oldcmd.driftturn = cmd->driftturn; + ziptic |= ZT_DRIFT; + } + *ziptic_p = ziptic; // attention here for the ticcmd size! @@ -4699,6 +4666,8 @@ void G_GhostTicker(void) g->p += 2; if (ziptic & ZT_AIMING) g->p += 2; + if (ziptic & ZT_DRIFT) + g->p += 2; // Grab ghost data. ziptic = READUINT8(g->p); diff --git a/src/g_input.c b/src/g_input.c index df0ee776..2822cc29 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1197,6 +1197,7 @@ static const char *gamecontrolname[num_gamecontrols] = "brake", "fire", "lookback", + "camreset", "camtoggle", "spectate", "lookup", diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b7797e54..4429bafe 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -2905,8 +2905,8 @@ static boolean HWR_CheckBBox(fixed_t *bspcoord) py2 = bspcoord[checkcoord[boxpos][3]]; // check clip list for an open space - angle1 = R_PointToAngle(px1, py1) - dup_viewangle; - angle2 = R_PointToAngle(px2, py2) - dup_viewangle; + angle1 = R_PointToAngle2(dup_viewx>>1, dup_viewy>>1, px1>>1, py1>>1) - dup_viewangle; + angle2 = R_PointToAngle2(dup_viewx>>1, dup_viewy>>1, px2>>1, py2>>1) - dup_viewangle; span = angle1 - angle2; @@ -4236,6 +4236,9 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) i = 0; temp = FLOAT_TO_FIXED(realtop); + if (spr->mobj->frame & FF_FULLBRIGHT) + lightlevel = 255; + #ifdef ESLOPE for (i = 1; i < sector->numlights; i++) { @@ -4243,14 +4246,16 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) : sector->lightlist[i].height; if (h <= temp) { - lightlevel = *list[i-1].lightlevel; + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = *list[i-1].lightlevel; colormap = list[i-1].extra_colormap; break; } } #else i = R_GetPlaneLight(sector, temp, false); - lightlevel = *list[i].lightlevel; + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = *list[i].lightlevel; colormap = list[i].extra_colormap; #endif @@ -4265,7 +4270,8 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) // even if we aren't changing colormap or lightlevel, we still need to continue drawing down the sprite if (!(list[i].flags & FF_NOSHADE) && (list[i].flags & FF_CUTSPRITES)) { - lightlevel = *list[i].lightlevel; + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = *list[i].lightlevel; colormap = list[i].extra_colormap; } @@ -5386,7 +5392,7 @@ static void HWR_ProjectSprite(mobj_t *thing) if (thing->skin && thing->sprite == SPR_PLAY) // This thing is a player! { if (thing->colorized) - vis->colormap = R_GetTranslationColormap(TC_RAINBOW, thing->color, GTC_CACHE); + vis->colormap = R_GetTranslationColormap(TC_STARMAN, thing->color, GTC_CACHE); else { size_t skinnum = (skin_t*)thing->skin-skins; @@ -5396,7 +5402,7 @@ static void HWR_ProjectSprite(mobj_t *thing) else { if (vis->mobj && vis->mobj->colorized) - vis->colormap = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color ? vis->mobj->color : SKINCOLOR_CYAN, GTC_CACHE); + vis->colormap = R_GetTranslationColormap(TC_STARMAN, vis->mobj->color ? vis->mobj->color : SKINCOLOR_CYAN, GTC_CACHE); else vis->colormap = R_GetTranslationColormap(TC_DEFAULT, vis->mobj->color ? vis->mobj->color : SKINCOLOR_CYAN, GTC_CACHE); } diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 119ff273..8bb4c959 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1208,7 +1208,7 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, } // starman support, could theoretically support boss ones too - if (skinnum == TC_RAINBOW) + if (skinnum == TC_STARMAN) { while (size--) { @@ -1490,7 +1490,7 @@ void HWR_DrawMD2(gr_vissprite_t *spr) if (spr->mobj->skin && spr->mobj->sprite == SPR_PLAY) { if (spr->mobj->colorized) - skinnum = TC_RAINBOW; + skinnum = TC_STARMAN; else { skinnum = (INT32)((skin_t*)spr->mobj->skin-skins); diff --git a/src/info.c b/src/info.c index c2c939ef..77a6c6b7 100644 --- a/src/info.c +++ b/src/info.c @@ -55,11 +55,11 @@ char sprnames[NUMSPRITES + 1][5] = "GWLR","SRBA","SRBB","SRBC","SRBD","SRBE","SRBF","SRBG","SRBH","SRBI", "SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO", //SRB2kart Sprites - "SPRG","BSPR","RNDM","KFRE","KINV","KINF","DRIF","DSMO","FITM","BANA", - "GSHE","JAWZ","SSMN","KRBM","BLIG","LIGH","SINK","SITR","KBLN","LAKI", - "POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO", - "CRAB","SHAD","BUMP","FLEN","CLAS","PSHW","ARRO","ITEM","ITMI","ITMN", - "PBOM" + "SPRG","BSPR","RNDM","RPOP","KFRE","KINV","KINF","DRIF","DSMO","FITM", + "BANA","GSHE","JAWZ","SSMN","KRBM","BLIG","LIGH","SINK","SITR","KBLN", + "LAKI","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", + "SACO","CRAB","SHAD","BUMP","FLEN","CLAS","PSHW","ARRO","ITEM","ITMI", + "ITMN","PBOM" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2566,10 +2566,10 @@ state_t states[NUMSTATES] = {SPR_RNDM, 23, 3, {NULL}, 0, 0, S_RANDOMITEM1}, // S_RANDOMITEM24 {SPR_RNDM, 0, 1, {A_ItemPop}, 0, 0, S_NULL}, // S_DEADRANDOMITEM - {SPR_RNDM, FF_FULLBRIGHT|24, 5, {NULL}, 0, 0, S_RANDOMITEMPOP2}, // S_RANDOMITEMPOP1 - {SPR_RNDM, FF_FULLBRIGHT|25, 5, {NULL}, 0, 0, S_RANDOMITEMPOP3}, // S_RANDOMITEMPOP2 - {SPR_RNDM, FF_FULLBRIGHT|26, 5, {NULL}, 0, 0, S_RANDOMITEMPOP4}, // S_RANDOMITEMPOP3 - {SPR_RNDM, FF_FULLBRIGHT|27, 5, {NULL}, 0, 0, S_NULL}, // S_RANDOMITEMPOP4 + {SPR_RPOP, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_RANDOMITEMPOP2}, // S_RANDOMITEMPOP1 + {SPR_RPOP, FF_FULLBRIGHT|1, 5, {NULL}, 0, 0, S_RANDOMITEMPOP3}, // S_RANDOMITEMPOP2 + {SPR_RPOP, FF_FULLBRIGHT|2, 5, {NULL}, 0, 0, S_RANDOMITEMPOP4}, // S_RANDOMITEMPOP3 + {SPR_RPOP, FF_FULLBRIGHT|3, 5, {NULL}, 0, 0, S_NULL}, // S_RANDOMITEMPOP4 {SPR_DRIF, 0, 2, {NULL}, 0, 0, S_DRIFTSPARK2}, // S_DRIFTSPARK1 {SPR_DRIF, 1, 2, {NULL}, 0, 0, S_DRIFTSPARK3}, // S_DRIFTSPARK2 @@ -2722,7 +2722,7 @@ state_t states[NUMSTATES] = {SPR_BLIG, 1, 2, {NULL}, 0, 0, S_BLUELIGHTNING3}, // S_BLUELIGHTNING2 {SPR_BLIG, 2, 2, {NULL}, 0, 0, S_BLUELIGHTNING4}, // S_BLUELIGHTNING3 {SPR_BLIG, 3, 2, {NULL}, 0, 0, S_NULL}, // S_BLUELIGHTNING4 - {SPR_SSMN, 3, 1, {A_MineExplode}, MT_BLUEEXPLOSION, 0, S_NULL}, // S_BLUEEXPLODE + {SPR_BOMB, 0, 1, {A_MineExplode}, MT_BLUEEXPLOSION, 0, S_NULL}, // S_BLUEEXPLODE {SPR_LIGH, 0, 2, {NULL}, 0, 0, S_LIGHTNING2}, // S_LIGHTNING1 {SPR_LIGH, 1, 2, {NULL}, 0, 0, S_LIGHTNING3}, // S_LIGHTNING2 @@ -14242,30 +14242,30 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = }, { // MT_RANDOMITEM - 2000, // doomednum - S_RANDOMITEM1, // spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 0, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate + 2000, // doomednum + S_RANDOMITEM1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate S_DEADRANDOMITEM, // deathstate - S_NULL, // xdeathstate - sfx_pop, // deathsound - 60*FRACUNIT, // speed - 36*FRACUNIT, // radius - 36*FRACUNIT, // height - 0, // display offset - 100, // mass + S_NULL, // xdeathstate + sfx_kc2e, // deathsound + 60*FRACUNIT, // speed + 36*FRACUNIT, // radius + 36*FRACUNIT, // height + 0, // display offset + 100, // mass MT_RANDOMITEMPOP, // damage - sfx_None, // activesound + sfx_None, // activesound MF_SLIDEME|MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags - S_NULL // raisestate + S_NULL // raisestate }, { // MT_RANDOMITEMPOP @@ -14545,7 +14545,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // seestate sfx_tossed, // seesound 8, // reactiontime - sfx_tink, // attacksound + sfx_mario1, // attacksound S_NULL, // painstate 0, // painchance sfx_None, // painsound @@ -14682,7 +14682,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 105, // reactiontime sfx_None, // attacksound S_NULL, // painstate - 320*FRACUNIT, // painchance + 288*FRACUNIT, // painchance sfx_None, // painsound S_NULL, // meleestate S_NULL, // missilestate @@ -15020,7 +15020,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOGRAVITY|MF_SCENERY, // flags S_NULL // raisestate }, diff --git a/src/info.h b/src/info.h index c1244934..a8bc4c5b 100644 --- a/src/info.h +++ b/src/info.h @@ -163,8 +163,8 @@ void A_RandomStateRange(); void A_DualAction(); void A_RemoteAction(); void A_ToggleFlameJet(); -void A_ItemPop(); // SRB2kart -void A_JawzChase(); // SRB2kart +void A_ItemPop(); // SRB2kart +void A_JawzChase(); // SRB2kart void A_MineExplode(); // SRB2kart void A_OrbitNights(); void A_GhostMe(); @@ -579,6 +579,7 @@ typedef enum sprite SPR_BSPR, // Blue Diagonal Spring SPR_RNDM, // Random Item Box + SPR_RPOP, // Random Item Box Pop SPR_KFRE, // Sneaker fire trail SPR_KINV, // Invincibility sparkle trail SPR_KINF, // Invincibility flash diff --git a/src/k_kart.c b/src/k_kart.c index cddc478a..d3984cdf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -25,6 +25,9 @@ // franticitems is Frantic Mode items, bool // mirrormode is Mirror Mode (duh), bool // comeback is Battle Mode's karma comeback, also bool +// instaitemcooldown is timer before anyone's allowed another lightning/blue shell +// spbincoming is the timer before k_deathsentence is cast on the player in 1st +// spbplayer is the last player who fired one //{ SRB2kart Color Code @@ -325,10 +328,6 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_speedometer); CV_RegisterVar(&cv_votetime); - CV_RegisterVar(&cv_collideminimum); - CV_RegisterVar(&cv_collidesoundnum); - CV_RegisterVar(&cv_collidesounds); - CV_RegisterVar(&cv_kartdebugitem); CV_RegisterVar(&cv_kartdebugamount); } @@ -364,56 +363,54 @@ boolean K_IsPlayerLosing(player_t *player) #define NUMKARTODDS 40 // Less ugly 2D arrays -static INT32 K_KartItemOddsDistance_Retro[NUMKARTRESULTS][9] = +static INT32 K_KartItemOddsRace[NUMKARTRESULTS][9] = { //P-Odds 0 1 2 3 4 5 6 7 8 - /*Sneaker*/ { 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Sneaker - /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Rocket Sneaker - /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Invincibility + /*Sneaker*/ {20, 0, 0, 3, 7, 6, 0, 0, 0 }, // Sneaker + /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 3, 5, 4, 0 }, // Rocket Sneaker + /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 6, 9,18 }, // Invincibility /*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana /*Eggman Monitor*/ { 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Eggman Monitor /*Orbinaut*/ { 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Orbinaut /*Jawz*/ { 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Jawz /*Mine*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Mine /*Ballhog*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Ballhog - /*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Self-Propelled Bomb - /*Grow*/ { 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Grow + /*Self-Propelled Bomb*/ { 0, 0, 1, 2, 4, 3, 1, 0, 0 }, // Self-Propelled Bomb + /*Grow*/ { 0, 0, 0, 0, 0, 0, 1, 1, 2 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0 }, // Shrink /*Lightning Shield*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Lightning Shield /*Hyudoro*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink - - /*Sneaker x3*/ { 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Sneaker x3 + /*Sneaker x3*/ { 0, 0, 0, 0, 3, 8, 7, 4, 0 }, // Sneaker x3 /*Banana x3*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Banana x3 /*Orbinaut x3*/ { 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Orbinaut x3 /*Jawz x2*/ { 0, 0, 0, 1, 1, 0, 0, 0, 0 } // Jawz x2 }; -static INT32 K_KartItemOddsBalloons[NUMKARTRESULTS][5] = +static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][6] = { - //P-Odds 0 1 2 3 4 - /*Sneaker*/ { 1, 2, 5, 1, 0 }, // Sneaker - /*Rocket Sneaker*/ { 0, 0, 0, 0, 0 }, // Rocket Sneaker - /*Invincibility*/ { 1, 1, 0, 0, 0 }, // Invincibility - /*Banana*/ { 0, 0, 3, 1, 1 }, // Banana - /*Eggman Monitor*/ { 0, 0, 2, 2, 1 }, // Eggman Monitor - /*Orbinaut*/ { 0, 0, 5, 3, 1 }, // Orbinaut - /*Jawz*/ { 0, 3, 3, 1, 0 }, // Jawz - /*Mine*/ { 0, 3, 3, 0, 0 }, // Mine - /*Ballhog*/ { 0, 3, 3, 0, 0 }, // Ballhog - /*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0 }, // Self-Propelled Bomb - /*Grow*/ { 1, 1, 0, 0, 0 }, // Grow - /*Shrink*/ { 0, 0, 0, 0, 0 }, // Shrink - /*Lightning Shield*/ { 0, 0, 0, 0, 0 }, // Lightning Shield - /*Hyudoro*/ { 0, 1, 1, 1, 0 }, // Hyudoro - /*Pogo Spring*/ { 0, 0, 3, 2, 1 }, // Pogo Spring - /*Kitchen Sink*/ { 0, 0, 0, 0, 0 }, // Kitchen Sink - - /*Sneaker x3*/ { 0, 0, 0, 0, 0 }, // Sneaker x3 - /*Orbinaut x3*/ { 0, 3, 3, 1, 0 }, // Orbinaut x3 - /*Banana x3*/ { 0, 3, 1, 1, 0 }, // Banana x3 - /*Jawz x2*/ { 1, 1, 0, 0, 0 } // Jawz x2 + //P-Odds 0 1 2 3 4 5 + /*Sneaker*/ { 3, 1, 2, 2, 0, 2 }, // Sneaker + /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 0 }, // Rocket Sneaker + /*Invincibility*/ { 4, 2, 1, 0, 0, 2 }, // Invincibility + /*Banana*/ { 0, 0, 2, 3, 6, 0 }, // Banana + /*Eggman Monitor*/ { 0, 0, 2, 2, 3, 0 }, // Eggman Monitor + /*Orbinaut*/ { 0, 0, 3, 5,10, 0 }, // Orbinaut + /*Jawz*/ { 3, 3, 2, 1, 0, 2 }, // Jawz + /*Mine*/ { 0, 3, 2, 1, 0, 2 }, // Mine + /*Ballhog*/ { 0, 2, 1, 1, 0, 2 }, // Ballhog + /*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0, 0 }, // Self-Propelled Bomb + /*Grow*/ { 4, 2, 0, 0, 0, 2 }, // Grow + /*Shrink*/ { 0, 0, 0, 0, 0, 0 }, // Shrink + /*Lightning Shield*/ { 0, 0, 0, 0, 0, 0 }, // Lightning Shield + /*Hyudoro*/ { 0, 0, 1, 1, 0, 0 }, // Hyudoro + /*Pogo Spring*/ { 0, 0, 1, 2, 0, 0 }, // Pogo Spring + /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0 }, // Kitchen Sink + /*Sneaker x3*/ { 3, 0, 0, 0, 0, 2 }, // Sneaker x3 + /*Banana x3*/ { 0, 2, 2, 1, 1, 2 }, // Banana x3 + /*Orbinaut x3*/ { 0, 3, 1, 1, 0, 2 }, // Orbinaut x3 + /*Jawz x2*/ { 3, 2, 0, 0, 0, 2 } // Jawz x2 }; /** \brief Item Roulette for Kart @@ -423,11 +420,22 @@ static INT32 K_KartItemOddsBalloons[NUMKARTRESULTS][5] = \return void */ -static void K_KartGetItemResult(player_t *player, INT8 getitem) +static void K_KartGetItemResult(player_t *player, SINT8 getitem) { switch (getitem) { - // Do the special roulette numbers first, then do the + // Special roulettes first, then the generic ones are handled by default + case KITEM_TRIPLESNEAKER: + if (getitem <= 0 || getitem >= NUMKARTRESULTS) // Sad (Fallback) + { + if (getitem != 0) + CONS_Printf("ERROR: P_KartGetItemResult - Item roulette gave bad item (%d) :(\n", getitem); + player->kartstuff[k_itemtype] = KITEM_SAD; + } + else + player->kartstuff[k_itemtype] = getitem; + player->kartstuff[k_itemamount] = 1; + break; case KRITEM_TRIPLESNEAKER: // Sneaker x3 player->kartstuff[k_itemtype] = KITEM_SNEAKER; player->kartstuff[k_itemamount] = 3; @@ -458,16 +466,23 @@ static void K_KartGetItemResult(player_t *player, INT8 getitem) } } -static INT32 K_KartGetItemOdds(UINT8 pos, INT8 item, player_t *player) +/** \brief Item Roulette for Kart + + \param player player object passed from P_KartPlayerThink + + \return void +*/ + +static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, player_t *player, boolean mashed) { INT32 newodds; INT32 i; UINT8 pingame = 0, pexiting = 0; if (G_BattleGametype()) - newodds = K_KartItemOddsBalloons[item-1][pos]; + newodds = K_KartItemOddsBattle[item-1][pos]; else - newodds = K_KartItemOddsDistance_Retro[item-1][pos]; + newodds = K_KartItemOddsRace[item-1][pos]; for (i = 0; i < MAXPLAYERS; i++) { @@ -484,10 +499,12 @@ static INT32 K_KartGetItemOdds(UINT8 pos, INT8 item, player_t *player) break; case KITEM_ROCKETSNEAKER: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_rocketsneaker.value) newodds = 0; break; case KITEM_INVINCIBILITY: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_invincibility.value || player->kartstuff[k_poweritemtimer]) newodds = 0; break; case KITEM_BANANA: @@ -501,31 +518,39 @@ static INT32 K_KartGetItemOdds(UINT8 pos, INT8 item, player_t *player) break; case KITEM_JAWZ: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_jawz.value) newodds = 0; break; case KITEM_MINE: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_mine.value) newodds = 0; break; case KITEM_BALLHOG: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_ballhog.value) newodds = 0; break; case KITEM_SPB: if (franticitems) newodds *= 2; - if (!cv_selfpropelledbomb.value || pexiting <= 0) newodds = 0; + if (mashed) newodds /= 2; + if (!cv_selfpropelledbomb.value || pexiting <= 0 + || (secondist <= (64*14)*4) || instaitemcooldown) newodds = 0; break; case KITEM_GROW: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_grow.value || player->kartstuff[k_poweritemtimer]) newodds = 0; break; case KITEM_SHRINK: if (franticitems) newodds *= 2; - if (!cv_shrink.value || pingame-1 <= pexiting) newodds = 0; + if (mashed) newodds /= 2; + if (!cv_shrink.value || pingame-1 <= pexiting || instaitemcooldown) newodds = 0; break; case KITEM_LIGHTNINGSHIELD: if (franticitems) newodds *= 2; - if (!cv_lightningshield.value || gametype != GT_RACE) newodds = 0; + if (mashed) newodds /= 2; + if (!cv_lightningshield.value) newodds = 0; break; case KITEM_HYUDORO: if (!cv_hyudoro.value) newodds = 0; @@ -535,22 +560,27 @@ static INT32 K_KartGetItemOdds(UINT8 pos, INT8 item, player_t *player) break; /*case KITEM_KITCHENSINK: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_kitchensink.value) newodds = 0; break;*/ case KRITEM_TRIPLESNEAKER: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_triplesneaker.value) newodds = 0; break; case KRITEM_TRIPLEBANANA: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_triplebanana.value) newodds = 0; break; case KRITEM_TRIPLEORBINAUT: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_tripleorbinaut.value) newodds = 0; break; case KRITEM_DUALJAWZ: if (franticitems) newodds *= 2; + if (mashed) newodds /= 2; if (!cv_dualjawz.value) newodds = 0; break; default: @@ -575,6 +605,10 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) UINT8 oddsvalid[9]; UINT8 disttable[14]; UINT8 distlen = 0; + INT32 secondist = 0; + SINT8 first = -1; + SINT8 second = -1; + boolean mashed = false; // This makes the roulette cycle through items - if this is 0, you shouldn't be here. if (player->kartstuff[k_itemroulette]) @@ -585,8 +619,9 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) // Gotta check how many players are active at this moment. for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && !players[i].spectator) - pingame++; + if (!playeringame[i] || players[i].spectator) + continue; + pingame++; if (players[i].kartstuff[k_balloon] > 0) avgballoon += players[i].kartstuff[k_balloon]; } @@ -603,9 +638,9 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) // If the roulette finishes or the player presses BT_ATTACK, stop the roulette and calculate the item. // I'm returning via the exact opposite, however, to forgo having another bracket embed. Same result either way, I think. // Finally, if you get past this check, now you can actually start calculating what item you get. - if (!(player->kartstuff[k_itemroulette] >= (TICRATE*3) - || ((cmd->buttons & BT_ATTACK) && !(player->kartstuff[k_eggmanheld] || player->kartstuff[k_itemheld]) - && player->kartstuff[k_itemroulette] >= roulettestop))) + if ((cmd->buttons & BT_ATTACK) && !(player->kartstuff[k_eggmanheld] || player->kartstuff[k_itemheld]) && player->kartstuff[k_itemroulette] >= roulettestop) + mashed = true; // Mashing halves your chances for the good items + else if (!(player->kartstuff[k_itemroulette] >= (TICRATE*3))) return; if (cmd->buttons & BT_ATTACK) @@ -636,7 +671,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) for (j = 0; j < NUMKARTRESULTS; j++) { - if (K_KartGetItemOdds(i, j, player) > 0) + if (K_KartGetItemOdds(i, j, player, mashed) > 0) { available = 1; break; @@ -648,15 +683,28 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && !players[i].spectator && players[i].mo - && players[i].kartstuff[k_position] < player->kartstuff[k_position]) - pdis += P_AproxDistance(P_AproxDistance(players[i].mo->x - player->mo->x, - players[i].mo->y - player->mo->y), - players[i].mo->z - player->mo->z) / mapheaderinfo[gamemap-1]->mobj_scale - * (pingame - players[i].kartstuff[k_position]) - / ((pingame - 1) * (pingame + 1) / 3); + if (playeringame[i] && !players[i].spectator && players[i].mo) + { + if (players[i].kartstuff[k_position] < player->kartstuff[k_position]) + pdis += P_AproxDistance(P_AproxDistance(players[i].mo->x - player->mo->x, + players[i].mo->y - player->mo->y), + players[i].mo->z - player->mo->z) / mapheaderinfo[gamemap-1]->mobj_scale + * (pingame - players[i].kartstuff[k_position]) + / ((pingame - 1) * (pingame + 1) / 3); + if (players[i].kartstuff[k_position] == 1 && first == -1) + first = i; + if (players[i].kartstuff[k_position] == 2 && second == -1) + second = i; + } } + if (first != -1 && second != -1 && !secondist) // calculate 2nd's distance from 1st, for blue shell + secondist = P_AproxDistance(P_AproxDistance(players[first].mo->x - players[second].mo->x, + players[first].mo->y - players[second].mo->y), + players[first].mo->z - players[second].mo->z) / mapheaderinfo[gamemap-1]->mobj_scale + * (pingame - 1) + / ((pingame - 1) * (pingame + 1) / 3); + #define SETUPDISTTABLE(odds, num) \ for (i = num; i; --i) disttable[distlen++] = odds @@ -669,14 +717,19 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (oddsvalid[2]) SETUPDISTTABLE(2,1); if (oddsvalid[3]) SETUPDISTTABLE(3,1); if (oddsvalid[4]) SETUPDISTTABLE(4,1); + // Nothing we can do about setting disttable[5], because of how that is set. - wantedpos = (player->kartstuff[k_balloon]-avgballoon)+2; // 0 is two balloons below average, 2 is average, 4 is two balloons above average - if (wantedpos > 4) - wantedpos = 4; - if (wantedpos < 0) - wantedpos = 0; - - useodds = disttable[(wantedpos * distlen) / 5]; + if (player->kartstuff[k_roulettetype] == 1) + useodds = 5; + else + { + wantedpos = (player->kartstuff[k_balloon]-avgballoon)+2; // 0 is two balloons below average, 2 is average, 4 is two balloons above average + if (wantedpos > 4) + wantedpos = 4; + if (wantedpos < 0) + wantedpos = 0; + useodds = disttable[(wantedpos * distlen) / 5]; + } } else { @@ -689,8 +742,11 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (oddsvalid[7]) SETUPDISTTABLE(7,3); if (oddsvalid[8]) SETUPDISTTABLE(8,1); - if (franticitems) // Frantic items make the distances between everyone artifically higher :P + if (franticitems) // Frantic items make the distances between everyone artifically higher, for crazier items + { pdis = (15*pdis/14); + secondist = (15*pdis/14); + } if (pingame == 1 && oddsvalid[0]) // Record Attack, or just alone useodds = 0; @@ -707,8 +763,10 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) #undef SETUPDISTTABLE + //CONS_Printf("%d %d\n", secondist, distvar*2); + #define SETITEMRESULT(pos, itemnum) \ - for (chance = 0; chance < K_KartGetItemOdds(pos, itemnum, player); chance++) \ + for (chance = 0; chance < K_KartGetItemOdds(pos, itemnum, player, mashed); chance++) \ spawnchance[numchoices++] = itemnum SETITEMRESULT(useodds, KITEM_SNEAKER); // Sneaker @@ -726,7 +784,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) SETITEMRESULT(useodds, KITEM_LIGHTNINGSHIELD); // Lightning Shield SETITEMRESULT(useodds, KITEM_HYUDORO); // Hyudoro SETITEMRESULT(useodds, KITEM_POGOSPRING); // Pogo Spring - //SETITEMRESULT(useodds, KITEM_KITCHENSINK); // Kitchen Sink + //SETITEMRESULT(useodds, KITEM_KITCHENSINK); // Kitchen Sink SETITEMRESULT(useodds, KRITEM_TRIPLESNEAKER); // Sneaker x3 SETITEMRESULT(useodds, KRITEM_TRIPLEBANANA); // Banana x3 @@ -745,6 +803,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) } player->kartstuff[k_itemroulette] = 0; // Since we're done, clear the roulette number + player->kartstuff[k_roulettetype] = 0; // This too if (P_IsLocalPlayer(player)) S_StartSound(NULL, sfx_mkitmF); @@ -770,6 +829,10 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) || (mobj2->player && mobj2->player->playerstate != PST_LIVE)) return; + if ((mobj1->player && mobj1->player->kartstuff[k_lakitu]) + || (mobj2->player && mobj2->player->kartstuff[k_lakitu])) + return; + // Don't bump if you've recently bumped if ((mobj1->player && mobj1->player->kartstuff[k_justbumped]) || (mobj2->player && mobj1->player->kartstuff[k_justbumped])) @@ -781,10 +844,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) return; } - if (cv_collidesounds.value == 1) - { - S_StartSound(mobj1, cv_collidesoundnum.value); - } + S_StartSound(mobj1, sfx_s3k49); fx = P_SpawnMobj(mobj1->x/2 + mobj2->x/2, mobj1->y/2 + mobj2->y/2, mobj1->z/2 + mobj2->z/2, MT_BUMP); if (mobj1->eflags & MFE_VERTICALFLIP) @@ -1029,11 +1089,11 @@ void K_KartMoveAnimation(player_t *player) // Standing frames - S_KART_STND1 S_KART_STND1_L S_KART_STND1_R if (player->speed == 0) { - if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state >= &states[S_KART_STND1_R] && player->mo->state <= &states[S_KART_STND2_R])) + if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_STND1_R] && player->mo->state <= &states[S_KART_STND2_R])) P_SetPlayerMobjState(player->mo, S_KART_STND1_R); - else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state >= &states[S_KART_STND1_L] && player->mo->state <= &states[S_KART_STND2_L])) + else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_STND1_L] && player->mo->state <= &states[S_KART_STND2_L])) P_SetPlayerMobjState(player->mo, S_KART_STND1_L); - else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(player->mo->state >= &states[S_KART_STND1] && player->mo->state <= &states[S_KART_STND2])) + else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_STND1] && player->mo->state <= &states[S_KART_STND2])) P_SetPlayerMobjState(player->mo, S_KART_STND1); } // Drifting Left - S_KART_DRIFT1_L @@ -1051,221 +1111,25 @@ void K_KartMoveAnimation(player_t *player) // Run frames - S_KART_RUN1 S_KART_RUN1_L S_KART_RUN1_R else if (player->speed > FixedMul(player->runspeed, player->mo->scale)) { - if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state >= &states[S_KART_RUN1_R] && player->mo->state <= &states[S_KART_RUN2_R])) + if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_RUN1_R] && player->mo->state <= &states[S_KART_RUN2_R])) P_SetPlayerMobjState(player->mo, S_KART_RUN1_R); - else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state >= &states[S_KART_RUN1_L] && player->mo->state <= &states[S_KART_RUN2_L])) + else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_RUN1_L] && player->mo->state <= &states[S_KART_RUN2_L])) P_SetPlayerMobjState(player->mo, S_KART_RUN1_L); - else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(player->mo->state >= &states[S_KART_RUN1] && player->mo->state <= &states[S_KART_RUN2])) + else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_RUN1] && player->mo->state <= &states[S_KART_RUN2])) P_SetPlayerMobjState(player->mo, S_KART_RUN1); } // Walk frames - S_KART_WALK1 S_KART_WALK1_L S_KART_WALK1_R else if (player->speed <= FixedMul(player->runspeed, player->mo->scale)) { - if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state >= &states[S_KART_WALK1_R] && player->mo->state <= &states[S_KART_WALK2_R])) + if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_WALK1_R] && player->mo->state <= &states[S_KART_WALK2_R])) P_SetPlayerMobjState(player->mo, S_KART_WALK1_R); - else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state >= &states[S_KART_WALK1_L] && player->mo->state <= &states[S_KART_WALK2_L])) + else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_WALK1_L] && player->mo->state <= &states[S_KART_WALK2_L])) P_SetPlayerMobjState(player->mo, S_KART_WALK1_L); - else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(player->mo->state >= &states[S_KART_WALK1] && player->mo->state <= &states[S_KART_WALK2])) + else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_WALK1] && player->mo->state <= &states[S_KART_WALK2])) P_SetPlayerMobjState(player->mo, S_KART_WALK1); } } -/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c - - \param player player object passed from P_PlayerThink - \param cmd control input from player - - \return void -*/ -void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) -{ - K_UpdateOffroad(player); - - // setting players to use the star colormap and spawning afterimages - if (player->kartstuff[k_invincibilitytimer]) - { - mobj_t *ghost; - player->mo->colorized = true; - ghost = P_SpawnGhostMobj(player->mo); - ghost->fuse = 4; - ghost->frame |= FF_FULLBRIGHT; - } - else - { - player->mo->colorized = false; - } - - if (player->kartstuff[k_spinout]) - player->kartstuff[k_spinout]--; - - if (player->kartstuff[k_spinouttimer]) - player->kartstuff[k_spinouttimer]--; - else if (!comeback) - player->kartstuff[k_comebacktimer] = comebacktime; - else if (player->kartstuff[k_comebacktimer]) - { - player->kartstuff[k_comebacktimer]--; - if (player == &players[consoleplayer] && player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer] <= 0) - comebackshowninfo = true; // client has already seen the message - } - - if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == K_GetKartFlashing()) - player->powers[pw_flashing]--; - - if (player->kartstuff[k_attractiontimer]) - player->kartstuff[k_attractiontimer]--; - - if (player->kartstuff[k_sneakertimer]) - player->kartstuff[k_sneakertimer]--; - - if (player->kartstuff[k_floorboost]) - player->kartstuff[k_floorboost]--; - - if (player->kartstuff[k_driftboost]) - player->kartstuff[k_driftboost]--; - - if (player->kartstuff[k_invincibilitytimer]) - player->kartstuff[k_invincibilitytimer]--; - - if (player->kartstuff[k_growshrinktimer] > 0) - player->kartstuff[k_growshrinktimer]--; - - if (player->kartstuff[k_growshrinktimer] < 0) - player->kartstuff[k_growshrinktimer]++; - - if (player->kartstuff[k_growshrinktimer] == 1 || player->kartstuff[k_growshrinktimer] == -1) - { - player->mo->destscale = mapheaderinfo[gamemap-1]->mobj_scale; - P_RestoreMusic(player); - } - - if (player->kartstuff[k_stealingtimer] == 0 && player->kartstuff[k_stolentimer] == 0 - && player->kartstuff[k_rocketsneakertimer]) - player->kartstuff[k_rocketsneakertimer]--; - - if (player->kartstuff[k_hyudorotimer]) - player->kartstuff[k_hyudorotimer]--; - - if (player->kartstuff[k_sadtimer]) - player->kartstuff[k_sadtimer]--; - - if (player->kartstuff[k_stealingtimer]) - player->kartstuff[k_stealingtimer]--; - - if (player->kartstuff[k_stolentimer]) - player->kartstuff[k_stolentimer]--; - - if (player->kartstuff[k_squishedtimer]) - player->kartstuff[k_squishedtimer]--; - - if (player->kartstuff[k_justbumped]) - player->kartstuff[k_justbumped]--; - - if (player->kartstuff[k_poweritemtimer]) - player->kartstuff[k_poweritemtimer]--; - - if (player->kartstuff[k_lapanimation]) - player->kartstuff[k_lapanimation]--; - - if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer])) - { - if (player->exiting) - { - if (player->exiting < 6*TICRATE) - player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; - } - else - { - if (player->kartstuff[k_comebacktimer] < 6*TICRATE) - player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1; - else if (player->kartstuff[k_comebacktimer] < 9*TICRATE) - player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; - } - - if (player->kartstuff[k_cardanimation] > 164) - player->kartstuff[k_cardanimation] = 164; - if (player->kartstuff[k_cardanimation] < 0) - player->kartstuff[k_cardanimation] = 0; - } - else - player->kartstuff[k_cardanimation] = 0; - - if (player->kartstuff[k_sounds]) - player->kartstuff[k_sounds]--; - - // ??? - /* - if (player->kartstuff[k_jmp] > 1 && onground) - { - S_StartSound(player->mo, sfx_spring); - P_DoJump(player, false); - player->mo->momz *= player->kartstuff[k_jmp]; - player->kartstuff[k_jmp] = 0; - } - */ - - if (player->kartstuff[k_comebacktimer]) - player->kartstuff[k_comebackmode] = 0; - - if (P_IsObjectOnGround(player->mo) && player->mo->momz <= 0 && player->kartstuff[k_pogospring]) - player->kartstuff[k_pogospring] = 0; - - if (cmd->buttons & BT_DRIFT) - player->kartstuff[k_jmp] = 1; - else - player->kartstuff[k_jmp] = 0; - - // Lakitu Checker - if (player->kartstuff[k_lakitu]) - K_LakituChecker(player); - - // Roulette Code - //K_KartItemRouletteByPosition(player, cmd); // Old, position-based - K_KartItemRouletteByDistance(player, cmd); // New, distance-based - - // Stopping of the horrible invincibility SFX - if (player->mo->health <= 0 || player->mo->player->kartstuff[k_invincibilitytimer] <= 0 - || player->mo->player->kartstuff[k_growshrinktimer] > 0) // If you don't have invincibility (or grow is active too) - { - if (S_SoundPlaying(player->mo, sfx_kinvnc)) // But the sound is playing - S_StopSoundByID(player->mo, sfx_kinvnc); // Stop it - } - - // And the same for the grow SFX - if (!(player->mo->health > 0 && player->mo->player->kartstuff[k_growshrinktimer] > 0)) // If you aren't big - { - if (S_SoundPlaying(player->mo, sfx_kgrow)) // But the sound is playing - S_StopSoundByID(player->mo, sfx_kgrow); // Stop it - } - - // AAAAAAND handle the SMK star alarm - if (player->mo->health > 0 && (player->mo->player->kartstuff[k_invincibilitytimer] > 0 - || player->mo->player->kartstuff[k_growshrinktimer] > 0)) - { - if (leveltime % 13 == 0 && cv_kartstarsfx.value && !P_IsLocalPlayer(player)) - S_StartSound(player->mo, sfx_smkinv); - } - else if (S_SoundPlaying(player->mo, sfx_smkinv)) - S_StopSoundByID(player->mo, sfx_smkinv); - - // Plays the music after the starting countdown. - if (P_IsLocalPlayer(player) && leveltime == 158) - S_ChangeMusicInternal(mapmusname, true); -} - -void K_KartPlayerAfterThink(player_t *player) -{ - if (player->kartstuff[k_invincibilitytimer]) - { - player->mo->frame |= FF_FULLBRIGHT; - } - else - { - if (!(player->mo->state->frame & FF_FULLBRIGHT)) - player->mo->frame &= ~FF_FULLBRIGHT; - } -} - static void K_PlayTauntSound(mobj_t *source) { S_StartSound(source, sfx_taunt1+P_RandomKey(4)); @@ -1412,6 +1276,15 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove if (!onground) return 0; // If the player isn't on the ground, there is no change in speed + if (forwardmove <= 0 && player->kartstuff[k_brakestop] < 6) // Don't start reversing with brakes until you've made a stop first + { + if (player->speed < 8*FRACUNIT) + player->kartstuff[k_brakestop]++; + return 0; + } + else if (forwardmove > 0) + player->kartstuff[k_brakestop] = 0; + // ACCELCODE!!!1!11! oldspeed = R_PointToDist2(0, 0, player->rmomx, player->rmomy); // FixedMul(P_AproxDistance(player->rmomx, player->rmomy), player->mo->scale); newspeed = FixedDiv(FixedDiv(FixedMul(oldspeed, accelmax - p_accel) + FixedMul(p_speed, p_accel), accelmax), ORIG_FRICTION); @@ -1458,8 +1331,8 @@ void K_SpinPlayer(player_t *player, mobj_t *source) if (G_BattleGametype()) { - /*if (source && source->player && player != source->player) - P_AddPlayerScore(source->player, 1);*/ + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); if (player->kartstuff[k_balloon] > 0) { @@ -1516,8 +1389,8 @@ void K_SquishPlayer(player_t *player, mobj_t *source) if (G_BattleGametype()) { - /*if (source && source->player && player != source->player) - P_AddPlayerScore(source->player, 1);*/ + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); if (player->kartstuff[k_balloon] > 0) { @@ -1573,7 +1446,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju if (source->player->kartstuff[k_comebackpoints] >= 3) K_StealBalloon(source->player, player, true); } - //P_AddPlayerScore(source->player, 1); + P_AddPlayerScore(source->player, 1); } if (player->kartstuff[k_balloon] > 0) @@ -1787,7 +1660,7 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) dust->angle = (ANGLE_180/16) * i; dust->scale = source->scale; dust->destscale = source->scale*10; - P_InstaThrust(dust, dust->angle, FixedMul(25*FRACUNIT, source->scale)); + P_InstaThrust(dust, dust->angle, FixedMul(20*FRACUNIT, source->scale)); truc = P_SpawnMobj(source->x + P_RandomRange(-radius, radius)*FRACUNIT, source->y + P_RandomRange(-radius, radius)*FRACUNIT, @@ -1797,7 +1670,7 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) speed = FixedMul(10*FRACUNIT, source->scale)>>FRACBITS; truc->momx = P_RandomRange(-speed, speed)*FRACUNIT; truc->momy = P_RandomRange(-speed, speed)*FRACUNIT; - speed = FixedMul(25*FRACUNIT, source->scale)>>FRACBITS; + speed = FixedMul(20*FRACUNIT, source->scale)>>FRACBITS; truc->momz = P_RandomRange(-speed, speed)*FRACUNIT; truc->color = color; } @@ -1810,18 +1683,18 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) dust->scale = source->scale; dust->destscale = source->scale*10; dust->tics = 30; - dust->momz = P_RandomRange(FixedMul(4*FRACUNIT, source->scale)>>FRACBITS, FixedMul(9*FRACUNIT, source->scale)>>FRACBITS)*FRACUNIT; + dust->momz = P_RandomRange(FixedMul(3*FRACUNIT, source->scale)>>FRACBITS, FixedMul(7*FRACUNIT, source->scale)>>FRACBITS)*FRACUNIT; truc = P_SpawnMobj(source->x + P_RandomRange(-radius, radius)*FRACUNIT, source->y + P_RandomRange(-radius, radius)*FRACUNIT, source->z + P_RandomRange(0, height)*FRACUNIT, MT_BOOMPARTICLE); truc->scale = source->scale; truc->destscale = source->scale*5; - speed = FixedMul(25*FRACUNIT, source->scale)>>FRACBITS; + speed = FixedMul(20*FRACUNIT, source->scale)>>FRACBITS; truc->momx = P_RandomRange(-speed, speed)*FRACUNIT; truc->momy = P_RandomRange(-speed, speed)*FRACUNIT; - speed = FixedMul(18*FRACUNIT, source->scale)>>FRACBITS; - speed2 = FixedMul(56*FRACUNIT, source->scale)>>FRACBITS; + speed = FixedMul(15*FRACUNIT, source->scale)>>FRACBITS; + speed2 = FixedMul(45*FRACUNIT, source->scale)>>FRACBITS; truc->momz = P_RandomRange(speed, speed2)*FRACUNIT; if (P_RandomChance(FRACUNIT/2)) truc->momz = -truc->momz; @@ -1835,6 +1708,7 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle mobj_t *th; angle_t an; fixed_t x, y, z; + fixed_t finalspeed = speed; mobj_t *throwmo; //INT32 dir; @@ -1846,8 +1720,11 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle //else // dir = 1; - x = source->x + source->momx; - y = source->y + source->momy; + if (source->player && source->player->speed > K_GetKartSpeed(source->player, false)) + finalspeed = FixedMul(speed, FixedDiv(source->player->speed, K_GetKartSpeed(source->player, false))); + + x = source->x + source->momx + FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT)); + y = source->y + source->momy + FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT)); z = source->z; // spawn on the ground please if (P_MobjFlip(source) < 0) @@ -1889,11 +1766,11 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle } th->angle = an; - th->momx = FixedMul(speed, FINECOSINE(an>>ANGLETOFINESHIFT)); - th->momy = FixedMul(speed, FINESINE(an>>ANGLETOFINESHIFT)); + th->momx = FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT)); + th->momy = FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT)); x = x + P_ReturnThrustX(source, an, source->radius + th->radius); - x = y + P_ReturnThrustY(source, an, source->radius + th->radius); + y = y + P_ReturnThrustY(source, an, source->radius + th->radius); throwmo = P_SpawnMobj(x, y, z, MT_FIREDITEM); throwmo->movecount = 1; throwmo->movedir = source->angle - an; @@ -2076,7 +1953,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map else { // Shoot forward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED + player->speed); + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); } } } @@ -2247,7 +2124,7 @@ void K_DoSneaker(player_t *player, boolean doPFlag) player->kartstuff[k_sounds] = 50; } -static void K_DoShrink(player_t *player, boolean spb) +static void K_DoShrink(player_t *player) { mobj_t *mo; thinker_t *think; @@ -2271,7 +2148,7 @@ static void K_DoShrink(player_t *player, boolean spb) if (mo->player && !mo->player->spectator && mo->player->kartstuff[k_position] < player->kartstuff[k_position]) - P_DamageMobj(mo, player->mo, player->mo, spb ? 65 : 64); + P_DamageMobj(mo, player->mo, player->mo, 64); else continue; } @@ -2283,6 +2160,21 @@ static void K_DoShrink(player_t *player, boolean spb) player->kartstuff[k_sounds] = 50; } +static void K_DoSPB(player_t *victim, player_t *source) +{ + INT32 i; + S_StartSound(victim->mo, sfx_bkpoof); // Sound the BANG! + + /*for (i = 0; i < MAXPLAYERS; i++) + { + if (playeringame[i]) + P_FlashPal(&players[i], PAL_NUKE, 10); + }*/ + + if (victim->mo && !victim->spectator) + P_DamageMobj(victim->mo, source->mo, source->mo, 65); +} + void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed) { if (mo->player && mo->player->spectator) @@ -2333,6 +2225,209 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed) S_StartSound(mo, sfx_kc2f); } +/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c + + \param player player object passed from P_PlayerThink + \param cmd control input from player + + \return void +*/ +void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) +{ + K_UpdateOffroad(player); + + // setting players to use the star colormap and spawning afterimages + if (player->kartstuff[k_invincibilitytimer]) + { + mobj_t *ghost; + player->mo->colorized = true; + ghost = P_SpawnGhostMobj(player->mo); + ghost->fuse = 4; + ghost->frame |= FF_FULLBRIGHT; + } + else + { + player->mo->colorized = false; + } + + if (player->kartstuff[k_spinout]) + player->kartstuff[k_spinout]--; + + if (player->kartstuff[k_spinouttimer]) + player->kartstuff[k_spinouttimer]--; + else if (!comeback) + player->kartstuff[k_comebacktimer] = comebacktime; + else if (player->kartstuff[k_comebacktimer]) + { + player->kartstuff[k_comebacktimer]--; + if (P_IsLocalPlayer(player) && player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer] <= 0) + comebackshowninfo = true; // client has already seen the message + } + + if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == K_GetKartFlashing()) + player->powers[pw_flashing]--; + + if (player->kartstuff[k_attractiontimer]) + player->kartstuff[k_attractiontimer]--; + + if (player->kartstuff[k_sneakertimer]) + player->kartstuff[k_sneakertimer]--; + + if (player->kartstuff[k_floorboost]) + player->kartstuff[k_floorboost]--; + + if (player->kartstuff[k_driftboost]) + player->kartstuff[k_driftboost]--; + + if (player->kartstuff[k_invincibilitytimer]) + player->kartstuff[k_invincibilitytimer]--; + + if (player->kartstuff[k_growshrinktimer] > 0) + player->kartstuff[k_growshrinktimer]--; + + if (player->kartstuff[k_growshrinktimer] < 0) + player->kartstuff[k_growshrinktimer]++; + + if (player->kartstuff[k_growshrinktimer] == 1 || player->kartstuff[k_growshrinktimer] == -1) + { + player->mo->destscale = mapheaderinfo[gamemap-1]->mobj_scale; + P_RestoreMusic(player); + } + + if (player->kartstuff[k_stealingtimer] == 0 && player->kartstuff[k_stolentimer] == 0 + && player->kartstuff[k_rocketsneakertimer]) + player->kartstuff[k_rocketsneakertimer]--; + + if (player->kartstuff[k_hyudorotimer]) + player->kartstuff[k_hyudorotimer]--; + + if (player->kartstuff[k_sadtimer]) + player->kartstuff[k_sadtimer]--; + + if (player->kartstuff[k_stealingtimer]) + player->kartstuff[k_stealingtimer]--; + + if (player->kartstuff[k_stolentimer]) + player->kartstuff[k_stolentimer]--; + + if (player->kartstuff[k_squishedtimer]) + player->kartstuff[k_squishedtimer]--; + + if (player->kartstuff[k_justbumped]) + player->kartstuff[k_justbumped]--; + + if (player->kartstuff[k_deathsentence]) + { + if (player->kartstuff[k_deathsentence] == 1) + K_DoBlueShell(player, &players[spbplayer]); + player->kartstuff[k_deathsentence]--; + } + + if (player->kartstuff[k_poweritemtimer]) + player->kartstuff[k_poweritemtimer]--; + + if (player->kartstuff[k_lapanimation]) + player->kartstuff[k_lapanimation]--; + + if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer])) + { + if (player->exiting) + { + if (player->exiting < 6*TICRATE) + player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; + } + else + { + if (player->kartstuff[k_comebacktimer] < 6*TICRATE) + player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1; + else if (player->kartstuff[k_comebacktimer] < 9*TICRATE) + player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; + } + + if (player->kartstuff[k_cardanimation] > 164) + player->kartstuff[k_cardanimation] = 164; + if (player->kartstuff[k_cardanimation] < 0) + player->kartstuff[k_cardanimation] = 0; + } + else + player->kartstuff[k_cardanimation] = 0; + + if (player->kartstuff[k_sounds]) + player->kartstuff[k_sounds]--; + + // ??? + /* + if (player->kartstuff[k_jmp] > 1 && onground) + { + S_StartSound(player->mo, sfx_spring); + P_DoJump(player, false); + player->mo->momz *= player->kartstuff[k_jmp]; + player->kartstuff[k_jmp] = 0; + } + */ + + if (player->kartstuff[k_comebacktimer]) + player->kartstuff[k_comebackmode] = 0; + + if (P_IsObjectOnGround(player->mo) && player->mo->momz <= 0 && player->kartstuff[k_pogospring]) + player->kartstuff[k_pogospring] = 0; + + if (cmd->buttons & BT_DRIFT) + player->kartstuff[k_jmp] = 1; + else + player->kartstuff[k_jmp] = 0; + + // Lakitu Checker + if (player->kartstuff[k_lakitu]) + K_LakituChecker(player); + + // Roulette Code + //K_KartItemRouletteByPosition(player, cmd); // Old, position-based + K_KartItemRouletteByDistance(player, cmd); // New, distance-based + + // Stopping of the horrible invincibility SFX + if (player->mo->health <= 0 || player->mo->player->kartstuff[k_invincibilitytimer] <= 0 + || player->mo->player->kartstuff[k_growshrinktimer] > 0) // If you don't have invincibility (or grow is active too) + { + if (S_SoundPlaying(player->mo, sfx_kinvnc)) // But the sound is playing + S_StopSoundByID(player->mo, sfx_kinvnc); // Stop it + } + + // And the same for the grow SFX + if (!(player->mo->health > 0 && player->mo->player->kartstuff[k_growshrinktimer] > 0)) // If you aren't big + { + if (S_SoundPlaying(player->mo, sfx_kgrow)) // But the sound is playing + S_StopSoundByID(player->mo, sfx_kgrow); // Stop it + } + + // AAAAAAND handle the SMK star alarm + if (player->mo->health > 0 && (player->mo->player->kartstuff[k_invincibilitytimer] > 0 + || player->mo->player->kartstuff[k_growshrinktimer] > 0)) + { + if (leveltime % 13 == 0 && cv_kartstarsfx.value && !P_IsLocalPlayer(player)) + S_StartSound(player->mo, sfx_smkinv); + } + else if (S_SoundPlaying(player->mo, sfx_smkinv)) + S_StopSoundByID(player->mo, sfx_smkinv); + + // Plays the music after the starting countdown. + if (P_IsLocalPlayer(player) && leveltime == 158) + S_ChangeMusicInternal(mapmusname, true); +} + +void K_KartPlayerAfterThink(player_t *player) +{ + if (player->kartstuff[k_invincibilitytimer]) + { + player->mo->frame |= FF_FULLBRIGHT; + } + else + { + if (!(player->mo->state->frame & FF_FULLBRIGHT)) + player->mo->frame &= ~FF_FULLBRIGHT; + } +} + // Returns false if this player being placed here causes them to collide with any other player // Used in g_game.c for match etc. respawning // This does not check along the z because the z is not correctly set for the spawnee at this point @@ -2419,7 +2514,7 @@ static void K_KartDrift(player_t *player, boolean onground) kartspeed = 1; // IF YOU CHANGE THESE: MAKE SURE YOU UPDATE THE SAME VALUES IN p_mobjc, "case MT_DRIFT:" - dsone = 26*4 + kartspeed*2 + (9 - player->kartweight); + dsone = (26*4 + kartspeed*2 + (9 - player->kartweight))*8; dstwo = dsone*2; // Drifting is actually straffing + automatic turning. @@ -2453,7 +2548,7 @@ static void K_KartDrift(player_t *player, boolean onground) } // Drifting: left or right? - if ((player->cmd.buttons & BT_DRIFTLEFT) && player->speed > FixedMul(10<<16, player->mo->scale) && player->kartstuff[k_jmp] == 1 + if ((player->cmd.driftturn > 0) && player->speed > FixedMul(10<<16, player->mo->scale) && player->kartstuff[k_jmp] == 1 && (player->kartstuff[k_drift] == 0 || player->kartstuff[k_driftend] == 1)) // && player->kartstuff[k_drift] != 1) { // Starting left drift @@ -2461,7 +2556,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; player->kartstuff[k_driftcharge] = 0; } - else if ((player->cmd.buttons & BT_DRIFTRIGHT) && player->speed > FixedMul(10<<16, player->mo->scale) && player->kartstuff[k_jmp] == 1 + else if ((player->cmd.driftturn < 0) && player->speed > FixedMul(10<<16, player->mo->scale) && player->kartstuff[k_jmp] == 1 && (player->kartstuff[k_drift] == 0 || player->kartstuff[k_driftend] == 1)) // && player->kartstuff[k_drift] != -1) { // Starting right drift @@ -2490,7 +2585,7 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) { - fixed_t driftadditive = 3; + fixed_t driftadditive = 24; if (player->kartstuff[k_drift] >= 1) // Drifting to the left { @@ -2498,10 +2593,10 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_drift] > 5) player->kartstuff[k_drift] = 5; - if (player->cmd.buttons & BT_DRIFTLEFT) // Inward - driftadditive++; - if (player->cmd.buttons & BT_DRIFTRIGHT) // Outward - driftadditive--; + if (player->cmd.driftturn > 0) // Inward + driftadditive += (player->cmd.driftturn/800)/8; + if (player->cmd.driftturn < 0) // Outward + driftadditive -= (player->cmd.driftturn/800)/8; } else if (player->kartstuff[k_drift] <= -1) // Drifting to the right { @@ -2509,10 +2604,10 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_drift] < -5) player->kartstuff[k_drift] = -5; - if (player->cmd.buttons & BT_DRIFTRIGHT) // Inward - driftadditive++; - if (player->cmd.buttons & BT_DRIFTLEFT) // Outward - driftadditive--; + if (player->cmd.driftturn < 0) // Inward + driftadditive += (player->cmd.driftturn/800)/4; + if (player->cmd.driftturn > 0) // Outward + driftadditive -= (player->cmd.driftturn/800)/4; } // This spawns the drift sparks @@ -2646,6 +2741,7 @@ static void K_KartUpdatePosition(player_t *player) player->kartstuff[k_position] = position; } + // // K_StripItems // @@ -2656,6 +2752,7 @@ static void K_StripItems(player_t *player) player->kartstuff[k_itemheld] = 0; player->kartstuff[k_itemroulette] = 0; + player->kartstuff[k_roulettetype] = 0; player->kartstuff[k_hyudorotimer] = 0; player->kartstuff[k_stealingtimer] = 0; player->kartstuff[k_stolentimer] = 0; @@ -2666,6 +2763,7 @@ static void K_StripItems(player_t *player) player->kartstuff[k_eggmanheld] = 0; player->kartstuff[k_sadtimer] = 0; } + // // K_MoveKartPlayer // @@ -3023,7 +3121,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { player->kartstuff[k_itemamount]--; - K_ThrowKartItem(player, true, MT_FIREBALL, 1, false); S_StartSound(player->mo, sfx_mario7); K_PlayTauntSound(player->mo); @@ -3127,23 +3224,47 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_hyudorotimer] > 0) { - if ((player == &players[displayplayer] && !splitscreen) - || (!(player == &players[displayplayer] && !splitscreen) - && (player->kartstuff[k_hyudorotimer] < 1*TICRATE/2 || player->kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)))) + if (splitscreen) { if (leveltime & 1) player->mo->flags2 |= MF2_DONTDRAW; else player->mo->flags2 &= ~MF2_DONTDRAW; + + if (player->kartstuff[k_hyudorotimer] >= (1*TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyudorotime-(1*TICRATE/2)) + { + if (player == &players[secondarydisplayplayer]) + player->mo->eflags |= MFE_DRAWONLYFORP2; + else if (player == &players[thirddisplayplayer] && splitscreen > 1) + player->mo->eflags |= MFE_DRAWONLYFORP3; + else if (player == &players[fourthdisplayplayer] && splitscreen > 2) + player->mo->eflags |= MFE_DRAWONLYFORP4; + else + player->mo->eflags |= MFE_DRAWONLYFORP1; + } + else + player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } else - player->mo->flags2 |= MF2_DONTDRAW; + { + if (player == &players[displayplayer] + || (player != &players[displayplayer] && (player->kartstuff[k_hyudorotimer] < (1*TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)))) + { + if (leveltime & 1) + player->mo->flags2 |= MF2_DONTDRAW; + else + player->mo->flags2 &= ~MF2_DONTDRAW; + } + else + player->mo->flags2 |= MF2_DONTDRAW; + } player->powers[pw_flashing] = player->kartstuff[k_hyudorotimer]; // We'll do this for now, let's people know about the invisible people through subtle hints } else if (player->kartstuff[k_hyudorotimer] == 0) { player->mo->flags2 &= ~MF2_DONTDRAW; + player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) // dead in match? you da bomb @@ -3180,7 +3301,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) 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; + + if ((player->powers[pw_flashing] || player->kartstuff[k_spinouttimer]) && (leveltime & 1)) + player->mo->tracer->flags2 |= MF2_DONTDRAW; + else + player->mo->tracer->flags2 &= ~MF2_DONTDRAW; } } else if (G_RaceGametype() || player->kartstuff[k_balloon] > 0) @@ -3223,31 +3348,17 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_KartDrift(player, onground); - // Feather strafing - if (player->kartstuff[k_pogospring]) - { - fixed_t strafe = 0; - fixed_t strength = FRACUNIT/32; - if (cmd->buttons & BT_DRIFTLEFT) - strafe--; - if (cmd->buttons & BT_DRIFTRIGHT) - strafe++; - strength += FixedDiv(player->speed, K_GetKartSpeed(player, true)); - P_Thrust(player->mo, player->mo->angle-ANGLE_90, strafe*strength); - } - // Quick Turning // You can't turn your kart when you're not moving. // So now it's time to burn some rubber! - if (player->speed < 2 && leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE - && ((cmd->buttons & BT_DRIFTLEFT) || (cmd->buttons & BT_DRIFTRIGHT))) + if (player->speed < 2 && leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE && cmd->driftturn != 0) { if (leveltime % 20 == 0) S_StartSound(player->mo, sfx_mkslid); } // Squishing - // If a Grow player or a Thwomp crushes you, get flattened instead of being killed. + // If a Grow player or a sector crushes you, get flattened instead of being killed. if (player->kartstuff[k_squishedtimer] <= 0) { @@ -3343,7 +3454,7 @@ void K_CheckBalloons(void) if (playeringame[winnernum]) { - P_AddPlayerScore(&players[winnernum], 1); + players[winnernum].score += 1; CONS_Printf(M_GetText("%s recieved a point for winning!\n"), player_names[winnernum]); } @@ -3418,6 +3529,8 @@ static patch_t *kp_sadface; static patch_t *kp_check[6]; +static patch_t *kp_spbwarning[2]; + void K_LoadKartHUDGraphics(void) { INT32 i, j; @@ -3539,6 +3652,10 @@ void K_LoadKartHUDGraphics(void) sprintf(buffer, "K_CHECK%d", i+1); kp_check[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); } + + // SPB warning + kp_spbwarning[0] = W_CachePatchName("K_SPBW1", PU_HUDGFX); + kp_spbwarning[1] = W_CachePatchName("K_SPBW2", PU_HUDGFX); } //} @@ -3552,6 +3669,7 @@ INT32 FACE_X, FACE_Y; // Top-four Faces INT32 LAKI_X, LAKI_Y; // Lakitu INT32 CHEK_Y; // CHECK graphic INT32 MINI_X, MINI_Y; // Minimap +INT32 SPBW_X, SPBW_Y; // SPB warning static void K_initKartHUD(void) { @@ -3616,7 +3734,9 @@ static void K_initKartHUD(void) // Minimap MINI_X = BASEVIDWIDTH - 50; // 270 MINI_Y = (BASEVIDHEIGHT/2)-16; // 84 - + // Blue Shell warning + SPBW_X = BASEVIDWIDTH/2; // 270 + SPBW_Y = BASEVIDHEIGHT- 24; // 176 if (splitscreen) // Splitscreen { @@ -3629,6 +3749,8 @@ static void K_initKartHUD(void) MINI_Y = (BASEVIDHEIGHT/2); + SPBW_Y = (BASEVIDHEIGHT/2)-8; + if (splitscreen > 1) // 3P/4P Small Splitscreen { ITEM_X = 0; @@ -3642,6 +3764,8 @@ static void K_initKartHUD(void) MINI_X = (3*BASEVIDWIDTH/4); MINI_Y = (3*BASEVIDHEIGHT/4); + SPBW_X = BASEVIDWIDTH/4; + if (splitscreen > 2) // 4P-only { MINI_X = (BASEVIDWIDTH/2); @@ -3699,7 +3823,7 @@ static void K_drawKartItem(void) patch_t *localpatch = kp_nodraw; patch_t *localbg = kp_itembg; patch_t *localinv = kp_invincibility[(leveltime % (7*3)) / 3]; - INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT); + INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT); if (stplyr->kartstuff[k_itemroulette]) { @@ -3920,7 +4044,7 @@ static void K_DrawKartPositionNum(INT32 num) break; } } - else if (stplyr->laps+1 == cv_numlaps.value || stplyr->exiting) // Check for the final lap, or won + else if (stplyr->laps+1 >= cv_numlaps.value || stplyr->exiting) // Check for the final lap, or won { // Alternate frame every three frames switch (leveltime % 9) @@ -4188,6 +4312,23 @@ static void K_drawKartBalloonsOrKarma(void) } } +static void K_drawSPBWarning(void) +{ + patch_t *localpatch = kp_nodraw; + INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM); + + if (!(stplyr->kartstuff[k_deathsentence] > 0 + || (spbincoming > 0 && spbincoming < 2*TICRATE && stplyr->kartstuff[k_position] == 1))) + return; + + if (leveltime % 8 > 3) + localpatch = kp_spbwarning[1]; + else + localpatch = kp_spbwarning[0]; + + V_DrawScaledPatch(SPBW_X, SPBW_Y, splitflags, localpatch); +} + fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my) { fixed_t dist, x; @@ -4416,6 +4557,13 @@ static void K_drawKartMinimap(void) splitflags |= V_HUDTRANSHALF; } + // let offsets transfer to the heads, too! + if (mirrormode) + x += SHORT(AutomapPic->leftoffset); + else + x -= SHORT(AutomapPic->leftoffset); + y -= SHORT(AutomapPic->topoffset); + // Player's tiny icons on the Automap. for (i = 0; i < MAXPLAYERS; i++) { @@ -4727,6 +4875,9 @@ void K_drawKartHUD(void) // Draw the numerical position K_DrawKartPositionNum(stplyr->kartstuff[k_position]); } + + // You're about to DIEEEEE + K_drawSPBWarning(); } else if (G_BattleGametype()) // Battle-only { diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 771dd0af..c8ff4e28 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1185,7 +1185,7 @@ static int mapheaderinfo_get(lua_State *L) else if (fastcmp(field,"zonttl")) lua_pushstring(L, header->zonttl); else if (fastcmp(field,"actnum")) - lua_pushinteger(L, header->actnum); + lua_pushstring(L, header->actnum); else if (fastcmp(field,"typeoflevel")) lua_pushinteger(L, header->typeoflevel); else if (fastcmp(field,"nextlevel")) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 0d488fdb..1eed10b0 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -733,6 +733,8 @@ static int ticcmd_get(lua_State *L) lua_pushinteger(L, cmd->aiming); else if (fastcmp(field,"buttons")) lua_pushinteger(L, cmd->buttons); + else if (fastcmp(field,"driftturn")) + lua_pushinteger(L, cmd->driftturn); else return NOFIELD; @@ -759,6 +761,8 @@ static int ticcmd_set(lua_State *L) cmd->aiming = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"buttons")) cmd->buttons = (UINT16)luaL_checkinteger(L, 3); + else if (fastcmp(field,"driftturn")) + cmd->driftturn = (INT16)luaL_checkinteger(L, 3); else return NOFIELD; diff --git a/src/m_cond.c b/src/m_cond.c index f2b163ea..7d07d00a 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -32,95 +32,80 @@ conditionset_t conditionSets[MAXCONDITIONSETS]; // Default Emblem locations emblem_t emblemlocations[MAXEMBLEMS] = { - // -- MAP01: GREEN HILLS -- - // Time: 1:30.00 - {ET_TIME, 0,0,0, 1, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, - // -- MAP02: NORTHERN DISTRICT -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 2, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP03: SUNBEAM PARADISE -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 3, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP04: PIPE SPEEDWAY -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 4, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP05: DARKVILE GARDEN -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 5, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP06: MEGABLOCK CASTLE -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 6, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP07: MIDNIGHT MEADOW -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 7, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP11: HILL TOP -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 11, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP13: SAPPHIRE COAST -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 13, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP15: BLUE MOUNTAIN -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 15, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP19: CASINO RESORT -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 19, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP21: SILVERCLOUD ISLAND -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 21, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP25: CANYON RUSH -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 25, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP26: CLOUD CRADLE K -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 26, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP27: TOXIC PALACE -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 27, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP30: ANCIENT TOMB -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 30, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP31: SUB-ZERO PEAK -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 31, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP32: VIRTUAL HIGHWAY -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 32, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP33: EGGMAN'S NIGHTCLUB -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 37, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP61: GBA RAINBOW ROAD -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 61, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP70: SONIC SPEEDWAY -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 70, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP72: AURORA ATOLL -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 72, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP79: BARREN BADLANDS -- - // Time: 2:30.00 - {ET_TIME, 0,0,0, 79, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0}, + // SILVER TIME TROPHIES + {ET_TIME, 0,0,0, 1, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // Green Hills Zone - Time: 1:30 + {ET_TIME, 0,0,0, 2, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pipe Speedway Zone - Time: 1:50 + {ET_TIME, 0,0,0, 3, 'T', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Dark Race - 2:15 + {ET_TIME, 0,0,0, 4, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Darkvile Garden Zone - 1:45 + {ET_TIME, 0,0,0, 5, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Northern District Zone - 2:20 + {ET_TIME, 0,0,0, 6, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Sonic Speedway Zone - 2:00 + {ET_TIME, 0,0,0, 7, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Egg Zeppelin Zone - 2:00 + {ET_TIME, 0,0,0, 8, 'T', SKINCOLOR_GREY, 95*TICRATE, "", 0}, // Hill Top Zone - 1:35 + {ET_TIME, 0,0,0, 9, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Sunbeam Paradise Zone - 1:50 + {ET_TIME, 0,0,0, 10, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Diamond Square Zone - 1:50 + {ET_TIME, 0,0,0, 11, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0}, // Misty Maze Zone - 2:30 + {ET_TIME, 0,0,0, 12, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Midnight Meadow Zone - 2:00 + {ET_TIME, 0,0,0, 13, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Megablock Castle Zone - 2:10 + {ET_TIME, 0,0,0, 14, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0}, // Sub-Zero Peak Zone - 2:30 + {ET_TIME, 0,0,0, 15, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Sapphire Coast Zone - 1:50 + {ET_TIME, 0,0,0, 16, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Silvercloud Island Zone - 2:20 + {ET_TIME, 0,0,0, 17, 'T', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Petroleum Refinery Zone - 2:15 + {ET_TIME, 0,0,0, 18, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Canyon Rush Zone - 2:10 + {ET_TIME, 0,0,0, 19, 'T', SKINCOLOR_GREY, 160*TICRATE, "", 0}, // Blue Mountain Zone - 2:40 + {ET_TIME, 0,0,0, 20, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Casino Resort Zone - 1:50 + {ET_TIME, 0,0,0, 21, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Desert Palace Zone - 1:45 + {ET_TIME, 0,0,0, 22, 'T', SKINCOLOR_GREY, 165*TICRATE, "", 0}, // Red Barrage Area - 2:45 + {ET_TIME, 0,0,0, 23, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Vanilla Hotel Zone - 1:45 + {ET_TIME, 0,0,0, 24, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Twinkle Cart - 1:50 + {ET_TIME, 0,0,0, 25, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pleasure Castle - 1:50 + {ET_TIME, 0,0,0, 26, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Aurora Atoll Zone - 2:20 + {ET_TIME, 0,0,0, 27, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Barren Badlands Zone - 2:10 + {ET_TIME, 0,0,0, 28, 'T', SKINCOLOR_GREY, 155*TICRATE, "", 0}, // Toxic Palace Zone - 2:35 + {ET_TIME, 0,0,0, 29, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Ancient Tomb Zone - 2:10 + {ET_TIME, 0,0,0, 30, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Cloud Cradle Zone K - 2:00 + {ET_TIME, 0,0,0, 31, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Kodachrome Void Zone - 1:50 + {ET_TIME, 0,0,0, 32, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Egg Quarters - 2:20 + {ET_TIME, 0,0,0, 33, 'T', SKINCOLOR_GREY, 115*TICRATE, "", 0}, // Boiling Bedrock Zone - 1:55 + {ET_TIME, 0,0,0, 34, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Virtual Highway Zone - 2:20 + {ET_TIME, 0,0,0, 35, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Eggman's Nightclub Zone - 2:00 + {ET_TIME, 0,0,0, 36, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // KKR Ganbare Dochu 2 - 1:30 + {ET_TIME, 0,0,0, 37, 'T', SKINCOLOR_GREY, 80*TICRATE, "", 0}, // CK Chao Circuit 1 - 1:20 + {ET_TIME, 0,0,0, 38, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // CK Chao Circuit 2 - 2:10 + {ET_TIME, 0,0,0, 39, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // CK Cloud Tops 2 - 1:40 + {ET_TIME, 0,0,0, 40, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // CK Regal Raceway - 2:10 + {ET_TIME, 0,0,0, 41, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // SM Dimension Heist - 2:10 + {ET_TIME, 0,0,0, 42, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // SRB2 Frozen Night - 1:40 + {ET_TIME, 0,0,0, 43, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // MKSC Sky Garden - 1:40 + {ET_TIME, 0,0,0, 44, 'T', SKINCOLOR_GREY, 95*TICRATE, "", 0}, // MKDS Peach Gardens - 1:35 + {ET_TIME, 0,0,0, 45, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // MKSC Rainbow Road - 1:45 + {ET_TIME, 0,0,0, 46, 'T', SKINCOLOR_GREY, 70*TICRATE, "", 0}, // SMK Mario Circuit 1 - 1:10 + {ET_TIME, 0,0,0, 47, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // SMK Donut Plains 1 - 1:30 + {ET_TIME, 0,0,0, 48, 'T', SKINCOLOR_GREY, 75*TICRATE, "", 0}, // SMK Ghost Valley 2 - 1:15 + {ET_TIME, 0,0,0, 49, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // SMK Mario Circuit 3 - 1:45 + {ET_TIME, 0,0,0, 50, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0} // SMK Rainbow Road - 2:10 + // GOLD DEV TIME TROPHIES + // ...none yet! }; // Default Extra Emblems extraemblem_t extraemblems[MAXEXTRAEMBLEMS] = { - {"Experienced Driver", "Play 50 Matches", 10, 'X', SKINCOLOR_BLUE, 0}, + {"Experienced Driver", "Play 100 Matches", 10, 'X', SKINCOLOR_BLUE, 0}, }; // Default Unlockables unlockable_t unlockables[MAXUNLOCKABLES] = { // Name, Objective, Menu Height, ConditionSet, Unlock Type, Variable, NoCecho, NoChecklist - /* 01 */ {"SNES Cup", "Collect 5 Emblems", 0, 1, SECRET_NONE, 0, false, false, 0}, - /* 02 */ {"Chaotic Kart Cup", "Collect 15 Emblems", 0, 2, SECRET_NONE, 0, false, false, 0}, + /* 01 */ {"Egg Cup", "", 0, 1, SECRET_NONE, 0, false, false, 0}, + /* 02 */ {"SMK Cup", "", 0, 2, SECRET_NONE, 0, false, false, 0}, + /* 03 */ {"Chao Cup", "", 0, 3, SECRET_NONE, 0, false, false, 0}, - /* 03 */ {"Record Attack", "", 0, -1, SECRET_RECORDATTACK, 0, true, true, 0}, + /* 04 */ {"Record Attack", "", 0, -1, SECRET_RECORDATTACK, 0, true, true, 0}, }; // Default number of emblems and extra emblems -INT32 numemblems = 23; +INT32 numemblems = 50; INT32 numextraemblems = 1; // DEFAULT CONDITION SETS FOR SRB2KART: @@ -132,12 +117,16 @@ void M_SetupDefaultConditionSets(void) M_AddRawCondition(1, 1, UC_TOTALEMBLEMS, 5, 0, 0); M_AddRawCondition(1, 2, UC_MATCHESPLAYED, 10, 0, 0); - // -- 2: Collect 15 emblems OR play 30 matches + // -- 2: Collect 15 emblems OR play 25 matches M_AddRawCondition(2, 1, UC_TOTALEMBLEMS, 15, 0, 0); - M_AddRawCondition(2, 2, UC_MATCHESPLAYED, 30, 0, 0); + M_AddRawCondition(2, 2, UC_MATCHESPLAYED, 25, 0, 0); - // -- 10: Play 50 matches - M_AddRawCondition(10, 1, UC_TOTALEMBLEMS, 50, 0, 0); + // -- 3: Collect 30 emblems OR play 50 matches + M_AddRawCondition(3, 1, UC_TOTALEMBLEMS, 30, 0, 0); + M_AddRawCondition(3, 2, UC_MATCHESPLAYED, 50, 0, 0); + + // -- 10: Play 100 matches + M_AddRawCondition(10, 1, UC_MATCHESPLAYED, 100, 0, 0); } void M_AddRawCondition(UINT8 set, UINT8 id, conditiontype_t c, INT32 r, INT16 x1, INT16 x2) diff --git a/src/m_fixed.c b/src/m_fixed.c index ce7471a2..01445738 100644 --- a/src/m_fixed.c +++ b/src/m_fixed.c @@ -33,7 +33,9 @@ */ fixed_t FixedMul(fixed_t a, fixed_t b) { - return (fixed_t)((((INT64)a * b) ) / FRACUNIT); + // Need to cast to unsigned before shifting to avoid undefined behaviour + // for negative integers + return (fixed_t)(((UINT64)((INT64)a * b)) >> FRACBITS); } #endif //__USE_C_FIXEDMUL__ diff --git a/src/m_menu.c b/src/m_menu.c index e7375a8d..ac9509bd 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3371,17 +3371,17 @@ static void M_DrawPauseMenu(void) // Draw any and all emblems at the top. M_DrawMapEmblems(gamemap, 272, 28); - if (mapheaderinfo[gamemap-1]->zonttl) + if (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) { - if (mapheaderinfo[gamemap-1]->actnum != 0) - V_DrawString(40, 28, V_YELLOWMAP, va("%s %s %d", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl, mapheaderinfo[gamemap-1]->actnum)); + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) + V_DrawString(40, 28, V_YELLOWMAP, va("%s %s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl, mapheaderinfo[gamemap-1]->actnum)); else V_DrawString(40, 28, V_YELLOWMAP, va("%s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl)); } else { - if (mapheaderinfo[gamemap-1]->actnum != 0) - V_DrawString(40, 28, V_YELLOWMAP, va("%s %d", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum)); + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) + V_DrawString(40, 28, V_YELLOWMAP, va("%s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum)); else V_DrawString(40, 28, V_YELLOWMAP, mapheaderinfo[gamemap-1]->lvlttl); } @@ -4896,7 +4896,7 @@ static void M_ReadSavegameInfo(UINT32 slot) else { strcpy(savegameinfo[slot].levelname, mapheaderinfo[(fake-1) & 8191]->lvlttl); - savegameinfo[slot].actnum = mapheaderinfo[(fake-1) & 8191]->actnum; + savegameinfo[slot].actnum = 0; //mapheaderinfo[(fake-1) & 8191]->actnum } #ifdef SAVEGAMES_OTHERVERSIONS @@ -5308,10 +5308,11 @@ static void M_Statistics(INT32 choice) if (!mapheaderinfo[i] || mapheaderinfo[i]->lvlttl[0] == '\0') continue; - if (!(mapheaderinfo[i]->typeoflevel & TOL_SP) || (mapheaderinfo[i]->menuflags & LF2_HIDEINSTATS)) + if (!(mapheaderinfo[i]->typeoflevel & TOL_RACE) // TOL_SP + || (mapheaderinfo[i]->menuflags & LF2_HIDEINSTATS)) continue; - if (!mapvisited[i]) + if (M_MapLocked(i+1)) // !mapvisited[i] continue; statsMapList[j++] = i; @@ -5346,10 +5347,20 @@ static void M_DrawStatsMaps(int location) mnum = statsMapList[i]; M_DrawMapEmblems(mnum+1, 292, y); - if (mapheaderinfo[mnum]->actnum != 0) - V_DrawString(20, y, V_YELLOWMAP, va("%s %d", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->actnum)); + if (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) + { + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) + V_DrawString(20, y, V_YELLOWMAP, va("%s %s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl, mapheaderinfo[mnum]->actnum)); + else + V_DrawString(20, y, V_YELLOWMAP, va("%s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl)); + } else - V_DrawString(20, y, V_YELLOWMAP, mapheaderinfo[mnum]->lvlttl); + { + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) + V_DrawString(20, y, V_YELLOWMAP, va("%s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->actnum)); + else + V_DrawString(20, y, V_YELLOWMAP, mapheaderinfo[mnum]->lvlttl); + } y += 8; diff --git a/src/m_misc.c b/src/m_misc.c index 573354f0..5727067c 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -679,9 +679,9 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png if (gamestate == GS_LEVEL && mapheaderinfo[gamemap-1]->lvlttl[0] != '\0') snprintf(lvlttltext, 48, "%s%s%s", mapheaderinfo[gamemap-1]->lvlttl, - (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? mapheaderinfo[gamemap-1]->zonttl : // SRB2kart + (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->zonttl) : // SRB2kart ((mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE"), - (mapheaderinfo[gamemap-1]->actnum > 0) ? va(" %d",mapheaderinfo[gamemap-1]->actnum) : ""); + (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->actnum) : ""); else snprintf(lvlttltext, 48, "Unknown"); diff --git a/src/p_enemy.c b/src/p_enemy.c index d1716fbd..52f3c4a4 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -187,8 +187,8 @@ void A_RandomStateRange(mobj_t *actor); void A_DualAction(mobj_t *actor); void A_RemoteAction(mobj_t *actor); void A_ToggleFlameJet(mobj_t *actor); -void A_ItemPop(mobj_t *actor); // SRB2kart -void A_JawzChase(mobj_t *actor); // SRB2kart +void A_ItemPop(mobj_t *actor); // SRB2kart +void A_JawzChase(mobj_t *actor); // SRB2kart void A_MineExplode(mobj_t *actor); // SRB2kart void A_OrbitNights(mobj_t *actor); void A_GhostMe(mobj_t *actor); @@ -2604,9 +2604,8 @@ void A_MonitorPop(mobj_t *actor) case MT_QUESTIONBOX: // Random! { mobjtype_t spawnchance[256]; - INT32 numchoices = 0/*, i = 0*/; + INT32 numchoices = 0, i = 0; - /* #define QUESTIONBOXCHANCES(type, cvar) \ for (i = cvar.value; i; --i) spawnchance[numchoices++] = type @@ -2624,7 +2623,6 @@ for (i = cvar.value; i; --i) spawnchance[numchoices++] = type QUESTIONBOXCHANCES(MT_RECYCLETV, cv_recycler); #undef QUESTIONBOXCHANCES - */ if (numchoices == 0) { diff --git a/src/p_floor.c b/src/p_floor.c index f92937ce..ac8e60dc 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -2090,6 +2090,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) boolean floortouch = false; fixed_t bottomheight, topheight; msecnode_t *node; + ffloor_t *rover; for (i = 0; i < MAXPLAYERS; i++) { @@ -2137,6 +2138,19 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) { targetsec = §ors[targetsecnum]; + // Find the FOF corresponding to the control linedef + for (rover = targetsec->ffloors; rover; rover = rover->next) + { + if (rover->master == sec->lines[i]) + break; + } + + if (!rover) // This should be impossible, but don't complain if it is the case somehow + continue; + + if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there + continue; + for (j = 0; j < MAXPLAYERS; j++) { if (!playeringame[j]) diff --git a/src/p_inter.c b/src/p_inter.c index b2c51cf3..16757431 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1200,7 +1200,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) { // blatant reuse of a variable that's normally unused in circuit if (!player->tossdelay) - S_StartSound(toucher, sfx_lose); + S_StartSound(toucher, sfx_s26d); player->tossdelay = 3; return; } @@ -3102,9 +3102,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player->kartstuff[k_sneakertimer] = 0; - // Thunder - if (damage == 64 && player != source->player) + // Size Down + if (damage == 64) { + if (player == source->player) + return false; // Don't flip out while super! if (!player->kartstuff[k_invincibilitytimer] && player->kartstuff[k_growshrinktimer] <= 0) { @@ -3112,7 +3114,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da K_SpinPlayer(player, source); // Start shrinking! - S_StartSound(player->mo, sfx_kc59); player->mo->destscale = 6*(mapheaderinfo[gamemap-1]->mobj_scale)/8; player->kartstuff[k_growshrinktimer] -= (100+20*(16-(player->kartstuff[k_position]))); } @@ -3125,20 +3126,18 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_LIGHTNING); return true; } - else if (damage == 64 && player == source->player) - return false; - // Blue Thunder - if (damage == 65 && player->kartstuff[k_position] == 1) + // Self-Propelled Bomb + if (damage == 65) { + if (player == source->player) + return false; // Just need to do this now! Being thrown upwards is done by the explosion. P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUELIGHTNING); blueexplode = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLOSION); P_SetTarget(&blueexplode->target, source); return true; } - else if (damage == 65 && player->kartstuff[k_position] > 1) - return false; //} // Sudden-Death mode diff --git a/src/p_map.c b/src/p_map.c index 12177a72..fdf65b7a 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1649,40 +1649,64 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player->kartstuff[k_balloon] <= 0 || tmthing->player->kartstuff[k_balloon] <= 0) { if (thing->player->kartstuff[k_comebackmode] == 0 - && tmthing->player->kartstuff[k_balloon] > 0) + && (tmthing->player->kartstuff[k_balloon] > 0 + && !tmthing->player->powers[pw_flashing])) { + mobj_t *boom = P_SpawnMobj(thing->x, thing->y, thing->z, MT_BOOMPARTICLE); + boom->scale = thing->scale; + boom->destscale = thing->scale; + boom->momz = 5*FRACUNIT; + if (thing->player->skincolor) + boom->color = thing->player->skincolor; + else + boom->color = SKINCOLOR_RED; + S_StartSound(boom, sfx_s3k4e); K_ExplodePlayer(tmthing->player, thing); thing->player->kartstuff[k_comebacktimer] = comebacktime; return true; } else if (tmthing->player->kartstuff[k_comebackmode] == 0 - && thing->player->kartstuff[k_balloon] > 0) + && (thing->player->kartstuff[k_balloon] > 0 + && !thing->player->powers[pw_flashing])) { + mobj_t *boom = P_SpawnMobj(tmthing->x, tmthing->y, tmthing->z, MT_BOOMPARTICLE); + boom->scale = tmthing->scale; + boom->destscale = tmthing->scale; + boom->momz = 5*FRACUNIT; + if (tmthing->player->skincolor) + boom->color = tmthing->player->skincolor; + else + boom->color = SKINCOLOR_RED; + S_StartSound(boom, sfx_s3k4e); K_ExplodePlayer(thing->player, tmthing); tmthing->player->kartstuff[k_comebacktimer] = comebacktime; return true; } else if (thing->player->kartstuff[k_comebackmode] == 1 - && (tmthing->player->kartstuff[k_balloon] > 0 && P_CanPickupItem(tmthing->player, true))) + && (tmthing->player->kartstuff[k_balloon] > 0 + && P_CanPickupItem(tmthing->player, true))) { 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; + tmthing->player->kartstuff[k_roulettetype] = 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 && P_CanPickupItem(thing->player, true))) + && (thing->player->kartstuff[k_balloon] > 0 + && P_CanPickupItem(thing->player, true))) { 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; + thing->player->kartstuff[k_roulettetype] = 1; if (tmthing->player->kartstuff[k_comebackpoints] >= 3) K_StealBalloon(tmthing->player, thing->player, true); tmthing->player->kartstuff[k_comebacktimer] = comebacktime; @@ -3843,6 +3867,12 @@ void P_BounceMove(mobj_t *mo) //INT32 hitcount; fixed_t mmomx = 0, mmomy = 0; + if (mo->eflags & MFE_JUSTBOUNCEDWALL) + { + P_SlideMove(mo, true); + return; + } + slidemo = mo; //hitcount = 0; @@ -3971,12 +4001,12 @@ bounceback: fx->eflags &= ~MFE_VERTICALFLIP; fx->scale = mo->scale; - if (cv_collidesounds.value == 1) - S_StartSound(mo, cv_collidesoundnum.value); + S_StartSound(mo, sfx_s3k49); } } - P_HitBounceLine(bestslideline); // clip the moves + P_HitBounceLine(bestslideline); + mo->eflags |= MFE_JUSTBOUNCEDWALL; mo->momx = tmxmove; mo->momy = tmymove; diff --git a/src/p_mobj.c b/src/p_mobj.c index 63377ae0..ac723813 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2891,6 +2891,12 @@ static void P_PlayerZMovement(mobj_t *mo) mo->momx = mo->momx/2; mo->momy = mo->momy/2; } + + if (mo->player->cmd.buttons & BT_BRAKE && !(mo->player->cmd.forwardmove)) // FURTHER slowdown if you're braking. + { + mo->momx = mo->momx/2; + mo->momy = mo->momy/2; + } } if (mo->health) @@ -6116,7 +6122,7 @@ static boolean P_AddShield(mobj_t *thing) } if (shield != SH_FORCE) - { // Regular shields check for themselves only + { // Regular shields check for themselves only if ((shieldtype_t)(thing->target->player->powers[pw_shield] & SH_NOSTACK) != shield) { P_RemoveMobj(thing); @@ -6153,7 +6159,6 @@ void P_RunOverlays(void) if (!mo->target) continue; - if (!splitscreen /*&& rendermode != render_soft*/) { angle_t viewingangle; @@ -6259,6 +6264,26 @@ void P_RunShadows(void) else mobj->flags2 &= ~MF2_DONTDRAW; + if (mobj->target->eflags & MFE_DRAWONLYFORP1) // groooooaann... + mobj->eflags |= MFE_DRAWONLYFORP1; + else + mobj->eflags &= ~MFE_DRAWONLYFORP1; + + if (mobj->target->eflags & MFE_DRAWONLYFORP2) + mobj->eflags |= MFE_DRAWONLYFORP2; + else + mobj->eflags &= ~MFE_DRAWONLYFORP2; + + if (mobj->target->eflags & MFE_DRAWONLYFORP3) + mobj->eflags |= MFE_DRAWONLYFORP3; + else + mobj->eflags &= ~MFE_DRAWONLYFORP3; + + if (mobj->target->eflags & MFE_DRAWONLYFORP4) + mobj->eflags |= MFE_DRAWONLYFORP4; + else + mobj->eflags &= ~MFE_DRAWONLYFORP4; + // First scale to the same radius P_SetScale(mobj, FixedDiv(mobj->target->radius, mobj->info->radius)); @@ -6408,7 +6433,7 @@ void P_MobjThinker(mobj_t *mobj) P_SetTarget(&mobj->tracer, NULL); mobj->flags2 &= ~MF2_PUSHED; - mobj->eflags &= ~MFE_SPRUNG; + mobj->eflags &= ~(MFE_SPRUNG|MFE_JUSTBOUNCEDWALL); tmfloorthing = tmhitthing = NULL; @@ -6521,10 +6546,7 @@ void P_MobjThinker(mobj_t *mobj) // Don't touch my fuse! return; case MT_OVERLAY: - if ((!mobj->target) - || ((mobj->state == &states[S_INVULNFLASH1] || mobj->state == &states[S_INVULNFLASH2] // SRB2kart: BAD HACK X_X - || mobj->state == &states[S_INVULNFLASH3] || mobj->state == &states[S_INVULNFLASH4]) - && mobj->target->player && mobj->target->player->kartstuff[k_invincibilitytimer] == 0)) + if (!mobj->target) { P_RemoveMobj(mobj); return; @@ -6563,7 +6585,7 @@ void P_MobjThinker(mobj_t *mobj) if (G_BattleGametype() && mobj->target->player->kartstuff[k_balloon] <= 0) kartspeed = 1; - dsone = 26*4 + kartspeed*2 + (9 - mobj->target->player->kartweight); + dsone = (26*4 + kartspeed*2 + (9 - mobj->target->player->kartweight))*8; dstwo = dsone*2; if (mobj->target->player->kartstuff[k_driftcharge] < dsone) @@ -6574,27 +6596,46 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_hyudorotimer] > 0) { - if ((mobj->target->player == &players[displayplayer] - || (splitscreen && mobj->target->player == &players[secondarydisplayplayer]) - || (splitscreen > 1 && mobj->target->player == &players[thirddisplayplayer]) - || (splitscreen > 2 && mobj->target->player == &players[fourthdisplayplayer])) - || (!(mobj->target->player == &players[displayplayer] - || (splitscreen && mobj->target->player == &players[secondarydisplayplayer]) - || (splitscreen > 1 && mobj->target->player == &players[thirddisplayplayer]) - || (splitscreen > 2 && mobj->target->player == &players[fourthdisplayplayer])) - && (mobj->target->player->kartstuff[k_hyudorotimer] < 1*TICRATE/2 || mobj->target->player->kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)))) + if (splitscreen) { if (leveltime & 1) mobj->flags2 |= MF2_DONTDRAW; else mobj->flags2 &= ~MF2_DONTDRAW; + + if (mobj->target->player->kartstuff[k_hyudorotimer] >= (1*TICRATE/2) && mobj->target->player->kartstuff[k_hyudorotimer] <= hyudorotime-(1*TICRATE/2)) + { + if (mobj->target->player == &players[secondarydisplayplayer]) + mobj->eflags |= MFE_DRAWONLYFORP2; + else if (mobj->target->player == &players[thirddisplayplayer] && splitscreen > 1) + mobj->eflags |= MFE_DRAWONLYFORP3; + else if (mobj->target->player == &players[fourthdisplayplayer] && splitscreen > 2) + mobj->eflags |= MFE_DRAWONLYFORP4; + else + mobj->eflags |= MFE_DRAWONLYFORP1; + } + else + mobj->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } else - mobj->flags2 |= MF2_DONTDRAW; + { + if (mobj->target->player == &players[displayplayer] + || (mobj->target->player != &players[displayplayer] + && (mobj->target->player->kartstuff[k_hyudorotimer] < (1*TICRATE/2) || mobj->target->player->kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)))) + { + if (leveltime & 1) + mobj->flags2 |= MF2_DONTDRAW; + else + mobj->flags2 &= ~MF2_DONTDRAW; + } + else + mobj->flags2 |= MF2_DONTDRAW; + } } else if (mobj->target->player->kartstuff[k_hyudorotimer] == 0) { mobj->flags2 &= ~MF2_DONTDRAW; + mobj->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } // Actor's distance from its Target, or Radius. @@ -6772,7 +6813,7 @@ void P_MobjThinker(mobj_t *mobj) } break; case MT_BATTLEBALLOON: - if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo + if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->health > 0 && !mobj->target->player->spectator) { fixed_t rad = 32*mobj->target->scale; @@ -6803,6 +6844,26 @@ void P_MobjThinker(mobj_t *mobj) offz = mobj->target->height / 5; } + if (mobj->target->eflags & MFE_DRAWONLYFORP1) // groooooaann... + mobj->eflags |= MFE_DRAWONLYFORP1; + else + mobj->eflags &= ~MFE_DRAWONLYFORP1; + + if (mobj->target->eflags & MFE_DRAWONLYFORP2) + mobj->eflags |= MFE_DRAWONLYFORP2; + else + mobj->eflags &= ~MFE_DRAWONLYFORP2; + + if (mobj->target->eflags & MFE_DRAWONLYFORP3) + mobj->eflags |= MFE_DRAWONLYFORP3; + else + mobj->eflags &= ~MFE_DRAWONLYFORP3; + + if (mobj->target->eflags & MFE_DRAWONLYFORP4) + mobj->eflags |= MFE_DRAWONLYFORP4; + else + mobj->eflags &= ~MFE_DRAWONLYFORP4; + if (mobj->target->flags2 & MF2_DONTDRAW) mobj->flags2 |= MF2_DONTDRAW; else @@ -8113,7 +8174,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->tracer->y, mobj->tracer->floorz, SPLATDRAWMODE_SHADE); #endif break; - /*case MT_SPARKLETRAIL: + case MT_SPARKLETRAIL: if (!mobj->target) { P_RemoveMobj(mobj); @@ -8121,7 +8182,7 @@ void P_MobjThinker(mobj_t *mobj) } mobj->color = mobj->target->color; mobj->colorized = mobj->target->colorized; - break;*/ + break; case MT_SPINFIRE: case MT_SNEAKERTRAIL: if (mobj->eflags & MFE_VERTICALFLIP) @@ -9214,7 +9275,8 @@ void P_SpawnPrecipitation(void) subsector_t *precipsector = NULL; precipmobj_t *rainmo = NULL; - if (dedicated || !cv_precipdensity.value || curWeather == PRECIP_NONE) + if (dedicated || !cv_precipdensity.value || curWeather == PRECIP_NONE + || netgame) // SRB2Kart return; // Use the blockmap to narrow down our placing patterns diff --git a/src/p_mobj.h b/src/p_mobj.h index 3617ea40..096c7762 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -233,11 +233,17 @@ typedef enum MFE_VERTICALFLIP = 1<<5, // Goo water MFE_GOOWATER = 1<<6, - // free: to and including 1<<7 + // SRB2Kart: The mobj just hit & bounced off a wall, this is cleared on next frame + MFE_JUSTBOUNCEDWALL = 1<<7, // Mobj was already sprung this tic MFE_SPRUNG = 1<<8, // Platform movement MFE_APPLYPMOMZ = 1<<9, + // SRB2Kart: Splitscreen sprite display; very wasteful but I couldn't think of another way to do it... + MFE_DRAWONLYFORP1 = 1<<10, + MFE_DRAWONLYFORP2 = 1<<11, + MFE_DRAWONLYFORP3 = 1<<12, + MFE_DRAWONLYFORP4 = 1<<13, // free: to and including 1<<15 } mobjeflag_t; @@ -360,7 +366,7 @@ typedef struct mobj_s struct pslope_s *standingslope; // The slope that the object is standing on (shouldn't need synced in savegames, right?) #endif - boolean colorized; // Whether the mobj uses the starman colormap + boolean colorized; // Whether the mobj uses the rainbow colormap // WARNING: New fields must be added separately to savegame and Lua. } mobj_t; diff --git a/src/p_saveg.c b/src/p_saveg.c index eaa38813..d375f693 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3248,11 +3248,17 @@ static void P_NetArchiveMisc(void) WRITEUINT32(save_p, hidetime); // SRB2kart + WRITEINT32(save_p, numgotboxes); + WRITEUINT8(save_p, gamespeed); WRITEUINT8(save_p, mirrormode); WRITEUINT8(save_p, franticitems); WRITEUINT8(save_p, comeback); + WRITEUINT32(save_p, instaitemcooldown); + WRITEUINT32(save_p, spbincoming); + WRITEUINT8(save_p, spbplayer); + // Is it paused? if (paused) WRITEUINT8(save_p, 0x2f); @@ -3339,11 +3345,17 @@ static inline boolean P_NetUnArchiveMisc(void) hidetime = READUINT32(save_p); // SRB2kart + numgotboxes = READINT32(save_p); + gamespeed = READUINT8(save_p); mirrormode = (boolean)READUINT8(save_p); franticitems = (boolean)READUINT8(save_p); comeback = (boolean)READUINT8(save_p); + instaitemcooldown = READUINT32(save_p); + spbincoming = READUINT32(save_p); + spbplayer = READUINT8(save_p); + // Is it paused? if (READUINT8(save_p) == 0x2f) paused = true; diff --git a/src/p_setup.c b/src/p_setup.c index 3071b224..5cd82a70 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -179,8 +179,8 @@ static void P_ClearSingleMapHeaderInfo(INT16 i) mapheaderinfo[num]->subttl[0] = '\0'; DEH_WriteUndoline("ZONETITLE", mapheaderinfo[num]->zonttl, UNDO_NONE); // SRB2kart mapheaderinfo[num]->zonttl[0] = '\0'; - DEH_WriteUndoline("ACT", va("%d", mapheaderinfo[num]->actnum), UNDO_NONE); - mapheaderinfo[num]->actnum = 0; + DEH_WriteUndoline("ACT", mapheaderinfo[num]->actnum, UNDO_NONE); // SRB2kart + mapheaderinfo[num]->actnum[0] = '\0'; DEH_WriteUndoline("TYPEOFLEVEL", va("%d", mapheaderinfo[num]->typeoflevel), UNDO_NONE); mapheaderinfo[num]->typeoflevel = 0; DEH_WriteUndoline("NEXTLEVEL", va("%d", mapheaderinfo[num]->nextlevel), UNDO_NONE); @@ -2561,11 +2561,6 @@ boolean P_SetupLevel(boolean skipprecip) // Reset the palette -#ifdef HWRENDER - if (rendermode == render_opengl) - HWR_SetPaletteColor(0); - else -#endif if (rendermode != render_none) V_SetPaletteLump("PLAYPAL"); @@ -2679,19 +2674,19 @@ boolean P_SetupLevel(boolean skipprecip) } // Print "SPEEDING OFF TO [ZONE] [ACT 1]..." - if (rendermode != render_none) + /*if (rendermode != render_none) { // Don't include these in the fade! char tx[64]; V_DrawSmallString(1, 191, V_ALLOWLOWERCASE, M_GetText("Speeding off to...")); snprintf(tx, 63, "%s%s%s", mapheaderinfo[gamemap-1]->lvlttl, - (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? mapheaderinfo[gamemap-1]->zonttl : // SRB2kart + (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->zonttl) : // SRB2kart ((mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE"), - (mapheaderinfo[gamemap-1]->actnum > 0) ? va(", Act %d",mapheaderinfo[gamemap-1]->actnum) : ""); + (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) ? va(", Act %s",mapheaderinfo[gamemap-1]->actnum) : ""); V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); I_UpdateNoVsync(); - } + }*/ #ifdef HAVE_BLUA LUA_InvalidateLevel(); @@ -2985,20 +2980,32 @@ boolean P_SetupLevel(boolean skipprecip) }*/ // SRB2Kart: map load variables - if (modeattacking) + if (modeattacking) // Just play it safe and set everything + { gamespeed = 2; - else if (G_BattleGametype()) - gamespeed = 0; - else - gamespeed = cv_kartspeed.value; - - if (G_BattleGametype()) mirrormode = false; + franticitems = false; + comeback = true; + } else - mirrormode = cv_kartmirror.value; + { + if (G_BattleGametype()) + gamespeed = 0; + else + gamespeed = cv_kartspeed.value; - franticitems = cv_kartfrantic.value; - comeback = cv_kartcomeback.value; + if (G_BattleGametype()) + mirrormode = false; + else + mirrormode = cv_kartmirror.value; + + franticitems = cv_kartfrantic.value; + comeback = cv_kartcomeback.value; + } + + instaitemcooldown = 0; + spbincoming = 0; + spbplayer = 0; // clear special respawning que iquehead = iquetail = 0; @@ -3036,7 +3043,7 @@ boolean P_SetupLevel(boolean skipprecip) if (!(netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking || players[consoleplayer].lives <= 0) && (!modifiedgame || savemoddata) && cursaveslot >= 0 && !ultimatemode && !(mapheaderinfo[gamemap-1]->menuflags & LF2_HIDEINMENU) - && (!G_IsSpecialStage(gamemap)) && gamemap != lastmapsaved && (mapheaderinfo[gamemap-1]->actnum < 2 || gamecomplete)) + && (!G_IsSpecialStage(gamemap)) && gamemap != lastmapsaved && (/*mapheaderinfo[gamemap-1]->actnum < 2 ||*/ gamecomplete)) G_SaveGame((UINT32)cursaveslot); if (savedata.lives > 0) @@ -3107,7 +3114,7 @@ boolean P_AddWadFile(const char *wadfilename, char **firstmapname) if ((numlumps = W_LoadWadFile(wadfilename)) == INT16_MAX) { - CONS_Printf(M_GetText("Errors occured while loading %s; not added.\n"), wadfilename); + CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), wadfilename); return false; } else wadnum = (UINT16)(numwadfiles-1); diff --git a/src/p_spec.c b/src/p_spec.c index 9ae87bc9..0565dbd7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4201,7 +4201,7 @@ DoneSection2: { // blatant reuse of a variable that's normally unused in circuit if (!player->tossdelay) - S_StartSound(player->mo, sfx_lose); + S_StartSound(player->mo, sfx_s26d); player->tossdelay = 3; } @@ -4210,7 +4210,9 @@ DoneSection2: if (P_IsLocalPlayer(player)) { // SRB2kart 200117 - if (!splitscreen) + if (splitscreen) + S_ChangeMusicInternal("karwin", true); + else { if (player->kartstuff[k_position] == 1) S_ChangeMusicInternal("karwin", true); @@ -4219,14 +4221,13 @@ DoneSection2: else S_ChangeMusicInternal("karok", true); } - else - S_ChangeMusicInternal("karok", true); - // - //HU_SetCEchoFlags(0); - //HU_SetCEchoDuration(5); - //HU_DoCEcho("FINISHED!"); } + if (player->kartstuff[k_position] == 1) + S_StartSound(NULL, sfx_s253); + else if (P_IsLocalPlayer(player)) + S_StartSound(NULL, sfx_s24f); + P_DoPlayerExit(player); } } @@ -6721,6 +6722,7 @@ void T_Scroll(scroll_t *s) line_t *line; size_t i; INT32 sect; + ffloor_t *rover; case sc_side: // scroll wall texture side = sides + s->affectee; @@ -6762,6 +6764,19 @@ void T_Scroll(scroll_t *s) sector_t *psec; psec = sectors + sect; + // Find the FOF corresponding to the control linedef + for (rover = psec->ffloors; rover; rover = rover->next) + { + if (rover->master == sec->lines[i]) + break; + } + + if (!rover) // This should be impossible, but don't complain if it is the case somehow + continue; + + if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there + continue; + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6825,6 +6840,19 @@ void T_Scroll(scroll_t *s) sector_t *psec; psec = sectors + sect; + // Find the FOF corresponding to the control linedef + for (rover = psec->ffloors; rover; rover = rover->next) + { + if (rover->master == sec->lines[i]) + break; + } + + if (!rover) // This should be impossible, but don't complain if it is the case somehow + continue; + + if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there + continue; + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; diff --git a/src/p_tick.c b/src/p_tick.c index 658e5325..bcedf1f6 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -608,7 +608,8 @@ void P_Ticker(boolean run) } // Keep track of how long they've been playing! - totalplaytime++; + if (!demoplayback) // Don't increment if a demo is playing. + totalplaytime++; if (!useNightsSS && G_IsSpecialStage(gamemap)) P_DoSpecialStageStuff(); @@ -676,6 +677,38 @@ void P_Ticker(boolean run) if (countdown2) countdown2--; + if (spbincoming && --spbincoming <= 0) + { + UINT8 best = 0; + SINT8 hurtthisguy = -1; + + spbincoming = 0; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator) + continue; + + if (!players[i].mo) + continue; + + if (players[i].exiting) + continue; + + if (best <= 0 || players[i].kartstuff[k_position] < best) + { + best = players[i].kartstuff[k_position]; + hurtthisguy = i; + } + } + + if (hurtthisguy != -1) + players[hurtthisguy].kartstuff[k_deathsentence] = TICRATE+1; + } + + if (instaitemcooldown) + instaitemcooldown--; + if (quake.time) { fixed_t ir = quake.intensity>>1; diff --git a/src/p_user.c b/src/p_user.c index cfc67bfc..d59908a4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1041,6 +1041,10 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) { UINT32 oldscore; +#if 1 + return; // Nope, still don't need this for Battle even +#endif + if (player->bot) player = &players[consoleplayer]; @@ -1161,44 +1165,39 @@ void P_RestoreMusic(player_t *player) S_SpeedMusic(1.0f); // SRB2kart - We have some different powers than vanilla, some of which tweak the music. - if (!player->exiting) + if (splitscreen != 0 && G_RaceGametype() + && (players[consoleplayer].exiting + || players[secondarydisplayplayer].exiting + || players[thirddisplayplayer].exiting + || players[fourthdisplayplayer].exiting)) + S_ChangeMusicInternal("karwin", true); + else if (splitscreen == 0 && G_RaceGametype() && player->exiting) { - // Item - Grow - if (player->kartstuff[k_growshrinktimer] > 1) - S_ChangeMusicInternal("kgrow", true); - - // Item - Star - else if (player->kartstuff[k_invincibilitytimer] > 1) - S_ChangeMusicInternal("kinvnc", false); - - // Event - Final Lap - else if (player->laps == (UINT8)(cv_numlaps.value - 1)) - { - S_SpeedMusic(1.2f); - S_ChangeMusic(mapmusname, mapmusflags, true); - } + if (player->kartstuff[k_position] == 1) + S_ChangeMusicInternal("karwin", true); + else if (K_IsPlayerLosing(player)) + S_ChangeMusicInternal("karlos", true); else - S_ChangeMusic(mapmusname, mapmusflags, true); - } - - /* SRB2kart - old stuff - if (player->powers[pw_super] && !(mapheaderinfo[gamemap-1]->levelflags & LF_NOSSMUSIC)) - S_ChangeMusicInternal("supers", true); - else if (player->powers[pw_invulnerability] > 1) - S_ChangeMusicInternal((mariomode) ? "minvnc" : "invinc", false); - else if (player->powers[pw_sneakers] > 1 && !player->powers[pw_super]) - { - if (mapheaderinfo[gamemap-1]->levelflags & LF_SPEEDMUSIC) - { - S_SpeedMusic(1.4f); - S_ChangeMusic(mapmusname, mapmusflags, true); - } - else - S_ChangeMusicInternal("shoes", true); + S_ChangeMusicInternal("karok", true); } else - S_ChangeMusic(mapmusname, mapmusflags, true); - */ + { + // Item - Grow + if (player->kartstuff[k_growshrinktimer] > 1 && player->playerstate == PST_LIVE) + S_ChangeMusicInternal("kgrow", true); + // Item - Invincibility + else if (player->kartstuff[k_invincibilitytimer] > 1 && player->playerstate == PST_LIVE) + S_ChangeMusicInternal("kinvnc", false); + else if (leveltime > 157) + { + // Event - Final Lap + if (G_RaceGametype() && player->laps >= (UINT8)(cv_numlaps.value - 1)) + S_SpeedMusic(1.2f); + S_ChangeMusic(mapmusname, mapmusflags, true); + } + else + S_StopMusic(); + } } // @@ -1763,6 +1762,9 @@ boolean P_InSpaceSector(mobj_t *mo) // Returns true if you are in space for (rover = sector->ffloors; rover; rover = rover->next) { + if (!(rover->flags & FF_EXISTS)) + continue; + if (GETSECSPECIAL(rover->master->frontsector->special, 1) != SPACESPECIAL) continue; #ifdef ESLOPE @@ -1977,6 +1979,12 @@ static void P_CheckBouncySectors(player_t *player) for (rover = node->m_sector->ffloors; rover; rover = rover->next) { + if (!(rover->flags & FF_EXISTS)) + continue; // FOFs should not be bouncy if they don't even "exist" + + if (GETSECSPECIAL(rover->master->frontsector->special, 1) != 15) + continue; // this sector type is required for FOFs to be bouncy + topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL); bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL); @@ -1990,7 +1998,6 @@ static void P_CheckBouncySectors(player_t *player) && oldz + player->mo->height > P_GetFOFBottomZ(player->mo, node->m_sector, rover, oldx, oldy, NULL)) top = false; - if (GETSECSPECIAL(rover->master->frontsector->special, 1) == 15) { fixed_t linedist; @@ -2297,12 +2304,12 @@ static void P_CheckInvincibilityTimer(player_t *player) //if (mariomode && !player->powers[pw_super]) // SRB2kart player->mo->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); - /*if (leveltime % (TICRATE/7) == 0) + if (leveltime % (TICRATE/7) == 0) { mobj_t *sparkle = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_IVSP); sparkle->destscale = player->mo->scale; P_SetScale(sparkle, player->mo->scale); - }*/ + } // Resume normal music stuff. if (player->powers[pw_invulnerability] == 1 || player->kartstuff[k_invincibilitytimer] == 1) @@ -4678,7 +4685,6 @@ static void P_3dMovement(player_t *player) angle_t movepushangle, movepushsideangle; // Analog //INT32 topspeed, acceleration, thrustfactor; fixed_t movepushforward = 0, movepushside = 0; - INT32 mforward = 0, mbackward = 0; angle_t dangle; // replaces old quadrants bits //boolean dangleflip = false; // SRB2kart - toaster //fixed_t normalspd = FixedMul(player->normalspeed, player->mo->scale); @@ -4766,12 +4772,6 @@ static void P_3dMovement(player_t *player) //dangleflip = true; } - // now use it to determine direction! - if (dangle <= ANGLE_45) // angles 0-45 or 315-360 - mforward = 1; // going forwards - else if (dangle >= ANGLE_135) // angles 135-225 - mbackward = 1; // going backwards - // anything else will leave both at 0, so no need to do anything else //{ SRB2kart 220217 - Toaster Code for misplaced thrust @@ -4797,104 +4797,13 @@ static void P_3dMovement(player_t *player) cmd->forwardmove = 0; // Do not let the player control movement if not onground. - onground = P_IsObjectOnGround(player->mo); - - // SRB2Kart: shhhhhhh don't question me, pogo springs and speed bumps are supposed to control like you're on the ground :p - if (player->kartstuff[k_pogospring]) - onground = true; + // SRB2Kart: feather and speed bumps are supposed to control like you're on the ground + onground = (P_IsObjectOnGround(player->mo) || (player->kartstuff[k_pogospring])); player->aiming = cmd->aiming<pflags & PF_SLIDING) - { - normalspd = FixedMul(36<mo->scale); - thrustfactor = 5; - acceleration = 96 + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * 40; - topspeed = normalspd; - } - else if (player->bot) - { // Bot steals player 1's stats - normalspd = FixedMul(players[consoleplayer].normalspeed, player->mo->scale); - thrustfactor = players[consoleplayer].thrustfactor; - acceleration = players[consoleplayer].accelstart + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * players[consoleplayer].acceleration; - - if (player->powers[pw_tailsfly]) - topspeed = normalspd/2; - else if (player->mo->eflags & (MFE_UNDERWATER|MFE_GOOWATER)) - { - topspeed = normalspd/2; - acceleration = 2*acceleration/3; - } - else - topspeed = normalspd; - } - else if (player->powers[pw_super] || player->powers[pw_sneakers] || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_sneakertimer]) - { - if (player->powers[pw_sneakers] && (player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_sneakertimer] > 0 || player->kartstuff[k_invincibilitytimer] > 0)) - thrustfactor = player->thrustfactor*3; - else - thrustfactor = player->thrustfactor*2; - acceleration = player->accelstart/2 + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * player->acceleration/2; - - - if (player->powers[pw_tailsfly]) - topspeed = normalspd; - else if (player->mo->eflags & (MFE_UNDERWATER|MFE_GOOWATER)) - { - topspeed = normalspd; - acceleration = 2*acceleration/3; - } - - if (cmd->forwardmove < 0) - topspeed = 5<<16; - else - topspeed = (normalspd * 3)/2; //> 60<<16 ? 60<<16 : normalspd * 2; - } - else - { - thrustfactor = player->thrustfactor; - acceleration = player->accelstart + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * player->acceleration; - - - if (player->powers[pw_tailsfly]) - topspeed = normalspd/2; - else if (player->mo->eflags & (MFE_UNDERWATER|MFE_GOOWATER)) - { - topspeed = normalspd/2; - acceleration = 2*acceleration/3; - } - if (cmd->forwardmove < 0) - topspeed = 5<<16; - else - topspeed = normalspd; - } - - // Better maneuverability while flying - //if(player->powers[pw_tailsfly]) - //{ - // thrustfactor = player->thrustfactor*2; - // acceleration = player->accelstart + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * player->acceleration; - //} - - if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration... - acceleration = FixedMul(acceleration<mo->movefactor)>>FRACBITS; - */ - // Forward movement - if (player->climbing) - { - if (cmd->forwardmove) - { - P_SetObjectMomZ(player->mo, FixedDiv(cmd->forwardmove*FRACUNIT, 10*FRACUNIT), false); - if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])) - player->mo->momz *= 2; - } - } - else if (!analogmove - //&& cmd->forwardmove != 0 - && !(player->pflags & PF_GLIDING || player->exiting - || (P_PlayerInPain(player) && !onground))) + if (!(player->exiting || (P_PlayerInPain(player) && !onground))) { //movepushforward = cmd->forwardmove * (thrustfactor * acceleration); movepushforward = K_3dKartMovement(player, onground, cmd->forwardmove); @@ -4903,25 +4812,14 @@ static void P_3dMovement(player_t *player) if (!onground) movepushforward >>= 2; // proper air movement - // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) - { - if ((mforward && cmd->forwardmove > 0) || (mbackward && cmd->forwardmove < 0)) - movepushforward = 0; - else if (!(player->pflags & PF_STARTDASH)) - movepushforward = FixedDiv(movepushforward, 16*FRACUNIT); - else - movepushforward = 0; - } - // don't need to account for scale here with kart accel code //movepushforward = FixedMul(movepushforward, player->mo->scale); if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration... movepushforward = FixedMul(movepushforward, player->mo->movefactor); - //if (mforward && cmd->forwardmove < 0) // SRB2kart - braking isn't instant - // movepushforward /= 32; + if (cmd->buttons & BT_BRAKE && !cmd->forwardmove) // SRB2kart - braking isn't instant + movepushforward /= 64; #ifdef ESLOPE totalthrust.x += P_ReturnThrustX(player->mo, movepushangle, movepushforward); @@ -4934,91 +4832,14 @@ static void P_3dMovement(player_t *player) { K_MomentumToFacing(player); } + // Sideways movement - if (player->climbing) + if (cmd->sidemove != 0 && !(player->exiting || (P_PlayerInPain(player)))) { - if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])) - P_InstaThrust(player->mo, player->mo->angle-ANGLE_90, FixedMul(FixedDiv(cmd->sidemove*FRACUNIT, 5*FRACUNIT), player->mo->scale)); - else - P_InstaThrust(player->mo, player->mo->angle-ANGLE_90, FixedMul(FixedDiv(cmd->sidemove*FRACUNIT, 10*FRACUNIT), player->mo->scale)); - } - // Analog movement control - else if (analogmove) - { - if (!(player->pflags & PF_GLIDING || player->exiting || P_PlayerInPain(player))) - { - angle_t controldirection; - - // Calculate the angle at which the controls are pointing - // to figure out the proper mforward and mbackward. - // (Why was it so complicated before? ~Red) - controldirection = R_PointToAngle2(0, 0, cmd->forwardmove*FRACUNIT, -cmd->sidemove*FRACUNIT)+movepushangle; - - //movepushforward = max(abs(cmd->sidemove), abs(cmd->forwardmove)) * (thrustfactor * acceleration); - movepushforward = K_3dKartMovement(player, onground, max(abs(cmd->sidemove), abs(cmd->forwardmove))); - - // allow very small movement while in air for gameplay - if (!onground) - movepushforward >>= 2; // proper air movement - - // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) - { - // Stupid little movement prohibitor hack - // that REALLY shouldn't belong in analog code. - if ((mforward && cmd->forwardmove > 0) || (mbackward && cmd->forwardmove < 0)) - movepushforward = 0; - else if (!(player->pflags & PF_STARTDASH)) - movepushforward = FixedDiv(movepushforward, 16*FRACUNIT); - else - movepushforward = 0; - } - - movepushsideangle = controldirection; - - // don't need to account for scale here with kart accel code - //movepushforward = FixedMul(movepushforward, player->mo->scale); - - //if (mforward && cmd->forwardmove < 0) // SRB2kart - braking isn't instant - // movepushforward /= 32; - -#ifdef ESLOPE - totalthrust.x += P_ReturnThrustX(player->mo, controldirection, movepushforward); - totalthrust.y += P_ReturnThrustY(player->mo, controldirection, movepushforward); -#else - P_Thrust(player->mo, controldirection, movepushforward); -#endif - } - } - else if (cmd->sidemove && !(player->pflags & PF_GLIDING) && !player->exiting && !P_PlayerInPain(player)) - { - //movepushside = cmd->sidemove * (thrustfactor * acceleration); if (cmd->sidemove > 0) - movepushside = K_3dKartMovement(player, onground, 50); + movepushside = (cmd->sidemove * FRACUNIT/128) + FixedDiv(player->speed, K_GetKartSpeed(player, true)); else - movepushside = -(K_3dKartMovement(player, onground, 50)); - - if (!onground) - { - movepushside >>= 2; - - // Reduce movepushslide even more if over "max" flight speed - if (player->powers[pw_tailsfly] && player->speed > K_GetKartSpeed(player, true)) //topspeed) - movepushside >>= 2; - } - - // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) - { - if (!(player->pflags & PF_STARTDASH)) - movepushside = FixedDiv(movepushside,16*FRACUNIT); - else - movepushside = 0; - } - - // Finally move the player now that his speed/direction has been decided. - // don't need to account for scale here with kart accel code - //movepushside = FixedMul(movepushside, player->mo->scale); + movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, K_GetKartSpeed(player, true)); #ifdef ESLOPE totalthrust.x += P_ReturnThrustX(player->mo, movepushsideangle, movepushside); @@ -6490,13 +6311,13 @@ void P_ElementalFireTrail(player_t *player) } } -static void P_SkidStuff(player_t *player) +/*static void P_SkidStuff(player_t *player) { fixed_t pmx = player->rmomx + player->cmomx; fixed_t pmy = player->rmomy + player->cmomy; // Knuckles glides into the dirt. - /* // SRB2kart - don't need + // SRB2kart - don't need if (player->pflags & PF_GLIDING && player->skidtime) { // Fell off a ledge... @@ -6534,7 +6355,7 @@ static void P_SkidStuff(player_t *player) } } // Skidding! - else*/if (onground && !(player->mo->eflags & MFE_GOOWATER) && !(player->pflags & (PF_JUMPED|PF_SPINNING|PF_SLIDING)) && !(player->charflags & SF_NOSKID)) + elseif (onground && !(player->mo->eflags & MFE_GOOWATER) && !(player->pflags & (PF_JUMPED|PF_SPINNING|PF_SLIDING)) && !(player->charflags & SF_NOSKID)) { if (player->skidtime) { @@ -6581,7 +6402,7 @@ static void P_SkidStuff(player_t *player) S_StopSound(player->mo); } } -} +}*/ // // P_MovePlayer @@ -6756,7 +6577,7 @@ static void P_MovePlayer(player_t *player) if (maptol & TOL_2D) runspd = FixedMul(runspd, 2*FRACUNIT/3); - P_SkidStuff(player); + //P_SkidStuff(player); ///////////////////////// // MOVEMENT ANIMATIONS // @@ -7103,8 +6924,6 @@ static void P_MovePlayer(player_t *player) // SRB2kart - Drifting smoke and fire if ((player->kartstuff[k_drift] != 0 || player->kartstuff[k_sneakertimer] > 0) && onground && (leveltime & 1)) K_SpawnDriftTrail(player); - if (player->kartstuff[k_invincibilitytimer] > 0) - K_SpawnSparkleTrail(player); /* // SRB2kart - nadah // If the player isn't on the ground, make sure they aren't in a "starting dash" position. @@ -8151,12 +7970,31 @@ static void P_DeathThink(player_t *player) { if (player->deadtimer != gameovertics) ; - // Restore the other player's music once we're dead for long enough + // Restore the first available player's music once we're dead for long enough // -- that is, as long as they aren't dead too - else if (player == &players[displayplayer] && players[secondarydisplayplayer].lives > 0) - P_RestoreMusic(&players[secondarydisplayplayer]); - else if (player == &players[secondarydisplayplayer] && players[displayplayer].lives > 0) - P_RestoreMusic(&players[displayplayer]); + else + { + INT32 i; + + for (i = 0; i < 4; i++) + { + if (i > splitscreen) + break; + + if (i == 0 && player != &players[displayplayer] && players[displayplayer].lives > 0) + P_RestoreMusic(&players[displayplayer]); + else if (i == 1 && player != &players[secondarydisplayplayer] && players[secondarydisplayplayer].lives > 0) + P_RestoreMusic(&players[secondarydisplayplayer]); + else if (i == 2 && player != &players[thirddisplayplayer] && players[thirddisplayplayer].lives > 0) + P_RestoreMusic(&players[thirddisplayplayer]); + else if (i == 3 && player != &players[fourthdisplayplayer] && players[fourthdisplayplayer].lives > 0) + P_RestoreMusic(&players[fourthdisplayplayer]); + else + continue; + + break; + } + } } } @@ -8300,6 +8138,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall subsector_t *newsubsec; fixed_t f1, f2; + if (player->exiting) // SRB2Kart: Leave the camera behind while exiting, for dramatic effect! + return true; + cameranoclip = (player->pflags & (PF_NOCLIP|PF_NIGHTSMODE)) || (player->mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)); // Noclipping player camera noclips too!! if (!(player->climbing || (player->pflags & PF_NIGHTSMODE) || player->playerstate == PST_DEAD)) @@ -9698,7 +9539,7 @@ void P_PlayerThink(player_t *player) // Flash player after being hit. if (!(player->pflags & PF_NIGHTSMODE)) { - // SRB2kart - fixes boo not flashing when it should. Grow doesn't flash either. Flashing is local. + // SRB2kart - fixes Hyudoro not flashing when it should. Grow doesn't flash either. Flashing is local. if ((player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer]) || (splitscreen > 1 && player == &players[thirddisplayplayer]) @@ -10114,3 +9955,4 @@ void P_PlayerAfterThink(player_t *player) K_KartPlayerAfterThink(player); } + diff --git a/src/r_bsp.c b/src/r_bsp.c index 10fac7a5..234d6ee0 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -855,7 +855,7 @@ static void R_AddPolyObjects(subsector_t *sub) drawseg_t *firstseg; -static void R_Subsector(size_t num) +static void R_Subsector(size_t num, UINT8 ssplayer) { INT32 count, floorlightlevel, ceilinglightlevel, light; seg_t *line; @@ -1213,7 +1213,7 @@ static void R_Subsector(size_t num) // Either you must pass the fake sector and handle validcount here, on the // real sector, or you must account for the lighting in some other way, // like passing it as an argument. - R_AddSprites(sub->sector, (floorlightlevel+ceilinglightlevel)/2); + R_AddSprites(sub->sector, (floorlightlevel+ceilinglightlevel)/2, ssplayer); firstseg = NULL; @@ -1419,7 +1419,7 @@ INT32 R_GetPlaneLight(sector_t *sector, fixed_t planeheight, boolean underside) // // killough 5/2/98: reformatted, removed tail recursion -void R_RenderBSPNode(INT32 bspnum) +void R_RenderBSPNode(INT32 bspnum, UINT8 ssplayer) { node_t *bsp; INT32 side; @@ -1430,7 +1430,7 @@ void R_RenderBSPNode(INT32 bspnum) // Decide which side the view point is on. side = R_PointOnSide(viewx, viewy, bsp); // Recursively divide front space. - R_RenderBSPNode(bsp->children[side]); + R_RenderBSPNode(bsp->children[side], ssplayer); // Possibly divide back space. @@ -1448,5 +1448,5 @@ void R_RenderBSPNode(INT32 bspnum) portalcullsector = NULL; } - R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); + R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR, ssplayer); } diff --git a/src/r_bsp.h b/src/r_bsp.h index e871b5dd..db340221 100644 --- a/src/r_bsp.h +++ b/src/r_bsp.h @@ -37,7 +37,7 @@ extern INT32 doorclosed; void R_ClearClipSegs(void); void R_PortalClearClipSegs(INT32 start, INT32 end); void R_ClearDrawSegs(void); -void R_RenderBSPNode(INT32 bspnum); +void R_RenderBSPNode(INT32 bspnum, UINT8 ssplayer); void R_AddPortal(INT32 line1, INT32 line2, INT32 x1, INT32 x2); #ifdef POLYOBJECTS diff --git a/src/r_local.h b/src/r_local.h index ebe15512..a3dfe7df 100644 --- a/src/r_local.h +++ b/src/r_local.h @@ -38,4 +38,4 @@ extern drawseg_t *firstseg; void SplitScreen_OnChange(void); -#endif // __R_LOCAL__ \ No newline at end of file +#endif // __R_LOCAL__ diff --git a/src/r_main.c b/src/r_main.c index 82b2b6d5..c516b87a 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1335,6 +1335,18 @@ void R_RenderPlayerView(player_t *player) { portal_pair *portal; const boolean skybox = (skyboxmo[0] && cv_skybox.value); + UINT8 ssplayer; + + if (player == &players[secondarydisplayplayer] && splitscreen) + ssplayer = 2; + else if (player == &players[thirddisplayplayer] && splitscreen > 1) + ssplayer = 3; + else if (player == &players[fourthdisplayplayer] && splitscreen > 2) + ssplayer = 4; + else if (splitscreen) + ssplayer = 1; + else + ssplayer = 0; if (cv_homremoval.value && player == &players[displayplayer]) // if this is display player 1 { @@ -1371,7 +1383,7 @@ void R_RenderPlayerView(player_t *player) R_ClearVisibleFloorSplats(); #endif - R_RenderBSPNode((INT32)numnodes - 1); + R_RenderBSPNode((INT32)numnodes - 1, ssplayer); R_ClipSprites(); R_DrawPlanes(); #ifdef FLOORSPLATS @@ -1404,7 +1416,7 @@ void R_RenderPlayerView(player_t *player) mytotal = 0; ProfZeroTimer(); #endif - R_RenderBSPNode((INT32)numnodes - 1); + R_RenderBSPNode((INT32)numnodes - 1, ssplayer); R_ClipSprites(); #ifdef TIMING RDMSR(0x10, &mycount); @@ -1429,7 +1441,7 @@ void R_RenderPlayerView(player_t *player) validcount++; - R_RenderBSPNode((INT32)numnodes - 1); + R_RenderBSPNode((INT32)numnodes - 1, ssplayer); R_ClipSprites(); //R_DrawPlanes(); //R_DrawMasked(); diff --git a/src/r_things.c b/src/r_things.c index d21b7808..2bd4ff86 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -29,6 +29,7 @@ #include "d_netfil.h" // blargh. for nameonly(). #include "m_cheat.h" // objectplace #include "k_kart.h" // SRB2kart +#include "p_local.h" // stplyr #ifdef HWRENDER #include "hardware/hw_md2.h" #endif @@ -1675,7 +1676,7 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) // R_AddSprites // During BSP traversal, this adds sprites by sector. // -void R_AddSprites(sector_t *sec, INT32 lightlevel) +void R_AddSprites(sector_t *sec, INT32 lightlevel, UINT8 ssplayer) { mobj_t *thing; precipmobj_t *precipthing; // Tails 08-25-2002 @@ -1718,6 +1719,25 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) continue; + if (splitscreen) + { + if (thing->eflags & MFE_DRAWONLYFORP1) + if (ssplayer != 1) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP2) + if (ssplayer != 2) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) + if (ssplayer != 3) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) + if (ssplayer != 4) + continue; + } + approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y); if (approx_dist <= limit_dist) @@ -1728,8 +1748,31 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) { // Draw everything in sector, no checks for (thing = sec->thinglist; thing; thing = thing->snext) - if (!(thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW)) - R_ProjectSprite(thing); + { + if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) + continue; + + if (splitscreen) + { + if (thing->eflags & MFE_DRAWONLYFORP1) + if (ssplayer != 1) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP2) + if (ssplayer != 2) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) + if (ssplayer != 3) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) + if (ssplayer != 4) + continue; + } + + R_ProjectSprite(thing); + } } // Someone seriously wants infinite draw distance for precipitation? diff --git a/src/r_things.h b/src/r_things.h index 347f204f..c7d4989c 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -55,7 +55,7 @@ void R_DelSpriteDefs(UINT16 wadnum); #endif //SoM: 6/5/2000: Light sprites correctly! -void R_AddSprites(sector_t *sec, INT32 lightlevel); +void R_AddSprites(sector_t *sec, INT32 lightlevel, UINT8 ssplayer); void R_InitSprites(void); void R_ClearSprites(void); void R_ClipSprites(void); diff --git a/src/s_sound.c b/src/s_sound.c index b2786cbf..0a352e9b 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -751,7 +751,7 @@ void S_StartSound(const void *origin, sfxenum_t sfx_id) if (sound_disabled) return; - if (true) // Sounds change in Mario mode! // SRB2kart - every sound is mario. + if (mariomode) // Sounds change in Mario mode! { switch (sfx_id) { @@ -764,9 +764,9 @@ void S_StartSound(const void *origin, sfxenum_t sfx_id) case sfx_thok: sfx_id = sfx_mario7; break; - case sfx_pop: - sfx_id = sfx_mkitem; // SRB2kart - break; +// case sfx_pop: +// sfx_id = sfx_mkitem; // SRB2kart +// break; case sfx_jump: sfx_id = sfx_mario6; break; @@ -1438,7 +1438,7 @@ void S_StartSoundName(void *mo, const char *soundname) /// ------------------------ #ifdef MUSICSLOT_COMPATIBILITY -const char *compat_special_music_slots[21] = +const char *compat_special_music_slots[16] = { "titles", // 1036 title screen "read_m", // 1037 intro diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index df8af61b..0dd022a8 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -700,6 +700,14 @@ static void Impl_HandleMouseButtonEvent(SDL_MouseButtonEvent evt, Uint32 type) SDL_memset(&event, 0, sizeof(event_t)); + // Ignore the event if the mouse is not actually focused on the window. + // This can happen if you used the mouse to restore keyboard focus; + // this apparently makes a mouse button down event but not a mouse button up event, + // resulting in whatever key was pressed down getting "stuck" if we don't ignore it. + // -- Monster Iestyn (28/05/18) + if (SDL_GetMouseFocus() != window) + return; + /// \todo inputEvent.button.which if (USE_MOUSEINPUT) { diff --git a/src/sounds.c b/src/sounds.c index 2de9d1f4..f81d2735 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -264,6 +264,139 @@ sfxinfo_t S_sfx[NUMSFX] = {"brakrl", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR}, {"brakrx", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR}, + // Sonic 1 sounds + {"s1a0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1aa", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ab", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ac", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ad", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ae", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1af", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ba", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1bb", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1bc", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1bd", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1be", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1bf", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ca", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1cb", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1cc", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1cd", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ce", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1cf", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + + // Sonic 2 sounds + {"s220", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s221", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s222", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s223", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s224", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s225", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s226", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s227", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s228", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s229", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s230", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s231", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s232", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s233", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s234", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s235", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s236", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s237", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s238", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s239", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s240", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s241", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s242", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s243", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s244", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s245", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s246", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s247", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s248", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s249", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Normal finish + {"s250", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s251", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s252", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s253", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // 1st place finish + {"s254", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s255", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s256", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s257", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s258", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s259", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s260", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s261", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s262", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s263", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s264", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s265", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s266", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s267", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s268", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s269", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Missed checkpoint + {"s26e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s270", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + // S3&K sounds {"s3k33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, @@ -287,7 +420,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3k46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s3k49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s3k49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart bump sound {"s3k4a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, @@ -466,6 +599,174 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3kdbs", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3kdbl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + // 3D Blast sounds (the "missing" ones are direct copies of S3K's, no minor differences what-so-ever) + {"3db06", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"3db09", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"3db14", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"3db16", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + + // Sonic CD sounds + {"cdfm00", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm01", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm02", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm03", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm04", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm05", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm06", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm07", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm08", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm09", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm10", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm11", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm12", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm13", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm14", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm15", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm16", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm17", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm18", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm19", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm20", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm21", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm22", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm23", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm24", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm25", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm26", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm27", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm28", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm29", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm30", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm31", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm32", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm35", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm36", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm37", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm38", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm39", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm45", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm51", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm52", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm53", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm54", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm55", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm56", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm57", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm58", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm59", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm64", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm65", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm66", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm67", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm68", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm69", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm70", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm71", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm72", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm73", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm74", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm75", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm76", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm77", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm78", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm79", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + + // Knuckles Chaotix sounds + {"kc2a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Pogo Spring + {"kc30", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc31", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc32", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc35", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc36", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc37", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc38", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc39", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Voting roulette + {"kc3a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Unlock everything cheat + {"kc43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc45", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Vote picked + {"kc49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Voting beep + {"kc4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc51", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc52", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc53", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc54", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc55", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc56", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc57", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc58", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc59", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Shrink + {"kc5a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Grow + {"kc5b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc5c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc5e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc64", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc65", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc66", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc67", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc68", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc69", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc6b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc6c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc6d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc6e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + // SRB2kart {"lkt1", true, 192, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"lkt2", true, 192, 0, -1, NULL, 0, -1, -1, LUMPERROR}, @@ -505,76 +806,6 @@ sfxinfo_t S_sfx[NUMSFX] = {"boing", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"smkinv", false, 140, 16, -1, NULL, 0, -1, -1, LUMPERROR}, - // Knuckles Chaotix sounds - {"kc2a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Pogo Spring - {"kc30", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc31", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc32", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc35", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc36", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc37", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc38", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc39", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Voting beep - {"kc3a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc45", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Voting pick - {"kc49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc51", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc52", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc53", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc54", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc55", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc56", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc57", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc58", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc59", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Shrink - {"kc5a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Grow - {"kc5b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc5c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc5e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc64", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc65", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc66", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc67", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc68", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc69", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc6b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc6c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc6d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc6e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - // SRB2kart - Skin sounds {"kwin", false, 64, 0, -1, NULL, 0, SKSWIN, -1, LUMPERROR}, {"klose", false, 64, 0, -1, NULL, 0, SKSLOSE, -1, LUMPERROR}, diff --git a/src/sounds.h b/src/sounds.h index c893c533..d71a21f7 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -336,6 +336,139 @@ typedef enum sfx_brakrl, // Rocket launcher sfx_brakrx, // Rocket explodes + // S1 sounds + sfx_s1a0, + sfx_s1a1, + sfx_s1a2, + sfx_s1a3, + sfx_s1a4, + sfx_s1a5, + sfx_s1a6, + sfx_s1a7, + sfx_s1a8, + sfx_s1a9, + sfx_s1aa, + sfx_s1ab, + sfx_s1ac, + sfx_s1ad, + sfx_s1ae, + sfx_s1af, + sfx_s1b0, + sfx_s1b1, + sfx_s1b2, + sfx_s1b3, + sfx_s1b4, + sfx_s1b5, + sfx_s1b6, + sfx_s1b7, + sfx_s1b8, + sfx_s1b9, + sfx_s1ba, + sfx_s1bb, + sfx_s1bc, + sfx_s1bd, + sfx_s1be, + sfx_s1bf, + sfx_s1c0, + sfx_s1c1, + sfx_s1c2, + sfx_s1c3, + sfx_s1c4, + sfx_s1c5, + sfx_s1c6, + sfx_s1c7, + sfx_s1c8, + sfx_s1c9, + sfx_s1ca, + sfx_s1cb, + sfx_s1cc, + sfx_s1cd, + sfx_s1ce, + sfx_s1cf, + + // S2 sounds + sfx_s220, + sfx_s221, + sfx_s222, + sfx_s223, + sfx_s224, + sfx_s225, + sfx_s226, + sfx_s227, + sfx_s228, + sfx_s229, + sfx_s22a, + sfx_s22b, + sfx_s22c, + sfx_s22d, + sfx_s22e, + sfx_s22f, + sfx_s230, + sfx_s231, + sfx_s232, + sfx_s233, + sfx_s234, + sfx_s235, + sfx_s236, + sfx_s237, + sfx_s238, + sfx_s239, + sfx_s23a, + sfx_s23b, + sfx_s23c, + sfx_s23d, + sfx_s23e, + sfx_s23f, + sfx_s240, + sfx_s241, + sfx_s242, + sfx_s243, + sfx_s244, + sfx_s245, + sfx_s246, + sfx_s247, + sfx_s248, + sfx_s249, + sfx_s24a, + sfx_s24b, + sfx_s24c, + sfx_s24d, + sfx_s24e, + sfx_s24f, + sfx_s250, + sfx_s251, + sfx_s252, + sfx_s253, + sfx_s254, + sfx_s255, + sfx_s256, + sfx_s257, + sfx_s258, + sfx_s259, + sfx_s25a, + sfx_s25b, + sfx_s25c, + sfx_s25d, + sfx_s25e, + sfx_s25f, + sfx_s260, + sfx_s261, + sfx_s262, + sfx_s263, + sfx_s264, + sfx_s265, + sfx_s266, + sfx_s267, + sfx_s268, + sfx_s269, + sfx_s26a, + sfx_s26b, + sfx_s26c, + sfx_s26d, + sfx_s26e, + sfx_s26f, + sfx_s270, + // S3&K sounds sfx_s3k33, sfx_s3k34, @@ -538,44 +671,103 @@ typedef enum sfx_s3kdbs, sfx_s3kdbl, - // SRB2kart - sfx_lkt1, - sfx_lkt2, - sfx_lkt3, - sfx_kart1, - sfx_kart2, - sfx_kart3, - sfx_mlap, - sfx_sboost, - sfx_mush, - sfx_kinvnc, - sfx_kgrow, - sfx_bomb, - sfx_bomb2, - sfx_peel, - sfx_slip, - sfx_fake, - sfx_grnshl, - sfx_redshl, - sfx_shbrk, - sfx_mkdrft, - sfx_mkslid, - sfx_mkitem, - sfx_mkitm1, - sfx_mkitm2, - sfx_mkitm3, - sfx_mkitm4, - sfx_mkitm5, - sfx_mkitm6, - sfx_mkitm7, - sfx_mkitm8, - sfx_mkitmF, - sfx_clash, - sfx_tossed, - sfx_shelit, - sfx_vroom, - sfx_boing, - sfx_smkinv, + // 3DB sounds + sfx_3db06, + sfx_3db09, + sfx_3db14, + sfx_3db16, + + // SCD sounds + sfx_cdfm00, + sfx_cdfm01, + sfx_cdfm02, + sfx_cdfm03, + sfx_cdfm04, + sfx_cdfm05, + sfx_cdfm06, + sfx_cdfm07, + sfx_cdfm08, + sfx_cdfm09, + sfx_cdfm10, + sfx_cdfm11, + sfx_cdfm12, + sfx_cdfm13, + sfx_cdfm14, + sfx_cdfm15, + sfx_cdfm16, + sfx_cdfm17, + sfx_cdfm18, + sfx_cdfm19, + sfx_cdfm20, + sfx_cdfm21, + sfx_cdfm22, + sfx_cdfm23, + sfx_cdfm24, + sfx_cdfm25, + sfx_cdfm26, + sfx_cdfm27, + sfx_cdfm28, + sfx_cdfm29, + sfx_cdfm30, + sfx_cdfm31, + sfx_cdfm32, + sfx_cdfm33, + sfx_cdfm34, + sfx_cdfm35, + sfx_cdfm36, + sfx_cdfm37, + sfx_cdfm38, + sfx_cdfm39, + sfx_cdfm40, + sfx_cdfm41, + sfx_cdfm42, + sfx_cdfm43, + sfx_cdfm44, + sfx_cdfm45, + sfx_cdfm46, + sfx_cdfm47, + sfx_cdfm48, + sfx_cdfm49, + sfx_cdfm50, + sfx_cdfm51, + sfx_cdfm52, + sfx_cdfm53, + sfx_cdfm54, + sfx_cdfm55, + sfx_cdfm56, + sfx_cdfm57, + sfx_cdfm58, + sfx_cdfm59, + sfx_cdfm60, + sfx_cdfm61, + sfx_cdfm62, + sfx_cdfm63, + sfx_cdfm64, + sfx_cdfm65, + sfx_cdfm66, + sfx_cdfm67, + sfx_cdfm68, + sfx_cdfm69, + sfx_cdfm70, + sfx_cdfm71, + sfx_cdfm72, + sfx_cdfm73, + sfx_cdfm74, + sfx_cdfm75, + sfx_cdfm76, + sfx_cdfm77, + sfx_cdfm78, + sfx_cdfm79, + sfx_cdpcm0, + sfx_cdpcm1, + sfx_cdpcm2, + sfx_cdpcm3, + sfx_cdpcm4, + sfx_cdpcm5, + sfx_cdpcm6, + sfx_cdpcm7, + sfx_cdpcm8, + sfx_cdpcm9, // KC sounds sfx_kc2a, @@ -647,6 +839,45 @@ typedef enum sfx_kc6d, sfx_kc6e, + // SRB2kart + sfx_lkt1, + sfx_lkt2, + sfx_lkt3, + sfx_kart1, + sfx_kart2, + sfx_kart3, + sfx_mlap, + sfx_sboost, + sfx_mush, + sfx_kinvnc, + sfx_kgrow, + sfx_bomb, + sfx_bomb2, + sfx_peel, + sfx_slip, + sfx_fake, + sfx_grnshl, + sfx_redshl, + sfx_shbrk, + sfx_mkdrft, + sfx_mkslid, + sfx_mkitem, + sfx_mkitm1, + sfx_mkitm2, + sfx_mkitm3, + sfx_mkitm4, + sfx_mkitm5, + sfx_mkitm6, + sfx_mkitm7, + sfx_mkitm8, + sfx_mkitmF, + sfx_clash, + sfx_tossed, + sfx_shelit, + sfx_vroom, + sfx_boing, + sfx_smkinv, + sfx_kwin, sfx_klose, sfx_slow, diff --git a/src/st_stuff.c b/src/st_stuff.c index 7ddb50ef..33f7a275 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -77,7 +77,7 @@ static patch_t *race1; static patch_t *race2; static patch_t *race3; static patch_t *racego; -static patch_t *ttlnum; +//static patch_t *ttlnum; static patch_t *nightslink; static patch_t *count5; static patch_t *count4; @@ -216,17 +216,17 @@ void ST_doPaletteStuff(void) else palette = 0; +#ifdef HWRENDER + if (rendermode == render_opengl) + palette = 0; // No flashpals here in OpenGL +#endif + palette = min(max(palette, 0), 13); if (palette != st_palette) { st_palette = palette; -#ifdef HWRENDER - if (rendermode == render_opengl) - HWR_SetPaletteColor(0); - else -#endif if (rendermode != render_none) { V_SetPaletteLump(GetPalette()); // Reset the palette @@ -753,7 +753,7 @@ static void ST_drawLevelTitle(void) char *lvlttl = mapheaderinfo[gamemap-1]->lvlttl; char *subttl = mapheaderinfo[gamemap-1]->subttl; char *zonttl = mapheaderinfo[gamemap-1]->zonttl; // SRB2kart - INT32 actnum = mapheaderinfo[gamemap-1]->actnum; + char *actnum = mapheaderinfo[gamemap-1]->actnum; INT32 lvlttlxpos; INT32 subttlxpos = BASEVIDWIDTH/2; INT32 ttlnumxpos; @@ -765,11 +765,8 @@ static void ST_drawLevelTitle(void) if (!(timeinmap > 2 && timeinmap-3 < 110)) return; - if (actnum > 0) - { - ttlnum = W_CachePatchName(va("TTL%.2d", actnum), PU_CACHE); - lvlttlxpos = ((BASEVIDWIDTH/2) - (V_LevelNameWidth(lvlttl)/2)) - SHORT(ttlnum->width); - } + if (strlen(actnum) > 0) + lvlttlxpos = ((BASEVIDWIDTH/2) - (V_LevelNameWidth(lvlttl)/2)) - V_LevelNameWidth(actnum); else lvlttlxpos = ((BASEVIDWIDTH/2) - (V_LevelNameWidth(lvlttl)/2)); @@ -801,8 +798,8 @@ static void ST_drawLevelTitle(void) default: zoney = 104; lvlttly = 80; break; } - if (actnum) - V_DrawScaledPatch(ttlnumxpos, zoney, 0, ttlnum); + if (strlen(actnum) > 0) + V_DrawLevelTitle(ttlnumxpos+12, zoney, 0, actnum); V_DrawLevelTitle(lvlttlxpos, lvlttly, 0, lvlttl); diff --git a/src/v_video.c b/src/v_video.c index 801a577f..ac0eed17 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -1774,7 +1774,7 @@ void V_DrawLevelTitle(INT32 x, INT32 y, INT32 option, const char *string) c = toupper(c) - LT_FONTSTART; if (c < 0 || c >= LT_FONTSIZE || !lt_font[c]) { - cx += 16*dupx; + cx += 12*dupx; continue; } @@ -1805,7 +1805,7 @@ INT32 V_LevelNameWidth(const char *string) { c = toupper(string[i]) - LT_FONTSTART; if (c < 0 || c >= LT_FONTSIZE || !lt_font[c]) - w += 16; + w += 12; else w += SHORT(lt_font[c]->width); } diff --git a/src/y_inter.c b/src/y_inter.c index b61ecf74..15b20d87 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -38,6 +38,7 @@ #include "m_random.h" // P_RandomKey #include "g_input.h" // PLAYER1INPUTDOWN +#include "k_kart.h" // colortranslations #ifdef HWRENDER #include "hardware/hw_main.h" @@ -168,17 +169,23 @@ static void Y_FollowIntermission(void); static void Y_UnloadData(void); // SRB2Kart: voting stuff - +// Level images typedef struct { char str[40]; patch_t *pic; } y_votelvlinfo; +// Clientside & splitscreen player info. typedef struct { SINT8 selection; UINT8 delay; +} y_voteplayer; + +typedef struct +{ + y_voteplayer playerinfo[4]; UINT8 ranim; UINT8 rtics; UINT8 roffset; @@ -191,6 +198,10 @@ static y_voteclient voteclient; static INT32 votetic; static INT32 voteendtic = -1; static patch_t *cursor = NULL; +static patch_t *cursor1 = NULL; +static patch_t *cursor2 = NULL; +static patch_t *cursor3 = NULL; +static patch_t *cursor4 = NULL; static patch_t *randomlvl = NULL; static void Y_UnloadVoteData(void); @@ -284,7 +295,7 @@ void Y_IntermissionDrawer(void) V_DrawLevelTitle(data.coop.passedx1, 49, 0, data.coop.passed1); V_DrawLevelTitle(data.coop.passedx2, 49+V_LevelNameHeight(data.coop.passed2)+2, 0, data.coop.passed2); - if (mapheaderinfo[gamemap-1]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) V_DrawScaledPatch(244, 57, 0, data.coop.ttlnum); //if (gottimebonus && endtic != -1) @@ -1116,10 +1127,10 @@ void Y_StartIntermission(void) data.coop.ptotal = W_CachePatchName("YB_TOTAL", PU_STATIC); // get act number - if (mapheaderinfo[prevmap]->actnum) + /*if (mapheaderinfo[prevmap]->actnum) data.coop.ttlnum = W_CachePatchName(va("TTL%.2d", mapheaderinfo[prevmap]->actnum), PU_STATIC); - else + else*/ data.coop.ttlnum = W_CachePatchName("TTL01", PU_STATIC); // get background patches @@ -1148,24 +1159,24 @@ void Y_StartIntermission(void) if (strlen(skins[players[consoleplayer].skin].realname) > 13) { strcpy(data.coop.passed1, "YOU GOT"); - strcpy(data.coop.passed2, (mapheaderinfo[gamemap-1]->actnum) ? "THROUGH ACT" : "THROUGH THE ACT"); + strcpy(data.coop.passed2, (strlen(mapheaderinfo[prevmap]->actnum) > 0) ? "THROUGH ACT" : "THROUGH THE ACT"); } // long enough that "X GOT" won't fit so use "X PASSED THE ACT" else if (strlen(skins[players[consoleplayer].skin].realname) > 8) { strcpy(data.coop.passed1, skins[players[consoleplayer].skin].realname); - strcpy(data.coop.passed2, (mapheaderinfo[gamemap-1]->actnum) ? "PASSED ACT" : "PASSED THE ACT"); + strcpy(data.coop.passed2, (strlen(mapheaderinfo[prevmap]->actnum) > 0) ? "PASSED ACT" : "PASSED THE ACT"); } // length is okay for normal use else { snprintf(data.coop.passed1, sizeof data.coop.passed1, "%s GOT", skins[players[consoleplayer].skin].realname); - strcpy(data.coop.passed2, (mapheaderinfo[gamemap-1]->actnum) ? "THROUGH ACT" : "THROUGH THE ACT"); + strcpy(data.coop.passed2, (strlen(mapheaderinfo[prevmap]->actnum) > 0) ? "THROUGH ACT" : "THROUGH THE ACT"); } // set X positions - if (mapheaderinfo[gamemap-1]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) { data.coop.passedx1 = 62 + (176 - V_LevelNameWidth(data.coop.passed1))/2; data.coop.passedx2 = 62 + (176 - V_LevelNameWidth(data.coop.passed2))/2; @@ -1306,12 +1317,12 @@ void Y_StartIntermission(void) Y_CalculateMatchWinners(); // set up the levelstring - if (mapheaderinfo[prevmap]->zonttl) + if (strlen(mapheaderinfo[prevmap]->zonttl) > 0) { - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s %.32s * %d *", + "%.32s %.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->zonttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1321,10 +1332,10 @@ void Y_StartIntermission(void) } else { - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s * %d *", + "%.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1369,12 +1380,12 @@ void Y_StartIntermission(void) Y_CalculateTournamentPoints(); // set up the levelstring - if (mapheaderinfo[prevmap]->zonttl) + if (strlen(mapheaderinfo[prevmap]->zonttl) > 0) { - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s %.32s * %d *", + "%.32s %.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->zonttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1384,10 +1395,10 @@ void Y_StartIntermission(void) } else { - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s * %d *", + "%.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1414,10 +1425,10 @@ void Y_StartIntermission(void) Y_CalculateMatchWinners(); // set up the levelstring - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s * %d *", + "%.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1450,10 +1461,10 @@ void Y_StartIntermission(void) Y_CalculateCompetitionWinners(); // set up the levelstring - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.competition.levelstring, sizeof data.competition.levelstring, - "%.32s * %d *", + "%.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.competition.levelstring, @@ -2129,7 +2140,8 @@ static void Y_UnloadData(void) // void Y_VoteDrawer(void) { - INT32 i, x, y = 0; + INT32 i, x, y = 0, height = 0; + UINT8 selected[4]; if (rendermode == render_none) return; @@ -2148,11 +2160,34 @@ void Y_VoteDrawer(void) (vid.height / vid.dupy) - SHORT(bgpatch->height), V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch); - y = 30; + for (i = 0; i < 4; i++) // First, we need to figure out the height of this thing... + { + UINT8 j; + selected[i] = 0; // Initialize + + for (j = 0; j <= splitscreen; j++) + { + if (voteclient.playerinfo[j].selection == i) + selected[i]++; + } + + if (selected[i]) + height += 50; + else + height += 25; + + if (i < 3) + height += 5-splitscreen; + } + + y = (200-height)/2; for (i = 0; i < 4; i++) { char str[40]; patch_t *pic; + UINT8 sizeadd = selected[i]; + UINT8 j; + UINT8 color; if (i == 3) { @@ -2166,25 +2201,72 @@ void Y_VoteDrawer(void) pic = levelinfo[i].pic; } - if (i == voteclient.selection) + if (selected[i]) { - if (votes[consoleplayer] == -1) + for (j = 0; j <= splitscreen; j++) // another loop for drawing the selection backgrounds in the right order, grumble grumble.. { - V_DrawScaledPatch(BASEVIDWIDTH-124, y+21, V_SNAPTORIGHT, cursor); - if (votetic % 4 > 1) - V_DrawFill(BASEVIDWIDTH-101, y-1, 82, 52, 120|V_SNAPTORIGHT); + INT32 handy = y; + UINT8 *colormap; + patch_t *thiscurs; + + if (voteclient.playerinfo[j].selection != i) + continue; + + if (splitscreen == 0) + { + thiscurs = cursor; + color = colortranslations[players[consoleplayer].skincolor][7]; + colormap = NULL; + } else - V_DrawFill(BASEVIDWIDTH-101, y-1, 82, 52, 103|V_SNAPTORIGHT); + { + switch (j) + { + case 1: + thiscurs = cursor2; + color = colortranslations[players[secondarydisplayplayer].skincolor][7]; + colormap = R_GetTranslationColormap(-1, players[secondarydisplayplayer].skincolor, GTC_CACHE); + break; + case 2: + thiscurs = cursor3; + color = colortranslations[players[thirddisplayplayer].skincolor][7]; + colormap = R_GetTranslationColormap(-1, players[thirddisplayplayer].skincolor, GTC_CACHE); + break; + case 3: + thiscurs = cursor4; + color = colortranslations[players[fourthdisplayplayer].skincolor][7]; + colormap = R_GetTranslationColormap(-1, players[fourthdisplayplayer].skincolor, GTC_CACHE); + break; + default: + thiscurs = cursor1; + color = colortranslations[players[consoleplayer].skincolor][7]; + colormap = R_GetTranslationColormap(-1, players[consoleplayer].skincolor, GTC_CACHE); + break; + } + } + + handy += 6*(3-splitscreen) + (13*j); + V_DrawMappedPatch(BASEVIDWIDTH-124, handy, V_SNAPTORIGHT, thiscurs, colormap); + + if (votetic % 5 == 0) + V_DrawFill(BASEVIDWIDTH-100-sizeadd, y-sizeadd, 80+(sizeadd*2), 50+(sizeadd*2), 120|V_SNAPTORIGHT); + else + V_DrawFill(BASEVIDWIDTH-100-sizeadd, y-sizeadd, 80+(sizeadd*2), 50+(sizeadd*2), color|V_SNAPTORIGHT); + + sizeadd--; } + V_DrawSmallScaledPatch(BASEVIDWIDTH-100, y, V_SNAPTORIGHT, pic); V_DrawRightAlignedThinString(BASEVIDWIDTH-20, 40+y, V_SNAPTORIGHT, str); - y += 55; + y += 50; } else { V_DrawTinyScaledPatch(BASEVIDWIDTH-60, y, V_SNAPTORIGHT, pic); - y += 30; + y += 25; } + + y += 5-splitscreen; } x = 20; @@ -2224,9 +2306,6 @@ void Y_VoteDrawer(void) } } - if (splitscreen) // only 1p has a vote in splitscreen - break; - y += 30; if (y > BASEVIDHEIGHT-40) @@ -2248,7 +2327,6 @@ void Y_VoteDrawer(void) // void Y_VoteTicker(void) { - boolean pressed = false; INT32 i; if (paused || P_AutoPause()) @@ -2267,7 +2345,7 @@ void Y_VoteTicker(void) { if (!playeringame[i] || players[i].spectator) votes[i] = -1; // Spectators are the lower class, and have effectively no voice in the government. Democracy sucks. - else if (pickedvote != -1 && votes[i] == -1 && !splitscreen) + else if (pickedvote != -1 && votes[i] == -1) votes[i] = 3; // Slow people get random } @@ -2280,9 +2358,6 @@ void Y_VoteTicker(void) if (timer) timer--; - if (voteclient.delay) - voteclient.delay--; - if (pickedvote != -1) { timer = 0; @@ -2325,7 +2400,7 @@ void Y_VoteTicker(void) if (voteclient.rendoff == 0) { if (tempvotes[((pickedvote + voteclient.roffset + 4) % numvotes)] == pickedvote - && voteclient.rsynctime % 50 == 0) // Song is 1.45 seconds long (sorry @ whoever wants to replace it in a music wad :V) + && voteclient.rsynctime % 51 == 0) // Song is 1.45 seconds long (sorry @ whoever wants to replace it in a music wad :V) { voteclient.rendoff = voteclient.roffset+4; S_ChangeMusicInternal("voteeb", false); @@ -2346,34 +2421,63 @@ void Y_VoteTicker(void) if (votetic < 3*(NEWTICRATE/7)) // give it some time before letting you control it :V return; - if ((playeringame[consoleplayer] && !players[consoleplayer].spectator) - && !voteclient.delay && pickedvote == -1 && votes[consoleplayer] == -1) + for (i = 0; i <= splitscreen; i++) { - if (InputDown(gc_aimforward, 1) || JoyAxis(AXISMOVE, 1) < 0) - { - voteclient.selection--; - pressed = true; - } - if ((InputDown(gc_aimbackward, 1) || JoyAxis(AXISMOVE, 1) > 0) && !pressed) - { - voteclient.selection++; - pressed = true; - } - if (voteclient.selection < 0) - voteclient.selection = 3; - if (voteclient.selection > 3) - voteclient.selection = 0; - if (InputDown(gc_accelerate, 1) && !pressed) - { - D_ModifyClientVote(voteclient.selection); - pressed = true; - } - } + UINT8 p; + boolean pressed = false; - if (pressed) - { - S_StartSound(NULL, sfx_kc4a); - voteclient.delay = NEWTICRATE/7; + switch (i) + { + case 1: + p = secondarydisplayplayer; + break; + case 2: + p = thirddisplayplayer; + break; + case 3: + p = fourthdisplayplayer; + break; + default: + p = consoleplayer; + break; + } + + if (voteclient.playerinfo[i].delay) + voteclient.playerinfo[i].delay--; + + if ((playeringame[p] && !players[p].spectator) + && !voteclient.playerinfo[i].delay + && pickedvote == -1 && votes[p] == -1) + { + if (InputDown(gc_aimforward, i+1) || JoyAxis(AXISAIM, i+1) < 0) + { + voteclient.playerinfo[i].selection--; + pressed = true; + } + + if ((InputDown(gc_aimbackward, i+1) || JoyAxis(AXISAIM, i+1) > 0) && !pressed) + { + voteclient.playerinfo[i].selection++; + pressed = true; + } + + if (voteclient.playerinfo[i].selection < 0) + voteclient.playerinfo[i].selection = 3; + if (voteclient.playerinfo[i].selection > 3) + voteclient.playerinfo[i].selection = 0; + + if ((InputDown(gc_accelerate, i+1) || JoyAxis(AXISMOVE, i+1) > 0) && !pressed) + { + D_ModifyClientVote(voteclient.playerinfo[i].selection, i); + pressed = true; + } + } + + if (pressed) + { + S_StartSound(NULL, sfx_kc4a); + voteclient.playerinfo[i].delay = NEWTICRATE/7; + } } if (server) @@ -2382,25 +2486,17 @@ void Y_VoteTicker(void) { for (i = 0; i < MAXPLAYERS; i++) { - if ((playeringame[i] && !players[i].spectator) && votes[i] == -1 && !splitscreen) + if ((playeringame[i] && !players[i].spectator) && votes[i] == -1) votes[i] = 3; } } else { - if (splitscreen) + for (i = 0; i < MAXPLAYERS; i++) { - if (votes[0] == -1) + if ((playeringame[i] && !players[i].spectator) && votes[i] == -1) return; } - else - { - for (i = 0; i < MAXPLAYERS; i++) - { - if ((playeringame[i] && !players[i].spectator) && votes[i] == -1) - return; - } - } } timer = 0; @@ -2429,13 +2525,21 @@ void Y_StartVote(void) widebgpatch = W_CachePatchName("INTERSCW", PU_STATIC); bgpatch = W_CachePatchName("INTERSCR", PU_STATIC); cursor = W_CachePatchName("M_CURSOR", PU_STATIC); + cursor1 = W_CachePatchName("P1CURSOR", PU_STATIC); + cursor2 = W_CachePatchName("P2CURSOR", PU_STATIC); + cursor3 = W_CachePatchName("P3CURSOR", PU_STATIC); + cursor4 = W_CachePatchName("P4CURSOR", PU_STATIC); randomlvl = W_CachePatchName("RANDOMLV", PU_STATIC); timer = cv_votetime.value*TICRATE; pickedvote = -1; - voteclient.selection = 0; - voteclient.delay = 0; + for (i = 0; i < 3; i++) + { + voteclient.playerinfo[i].selection = 0; + voteclient.playerinfo[i].delay = 0; + } + voteclient.ranim = 0; voteclient.rtics = 1; voteclient.roffset = 0; @@ -2450,12 +2554,12 @@ void Y_StartVote(void) lumpnum_t lumpnum; // set up the str - if (mapheaderinfo[votelevels[i]]->zonttl) + if (strlen(mapheaderinfo[votelevels[i]]->zonttl) > 0) { - if (mapheaderinfo[votelevels[i]]->actnum) + if (strlen(mapheaderinfo[votelevels[i]]->actnum) > 0) snprintf(levelinfo[i].str, sizeof levelinfo[i].str, - "%.32s %.32s %d", + "%.32s %.32s %s", mapheaderinfo[votelevels[i]]->lvlttl, mapheaderinfo[votelevels[i]]->zonttl, mapheaderinfo[votelevels[i]]->actnum); else snprintf(levelinfo[i].str, @@ -2465,10 +2569,10 @@ void Y_StartVote(void) } else { - if (mapheaderinfo[votelevels[i]]->actnum) + if (strlen(mapheaderinfo[votelevels[i]]->actnum) > 0) snprintf(levelinfo[i].str, sizeof levelinfo[i].str, - "%.32s %d", + "%.32s %s", mapheaderinfo[votelevels[i]]->lvlttl, mapheaderinfo[votelevels[i]]->actnum); else snprintf(levelinfo[i].str, @@ -2507,6 +2611,10 @@ static void Y_UnloadVoteData(void) UNLOAD(widebgpatch); UNLOAD(bgpatch); UNLOAD(cursor); + UNLOAD(cursor1); + UNLOAD(cursor2); + UNLOAD(cursor3); + UNLOAD(cursor4); UNLOAD(randomlvl); UNLOAD(levelinfo[3].pic); @@ -2538,7 +2646,7 @@ void Y_SetupVoteFinish(SINT8 pick, SINT8 level) for (i = 0; i < MAXPLAYERS; i++) { - if ((playeringame[i] && !players[i].spectator) && votes[i] == -1 && !splitscreen) + if ((playeringame[i] && !players[i].spectator) && votes[i] == -1) votes[i] = 3; if (votes[i] == -1 || endtype > 1) // Don't need to go on @@ -2573,5 +2681,4 @@ void Y_SetupVoteFinish(SINT8 pick, SINT8 level) pickedvote = pick; nextmap = votelevels[level]; timer = 0; - S_ChangeMusicInternal("voteea", true); -} \ No newline at end of file +}