From 3a3180ce055f47fac4efa2f03136f64ce7747ec9 Mon Sep 17 00:00:00 2001 From: ZTsukei Date: Sat, 20 Aug 2016 22:15:06 -0400 Subject: [PATCH] Redid control names, some item code, start of drift shenanigans --- src/b_bot.c | 2 +- src/d_main.c | 2 + src/d_player.h | 3 +- src/d_ticcmd.h | 16 +- src/dehacked.c | 19 +- src/f_finale.c | 4 +- src/g_game.c | 112 ++- src/g_input.c | 100 +-- src/g_input.h | 16 +- src/hardware/hw_light.c | 20 + src/info.c | 1082 ++++++++++++++++++++++++- src/info.h | 267 ++++++ src/k_kart.c | 1693 ++++++++++++++++++++++++++++++++++++--- src/k_kart.h | 8 +- src/m_cheat.c | 18 +- src/m_menu.c | 38 +- src/p_enemy.c | 215 +++++ src/p_inter.c | 11 +- src/p_mobj.c | 70 +- src/p_spec.c | 2 +- src/p_user.c | 122 +-- src/sounds.c | 32 + src/sounds.h | 36 + src/tables.h | 4 + src/y_inter.c | 4 +- 25 files changed, 3561 insertions(+), 335 deletions(-) diff --git a/src/b_bot.c b/src/b_bot.c index 3aa456ab..c06b23ed 100644 --- a/src/b_bot.c +++ b/src/b_bot.c @@ -191,7 +191,7 @@ void B_KeysToTiccmd(mobj_t *mo, ticcmd_t *cmd, boolean forward, boolean backward if (jump) cmd->buttons |= BT_JUMP; if (spin) - cmd->buttons |= BT_USE; + cmd->buttons |= BT_BRAKE; } void B_MoveBlocked(player_t *player) diff --git a/src/d_main.c b/src/d_main.c index b44bccef..f9595577 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -824,6 +824,8 @@ static void IdentifyVersion(void) // SRB2kart - Add graphics (temp) D_AddFile(va(pandf,srb2waddir,"AllKartGraphics.wad")); + D_AddFile(va(pandf,srb2waddir,"AllKartChars.wad")); + D_AddFile(va(pandf,srb2waddir,"AllKartSounds.wad")); #if !defined (HAVE_SDL) || defined (HAVE_MIXER) { diff --git a/src/d_player.h b/src/d_player.h index 3387ee6a..4b8a616a 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -234,6 +234,7 @@ typedef enum typedef enum { // Basic gameplay things + k_introcam, // Something to do with the map intro k_position, // Used for Kart positions, mostly for deterministic stuff k_playerahead, // Is someone ahead of me or not? k_oldposition, // Used for taunting when you pass someone @@ -252,11 +253,11 @@ typedef enum k_drift, // Drifting Left or Right, plus a bigger counter = sharper turn k_driftcharge, // Charge your drift so you can release a burst of speed + k_boostcharge, // Charge-up for boosting at the start of the race, or when Lakitu drops you k_jmp, // In Mario Kart, letting go of the jump button stops the drift k_lakitu, // > 0 = Lakitu fishing, < 0 = Lakitu lap counter (was "player->airtime") // NOTE: Check for ->lakitu, replace with this k_itemroulette, // Used for the roulette when deciding what item to give you (was "pw_kartitem") - k_itemslot, // If you have X item, and kartitem chose X too, save it k_itemclose, // Used to animate the item window closing (was "pw_psychic") // Some items use timers for their duration or effects diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index 83f684b6..80403605 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -27,16 +27,16 @@ typedef enum // First 4 bits are weapon change info, DO NOT USE! BT_WEAPONMASK = 0x0F, //our first four bits. - BT_WEAPONNEXT = 1<<4, - BT_WEAPONPREV = 1<<5, + BT_DRIFTLEFT = 1<<4, // Drift Left // BT_WEAPONNEXT + BT_DRIFTRIGHT = 1<<5, // Drift Right // BT_WEAPONPREV - BT_ATTACK = 1<<6, // shoot rings - BT_USE = 1<<7, // spin - BT_CAMLEFT = 1<<8, // turn camera left - BT_CAMRIGHT = 1<<9, // turn camera right - BT_TOSSFLAG = 1<<10, + BT_ATTACK = 1<<6, // use kart item // SRB2kart + BT_BRAKE = 1<<7, // brake // BT_USE + BT_FORWARD = 1<<8, // toss item forward // BT_CAMLEFT + BT_BACKWARD = 1<<9, // drop item behind // BT_CAMRIGHT + BT_SPECTATE = 1<<10, // toggle spectate // BT_TOSSFLAG BT_JUMP = 1<<11, - BT_FIRENORMAL = 1<<12, // Fire a normal ring no matter what + BT_ACCELERATE = 1<<12, // Accelerate // BT_FIRENORMAL BT_CUSTOM1 = 1<<13, BT_CUSTOM2 = 1<<14, diff --git a/src/dehacked.c b/src/dehacked.c index 613dc85e..2a1771c4 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1698,6 +1698,7 @@ static actionpointer_t actionpointers[] = {{A_DropMine}, "A_DROPMINE"}, {{A_FishJump}, "A_FISHJUMP"}, {{A_ThrownRing}, "A_THROWNRING"}, + {{A_GrenadeRing}, "A_GRENADERING"}, // SRB2kart {{A_SetSolidSteam}, "A_SETSOLIDSTEAM"}, {{A_UnsetSolidSteam}, "A_UNSETSOLIDSTEAM"}, {{A_SignPlayer}, "A_SIGNPLAYER"}, @@ -1800,6 +1801,8 @@ static actionpointer_t actionpointers[] = {{A_DualAction}, "A_DUALACTION"}, {{A_RemoteAction}, "A_REMOTEACTION"}, {{A_ToggleFlameJet}, "A_TOGGLEFLAMEJET"}, + {{A_RedShellChase}, "A_REDSHELLCHASE"}, // SRB2kart + {{A_BobombExplode}, "A_BOBOMBEXPLODE"}, // SRB2kart {{A_OrbitNights}, "A_ORBITNIGHTS"}, {{A_GhostMe}, "A_GHOSTME"}, {{A_SetObjectState}, "A_SETOBJECTSTATE"}, @@ -7379,17 +7382,17 @@ struct { {"DI_SOUTHEAST",DI_SOUTHEAST}, {"NUMDIRS",NUMDIRS}, - // Buttons (ticcmd_t) + // Buttons (ticcmd_t) // SRB2kart {"BT_WEAPONMASK",BT_WEAPONMASK}, //our first four bits. - {"BT_WEAPONNEXT",BT_WEAPONNEXT}, - {"BT_WEAPONPREV",BT_WEAPONPREV}, + {"BT_DRIFTLEFT",BT_DRIFTLEFT}, + {"BT_DRIFTRIGHT",BT_DRIFTRIGHT}, {"BT_ATTACK",BT_ATTACK}, // shoot rings - {"BT_USE",BT_USE}, // spin - {"BT_CAMLEFT",BT_CAMLEFT}, // turn camera left - {"BT_CAMRIGHT",BT_CAMRIGHT}, // turn camera right - {"BT_TOSSFLAG",BT_TOSSFLAG}, + {"BT_BRAKE",BT_BRAKE}, // brake + {"BT_FORWARD",BT_FORWARD}, // turn camera left + {"BT_BACKWARD",BT_BACKWARD}, // turn camera right + {"BT_SPECTATE",BT_SPECTATE}, {"BT_JUMP",BT_JUMP}, - {"BT_FIRENORMAL",BT_FIRENORMAL}, // Fire a normal ring no matter what + {"BT_ACCELERATE",BT_ACCELERATE}, // Fire a normal ring no matter what {"BT_CUSTOM1",BT_CUSTOM1}, // Lua customizable {"BT_CUSTOM2",BT_CUSTOM2}, // Lua customizable {"BT_CUSTOM3",BT_CUSTOM3}, // Lua customizable diff --git a/src/f_finale.c b/src/f_finale.c index 776bec98..38bf32e8 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -997,7 +997,7 @@ static const char *credits[] = { "", "\1Sprite Artists", "Odi \"Iceman404\" Atunzu", - "Victor \"VAdaPEGA\" Ara\x1Fjo", // Araújo -- sorry for our limited font! D: + "Victor \"VAdaPEGA\" Ara\x1Fjo", // Araújo -- sorry for our limited font! D: "Jim \"MotorRoach\" DeMello", "Desmond \"Blade\" DesJardins", "Sherman \"CoatRack\" DesJardins", @@ -1847,7 +1847,7 @@ void F_CutsceneTicker(void) if (netgame && i != serverplayer && i != adminplayer) continue; - if (players[i].cmd.buttons & BT_USE) + if (players[i].cmd.buttons & BT_BRAKE || players[i].cmd.buttons & BT_ACCELERATE) // SRB2kart { keypressed = false; cutscene_boostspeed = 1; diff --git a/src/g_game.c b/src/g_game.c index d61d070f..f58f1830 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -947,7 +947,7 @@ angle_t localangle, localangle2; static fixed_t forwardmove[2] = {25<>16, 50<>16}; static fixed_t sidemove[2] = {25<>16, 50<>16}; // faster! -static fixed_t angleturn[3] = {640, 1280, 320}; // + slow turn +static fixed_t angleturn[3] = {400/NEWTICRATERATIO, 800/NEWTICRATERATIO, 200/NEWTICRATERATIO}; // + slow turn void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics) { @@ -1030,9 +1030,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics) } else { - if (turnright) + if (turnright && !(turnleft)) cmd->angleturn = (INT16)(cmd->angleturn - angleturn[tspeed]); - else if (turnleft) + else if (turnleft && !(turnright)) cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]); if (analogjoystickmove && axis != 0) @@ -1073,10 +1073,12 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics) if (PLAYER1INPUTDOWN(gc_strafeleft)) side -= sidemove[speed]; - if (PLAYER1INPUTDOWN(gc_weaponnext)) + /* // SRB2kart - these aren't used in kart + if (PLAYER1INPUTDOWN(gc_driftleft)) cmd->buttons |= BT_WEAPONNEXT; // Next Weapon - if (PLAYER1INPUTDOWN(gc_weaponprev)) + if (PLAYER1INPUTDOWN(gc_driftright)) cmd->buttons |= BT_WEAPONPREV; // Previous Weapon + */ #if NUM_WEAPONS > 10 "Add extra inputs to g_input.h/gamecontrols_e" @@ -1097,11 +1099,11 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics) // fire normal with any button/key axis = JoyAxis(AXISFIRENORMAL); - if (PLAYER1INPUTDOWN(gc_firenormal) || (cv_usejoystick.value && axis > 0)) - cmd->buttons |= BT_FIRENORMAL; + if (PLAYER1INPUTDOWN(gc_accelerate) || (cv_usejoystick.value && axis > 0)) + cmd->buttons |= BT_ACCELERATE; - if (PLAYER1INPUTDOWN(gc_tossflag)) - cmd->buttons |= BT_TOSSFLAG; + if (PLAYER1INPUTDOWN(gc_spectate)) + cmd->buttons |= BT_SPECTATE; // Lua scriptable buttons if (PLAYER1INPUTDOWN(gc_custom1)) @@ -1112,22 +1114,22 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics) cmd->buttons |= BT_CUSTOM3; // use with any button/key - if (PLAYER1INPUTDOWN(gc_use)) - cmd->buttons |= BT_USE; + if (PLAYER1INPUTDOWN(gc_brake)) + cmd->buttons |= BT_BRAKE; // Camera Controls if (cv_debug || cv_analog.value || demoplayback || objectplacing || player->pflags & PF_NIGHTSMODE) { - if (PLAYER1INPUTDOWN(gc_camleft)) - cmd->buttons |= BT_CAMLEFT; - if (PLAYER1INPUTDOWN(gc_camright)) - cmd->buttons |= BT_CAMRIGHT; + if (PLAYER1INPUTDOWN(gc_aimforward)) + cmd->buttons |= BT_FORWARD; + if (PLAYER1INPUTDOWN(gc_aimbackward)) + cmd->buttons |= BT_BACKWARD; } - if (PLAYER1INPUTDOWN(gc_camreset)) + if (PLAYER1INPUTDOWN(gc_lookback)) { if (camera.chase && !resetdown) - P_ResetCamera(&players[displayplayer], &camera); + P_ResetCamera(&players[displayplayer], &camera); // TODO: Replace with a camflip resetdown = true; } else @@ -1222,6 +1224,20 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics) cmd->forwardmove = (SINT8)(cmd->forwardmove + forward); cmd->sidemove = (SINT8)(cmd->sidemove + side); + //{ SRB2kart - Drift support + axis = JoyAxis(AXISTURN); + + if (turnleft || axis < 0) // Drifting to the left + cmd->buttons |= BT_DRIFTLEFT; + else + cmd->buttons &= ~BT_DRIFTLEFT; + + if (turnright || axis > 0) // Drifting to the right + cmd->buttons |= BT_DRIFTRIGHT; + else + cmd->buttons &= ~BT_DRIFTRIGHT; + //} + if (cv_analog.value) { cmd->angleturn = (INT16)(thiscam->angle >> 16); if (player->awayviewtics) @@ -1229,7 +1245,15 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics) } else { - localangle += (cmd->angleturn<<16); + // SRB2kart + INT32 turnspeed; + + if (players[consoleplayer].mo && (players[consoleplayer].kartstuff[k_introcam] > 1 || players[consoleplayer].speed == 0)) + turnspeed = 0; + else + turnspeed = 16; + + localangle += (cmd->angleturn<angleturn = (INT16)(localangle >> 16); } @@ -1364,10 +1388,12 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics) if (PLAYER2INPUTDOWN(gc_strafeleft)) side -= sidemove[speed]; - if (PLAYER2INPUTDOWN(gc_weaponnext)) + /* // SRB2kart - these aren't used in kart + if (PLAYER2INPUTDOWN(gc_driftleft)) cmd->buttons |= BT_WEAPONNEXT; // Next Weapon - if (PLAYER2INPUTDOWN(gc_weaponprev)) + if (PLAYER2INPUTDOWN(gc_driftright)) cmd->buttons |= BT_WEAPONPREV; // Previous Weapon + */ //use the four avaliable bits to determine the weapon. cmd->buttons &= ~BT_WEAPONMASK; @@ -1385,11 +1411,11 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics) // fire normal with any button/key axis = Joy2Axis(AXISFIRENORMAL); - if (PLAYER2INPUTDOWN(gc_firenormal) || (cv_usejoystick2.value && axis > 0)) - cmd->buttons |= BT_FIRENORMAL; + if (PLAYER2INPUTDOWN(gc_accelerate) || (cv_usejoystick2.value && axis > 0)) + cmd->buttons |= BT_ACCELERATE; - if (PLAYER2INPUTDOWN(gc_tossflag)) - cmd->buttons |= BT_TOSSFLAG; + if (PLAYER2INPUTDOWN(gc_spectate)) + cmd->buttons |= BT_SPECTATE; // Lua scriptable buttons if (PLAYER2INPUTDOWN(gc_custom1)) @@ -1400,22 +1426,22 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics) cmd->buttons |= BT_CUSTOM3; // use with any button/key - if (PLAYER2INPUTDOWN(gc_use)) - cmd->buttons |= BT_USE; + if (PLAYER2INPUTDOWN(gc_brake)) + cmd->buttons |= BT_BRAKE; // Camera Controls if (cv_debug || cv_analog2.value || player->pflags & PF_NIGHTSMODE) { - if (PLAYER2INPUTDOWN(gc_camleft)) - cmd->buttons |= BT_CAMLEFT; - if (PLAYER2INPUTDOWN(gc_camright)) - cmd->buttons |= BT_CAMRIGHT; + if (PLAYER2INPUTDOWN(gc_aimforward)) + cmd->buttons |= BT_FORWARD; + if (PLAYER2INPUTDOWN(gc_aimbackward)) + cmd->buttons |= BT_BACKWARD; } - if (PLAYER2INPUTDOWN(gc_camreset)) + if (PLAYER2INPUTDOWN(gc_lookback)) { if (camera2.chase && !resetdown) - P_ResetCamera(&players[secondarydisplayplayer], &camera2); + P_ResetCamera(&players[secondarydisplayplayer], &camera2); // TODO: Replace with a camflip resetdown = true; } else @@ -1509,6 +1535,26 @@ void G_BuildTiccmd2(ticcmd_t *cmd, INT32 realtics) cmd->forwardmove = (SINT8)(cmd->forwardmove + forward); cmd->sidemove = (SINT8)(cmd->sidemove + side); + //{ SRB2kart - Drift support + axis = Joy2Axis(AXISTURN); + + if (turnleft || axis < 0) // Drifting to the left + cmd->buttons |= BT_DRIFTLEFT; + else + cmd->buttons &= ~BT_DRIFTLEFT; + + if (turnright || axis > 0) // Drifting to the right + cmd->buttons |= BT_DRIFTRIGHT; + else + cmd->buttons &= ~BT_DRIFTRIGHT; + + if (turnright && turnleft) + { + cmd->buttons &= ~BT_DRIFTLEFT; + cmd->buttons &= ~BT_DRIFTRIGHT; + } + //} + if (player->bot == 1) { if (!player->powers[pw_tailsfly] && (cmd->forwardmove || cmd->sidemove || cmd->buttons)) { @@ -3784,7 +3830,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) if (ziptic & ZT_ANGLE) oldcmd.angleturn = READINT16(demo_p); if (ziptic & ZT_BUTTONS) - oldcmd.buttons = (oldcmd.buttons & (BT_CAMLEFT|BT_CAMRIGHT)) | (READUINT16(demo_p) & ~(BT_CAMLEFT|BT_CAMRIGHT)); + oldcmd.buttons = (oldcmd.buttons & (BT_FORWARD|BT_BACKWARD)) | (READUINT16(demo_p) & ~(BT_FORWARD|BT_BACKWARD)); if (ziptic & ZT_AIMING) oldcmd.aiming = READINT16(demo_p); diff --git a/src/g_input.c b/src/g_input.c index b004384c..4d90065e 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1064,19 +1064,19 @@ void G_Controldefault(void) gamecontrol[gc_turnleft ][1] = KEY_LEFTARROW; gamecontrol[gc_turnright ][0] = KEY_HAT1+3; //Right gamecontrol[gc_turnright ][1] = KEY_RIGHTARROW; - gamecontrol[gc_weaponnext ][0] = ']'; - gamecontrol[gc_weaponprev ][0] = '['; + gamecontrol[gc_driftleft ][0] = ']'; + gamecontrol[gc_driftright ][0] = '['; gamecontrol[gc_fire ][0] = KEY_JOY1+6; //X gamecontrol[gc_fire ][1] = KEY_RCTRL; - gamecontrol[gc_firenormal ][0] = KEY_JOY1+5; //Y - gamecontrol[gc_firenormal ][1] = ';'; - gamecontrol[gc_tossflag ][0] = '\''; - gamecontrol[gc_use ][0] = KEY_JOY1+1; //B - gamecontrol[gc_use ][1] = '.'; + gamecontrol[gc_accelerate ][0] = KEY_JOY1+5; //Y + gamecontrol[gc_accelerate ][1] = ';'; + gamecontrol[gc_spectate ][0] = '\''; + gamecontrol[gc_brake ][0] = KEY_JOY1+1; //B + gamecontrol[gc_brake ][1] = '.'; gamecontrol[gc_camtoggle ][1] = ','; - gamecontrol[gc_camleft ][0] = 'o'; - gamecontrol[gc_camright ][0] = 'p'; - gamecontrol[gc_camreset ][0] = 'c'; + gamecontrol[gc_aimforward ][0] = 'o'; + gamecontrol[gc_aimbackward][0] = 'p'; + gamecontrol[gc_lookback ][0] = 'c'; gamecontrol[gc_lookup ][0] = KEY_PGUP; gamecontrol[gc_lookdown ][0] = KEY_PGDN; gamecontrol[gc_centerview ][0] = KEY_END; @@ -1097,11 +1097,11 @@ void G_Controldefault(void) gamecontrolbis[gc_turnleft ][1] = 'a'; gamecontrolbis[gc_turnright ][0] = KEY_2HAT1+3; gamecontrolbis[gc_turnright ][1] = 'd'; - gamecontrolbis[gc_weaponnext][0] = 't'; - gamecontrolbis[gc_weaponprev][0] = 'r'; + gamecontrolbis[gc_driftleft ][0] = 't'; + gamecontrolbis[gc_driftright][0] = 'r'; gamecontrolbis[gc_fire ][0] = KEY_2JOY1+6; //X - gamecontrolbis[gc_firenormal][0] = KEY_2JOY1+5; //Y - gamecontrolbis[gc_use ][0] = KEY_2JOY1+1; //B + gamecontrolbis[gc_accelerate][0] = KEY_2JOY1+5; //Y + gamecontrolbis[gc_brake ][0] = KEY_2JOY1+1; //B gamecontrolbis[gc_jump ][0] = KEY_2JOY1+2; //A //gamecontrolbis[gc_straferight][0] = 'x'; //gamecontrolbis[gc_strafeleft ][0] = 'z'; @@ -1115,10 +1115,10 @@ void G_Controldefault(void) gamecontrol[gc_turnright ][0] = KEY_HAT1+3; // Right gamecontrol[gc_strafeleft ][0] = KEY_JOY1+4; // L gamecontrol[gc_straferight][0] = KEY_JOY1+5; // R - gamecontrol[gc_tossflag ][0] = KEY_JOY1+0; // Triangle - gamecontrol[gc_use ][0] = KEY_JOY1+1; // Circle + gamecontrol[gc_spectate ][0] = KEY_JOY1+0; // Triangle + gamecontrol[gc_brake ][0] = KEY_JOY1+1; // Circle gamecontrol[gc_camtoggle ][0] = KEY_JOY1+6; // Select - gamecontrol[gc_camreset ][0] = KEY_JOY1+3; // Square + gamecontrol[gc_lookback ][0] = KEY_JOY1+3; // Square gamecontrol[gc_centerview ][0] = KEY_JOY1+9; // Hold gamecontrol[gc_pause ][0] = KEY_JOY1+8; // Start gamecontrol[gc_jump ][0] = KEY_JOY1+2; // Cross @@ -1129,7 +1129,7 @@ void G_Controldefault(void) gamecontrol[gc_fire ][0] = KEY_JOY1+0; //A gamecontrol[gc_forward ][0] = KEY_JOY1+1; //Y gamecontrol[gc_jump ][0] = KEY_JOY1+2; //B - gamecontrol[gc_use ][0] = KEY_JOY1+3; //X + gamecontrol[gc_brake ][0] = KEY_JOY1+3; //X gamecontrol[gc_strafeleft ][0] = KEY_JOY1+4; //L gamecontrol[gc_straferight][0] = KEY_JOY1+5; //R gamecontrol[gc_lookup ][0] = KEY_JOY1+6; //U @@ -1143,13 +1143,13 @@ void G_Controldefault(void) gamecontrol[gc_forward ][0] = KEY_UPARROW; gamecontrol[gc_backward ][0] = KEY_DOWNARROW; gamecontrol[gc_jump ][0] = KEY_JOY1+0; //A - gamecontrol[gc_use ][0] = KEY_JOY1+3; //Y + gamecontrol[gc_brake ][0] = KEY_JOY1+3; //Y gamecontrol[gc_strafeleft ][0] = KEY_JOY1+4; //L gamecontrol[gc_straferight][0] = KEY_JOY1+5; //R gamecontrol[gc_turnleft ][0] = KEY_LEFTARROW; gamecontrol[gc_turnright ][0] = KEY_RIGHTARROW; gamecontrol[gc_pause ][0] = KEY_JOY1+6; //Start - gamecontrol[gc_weaponnext ][0] = KEY_JOY1+7; //Select + gamecontrol[gc_driftleft ][0] = KEY_JOY1+7; //Select } #else void G_Controldefault(void) @@ -1162,8 +1162,8 @@ void G_Controldefault(void) gamecontrol[gc_straferight][0] = 'd'; gamecontrol[gc_turnleft ][0] = KEY_LEFTARROW; gamecontrol[gc_turnright ][0] = KEY_RIGHTARROW; - gamecontrol[gc_weaponnext ][0] = 'e'; - gamecontrol[gc_weaponprev ][0] = 'q'; + gamecontrol[gc_driftleft ][0] = 'e'; + gamecontrol[gc_driftright ][0] = 'q'; gamecontrol[gc_wepslot1 ][0] = '1'; gamecontrol[gc_wepslot2 ][0] = '2'; gamecontrol[gc_wepslot3 ][0] = '3'; @@ -1176,13 +1176,13 @@ void G_Controldefault(void) gamecontrol[gc_wepslot10 ][0] = '0'; gamecontrol[gc_fire ][0] = KEY_RCTRL; gamecontrol[gc_fire ][1] = KEY_MOUSE1+0; - gamecontrol[gc_firenormal ][0] = 'c'; - gamecontrol[gc_tossflag ][0] = '\''; - gamecontrol[gc_use ][0] = 'x'; + gamecontrol[gc_accelerate ][0] = 'c'; + gamecontrol[gc_spectate ][0] = '\''; + gamecontrol[gc_brake ][0] = 'x'; gamecontrol[gc_camtoggle ][0] = 'v'; - gamecontrol[gc_camleft ][0] = '['; - gamecontrol[gc_camright ][0] = ']'; - gamecontrol[gc_camreset ][0] = 'r'; + gamecontrol[gc_aimforward ][0] = '['; + gamecontrol[gc_aimbackward][0] = ']'; + gamecontrol[gc_lookback ][0] = 'r'; gamecontrol[gc_lookup ][0] = KEY_PGUP; gamecontrol[gc_lookdown ][0] = KEY_PGDN; gamecontrol[gc_centerview ][0] = KEY_END; @@ -1198,12 +1198,12 @@ void G_Controldefault(void) gamecontrol[gc_backward ][0] = KEY_JOY1+03; //DOWN gamecontrol[gc_turnleft ][0] = KEY_JOY1+04; //LEFT gamecontrol[gc_turnright ][0] = KEY_JOY1+05; //RIGHT - gamecontrol[gc_weaponnext ][0] = KEY_JOY1+10; //y - gamecontrol[gc_weaponprev ][0] = KEY_JOY1+9; //x + gamecontrol[gc_driftleft ][0] = KEY_JOY1+10; //y + gamecontrol[gc_driftright ][0] = KEY_JOY1+9; //x gamecontrol[gc_fire ][0] = KEY_JOY1+12; //L - gamecontrol[gc_firenormal ][0] = KEY_JOY1+13; //R - gamecontrol[gc_use ][0] = KEY_JOY1+00; //B - gamecontrol[gc_use ][1] = KEY_JOY1+07; //b + gamecontrol[gc_accelerate ][0] = KEY_JOY1+13; //R + gamecontrol[gc_brake ][0] = KEY_JOY1+00; //B + gamecontrol[gc_brake ][1] = KEY_JOY1+07; //b gamecontrol[gc_jump ][0] = KEY_JOY1+01; //A gamecontrol[gc_jump ][1] = KEY_JOY1+06; //a gamecontrol[gc_pause ][0] = KEY_JOY1+18; //Home @@ -1211,12 +1211,12 @@ void G_Controldefault(void) gamecontrolbis[gc_backward ][0] = KEY_2JOY1+03; //DOWN gamecontrolbis[gc_turnleft ][0] = KEY_2JOY1+04; //LEFT gamecontrolbis[gc_turnright ][0] = KEY_2JOY1+05; //RIGHT - gamecontrolbis[gc_weaponnext ][0] = KEY_2JOY1+10; //y - gamecontrolbis[gc_weaponprev ][0] = KEY_2JOY1+9; //x + gamecontrolbis[gc_driftleft ][0] = KEY_2JOY1+10; //y + gamecontrolbis[gc_driftright ][0] = KEY_2JOY1+9; //x gamecontrolbis[gc_fire ][0] = KEY_2JOY1+12; //L - gamecontrolbis[gc_firenormal ][0] = KEY_2JOY1+13; //R - gamecontrolbis[gc_use ][0] = KEY_2JOY1+00; //B - gamecontrolbis[gc_use ][1] = KEY_2JOY1+07; //b + gamecontrolbis[gc_accelerate ][0] = KEY_2JOY1+13; //R + gamecontrolbis[gc_brake ][0] = KEY_2JOY1+00; //B + gamecontrolbis[gc_brake ][1] = KEY_2JOY1+07; //b gamecontrolbis[gc_jump ][0] = KEY_2JOY1+01; //A gamecontrolbis[gc_jump ][1] = KEY_2JOY1+06; //a gamecontrolbis[gc_pause ][0] = KEY_2JOY1+18; //Home @@ -1228,14 +1228,14 @@ void G_Controldefault(void) gamecontrol[gc_strafeleft ][1] = KEY_JOY1+15; //ZL gamecontrol[gc_turnleft ][1] = KEY_HAT1+02; //LEFT gamecontrol[gc_turnright ][1] = KEY_HAT1+03; //RIGHT - gamecontrol[gc_weaponnext ][1] = KEY_JOY1+11; //x + gamecontrol[gc_driftleft ][1] = KEY_JOY1+11; //x gamecontrol[gc_fire ][0] = KEY_JOY1+12; //y gamecontrol[gc_fire ][1] = KEY_JOY1+01; //B - gamecontrol[gc_firenormal ][0] = KEY_JOY1+13; //L - gamecontrol[gc_firenormal ][1] = KEY_JOY1+00; //A - gamecontrol[gc_tossflag ][1] = KEY_JOY1+17; //Plus CC - gamecontrol[gc_use ][0] = KEY_JOY1+9; //a - gamecontrol[gc_use ][1] = KEY_JOY1+02; //1 + gamecontrol[gc_accelerate ][0] = KEY_JOY1+13; //L + gamecontrol[gc_accelerate ][1] = KEY_JOY1+00; //A + gamecontrol[gc_spectate ][1] = KEY_JOY1+17; //Plus CC + gamecontrol[gc_brake ][0] = KEY_JOY1+9; //a + gamecontrol[gc_brake ][1] = KEY_JOY1+02; //1 gamecontrol[gc_centerview ][1] = KEY_JOY1+14; //R gamecontrol[gc_scores ][0] = KEY_JOY1+04; //Minus gamecontrol[gc_scores ][1] = KEY_JOY1+18; //Minus @@ -1249,14 +1249,14 @@ void G_Controldefault(void) gamecontrolbis[gc_strafeleft ][1] = KEY_2JOY1+15; //ZL gamecontrolbis[gc_turnleft ][1] = KEY_2HAT1+02; //LEFT gamecontrolbis[gc_turnright ][1] = KEY_2HAT1+03; //RIGHT - gamecontrolbis[gc_weaponnext ][1] = KEY_2JOY1+11; //x + gamecontrolbis[gc_driftleft ][1] = KEY_2JOY1+11; //x gamecontrolbis[gc_fire ][0] = KEY_2JOY1+12; //y gamecontrolbis[gc_fire ][1] = KEY_2JOY1+01; //B - gamecontrolbis[gc_firenormal ][0] = KEY_2JOY1+13; //L - gamecontrolbis[gc_firenormal ][1] = KEY_2JOY1+00; //A - gamecontrolbis[gc_tossflag ][1] = KEY_2JOY1+17; //Plus CC - gamecontrolbis[gc_use ][0] = KEY_2JOY1+9; //a - gamecontrolbis[gc_use ][1] = KEY_2JOY1+02; //1 + gamecontrolbis[gc_accelerate ][0] = KEY_2JOY1+13; //L + gamecontrolbis[gc_accelerate ][1] = KEY_2JOY1+00; //A + gamecontrolbis[gc_spectate ][1] = KEY_2JOY1+17; //Plus CC + gamecontrolbis[gc_brake ][0] = KEY_2JOY1+9; //a + gamecontrolbis[gc_brake ][1] = KEY_2JOY1+02; //1 gamecontrolbis[gc_centerview ][1] = KEY_2JOY1+14; //R gamecontrolbis[gc_scores ][0] = KEY_2JOY1+04; //Minus gamecontrolbis[gc_scores ][1] = KEY_2JOY1+18; //Minus diff --git a/src/g_input.h b/src/g_input.h index d6533932..50b491ad 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -88,8 +88,8 @@ typedef enum gc_straferight, gc_turnleft, gc_turnright, - gc_weaponnext, - gc_weaponprev, + gc_driftleft, // gc_weaponnext + gc_driftright, // gc_weaponprev gc_wepslot1, gc_wepslot2, gc_wepslot3, @@ -101,13 +101,13 @@ typedef enum gc_wepslot9, gc_wepslot10, gc_fire, - gc_firenormal, - gc_tossflag, - gc_use, + gc_accelerate, // gc_firenormal + gc_spectate, // gc_tossflag + gc_brake, // gc_use gc_camtoggle, - gc_camleft, - gc_camright, - gc_camreset, + gc_aimforward, // gc_camleft + gc_aimbackward, // gc_camright + gc_lookback, // gc_camreset gc_lookup, gc_lookdown, gc_centerview, diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c index a93e96dc..fe4be9be 100644 --- a/src/hardware/hw_light.c +++ b/src/hardware/hw_light.c @@ -497,6 +497,26 @@ light_t *t_lspr[NUMSPRITES] = &lspr[NOLIGHT], // SPR_SRBN &lspr[NOLIGHT], // SPR_SRBO + &lspr[NOLIGHT], //"SPRG", + &lspr[NOLIGHT], //"BSPR", + &lspr[NOLIGHT], //"RNDM", + &lspr[NOLIGHT], //"SPRK", + &lspr[NOLIGHT], //"KFRE", + &lspr[NOLIGHT], //"DRIF", + &lspr[NOLIGHT], //"FAKE", + &lspr[NOLIGHT], //"DFAK", + &lspr[NOLIGHT], //"BANA", + &lspr[NOLIGHT], //"DBAN", + &lspr[NOLIGHT], //"GSHE", + &lspr[NOLIGHT], //"GSTR", + &lspr[NOLIGHT], //"DGSH", + &lspr[NOLIGHT], //"RSHE", + &lspr[NOLIGHT], //"RSTR", + &lspr[NOLIGHT], //"DRSH", + &lspr[NOLIGHT], //"BOMB", + &lspr[NOLIGHT], //"BLIG", + &lspr[NOLIGHT], //"LIGH" + // Free slots &lspr[NOLIGHT], &lspr[NOLIGHT], diff --git a/src/info.c b/src/info.c index 0ca0007c..59fcaf43 100644 --- a/src/info.c +++ b/src/info.c @@ -54,6 +54,9 @@ char sprnames[NUMSPRITES + 1][5] = "ROII","ROIJ","ROIK","ROIL","ROIM","ROIN","ROIO","ROIP","BBAL","GWLG", "GWLR","SRBA","SRBB","SRBC","SRBD","SRBE","SRBF","SRBG","SRBH","SRBI", "SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO", + //SRB2kart Sprites + "SPRG","BSPR","RNDM","SPRK","KFRE","DRIF","FAKE","DFAK","BANA","DBAN", + "GSHE","GSTR","DGSH","RSHE","RSTR","DRSH","BOMB","BLIG","LIGH" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -109,8 +112,8 @@ state_t states[NUMSTATES] = {SPR_PLAY, 18, 2, {NULL}, 0, 0, S_KART_SPIN7}, // S_KART_SPIN6 S {SPR_PLAY, 19, 2, {NULL}, 0, 0, S_KART_SPIN8}, // S_KART_SPIN7 T {SPR_PLAY, 20, 2, {NULL}, 0, 0, S_KART_SPIN1}, // S_KART_SPIN8 U - {SPR_PLAY, 21, 350, {NULL}, 0, 0, S_KART_STND}, // S_KART_PAIN V - {SPR_PLAY, 22, 350, {NULL}, 0, 0, S_KART_STND}, // S_KART_SQUISH W + {SPR_PLAY, 13, 350, {NULL}, 0, 0, S_KART_STND}, // S_KART_PAIN N + {SPR_PLAY, 21, 350, {NULL}, 0, 0, S_KART_STND}, // S_KART_SQUISH V /* {SPR_PLAY, 0, 105, {NULL}, 0, 0, S_PLAY_TAP1}, // S_PLAY_STND {SPR_PLAY, 1, 16, {NULL}, 0, 0, S_PLAY_TAP2}, // S_PLAY_TAP1 @@ -2513,6 +2516,188 @@ state_t states[NUMSTATES] = {SPR_SRBO, 0, 2, {A_Look}, 0, 0, S_SRB1_GENREX1}, // S_SRB1_GENREX1 {SPR_SRBO, 0, 2, {A_BuzzFly}, 0, 0, S_SRB1_GENREX2}, // S_SRB1_GENREX2 + + // SRB2kart + {SPR_SPRG, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GRAYSPRING + {SPR_SPRG, 4, 4, {A_Pain}, 0, 0, S_GRAYSPRING3}, // S_GRAYSPRING2 + {SPR_SPRG, 3, 1, {NULL}, 0, 0, S_GRAYSPRING4}, // S_GRAYSPRING3 + {SPR_SPRG, 2, 1, {NULL}, 0, 0, S_GRAYSPRING5}, // S_GRAYSPRING4 + {SPR_SPRG, 1, 1, {NULL}, 0, 0, S_GRAYSPRING}, // S_GRAYSPRING5 + + {SPR_BSPR, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BDIAG1 + {SPR_BSPR, 1, 1, {A_Pain}, 0, 0, S_BDIAG3}, // S_BDIAG2 + {SPR_BSPR, 2, 1, {NULL}, 0, 0, S_BDIAG4}, // S_BDIAG3 + {SPR_BSPR, 3, 1, {NULL}, 0, 0, S_BDIAG5}, // S_BDIAG4 + {SPR_BSPR, 4, 1, {NULL}, 0, 0, S_BDIAG6}, // S_BDIAG5 + {SPR_BSPR, 3, 1, {NULL}, 0, 0, S_BDIAG7}, // S_BDIAG6 + {SPR_BSPR, 2, 1, {NULL}, 0, 0, S_BDIAG8}, // S_BDIAG7 + {SPR_BSPR, 1, 1, {NULL}, 0, 0, S_BDIAG1}, // S_BDIAG8 + + {SPR_RNDM, 0, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM2}, // S_RANDOMITEM1 + {SPR_RNDM, 1, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM3}, // S_RANDOMITEM2 + {SPR_RNDM, 2, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM4}, // S_RANDOMITEM3 + {SPR_RNDM, 3, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM5}, // S_RANDOMITEM4 + {SPR_RNDM, 4, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM6}, // S_RANDOMITEM5 + {SPR_RNDM, 5, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM7}, // S_RANDOMITEM6 + {SPR_RNDM, 6, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM8}, // S_RANDOMITEM7 + {SPR_RNDM, 7, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM9}, // S_RANDOMITEM8 + {SPR_RNDM, 8, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM10}, // S_RANDOMITEM9 + {SPR_RNDM, 9, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM11}, // S_RANDOMITEM10 + {SPR_RNDM, 10, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM12}, // S_RANDOMITEM11 + {SPR_RNDM, 11, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM13}, // S_RANDOMITEM12 + {SPR_RNDM, 12, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM14}, // S_RANDOMITEM13 + {SPR_RNDM, 13, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM15}, // S_RANDOMITEM14 + {SPR_RNDM, 14, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM16}, // S_RANDOMITEM15 + {SPR_RNDM, 15, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM17}, // S_RANDOMITEM16 + {SPR_RNDM, 16, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM18}, // S_RANDOMITEM17 + {SPR_RNDM, 17, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM19}, // S_RANDOMITEM18 + {SPR_RNDM, 18, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM20}, // S_RANDOMITEM19 + {SPR_RNDM, 19, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM21}, // S_RANDOMITEM20 + {SPR_RNDM, 20, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM22}, // S_RANDOMITEM21 + {SPR_RNDM, 21, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM23}, // S_RANDOMITEM22 + {SPR_RNDM, 22, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM24}, // S_RANDOMITEM23 + {SPR_RNDM, 23, 3, {A_AttractChase}, 0, 0, S_RANDOMITEM1}, // S_RANDOMITEM24 + + {SPR_SPRK, 0, 2, {NULL}, 0, 0, S_RANDOMITEMPOP2}, // S_RANDOMITEMPOP1 + {SPR_SPRK, 1, 2, {NULL}, 0, 0, S_RANDOMITEMPOP3}, // S_RANDOMITEMPOP2 + {SPR_SPRK, 2, 2, {NULL}, 0, 0, S_RANDOMITEMPOP4}, // S_RANDOMITEMPOP3 + {SPR_SPRK, 3, 2, {NULL}, 0, 0, S_RANDOMITEMPOP5}, // S_RANDOMITEMPOP4 + {SPR_NULL, 0, -1, {NULL}, 0, 0, S_NULL}, // S_RANDOMITEMPOP5 + + {SPR_DRIF, 0, 2, {NULL}, 0, 0, S_DRIFTSPARK2}, // S_DRIFTSPARK1 + {SPR_DRIF, 1, 2, {NULL}, 0, 0, S_DRIFTSPARK3}, // S_DRIFTSPARK2 + {SPR_DRIF, 2, 2, {NULL}, 0, 0, S_DRIFTSPARK1}, // S_DRIFTSPARK3 + {SPR_DRIF, 3, 2, {NULL}, 0, 0, S_DRIFTSPARK5}, // S_DRIFTSPARK4 + {SPR_DRIF, 4, 2, {NULL}, 0, 0, S_DRIFTSPARK6}, // S_DRIFTSPARK5 + {SPR_DRIF, 5, 2, {NULL}, 0, 0, S_DRIFTSPARK4}, // S_DRIFTSPARK6 + + {SPR_NULL, 0, 10, {NULL}, 0, 0, S_KARTFIRE2}, // S_KARTFIRE1 + {SPR_KFRE, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARTFIRE3}, // S_KARTFIRE2 + {SPR_KFRE, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_KARTFIRE4}, // S_KARTFIRE3 + {SPR_KFRE, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_KARTFIRE5}, // S_KARTFIRE4 + {SPR_KFRE, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_KARTFIRE6}, // S_KARTFIRE5 + {SPR_KFRE, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_KARTFIRE7}, // S_KARTFIRE6 + {SPR_KFRE, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_KARTFIRE8}, // S_KARTFIRE7 + {SPR_KFRE, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_NULL}, // S_KARTFIRE8 + + {SPR_FAKE, 0, 3, {NULL}, 0, 0, S_FAKEITEM2}, // S_FAKEITEM1 + {SPR_FAKE, 1, 3, {NULL}, 0, 0, S_FAKEITEM3}, // S_FAKEITEM2 + {SPR_FAKE, 2, 3, {NULL}, 0, 0, S_FAKEITEM4}, // S_FAKEITEM3 + {SPR_FAKE, 3, 3, {NULL}, 0, 0, S_FAKEITEM5}, // S_FAKEITEM4 + {SPR_FAKE, 4, 3, {NULL}, 0, 0, S_FAKEITEM6}, // S_FAKEITEM5 + {SPR_FAKE, 5, 3, {NULL}, 0, 0, S_FAKEITEM7}, // S_FAKEITEM6 + {SPR_FAKE, 6, 3, {NULL}, 0, 0, S_FAKEITEM8}, // S_FAKEITEM7 + {SPR_FAKE, 7, 3, {NULL}, 0, 0, S_FAKEITEM9}, // S_FAKEITEM8 + {SPR_FAKE, 8, 3, {NULL}, 0, 0, S_FAKEITEM10}, // S_FAKEITEM9 + {SPR_FAKE, 9, 3, {NULL}, 0, 0, S_FAKEITEM11}, // S_FAKEITEM10 + {SPR_FAKE, 10, 3, {NULL}, 0, 0, S_FAKEITEM12}, // S_FAKEITEM11 + {SPR_FAKE, 11, 3, {NULL}, 0, 0, S_FAKEITEM13}, // S_FAKEITEM12 + {SPR_FAKE, 12, 3, {NULL}, 0, 0, S_FAKEITEM14}, // S_FAKEITEM13 + {SPR_FAKE, 13, 3, {NULL}, 0, 0, S_FAKEITEM15}, // S_FAKEITEM14 + {SPR_FAKE, 14, 3, {NULL}, 0, 0, S_FAKEITEM16}, // S_FAKEITEM15 + {SPR_FAKE, 15, 3, {NULL}, 0, 0, S_FAKEITEM17}, // S_FAKEITEM16 + {SPR_FAKE, 16, 3, {NULL}, 0, 0, S_FAKEITEM18}, // S_FAKEITEM17 + {SPR_FAKE, 17, 3, {NULL}, 0, 0, S_FAKEITEM19}, // S_FAKEITEM18 + {SPR_FAKE, 18, 3, {NULL}, 0, 0, S_FAKEITEM20}, // S_FAKEITEM19 + {SPR_FAKE, 19, 3, {NULL}, 0, 0, S_FAKEITEM21}, // S_FAKEITEM20 + {SPR_FAKE, 20, 3, {NULL}, 0, 0, S_FAKEITEM22}, // S_FAKEITEM21 + {SPR_FAKE, 21, 3, {NULL}, 0, 0, S_FAKEITEM23}, // S_FAKEITEM22 + {SPR_FAKE, 22, 3, {NULL}, 0, 0, S_FAKEITEM24}, // S_FAKEITEM23 + {SPR_FAKE, 23, 3, {NULL}, 0, 0, S_FAKEITEM1}, // S_FAKEITEM24 + {SPR_DFAK, 0, 175, {NULL}, 0, 0, S_FAKEITEM1}, // S_DEADFAKEITEM + + {SPR_BANA, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BANANAITEM + {SPR_DBAN, 0, 175, {NULL}, 0, 0, S_NULL}, // S_DEADBANANA + + {SPR_GSHE, 0, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEGREENSHIELD2}, // S_TRIPLEGREENSHIELD1 + {SPR_GSHE, 1, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEGREENSHIELD3}, // S_TRIPLEGREENSHIELD2 + {SPR_GSHE, 2, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEGREENSHIELD4}, // S_TRIPLEGREENSHIELD3 + {SPR_GSHE, 3, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEGREENSHIELD5}, // S_TRIPLEGREENSHIELD4 + {SPR_GSHE, 4, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEGREENSHIELD6}, // S_TRIPLEGREENSHIELD5 + {SPR_GSHE, 5, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEGREENSHIELD7}, // S_TRIPLEGREENSHIELD6 + {SPR_GSHE, 6, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEGREENSHIELD8}, // S_TRIPLEGREENSHIELD7 + {SPR_GSHE, 7, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEGREENSHIELD1}, // S_TRIPLEGREENSHIELD8 + {SPR_GSHE, 0, 2, {NULL}, 0, 0, S_GREENSHIELD2}, // S_GREENSHIELD1 + {SPR_GSHE, 1, 2, {NULL}, 0, 0, S_GREENSHIELD3}, // S_GREENSHIELD2 + {SPR_GSHE, 2, 2, {NULL}, 0, 0, S_GREENSHIELD4}, // S_GREENSHIELD3 + {SPR_GSHE, 3, 2, {NULL}, 0, 0, S_GREENSHIELD5}, // S_GREENSHIELD4 + {SPR_GSHE, 4, 2, {NULL}, 0, 0, S_GREENSHIELD6}, // S_GREENSHIELD5 + {SPR_GSHE, 5, 2, {NULL}, 0, 0, S_GREENSHIELD7}, // S_GREENSHIELD6 + {SPR_GSHE, 6, 2, {NULL}, 0, 0, S_GREENSHIELD8}, // S_GREENSHIELD7 + {SPR_GSHE, 7, 2, {NULL}, 0, 0, S_GREENSHIELD1}, // S_GREENSHIELD8 + {SPR_GSHE, 0, 2, {A_SmokeTrailer}, MT_GREENTRAIL, 0, S_GREENITEM2}, // S_GREENITEM1 + {SPR_GSHE, 1, 2, {A_SmokeTrailer}, MT_GREENTRAIL, 0, S_GREENITEM3}, // S_GREENITEM2 + {SPR_GSHE, 2, 2, {A_SmokeTrailer}, MT_GREENTRAIL, 0, S_GREENITEM4}, // S_GREENITEM3 + {SPR_GSHE, 3, 2, {A_SmokeTrailer}, MT_GREENTRAIL, 0, S_GREENITEM5}, // S_GREENITEM4 + {SPR_GSHE, 4, 2, {A_SmokeTrailer}, MT_GREENTRAIL, 0, S_GREENITEM6}, // S_GREENITEM5 + {SPR_GSHE, 5, 2, {A_SmokeTrailer}, MT_GREENTRAIL, 0, S_GREENITEM7}, // S_GREENITEM6 + {SPR_GSHE, 6, 2, {A_SmokeTrailer}, MT_GREENTRAIL, 0, S_GREENITEM8}, // S_GREENITEM7 + {SPR_GSHE, 7, 2, {A_SmokeTrailer}, MT_GREENTRAIL, 0, S_GREENITEM1}, // S_GREENITEM8 + {SPR_GSHE, 0, 1, {NULL}, 0, 0, S_GREENTRAIL2}, // S_GREENTRAIL1 + {SPR_GSHE, 1, 1, {NULL}, 0, 0, S_GREENTRAIL3}, // S_GREENTRAIL2 + {SPR_GSHE, 2, 1, {NULL}, 0, 0, S_GREENTRAIL4}, // S_GREENTRAIL3 + {SPR_GSHE, 3, 1, {NULL}, 0, 0, S_GREENTRAIL5}, // S_GREENTRAIL4 + {SPR_GSHE, 4, 1, {NULL}, 0, 0, S_GREENTRAIL6}, // S_GREENTRAIL5 + {SPR_GSHE, 5, 1, {NULL}, 0, 0, S_GREENTRAIL7}, // S_GREENTRAIL6 + {SPR_GSHE, 6, 1, {NULL}, 0, 0, S_GREENTRAIL8}, // S_GREENTRAIL7 + {SPR_GSHE, 7, 1, {NULL}, 0, 0, S_GREENTRAIL9}, // S_GREENTRAIL8 + {SPR_GSHE, 8, 1, {NULL}, 0, 0, S_NULL}, // S_GREENTRAIL9 + {SPR_DGSH, 0, 175, {NULL}, 0, 0, S_NULL}, // S_DEADGREEN + + {SPR_RSHE, 0, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEREDSHIELD2}, // S_TRIPLEREDSHIELD1 + {SPR_RSHE, 1, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEREDSHIELD3}, // S_TRIPLEREDSHIELD2 + {SPR_RSHE, 2, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEREDSHIELD4}, // S_TRIPLEREDSHIELD3 + {SPR_RSHE, 3, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEREDSHIELD5}, // S_TRIPLEREDSHIELD4 + {SPR_RSHE, 4, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEREDSHIELD6}, // S_TRIPLEREDSHIELD5 + {SPR_RSHE, 5, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEREDSHIELD7}, // S_TRIPLEREDSHIELD6 + {SPR_RSHE, 6, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEREDSHIELD8}, // S_TRIPLEREDSHIELD7 + {SPR_RSHE, 7, 2, {A_RotateSpikeBall}, 0, 0, S_TRIPLEREDSHIELD1}, // S_TRIPLEREDSHIELD8 + {SPR_RSHE, 0, 2, {NULL}, 0, 0, S_REDSHIELD2}, // S_REDSHIELD1 + {SPR_RSHE, 1, 2, {NULL}, 0, 0, S_REDSHIELD3}, // S_REDSHIELD2 + {SPR_RSHE, 2, 2, {NULL}, 0, 0, S_REDSHIELD4}, // S_REDSHIELD3 + {SPR_RSHE, 3, 2, {NULL}, 0, 0, S_REDSHIELD5}, // S_REDSHIELD4 + {SPR_RSHE, 4, 2, {NULL}, 0, 0, S_REDSHIELD6}, // S_REDSHIELD5 + {SPR_RSHE, 5, 2, {NULL}, 0, 0, S_REDSHIELD7}, // S_REDSHIELD6 + {SPR_RSHE, 6, 2, {NULL}, 0, 0, S_REDSHIELD8}, // S_REDSHIELD7 + {SPR_RSHE, 7, 2, {NULL}, 0, 0, S_REDSHIELD1}, // S_REDSHIELD8 + {SPR_RSHE, 0, 2, {A_DualAction}, S_REDITEMCHASE, S_REDITEMTRAIL, S_REDITEM2}, // S_REDITEM1 + {SPR_RSHE, 1, 2, {A_DualAction}, S_REDITEMCHASE, S_REDITEMTRAIL, S_REDITEM3}, // S_REDITEM2 + {SPR_RSHE, 2, 2, {A_DualAction}, S_REDITEMCHASE, S_REDITEMTRAIL, S_REDITEM4}, // S_REDITEM3 + {SPR_RSHE, 3, 2, {A_DualAction}, S_REDITEMCHASE, S_REDITEMTRAIL, S_REDITEM5}, // S_REDITEM4 + {SPR_RSHE, 4, 2, {A_DualAction}, S_REDITEMCHASE, S_REDITEMTRAIL, S_REDITEM6}, // S_REDITEM5 + {SPR_RSHE, 5, 2, {A_DualAction}, S_REDITEMCHASE, S_REDITEMTRAIL, S_REDITEM7}, // S_REDITEM6 + {SPR_RSHE, 6, 2, {A_DualAction}, S_REDITEMCHASE, S_REDITEMTRAIL, S_REDITEM8}, // S_REDITEM7 + {SPR_RSHE, 7, 2, {A_DualAction}, S_REDITEMCHASE, S_REDITEMTRAIL, S_REDITEM1}, // S_REDITEM8 + {SPR_RSHE, 0, 2, {A_RedShellChase}, 0, 0, S_REDITEM2}, // S_REDITEMCHASE + {SPR_RSHE, 1, 2, {A_SmokeTrailer}, MT_REDTRAIL, 0, S_REDITEM3}, // S_REDITEMTRAIL + {SPR_RSHE, 0, 1, {NULL}, 0, 0, S_REDTRAIL2}, // S_REDTRAIL1 + {SPR_RSHE, 1, 1, {NULL}, 0, 0, S_REDTRAIL3}, // S_REDTRAIL2 + {SPR_RSHE, 2, 1, {NULL}, 0, 0, S_REDTRAIL4}, // S_REDTRAIL3 + {SPR_RSHE, 3, 1, {NULL}, 0, 0, S_REDTRAIL5}, // S_REDTRAIL4 + {SPR_RSHE, 4, 1, {NULL}, 0, 0, S_REDTRAIL6}, // S_REDTRAIL5 + {SPR_RSHE, 5, 1, {NULL}, 0, 0, S_REDTRAIL7}, // S_REDTRAIL6 + {SPR_RSHE, 6, 1, {NULL}, 0, 0, S_REDTRAIL8}, // S_REDTRAIL7 + {SPR_RSHE, 7, 1, {NULL}, 0, 0, S_REDTRAIL9}, // S_REDTRAIL8 + {SPR_RSHE, 8, 1, {NULL}, 0, 0, S_NULL}, // S_REDTRAIL9 + {SPR_DRSH, 0, 175, {NULL}, 0, 0, S_NULL}, // S_DEADRED + + {SPR_BOMB, 0, 1, {NULL}, 0, 0, S_BOMBSHIELD}, // S_BOMBSHIELD + {SPR_BOMB, 0, 1, {A_GrenadeRing}, 0, 0, S_BOMBITEM}, // S_BOMBITEM + {SPR_BOMB, 0, 1, {NULL}, 0, 0, S_BOMBAIR}, // S_BOMBAIR + {SPR_BOMB, 0, 1, {A_BobombExplode}, MT_BOMBEXPLOSION, 0, S_NULL}, // S_BOMBEXPLODE + + {SPR_BLIG, 0, 2, {NULL}, 0, 0, S_BLUELIGHTNING2}, // S_BLUELIGHTNING1 + {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_NULL, 0, 1, {A_BobombExplode}, MT_BLUEEXPLOSION, 0, S_NULL}, // S_BLUEEXPLODE + + {SPR_LIGH, 0, 2, {NULL}, 0, 0, S_LIGHTNING2}, // S_LIGHTNING1 + {SPR_LIGH, 0, 2, {NULL}, 0, 0, S_LIGHTNING3}, // S_LIGHTNING2 + {SPR_LIGH, 0, 2, {NULL}, 0, 0, S_LIGHTNING4}, // S_LIGHTNING3 + {SPR_LIGH, 0, 2, {NULL}, 0, 0, S_NULL}, // S_LIGHTNING4 + + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -13767,6 +13952,899 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + // SRB2kart MT's + + { // MT_GRAYSPRING + 553, // doomednum + S_GRAYSPRING, // spawnstate + 100, // spawnhealth + S_GRAYSPRING2, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_spring, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 5*FRACUNIT, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPRING, // flags + S_GRAYSPRING2 // raisestate + }, + + { // MT_INVISSPRING + 554, // doomednum + SPR_NULL, // spawnstate + 100, // spawnhealth + SPR_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_spring, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 5*FRACUNIT, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPRING, // flags + SPR_NULL // raisestate + }, + + { // MT_BLUEDIAG + 557, // doomednum + S_BDIAG1, // spawnstate + 1, // spawnhealth + S_BDIAG2, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_spring, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 11*FRACUNIT, // mass + 11*FRACUNIT, // damage + sfx_None, // activesound + MF_SOLID|MF_SPRING, // flags + S_BDIAG2 // raisestate + }, + + { // MT_RANDOMITEM + 2000, // doomednum + S_RANDOMITEM1, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_RANDOMITEM1, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_RANDOMBOX3, // deathstate + S_NULL, // xdeathstate + sfx_pop, // deathsound + 64*FRACUNIT, // speed + 32*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + S_NULL // raisestate + }, + + { // MT_RANDOMITEMPOP + -1, // doomednum + S_RANDOMITEMPOP1, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_RANDOMITEMPOP1, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOCLIP, // flags + S_NULL // raisestate + }, + + { // MT_MUSHROOMTRAIL + -1, // doomednum + S_KARTFIRE1, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 14*FRACUNIT, // radius + 14*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_FIRE, // flags + S_NULL // raisestate + }, + + { // MT_DRIFT + -1, // doomednum + S_DRIFTSPARK1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 12, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 64*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_FAKESHIELD + -1, // doomednum + S_FAKEITEM1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADFAKEITEM, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + k_fakeitem, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_FAKEITEM + -1, // doomednum + S_FAKEITEM1, // spawnstate + 2, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADFAKEITEM, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_fake, // activesound + MF_SHOOTABLE, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEBANANASHIELD1 + -1, // doomednum + S_BANANAITEM, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADBANANA, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + k_banana, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEBANANASHIELD2 + -1, // doomednum + S_BANANAITEM, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADBANANA, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + k_banana, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEBANANASHIELD3 + -1, // doomednum + S_BANANAITEM, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADBANANA, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + k_banana, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BANANASHIELD + -1, // doomednum + S_BANANAITEM, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADBANANA, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + k_banana, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BANANAITEM + -1, // doomednum + S_BANANAITEM, // spawnstate + 2, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADBANANA, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_peel, // activesound + MF_SHOOTABLE, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEGREENSHIELD1 + -1, // doomednum + S_TRIPLEGREENSHIELD1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADGREEN, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 10*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEGREENSHIELD2 + -1, // doomednum + S_TRIPLEGREENSHIELD4, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADGREEN, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 10*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEGREENSHIELD3 + -1, // doomednum + S_TRIPLEGREENSHIELD7, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADGREEN, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 10*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_GREENSHIELD + -1, // doomednum + S_GREENSHIELD1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADGREEN, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + k_greenshell, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_GREENITEM + -1, // doomednum + S_GREENITEM1, // spawnstate + 7, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_tink, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADGREEN, // deathstate + S_NULL, // xdeathstate + sfx_shbrk, // deathsound + 64*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_grnshl, // activesound + MF_SHOOTABLE|MF_BOUNCE, // flags + S_NULL // raisestate + }, + + { // MT_GREENTRAIL + -1, // doomednum + S_GREENTRAIL1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEREDSHIELD1 + -1, // doomednum + S_TRIPLEREDSHIELD2, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADRED, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 10*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEREDSHIELD2 + -1, // doomednum + S_TRIPLEREDSHIELD5, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADRED, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 10*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_TRIPLEREDSHIELD3 + -1, // doomednum + S_TRIPLEREDSHIELD8, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADRED, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 10*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_REDSHIELD + -1, // doomednum + S_REDSHIELD1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADRED, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + k_redshell, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_REDITEM + -1, // doomednum + S_REDITEM1, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADRED, // deathstate + S_NULL, // xdeathstate + sfx_shbrk, // deathsound + 7*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_redshl, // activesound + MF_SHOOTABLE, // flags + S_NULL // raisestate + }, + + { // MT_REDITEMDUD + -1, // doomednum + S_REDITEM1, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_DEADRED, // deathstate + S_NULL, // xdeathstate + sfx_shbrk, // deathsound + 56*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_redshl, // activesound + MF_SHOOTABLE, // flags + S_NULL // raisestate + }, + + { // MT_REDTRAIL + -1, // doomednum + S_REDTRAIL1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BOMBSHIELD + -1, // doomednum + S_BOMBSHIELD, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 256*FRACUNIT, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_BOMBEXPLODE, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + k_bobomb, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BOMBITEM + -1, // doomednum + S_BOMBAIR, // spawnstate + 105, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 256*FRACUNIT, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_BOMBEXPLODE, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 24*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_bomb, // activesound + MF_BOUNCE|MF_FLOAT|MF_NOCLIPTHING|MF_MISSILE|MF_SHOOTABLE, // flags + S_NULL // raisestate + }, + + { // MT_BOMBEXPLOSION + -1, // doomednum + S_BPLD1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 32*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_BLUELIGHTNING + -1, // doomednum + S_BLUELIGHTNING1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 64*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BLUEEXPLOSION + -1, // doomednum + S_BLUEEXPLODE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 256*FRACUNIT, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 64*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY|MF_RUNSPAWNFUNC, // flags + S_NULL // raisestate + }, + + { // MT_LIGHTNING + -1, // doomednum + S_LIGHTNING1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 64*FRACUNIT, // radius + 64*FRACUNIT, // height + 0, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + #ifdef SEENAMES { // MT_NAMECHECK -1, // doomednum diff --git a/src/info.h b/src/info.h index b87f5d73..b35f1b88 100644 --- a/src/info.h +++ b/src/info.h @@ -60,6 +60,7 @@ void A_AttractChase(); // Ring Chase void A_DropMine(); // Drop Mine from Skim or Jetty-Syn Bomber void A_FishJump(); // Fish Jump void A_ThrownRing(); // Sparkle trail for red ring +void A_GrenadeRing(); // SRB2kart void A_SetSolidSteam(); void A_UnsetSolidSteam(); void A_SignPlayer(); @@ -162,6 +163,8 @@ void A_RandomStateRange(); void A_DualAction(); void A_RemoteAction(); void A_ToggleFlameJet(); +void A_RedShellChase(); // SRB2kart +void A_BobombExplode(); // SRB2kart void A_OrbitNights(); void A_GhostMe(); void A_SetObjectState(); @@ -570,6 +573,30 @@ typedef enum sprite SPR_SRBN, SPR_SRBO, + // Springs + SPR_SPRG, // Gray Spring + SPR_BSPR, // Blue Diagonal Spring + + SPR_RNDM, // Random Item Box + SPR_RPOP, // Random Item Box Pop + SPR_KFRE, // Mushroom fire trail + SPR_DRIF, // Drift Sparks + + // Kart Items + SPR_FITE, // Fake Item box + SPR_DFAK, // Dead Fake Item + SPR_BANA, // Banana Peel + SPR_DBAN, // Dead Banana Peel + SPR_GSHE, // Green Shell + SPR_GSTR, // Green Shell Trail + SPR_DGSH, // Dead Green Shell + SPR_RSHE, // Red Shell + SPR_RSTR, // Red Shell Trail + SPR_DRSH, // Dead Red Shell + SPR_BOMB, // Bob-omb + SPR_BLIG, // Blue Lightning + SPR_LIGH, // Lightning + SPR_FIRSTFREESLOT, SPR_LASTFREESLOT = SPR_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, NUMSPRITES @@ -2957,6 +2984,203 @@ typedef enum state S_SRB1_GENREX1, S_SRB1_GENREX2, + // Gray Springs + S_GRAYSPRING, + S_GRAYSPRING2, + S_GRAYSPRING3, + S_GRAYSPRING4, + S_GRAYSPRING5, + + // Blue Diagonal Spring + S_BDIAG1, + S_BDIAG2, + S_BDIAG3, + S_BDIAG4, + S_BDIAG5, + S_BDIAG6, + S_BDIAG7, + S_BDIAG8, + + //{ Random Item Box + S_RANDOMITEM1, + S_RANDOMITEM2, + S_RANDOMITEM3, + S_RANDOMITEM4, + S_RANDOMITEM5, + S_RANDOMITEM6, + S_RANDOMITEM7, + S_RANDOMITEM8, + S_RANDOMITEM9, + S_RANDOMITEM10, + S_RANDOMITEM11, + S_RANDOMITEM12, + S_RANDOMITEM13, + S_RANDOMITEM14, + S_RANDOMITEM15, + S_RANDOMITEM16, + S_RANDOMITEM17, + S_RANDOMITEM18, + S_RANDOMITEM19, + S_RANDOMITEM20, + S_RANDOMITEM21, + S_RANDOMITEM22, + S_RANDOMITEM23, + S_RANDOMITEM24, + + // Random Item Pop + S_RANDOMITEMPOP1, + S_RANDOMITEMPOP2, + S_RANDOMITEMPOP3, + S_RANDOMITEMPOP4, + S_RANDOMITEMPOP5, + //} + + // Drift Sparks + S_DRIFTSPARK1, + S_DRIFTSPARK2, + S_DRIFTSPARK3, + S_DRIFTSPARK4, + S_DRIFTSPARK5, + S_DRIFTSPARK6, + + // Magnet Burst + + // Mushroom Fire Trail + S_KARTFIRE1, + S_KARTFIRE2, + S_KARTFIRE3, + S_KARTFIRE4, + S_KARTFIRE5, + S_KARTFIRE6, + S_KARTFIRE7, + S_KARTFIRE8, + + //{ Fake Item + S_FAKEITEM1, + S_FAKEITEM2, + S_FAKEITEM3, + S_FAKEITEM4, + S_FAKEITEM5, + S_FAKEITEM6, + S_FAKEITEM7, + S_FAKEITEM8, + S_FAKEITEM9, + S_FAKEITEM10, + S_FAKEITEM11, + S_FAKEITEM12, + S_FAKEITEM13, + S_FAKEITEM14, + S_FAKEITEM15, + S_FAKEITEM16, + S_FAKEITEM17, + S_FAKEITEM18, + S_FAKEITEM19, + S_FAKEITEM20, + S_FAKEITEM21, + S_FAKEITEM22, + S_FAKEITEM23, + S_FAKEITEM24, + S_DEADFAKEITEM, + //} + + // Banana + S_BANANAITEM, + S_DEADBANANA, + + //{ Green Shell + S_TRIPLEGREENSHIELD1, + S_TRIPLEGREENSHIELD2, + S_TRIPLEGREENSHIELD3, + S_TRIPLEGREENSHIELD4, + S_TRIPLEGREENSHIELD5, + S_TRIPLEGREENSHIELD6, + S_TRIPLEGREENSHIELD7, + S_TRIPLEGREENSHIELD8, + S_GREENSHIELD1, + S_GREENSHIELD2, + S_GREENSHIELD3, + S_GREENSHIELD4, + S_GREENSHIELD5, + S_GREENSHIELD6, + S_GREENSHIELD7, + S_GREENSHIELD8, + S_GREENITEM1, + S_GREENITEM2, + S_GREENITEM3, + S_GREENITEM4, + S_GREENITEM5, + S_GREENITEM6, + S_GREENITEM7, + S_GREENITEM8, + S_GREENTRAIL1, + S_GREENTRAIL2, + S_GREENTRAIL3, + S_GREENTRAIL4, + S_GREENTRAIL5, + S_GREENTRAIL6, + S_GREENTRAIL7, + S_GREENTRAIL8, + S_GREENTRAIL9, + S_DEADGREEN, + //} + //{ Red Shell + S_TRIPLEREDSHIELD1, + S_TRIPLEREDSHIELD2, + S_TRIPLEREDSHIELD3, + S_TRIPLEREDSHIELD4, + S_TRIPLEREDSHIELD5, + S_TRIPLEREDSHIELD6, + S_TRIPLEREDSHIELD7, + S_TRIPLEREDSHIELD8, + S_REDSHIELD1, + S_REDSHIELD2, + S_REDSHIELD3, + S_REDSHIELD4, + S_REDSHIELD5, + S_REDSHIELD6, + S_REDSHIELD7, + S_REDSHIELD8, + S_REDITEM1, + S_REDITEM2, + S_REDITEM3, + S_REDITEM4, + S_REDITEM5, + S_REDITEM6, + S_REDITEM7, + S_REDITEM8, + S_REDITEMCHASE, + S_REDITEMTRAIL, + S_REDTRAIL1, + S_REDTRAIL2, + S_REDTRAIL3, + S_REDTRAIL4, + S_REDTRAIL5, + S_REDTRAIL6, + S_REDTRAIL7, + S_REDTRAIL8, + S_REDTRAIL9, + S_DEADRED, + //} + + // Bob-omb + S_BOMBSHIELD, + S_BOMBITEM, + S_BOMBAIR, + S_BOMBEXPLODE, + + // Blue Shell - Blue Lightning for now... + S_BLUELIGHTNING1, + S_BLUELIGHTNING2, + S_BLUELIGHTNING3, + S_BLUELIGHTNING4, + S_BLUEEXPLODE, + + // Lightning + S_LIGHTNING1, + S_LIGHTNING2, + S_LIGHTNING3, + S_LIGHTNING4, + #ifdef SEENAMES S_NAMECHECK, #endif @@ -3483,6 +3707,49 @@ typedef enum mobj_type MT_SRB1_METALSONIC, MT_SRB1_GOLDBOT, MT_SRB1_GENREX, + + // SRB2kart + MT_GRAYSPRING, + MT_INVISSPRING, + MT_BLUEDIAG, + MT_RANDOMITEM, + MT_RANDOMITEMPOP, + + MT_MUSHROOMTRAIL, + MT_DRIFT, + + MT_FAKESHIELD, + MT_FAKEITEM, + + MT_TRIPLEBANANASHIELD1, // Banana Stuff + MT_TRIPLEBANANASHIELD2, + MT_TRIPLEBANANASHIELD3, + MT_BANANASHIELD, + MT_BANANAITEM, + + MT_TRIPLEGREENSHIELD1, // Green shell stuff + MT_TRIPLEGREENSHIELD2, + MT_TRIPLEGREENSHIELD3, + MT_GREENSHIELD, + MT_GREENITEM, + MT_GREENTRAIL, + + MT_TRIPLEREDSHIELD1, // Red shell stuff + MT_TRIPLEREDSHIELD2, + MT_TRIPLEREDSHIELD3, + MT_REDSHIELD, + MT_REDITEM, + MT_REDITEMDUD, + MT_REDTRAIL, + + MT_BOMBSHIELD, // Bob-omb stuff + MT_BOMBITEM, + MT_BOMBEXPLOSION, + + MT_BLUELIGHTNING, // Lightning stuff + MT_BLUEEXPLOSION, + MT_LIGHTNING, + #ifdef SEENAMES MT_NAMECHECK, #endif diff --git a/src/k_kart.c b/src/k_kart.c index 60166b60..6159c8be 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -307,25 +307,355 @@ static fixed_t K_KartItemOdds_Retro[MAXPLAYERS][NUMKARTITEMS][MAXPLAYERS] = { // 1 Active Player { //1st // - { 0 }, // Magnet - { 0 }, // Boo - { 40 }, // Mushroom - { 0 }, // Triple Mushroom - { 0 }, // Mega Mushroom - { 0 }, // Gold Mushroom - { 0 }, // Star - { 0 }, // Triple Banana - { 0 }, // Fake Item - { 0 }, // Banana - { 0 }, // Green Shell - { 0 }, // Red Shell - { 0 }, // Triple Green Shell - { 0 }, // Bob-omb - { 0 }, // Blue Shell - { 0 }, // Fire Flower - { 0 }, // Triple Red Shell - { 0 } // Lightning - } //1st // + { 0 }, // Magnet + { 0 }, // Boo + { 40 }, // Mushroom + { 0 }, // Triple Mushroom + { 0 }, // Mega Mushroom + { 0 }, // Gold Mushroom + { 0 }, // Star + { 0 }, // Triple Banana + { 0 }, // Fake Item + { 0 }, // Banana + { 0 }, // Green Shell + { 0 }, // Red Shell + { 0 }, // Triple Green Shell + { 0 }, // Bob-omb + { 0 }, // Blue Shell + { 0 }, // Fire Flower + { 0 }, // Triple Red Shell + { 0 } // Lightning + }, //1st // + + // 2 Active Players + { //1st 2nd // + { 0, 0 }, // Magnet + { 0, 0 }, // Boo + { 0, 0 }, // Mushroom + { 0, 0 }, // Triple Mushroom + { 0, 0 }, // Mega Mushroom + { 0, 0 }, // Gold Mushroom + { 0, 0 }, // Star + { 0, 0 }, // Triple Banana + { 0, 0 }, // Fake Item + { 0, 0 }, // Banana + { 0, 0 }, // Green Shell + { 0, 0 }, // Red Shell + { 0, 0 }, // Triple Green Shell + { 0, 0 }, // Bob-omb + { 0, 0 }, // Blue Shell + { 0, 0 }, // Fire Flower + { 0, 0 }, // Triple Red Shell + { 0, 0 } // Lightning + }, //1st 2nd // + + // 3 Active Players + { //1st 2nd 3rd // + { 0, 0, 0 }, // Magnet + { 0, 0, 0 }, // Boo + { 0, 0, 0 }, // Mushroom + { 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0 }, // Star + { 0, 0, 0 }, // Triple Banana + { 0, 0, 0 }, // Fake Item + { 0, 0, 0 }, // Banana + { 0, 0, 0 }, // Green Shell + { 0, 0, 0 }, // Red Shell + { 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0 }, // Bob-omb + { 0, 0, 0 }, // Blue Shell + { 0, 0, 0 }, // Fire Flower + { 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0 } // Lightning + }, //1st 2nd 3rd // + + // 4 Active Players + { //1st 2nd 3rd 4th // + { 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th // + + // 5 Active Players + { //1st 2nd 3rd 4th 5th // + { 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th // + + // 6 Active Players + { //1st 2nd 3rd 4th 5th 6th // + { 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th // + + // 7 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th // + { 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th // + + // 8 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th // + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th 8th // + + // 9 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th 9th // + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th 8th 9th // + + // 10 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t // + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t // + + // 11 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t // + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t // + + // 12 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t // + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t // + + // 13 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t // + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t // + + // 14 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t 14t // + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t 14t // + + // 15 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t 14t 15t // + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Star + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Lightning + }, //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t 14t 15t // + + // 16 Active Players + { //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t 14t 15t 16t // + { 1, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Magnet + { 0, 2, 4, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Boo + { 0, 4, 6, 8, 10, 9, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0 }, // Mushroom + { 0, 0, 0, 2, 4, 7, 10, 13, 16, 18, 15, 14, 12, 8, 7, 0 }, // Triple Mushroom + { 0, 0, 0, 0, 0, 0, 2, 5, 6, 8, 8, 5, 2, 0, 0, 0 }, // Mega Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 8, 11, 13, 14, 23, 27 }, // Gold Mushroom + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 5, 7, 10, 13 }, // Star + { 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Banana + { 7, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Fake Item + { 15, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Banana + { 10, 8, 6, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Green Shell + { 3, 10, 9, 8, 7, 6, 5, 3, 2, 0, 0, 0, 0, 0, 0, 0 }, // Red Shell + { 0, 0, 2, 4, 5, 8, 7, 5, 3, 2, 0, 0, 0, 0, 0, 0 }, // Triple Green Shell + { 0, 0, 0, 2, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Bob-omb + { 0, 0, 0, 0, 2, 3, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0 }, // Blue Shell + { 0, 0, 0, 0, 0, 0, 3, 5, 6, 4, 2, 0, 0, 0, 0, 0 }, // Fire Flower + { 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 2, 0, 0, 0, 0 }, // Triple Red Shell + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 8, 11, 0, 0 } // Lightning + } //1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10t 11t 12t 13t 14t 15t 16t // }; /** \brief Item Roulette for Kart @@ -415,8 +745,8 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro player->kartstuff[k_itemroulette] = 0; // Since we're done, clear the roulette number - //if (P_IsLocalPlayer(player)) - // S_StartSound(NULL, sfx_mkitemF); + if (P_IsLocalPlayer(player)) + S_StartSound(NULL, sfx_mkitemF); } /** \brief Item Roulette for Kart @@ -429,7 +759,7 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro static void K_KartSetItemResult(fixed_t position, fixed_t giveitem) { prevchance = chance; - basechance = K_KartItemOdds_Retro[pingame][giveitem][position]; // Number of slots in the array, based on odds + basechance = K_KartItemOdds_Retro[pingame][giveitem][position]; // Number of slots in the array, based on odds for (; chance < prevchance + basechance; chance++) { spawnchance[chance] = giveitem; @@ -452,8 +782,8 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) return; // This makes the roulette produce the random noises. - //if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsLocalPlayer(player)) - // S_StartSound(NULL,sfx_mkitem1 + ((player->kartstuff[k_itemroulette] / 3) % 8)); + if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsLocalPlayer(player)) + S_StartSound(NULL,sfx_mkitem1 + ((player->kartstuff[k_itemroulette] / 3) % 8)); // 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. @@ -553,6 +883,10 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) //{ SRB2kart p_user.c Stuff +INT32 bootime = 7*TICRATE; +INT32 mushroomtime = 120; +INT32 bonustime = 700; + /** \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 @@ -563,9 +897,9 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { // This spawns the drift sparks when k_driftcharge hits 30. Its own AI handles life/death and color - //if ((player->kartstuff[k_drift] == 1 || player->kartstuff[k_drift] == -1) - // && player->kartstuff[k_driftcharge] == 30) - // P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_DRIFT)->target = player->mo; + if ((player->kartstuff[k_drift] == 1 || player->kartstuff[k_drift] == -1) + && player->kartstuff[k_driftcharge] == 30) + P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_DRIFT)->target = player->mo; if (player->kartstuff[k_itemclose]) player->kartstuff[k_itemclose]--; @@ -593,8 +927,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_growshrinktimer] == 1 || player->kartstuff[k_growshrinktimer] == -1) { - player->mo->destscale = 100; - //P_RestoreMusic(player); + player->mo->destscale = FRACUNIT; + P_RestoreMusic(player); } if (player->kartstuff[k_bootaketimer] == 0 && player->kartstuff[k_boostolentimer] == 0 @@ -617,9 +951,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_laserwisptimer]) player->kartstuff[k_laserwisptimer]--; + if (player->kartstuff[k_sounds]) + player->kartstuff[k_sounds]--; + // Restores music if too many sounds are playing (?) - if (player->kartstuff[k_sounds] >= 1 && player->kartstuff[k_sounds] < 120) - player->kartstuff[k_sounds] += 1; + //if (player->kartstuff[k_sounds] >= 1 && player->kartstuff[k_sounds] < 120) + // player->kartstuff[k_sounds] += 1; //if (player->kartstuff[k_sounds] < 120 && player->kartstuff[k_sounds] > 116) //&& P_IsLocalPlayer(player)) // P_RestoreMusic(player); @@ -646,14 +983,14 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { if (!P_IsLocalPlayer(player)) // If it isn't the current player { - //if (!S_SoundPlaying(NULL, sfx_star)) // and it isn't still playing - // S_StartSound(player->mo, sfx_star); // play it again + if (!S_SoundPlaying(NULL, sfx_star)) // and it isn't still playing + S_StartSound(player->mo, sfx_star); // play it again } } else if (player->mo->health <= 0 || player->mo->player->kartstuff[k_startimer] <= 0 || player->mo->player->kartstuff[k_growshrinktimer] > 0) // If you don't have invincibility (or mega is active too) { - //if (S_SoundPlaying(player->mo, sfx_star)) // But the sound is playing - // S_StopSoundByID(player->mo, sfx_star); // Stop it + if (S_SoundPlaying(player->mo, sfx_star)) // But the sound is playing + S_StopSoundByID(player->mo, sfx_star); // Stop it } // And now the same for the mega mushroom SFX ~Sryder @@ -661,143 +998,1260 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { if (!P_IsLocalPlayer(player)) // If it isn't the current player { - //if (!S_SoundPlaying(NULL, sfx_mega)) // and it isn't still playing - // S_StartSound(player->mo, sfx_mega); // play it again + if (!S_SoundPlaying(NULL, sfx_mega)) // and it isn't still playing + S_StartSound(player->mo, sfx_mega); // play it again } } else // If you aren't big { - //if (S_SoundPlaying(player->mo, sfx_mega)) // But the sound is playing - // S_StopSoundByID(player->mo, sfx_mega); // Stop it + if (S_SoundPlaying(player->mo, sfx_mega)) // But the sound is playing + S_StopSoundByID(player->mo, sfx_mega); // Stop it } } -boolean P_SpinPlayerMobj(mobj_t *target, mobj_t *source) +void K_PlayTauntSound(mobj_t *source) { - player_t *player; + INT32 prandom; - if (!(target->flags & MF_SHOOTABLE)) - return false; // shouldn't happen... + prandom = P_RandomFixed(); - if (target->health <= 0) + if (prandom <= 63) + S_StartSound(source, sfx_taunt1); + else if (prandom <= 127) + S_StartSound(source, sfx_taunt2); + else if (prandom <= 191) + S_StartSound(source, sfx_taunt3); + else + S_StartSound(source, sfx_taunt4); +} + +boolean K_SpinPlayer(player_t *player, mobj_t *source) +{ + if (player->health <= 0) return false; - if (!target || !target->player) - return false; // Just for players - - player = target->player; - if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootaketimer] > 0) return false; - if (player) + player->kartstuff[k_mushroomtimer] = 0; + + if (player->kartstuff[k_spinouttype] == 0) { - player->kartstuff[k_mushroomtimer] = 0; + player->kartstuff[k_spinouttimer] = 2*TICRATE; - if (player->kartstuff[k_spinouttype] == 0) - { - player->kartstuff[k_spinouttimer] = 2*TICRATE; + if (player->speed < player->normalspeed/4) + P_InstaThrust(player->mo, player->mo->angle, player->normalspeed*FRACUNIT/4); - if (player->speed < player->normalspeed/4) - P_InstaThrust(player->mo, player->mo->angle, player->normalspeed*FRACUNIT/4); - - //S_StartSound(player->mo, sfx_slip); // TODO: add this sound - } - else - player->kartstuff[k_spinouttimer] = 1*TICRATE; - - player->powers[pw_flashing] = flashingtics; - - player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; - - if (!(player->mo->state >= &states[S_KART_SPIN1] && player->mo->state <= &states[S_KART_SPIN8])) // Turning the player seems like a bad way to do it, so we'll use states instead - P_SetPlayerMobjState(player->mo, S_KART_SPIN1); - - player->kartstuff[k_spinouttype] = 0; + S_StartSound(player->mo, sfx_slip); } + else + player->kartstuff[k_spinouttimer] = 1*TICRATE; + + player->powers[pw_flashing] = flashingtics; + + player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; + + if (!(player->mo->state >= &states[S_KART_SPIN1] && player->mo->state <= &states[S_KART_SPIN8])) + P_SetPlayerMobjState(player->mo, S_KART_SPIN1); + + player->kartstuff[k_spinouttype] = 0; + return true; } -boolean P_SquishPlayerMobj(mobj_t *target, mobj_t *source) +boolean K_SquishPlayer(player_t *player, mobj_t *source) { - player_t *player; - - if (!(target->flags & MF_SHOOTABLE)) - return false; // shouldn't happen... - - if (target->health <= 0) + if (player->health <= 0) return false; - if (!target || !target->player) - return false; // Just for players - - player = target->player; - if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootaketimer] > 0) return false; - if (player) - { - player->kartstuff[k_mushroomtimer] = 0; + player->kartstuff[k_mushroomtimer] = 0; - player->kartstuff[k_squishedtimer] = 2*TICRATE; + player->kartstuff[k_squishedtimer] = 2*TICRATE; - player->powers[pw_flashing] = flashingtics; + player->powers[pw_flashing] = flashingtics; - player->mo->flags |= MF_NOCLIP; + player->mo->flags |= MF_NOCLIP; - if (player->mo->state != &states[S_KART_SQUISH]) // Squash - P_SetPlayerMobjState(player->mo, S_KART_SQUISH); + if (player->mo->state != &states[S_KART_SQUISH]) // Squash + P_SetPlayerMobjState(player->mo, S_KART_SQUISH); + + P_PlayRinglossSound(player->mo); - P_PlayRinglossSound(player->mo); - } return true; } -boolean P_ExplodePlayerMobj(mobj_t *target, mobj_t *source) // A bit of a hack, we just throw the player up higher here and extend their spinout timer +boolean K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we just throw the player up higher here and extend their spinout timer { - player_t *player; - - if (!(target->flags & MF_SHOOTABLE)) - return false; // shouldn't happen... - - if (target->health <= 0) + if (player->health <= 0) return false; - if (!target || !target->player) - return false; // Just for players - - player = target->player; - if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] > 0) || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootaketimer] > 0) return false; - if (player) - { - player->mo->momz = 18*FRACUNIT; - player->mo->momx = player->mo->momy = 0; + player->mo->momz = 18*FRACUNIT; + player->mo->momx = player->mo->momy = 0; - player->kartstuff[k_mushroomtimer] = 0; + player->kartstuff[k_mushroomtimer] = 0; - player->kartstuff[k_spinouttype] = 1; - player->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); - player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; + player->kartstuff[k_spinouttype] = 1; + player->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); + player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; - player->powers[pw_flashing] = flashingtics; + player->powers[pw_flashing] = flashingtics; + if (!(player->mo->state >= &states[S_KART_SPIN1] && player->mo->state <= &states[S_KART_SPIN8])) + P_SetPlayerMobjState(player->mo, S_KART_SPIN1); - if (!(player->mo->state >= &states[S_KART_SPIN1] && player->mo->state <= &states[S_KART_SPIN8])) // Turning the player seems like a bad way to do it, so we'll use states instead - P_SetPlayerMobjState(player->mo, S_KART_SPIN1); + player->kartstuff[k_spinouttype] = 0; - player->kartstuff[k_spinouttype] = 0; + P_PlayRinglossSound(player->mo); - P_PlayRinglossSound(player->mo); - } return true; +} +void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit) +{ + mobj_t *mobj; + mobj_t *ghost = NULL; + INT32 i; + TVector v; + TVector *res; + fixed_t finalx, finaly, finalz, dist; + //mobj_t hoopcenter; + angle_t degrees, fa, closestangle; + fixed_t mobjx, mobjy, mobjz; + + //hoopcenter.x = x; + //hoopcenter.y = y; + //hoopcenter.z = z; + + //hoopcenter.z = z - mobjinfo[type].height/2; + + degrees = FINEANGLES/number; + + radius = FixedDiv(radius,5*(FRACUNIT/4)); + + closestangle = 0; + + // Create the hoop! + for (i = 0; i < number; i++) + { + fa = (i*degrees); + v[0] = FixedMul(FINECOSINE(fa),radius); + v[1] = 0; + v[2] = FixedMul(FINESINE(fa),radius); + v[3] = FRACUNIT; + + res = VectorMatrixMultiply(v, *RotateXMatrix(rotangle)); + M_Memcpy(&v, res, sizeof (v)); + res = VectorMatrixMultiply(v, *RotateZMatrix(closestangle)); + M_Memcpy(&v, res, sizeof (v)); + + finalx = x + v[0]; + finaly = y + v[1]; + finalz = z + v[2]; + + mobj = P_SpawnMobj(finalx, finaly, finalz, type); + + mobj->z -= mobj->height>>1; + + // change angle + mobj->angle = R_PointToAngle2(mobj->x, mobj->y, x, y); + + // change slope + dist = P_AproxDistance(P_AproxDistance(x - mobj->x, y - mobj->y), z - mobj->z); + + if (dist < 1) + dist = 1; + + mobjx = mobj->x; + mobjy = mobj->y; + mobjz = mobj->z; + + if (ghostit) + { + ghost = P_SpawnGhostMobj(mobj); + P_SetMobjState(mobj, S_NULL); + mobj = ghost; + } + + mobj->momx = FixedMul(FixedDiv(mobjx - x, dist), 2*FRACUNIT); + mobj->momy = FixedMul(FixedDiv(mobjy - y, dist), 2*FRACUNIT); + mobj->momz = FixedMul(FixedDiv(mobjz - z, dist), 2*FRACUNIT); + + if (spawncenter) + { + mobj->x = x; + mobj->y = y; + mobj->z = z; + } + + mobj->flags |= MF_NOCLIPTHING; + mobj->flags &= ~MF_SPECIAL; + + } +} + +mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle, INT32 flags2, fixed_t speed) +{ + mobj_t *th; + angle_t an; + fixed_t x, y, z; + //INT32 dir; + + // angle at which you fire, is player angle + an = angle; + + //if (source->player->kartstuff[k_throwdir] != 0) + // dir = source->player->kartstuff[k_throwdir]; + //else + // dir = 1; + + x = source->x + source->momx; + y = source->y + source->momy; + z = source->z + source->height/3; + + th = P_SpawnMobj(x, y, z, type); + + th->flags2 |= flags2; + + th->threshold = 10; + +#ifdef WEAPON_SFX + //Since rail and bounce have no thrown objects, this hack is necessary. + //Is creating thrown objects for rail and bounce more or less desirable than this? + if (th->info->seesound && !(th->flags2 & MF2_RAILRING) && !(th->flags2 & MF2_SCATTER)) + S_StartSound(source, th->info->seesound); +#else + if (th->info->seesound) + S_StartSound(source, th->info->seesound); +#endif + + P_SetTarget(&th->target, source); + + th->angle = an; + th->momx = FixedMul(speed, FINECOSINE(an>>ANGLETOFINESHIFT)); + th->momy = FixedMul(speed, FINESINE(an>>ANGLETOFINESHIFT)); + + return NULL; +} + +static mobj_t *P_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, boolean bobombthrow) +{ + mobj_t *mo; + INT32 dir; + angle_t newangle; + fixed_t newx; + fixed_t newy; + + if (!player) + return NULL; + + if (bobombthrow) + { + if (player->kartstuff[k_throwdir] == 1) + dir = 2; + else if (player->kartstuff[k_throwdir] == -1) + dir = -1; + else + dir = 1; + } + else + { + if (player->kartstuff[k_throwdir] != 0) + dir = player->kartstuff[k_throwdir]; + else + dir = defaultDir; + } + + if (missile) + { + if (dir == -1) + { + // Shoot backward + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, 64*FRACUNIT); + + if (mo) + { + if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_VERTICALFLIP; + } + } + else + { + // Shoot forward + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, 64*FRACUNIT); + + if (mo) + { + if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_VERTICALFLIP; + } + } + } + else + { + if (dir == 1 || dir == 2) + { + // Shoot forward + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + 80*FRACUNIT, mapthing); + + mo->threshold = 10; + + P_SetTarget(&mo->target, player->mo); + + if (mo) + { + angle_t fa = player->mo->angle>>ANGLETOFINESHIFT; + int DIST = 50*FRACUNIT + player->speed*FRACUNIT; // 6 when dropping CTF flag + if (DIST > 64*FRACUNIT) + DIST = 64*FRACUNIT; + + int HEIGHT; + + if (dir == 2) + HEIGHT = 16*FRACUNIT + player->mo->momz; + else + HEIGHT = 8*FRACUNIT + player->mo->momz; + + if (HEIGHT > 64*FRACUNIT) + HEIGHT = 64*FRACUNIT; + + mo->momx = FixedMul(FINECOSINE(fa), DIST); + mo->momy = FixedMul(FINESINE(fa), DIST); + mo->momz = HEIGHT; + + if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_VERTICALFLIP; + } + } + else + { + // Drop it directly behind you. + newangle = player->mo->angle; + + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, mapthing); + + mo->threshold = 10; + + P_SetTarget(&mo->target, player->mo); + + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, player->mo->radius*2 + mo->radius*3); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, player->mo->radius*2 + mo->radius*3); + + mo->x = newx; + mo->y = newy; + + if (mo) + { + if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_VERTICALFLIP; + } + } + } + return mo; +} + +static void K_DoBooSteal(player_t * player) +{ + INT32 i, numplayers = 0; + INT32 playerswappable[MAXPLAYERS]; + INT32 stealplayer = 0; // The player that's getting stolen from + INT32 prandom = 0; + + if (!multiplayer) + return; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE + && !players[i].exiting && !players[i].powers[pw_super] && !((netgame || multiplayer) && players[i].spectator) + && players[i].kartstuff[k_position] < player->kartstuff[k_position] && player != &players[i] + + && (players[i].kartstuff[k_star] || players[i].kartstuff[k_mushroom] || players[i].kartstuff[k_goldshroom] + || players[i].kartstuff[k_megashroom] || players[i].kartstuff[k_lightning] || players[i].kartstuff[k_blueshell] + || players[i].kartstuff[k_greenshell] & 2 || players[i].kartstuff[k_triplegreenshell] & 8 + || players[i].kartstuff[k_redshell] & 2 || players[i].kartstuff[k_tripleredshell] & 8 + || players[i].kartstuff[k_banana] & 2 || players[i].kartstuff[k_triplebanana] & 8 + || players[i].kartstuff[k_fakeitem] & 2 || players[i].kartstuff[k_bobomb] & 2 + || players[i].kartstuff[k_boo])) // Stealing boos with boos? sounds like fun + { + playerswappable[numplayers] = i+1; + numplayers++; + } + } + + prandom = P_RandomFixed(); + + if (player->kartstuff[k_position] == 1 || numplayers < 1) // No-one can be stolen from? Get longer invisibility for nothing + { + player->kartstuff[k_bootaketimer] = bootime; + player->kartstuff[k_boo] = 0; + return; + } + else if (numplayers == 1) // With just 2 players, we just need to set the other player to be the one to steal from + { + stealplayer = playerswappable[numplayers - 1]; + } + else if (numplayers > 1) // We need to choose between the available candidates for the 2nd player + { + stealplayer = playerswappable[prandom%(numplayers-1)]; + } + + if (stealplayer) // Now here's where we do the stealing, has to be done here because we still know the player we're stealing from + { + stealplayer -= 1; // stealplayer is +1 so we know if it found there actually WAS a player + + player->kartstuff[k_bootaketimer] = bootime; + player->kartstuff[k_boo] = 0; + players[stealplayer].kartstuff[k_boostolentimer] = bootime; + + if (players[stealplayer].kartstuff[k_star]) + { + player->kartstuff[k_star] = players[stealplayer].kartstuff[k_star]; + players[stealplayer].kartstuff[k_star] = 0; + } + else if (players[stealplayer].kartstuff[k_mushroom]) + { + player->kartstuff[k_mushroom] = players[stealplayer].kartstuff[k_mushroom]; + players[stealplayer].kartstuff[k_mushroom] = 0; + } + else if (players[stealplayer].kartstuff[k_goldshroom]) + { + player->kartstuff[k_goldshroom] = players[stealplayer].kartstuff[k_goldshroom]; + players[stealplayer].kartstuff[k_goldshroom] = 0; + } + else if (players[stealplayer].kartstuff[k_megashroom]) + { + player->kartstuff[k_megashroom] = players[stealplayer].kartstuff[k_megashroom]; + players[stealplayer].kartstuff[k_megashroom] = 0; + } + else if (players[stealplayer].kartstuff[k_lightning]) + { + player->kartstuff[k_lightning] = players[stealplayer].kartstuff[k_lightning]; + players[stealplayer].kartstuff[k_lightning] = 0; + } + else if (players[stealplayer].kartstuff[k_blueshell]) + { + player->kartstuff[k_blueshell] = players[stealplayer].kartstuff[k_blueshell]; + players[stealplayer].kartstuff[k_blueshell] = 0; + } + else if (players[stealplayer].kartstuff[k_greenshell] & 2) + { + player->kartstuff[k_greenshell] |= 2; + players[stealplayer].kartstuff[k_greenshell] &= ~2; + } + else if (players[stealplayer].kartstuff[k_triplegreenshell] & 8) + { + player->kartstuff[k_triplegreenshell] |= 8; + players[stealplayer].kartstuff[k_triplegreenshell] &= ~8; + } + else if (players[stealplayer].kartstuff[k_redshell] & 2) + { + player->kartstuff[k_redshell] |= 2; + players[stealplayer].kartstuff[k_redshell] &= ~2; + } + else if (players[stealplayer].kartstuff[k_tripleredshell] & 8) + { + player->kartstuff[k_tripleredshell] |= 8; + players[stealplayer].kartstuff[k_tripleredshell] &= ~8; + } + else if (players[stealplayer].kartstuff[k_banana] & 2) + { + player->kartstuff[k_banana] |= 2; + players[stealplayer].kartstuff[k_banana] &= ~2; + } + else if (players[stealplayer].kartstuff[k_triplebanana] & 8) + { + player->kartstuff[k_triplebanana] |= 8; + players[stealplayer].kartstuff[k_triplebanana] &= ~8; + } + else if (players[stealplayer].kartstuff[k_fakeitem] & 2) + { + player->kartstuff[k_fakeitem] |= 2; + players[stealplayer].kartstuff[k_fakeitem] &= ~2; + } + else if (players[stealplayer].kartstuff[k_bobomb] & 2) + { + player->kartstuff[k_bobomb] |= 2; + players[stealplayer].kartstuff[k_bobomb] &= ~2; + } + if (players[stealplayer].kartstuff[k_boo]) + { + player->kartstuff[k_boo] = players[stealplayer].kartstuff[k_boo]; + players[stealplayer].kartstuff[k_boo] = 0; + } + } +} + +void K_DoMushroom(player_t *player, boolean doPFlag) +{ + S_StartSound(player->mo, sfx_mush); + player->kartstuff[k_mushroomtimer] = mushroomtime; + + if (doPFlag) + player->pflags |= PF_ATTACKDOWN; + + if (player->kartstuff[k_sounds]) // Prevents taunt sounds from playing every time the button is pressed + return; + + K_PlayTauntSound(player->mo); + player->kartstuff[k_sounds] = 70; +} + +void K_DoLightning(player_t *player, boolean bluelightning) +{ + INT32 i; + S_StartSound(player->mo, sfx_bkpoof); // Sound the BANG! + K_PlayTauntSound(player->mo); + player->pflags |= PF_ATTACKDOWN; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (playeringame[i]) + P_FlashPal(&players[i], PAL_NUKE, 10); + + if (bluelightning) + P_DamageMobj(players[i].mo, player->mo, player->mo, bluelightning ? 65 : 64); + } + + if (player->kartstuff[k_sounds]) // Prevents taunt sounds from playing every time the button is pressed + return; + + K_PlayTauntSound(player->mo); + player->kartstuff[k_sounds] = 70; +} + +void K_MoveKartPlayer(player_t *player, boolean onground) +{ + ticcmd_t *cmd; + + cmd = &player->cmd; + + boolean ATTACK_IS_DOWN = ((cmd->buttons & BT_ATTACK) && !(player->pflags & PF_ATTACKDOWN)); + boolean HOLDING_ITEM = (player->kartstuff[k_greenshell] == 1 || player->kartstuff[k_redshell] == 1 + || player->kartstuff[k_banana] == 1 || player->kartstuff[k_fakeitem] == 1 || player->kartstuff[k_bobomb] == 1 + || player->kartstuff[k_triplegreenshell] & 1 || player->kartstuff[k_triplegreenshell] & 2 || player->kartstuff[k_triplegreenshell] & 4 + || player->kartstuff[k_tripleredshell] & 1 || player->kartstuff[k_tripleredshell] & 2 || player->kartstuff[k_tripleredshell] & 4 + || player->kartstuff[k_triplebanana] & 1 || player->kartstuff[k_triplebanana] & 2 || player->kartstuff[k_triplebanana] & 4); + boolean NO_BOO = (player->kartstuff[k_boostolentimer] == 0 && player->kartstuff[k_bootaketimer] == 0); + + if (!(cmd->buttons & BT_ATTACK)) + player->pflags |= PF_ATTACKDOWN; + if (player && player->health > 0 && !player->spectator && !player->exiting && player->kartstuff[k_introcam] < 2 && player->kartstuff[k_spinouttimer] == 0) + { + // GoldenMushroom power + if (ATTACK_IS_DOWN && !HOLDING_ITEM && onground && player->kartstuff[k_goldshroom] == 1 && player->kartstuff[k_goldshroomtimer] == 0 && NO_BOO) + { + K_DoMushroom(player, true); + player->kartstuff[k_goldshroomtimer] = bonustime; + player->kartstuff[k_goldshroom] = 0; + } + // GoldenMushroom power + else if (ATTACK_IS_DOWN && player->kartstuff[k_goldshroomtimer] > 1 && onground && NO_BOO) + { + K_DoMushroom(player, true); + player->kartstuff[k_goldshroomtimer] -= 5; + if (player->kartstuff[k_goldshroomtimer] < 1) + player->kartstuff[k_goldshroomtimer] = 1; + } + // TripleMushroom power + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_mushroom] == 4 && onground && NO_BOO) + { + K_DoMushroom(player, true); + player->kartstuff[k_mushroom] = 2; + } + // DoubleMushroom power + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_mushroom] == 2 && onground && NO_BOO) + { + K_DoMushroom(player, true); + player->kartstuff[k_mushroom] = 1; + } + // Mushroom power + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_mushroom] == 1 && onground && NO_BOO) + { + K_DoMushroom(player, true); + player->kartstuff[k_mushroom] = 0; + } + // Star power + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_star] == 1 && NO_BOO) + { + if (P_IsLocalPlayer(player) && !player->exiting) + S_ChangeMusicInternal("minvnc", true); + if (!P_IsLocalPlayer(player)) + S_StartSound(player->mo, sfx_star); + player->kartstuff[k_startimer] = bonustime; // Activate it + K_PlayTauntSound(player->mo); + player->kartstuff[k_star] = 0; + player->kartstuff[k_itemclose] = 10; + player->pflags |= PF_ATTACKDOWN; + } + // Green Shell + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_greenshell] & 2 && NO_BOO) + { + angle_t newangle; + fixed_t newx; + fixed_t newy; + mobj_t *mo; + player->kartstuff[k_greenshell] &= ~2; + player->kartstuff[k_greenshell] |= 1; + player->pflags |= PF_ATTACKDOWN; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + mo = P_SpawnMobj(newx, newy, player->mo->z, MT_GREENSHIELD); + mo->threshold = 10; + if (mo) + P_SetTarget(&mo->target, player->mo); + player->kartstuff[k_itemclose] = 10; + } + else if (!(cmd->buttons & BT_ATTACK) && player->kartstuff[k_greenshell] & 1) + { + player->kartstuff[k_greenshell] &= ~1; + + P_ThrowKartItem(player, true, MT_GREENITEM, 1, false); + K_PlayTauntSound(player->mo); + + } + // Triple Green Shell + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_triplegreenshell] & 8 && NO_BOO) + { + angle_t newangle; + fixed_t newx; + fixed_t newy; + mobj_t *mo, *mo2, *mo3; + player->kartstuff[k_triplegreenshell] &= ~8; + player->kartstuff[k_triplegreenshell] |= 7; + player->pflags |= PF_ATTACKDOWN; + newangle = player->mo->angle; + K_PlayTauntSound(player->mo); + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + mo = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEGREENSHIELD1); + mo->threshold = 10; + P_SetTarget(&mo->target, player->mo); + mo->angle = 0; + mo2 = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEGREENSHIELD2); + mo2->threshold = 10; + P_SetTarget(&mo2->target, player->mo); + mo2->angle = ANGLE_120; + mo3 = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEGREENSHIELD3); + mo3->threshold = 10; + P_SetTarget(&mo3->target, player->mo); + mo3->angle = ANGLE_240; + player->kartstuff[k_itemclose] = 10; + } + else if (ATTACK_IS_DOWN && (player->kartstuff[k_triplegreenshell] & 1 || player->kartstuff[k_triplegreenshell] & 2 || player->kartstuff[k_triplegreenshell] & 4)) + { + P_ThrowKartItem(player, true, MT_GREENITEM, 1, false); + K_PlayTauntSound(player->mo); + player->pflags |= PF_ATTACKDOWN; + + if (player->kartstuff[k_triplegreenshell] & 4) + player->kartstuff[k_triplegreenshell] &= ~4; + else if (player->kartstuff[k_triplegreenshell] & 2) + player->kartstuff[k_triplegreenshell] &= ~2; + else if (player->kartstuff[k_triplegreenshell] & 1) + player->kartstuff[k_triplegreenshell] &= ~1; + + } + // Red Shell + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_redshell] & 2 && NO_BOO) + { + angle_t newangle; + fixed_t newx; + fixed_t newy; + mobj_t *mo; + player->kartstuff[k_redshell] &= ~2; + player->kartstuff[k_redshell] |= 1; + player->pflags |= PF_ATTACKDOWN; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + mo = P_SpawnMobj(newx, newy, player->mo->z, MT_REDSHIELD); + mo->threshold = 10; + if (mo) + P_SetTarget(&mo->target, player->mo); + player->kartstuff[k_itemclose] = 10; + } + else if (!(cmd->buttons & BT_ATTACK) && player->kartstuff[k_redshell] & 1 && (player->kartstuff[k_throwdir] == 1 || player->kartstuff[k_throwdir] == 0)) + { + player->kartstuff[k_redshell] &= ~1; + + P_ThrowKartItem(player, true, MT_REDITEM, 1, false); + K_PlayTauntSound(player->mo); + } + // Red Shell Dud + else if (!(cmd->buttons & BT_ATTACK) && player->kartstuff[k_redshell] & 1 && player->kartstuff[k_throwdir] == -1) + { + player->kartstuff[k_redshell] &= ~1; + + P_ThrowKartItem(player, true, MT_REDITEMDUD, -1, false); + K_PlayTauntSound(player->mo); + } + // Triple Red Shell + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_tripleredshell] & 8 && NO_BOO) + { + angle_t newangle; + fixed_t newx; + fixed_t newy; + mobj_t *mo, *mo2, *mo3; + player->kartstuff[k_tripleredshell] &= ~8; + player->kartstuff[k_tripleredshell] |= 7; + player->pflags |= PF_ATTACKDOWN; + newangle = player->mo->angle; + K_PlayTauntSound(player->mo); + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + mo = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEREDSHIELD1); + mo->threshold = 10; + P_SetTarget(&mo->target, player->mo); + mo->angle = 0; + mo2 = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEREDSHIELD2); + mo2->threshold = 10; + P_SetTarget(&mo2->target, player->mo); + mo2->angle = ANGLE_120; + mo3 = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEREDSHIELD3); + mo3->threshold = 10; + P_SetTarget(&mo3->target, player->mo); + mo3->angle = ANGLE_240; + player->kartstuff[k_itemclose] = 10; + } + else if (ATTACK_IS_DOWN && (player->kartstuff[k_tripleredshell] & 1 || player->kartstuff[k_tripleredshell] & 2 || player->kartstuff[k_tripleredshell] & 4) + && (player->kartstuff[k_throwdir] == 1 || player->kartstuff[k_throwdir] == 0)) + { + P_ThrowKartItem(player, true, MT_REDITEM, 1, false); + K_PlayTauntSound(player->mo); + player->pflags |= PF_ATTACKDOWN; + if (player->kartstuff[k_tripleredshell] & 4) + player->kartstuff[k_tripleredshell] &= ~4; + else if (player->kartstuff[k_tripleredshell] & 2) + player->kartstuff[k_tripleredshell] &= ~2; + else if (player->kartstuff[k_tripleredshell] & 1) + player->kartstuff[k_tripleredshell] &= ~1; + } + else if (ATTACK_IS_DOWN && (player->kartstuff[k_tripleredshell] & 1 || player->kartstuff[k_tripleredshell] & 2 || player->kartstuff[k_tripleredshell] & 4) + && player->kartstuff[k_throwdir] == -1) + { + P_ThrowKartItem(player, true, MT_REDITEMDUD, -1, false); + K_PlayTauntSound(player->mo); + player->pflags |= PF_ATTACKDOWN; + if (player->kartstuff[k_tripleredshell] & 4) + player->kartstuff[k_tripleredshell] &= ~4; + else if (player->kartstuff[k_tripleredshell] & 2) + player->kartstuff[k_tripleredshell] &= ~2; + else if (player->kartstuff[k_tripleredshell] & 1) + player->kartstuff[k_tripleredshell] &= ~1; + } + // Banana Peel + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_banana] & 2 && NO_BOO) + { + angle_t newangle; + fixed_t newx; + fixed_t newy; + mobj_t *mo; + player->kartstuff[k_banana] &= ~2; + player->kartstuff[k_banana] |= 1; + player->pflags |= PF_ATTACKDOWN; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + mo = P_SpawnMobj(newx, newy, player->mo->z, MT_BANANASHIELD); + mo->threshold = 10; + if (mo) + P_SetTarget(&mo->target, player->mo); + player->kartstuff[k_itemclose] = 10; + } + else if (!(cmd->buttons & BT_ATTACK) && player->kartstuff[k_banana] & 1) + { + P_ThrowKartItem(player, false, MT_BANANAITEM, -1, false); + K_PlayTauntSound(player->mo); + player->kartstuff[k_banana] &= ~1; + } + // Triple Banana Peel + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_triplebanana] & 8 && NO_BOO) + { + angle_t newangle; + fixed_t newx; + fixed_t newy; + mobj_t *mo, *mo2, *mo3; + K_PlayTauntSound(player->mo); + player->kartstuff[k_triplebanana] &= ~8; + player->kartstuff[k_triplebanana] |= 7; + player->pflags |= PF_ATTACKDOWN; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + mo = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEBANANASHIELD1); + mo->threshold = 10; + if (mo) { + P_SetTarget(&mo->target, player->mo); + mo->angle = 0; } + mo2 = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEBANANASHIELD2); + mo2->threshold = 10; + if (mo2) { + P_SetTarget(&mo2->target, player->mo); + mo2->angle = ANGLE_135; } + mo3 = P_SpawnMobj(newx, newy, player->mo->z, MT_TRIPLEBANANASHIELD3); + mo3->threshold = 10; + if (mo3) { + P_SetTarget(&mo3->target, player->mo); + mo3->angle = ANGLE_225; } + player->kartstuff[k_itemclose] = 10; + } + else if (ATTACK_IS_DOWN && (player->kartstuff[k_triplebanana] & 1 || player->kartstuff[k_triplebanana] & 2 || player->kartstuff[k_triplebanana] & 4)) + { + P_ThrowKartItem(player, false, MT_BANANAITEM, -1,false ); + K_PlayTauntSound(player->mo); + player->pflags |= PF_ATTACKDOWN; + if (player->kartstuff[k_triplebanana] & 4) + player->kartstuff[k_triplebanana] &= ~4; + else if (player->kartstuff[k_triplebanana] & 2) + player->kartstuff[k_triplebanana] &= ~2; + else if (player->kartstuff[k_triplebanana] & 1) + player->kartstuff[k_triplebanana] &= ~1; + } + // Fake Itembox + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_fakeitem] & 2 && NO_BOO) + { + angle_t newangle; + fixed_t newx; + fixed_t newy; + mobj_t *mo; + player->kartstuff[k_fakeitem] &= ~2; + player->kartstuff[k_fakeitem] |= 1; + player->pflags |= PF_ATTACKDOWN; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + mo = P_SpawnMobj(newx, newy, player->mo->z, MT_FAKESHIELD); + mo->threshold = 10; + if (mo) + P_SetTarget(&mo->target, player->mo); + player->kartstuff[k_itemclose] = 10; + } + else if (!(cmd->buttons & BT_ATTACK) && player->kartstuff[k_fakeitem] & 1) + { + P_ThrowKartItem(player, false, MT_FAKEITEM, -1, false); + K_PlayTauntSound(player->mo); + player->kartstuff[k_fakeitem] &= ~1; + } + // Bomb + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_bobomb] & 2 && NO_BOO) + { + angle_t newangle; + fixed_t newx; + fixed_t newy; + mobj_t *mo; + player->kartstuff[k_bobomb] &= ~2; + player->kartstuff[k_bobomb] |= 1; + player->pflags |= PF_ATTACKDOWN; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT); + mo = P_SpawnMobj(newx, newy, player->mo->z, MT_BOMBSHIELD); + mo->threshold = 10; + if (mo) + P_SetTarget(&mo->target, player->mo); + player->kartstuff[k_itemclose] = 10; + } + if (!(cmd->buttons & BT_ATTACK) && player->kartstuff[k_bobomb] & 1) + { + P_ThrowKartItem(player, false, MT_BOMBITEM, 1, true); + K_PlayTauntSound(player->mo); + player->kartstuff[k_bobomb] &= ~1; + } + // Thunder + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_lightning] == 1 && NO_BOO) + { + K_DoLightning(player, false); + player->kartstuff[k_lightning] = 0; + player->kartstuff[k_itemclose] = 10; + } + // Blue Shell + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_blueshell] == 1 && NO_BOO) + { + K_DoLightning(player, true); + player->kartstuff[k_blueshell] = 0; + player->kartstuff[k_itemclose] = 10; + } + // Mega Mushroom + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_megashroom] == 1 && NO_BOO) + { + if (P_IsLocalPlayer(player) && !player->exiting) + S_ChangeMusicInternal("mega", true); + if (!P_IsLocalPlayer(player)) + S_StartSound(player->mo, sfx_mega); + K_PlayTauntSound(player->mo); + player->kartstuff[k_growshrinktimer] = bonustime; + player->mo->destscale = FRACUNIT*3/2; + S_StartSound(player->mo, sfx_mario3); + player->pflags |= PF_ATTACKDOWN; + player->kartstuff[k_megashroom] = 0; + player->kartstuff[k_itemclose] = 10; + } + // Boo + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_boo] == 1 && NO_BOO) + { + K_DoBooSteal(player); + player->pflags |= PF_ATTACKDOWN; + player->kartstuff[k_boo] = 0; + } + + if (player->kartstuff[k_mushroomtimer] > 0 && player->kartstuff[k_boosting] == 0 && onground) + { + cmd->forwardmove = 1; + if (player->kartstuff[k_drift] == 1) + P_InstaThrust(player->mo, player->mo->angle+ANGLE_45, 55*FRACUNIT); + else if (player->kartstuff[k_drift] == -1) + P_InstaThrust(player->mo, player->mo->angle-ANGLE_45, 55*FRACUNIT); + else + P_InstaThrust(player->mo, player->mo->angle, 55*FRACUNIT); + player->kartstuff[k_boosting] = 1; + } + else if (player->kartstuff[k_mushroomtimer] == 0 && player->kartstuff[k_boosting] == 1) + player->kartstuff[k_boosting] = 0; + + if (player->kartstuff[k_bootaketimer] > 0) + { + if ((player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) + || (!(player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) + && (player->kartstuff[k_bootaketimer] < 1*TICRATE/2 || player->kartstuff[k_bootaketimer] > bootime-(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_bootaketimer]; // We'll do this for now, let's people know about the invisible people through subtle hints + } + else if (player->kartstuff[k_bootaketimer] == 0) + { + player->mo->flags2 &= ~MF2_DONTDRAW; + } + } + + if (player->kartstuff[k_growshrinktimer] > 1) + player->powers[pw_flashing] = 2; + + // Friction + if (player->speed > 0 && cmd->forwardmove == 0 && player->mo->friction == 59392) + player->mo->friction += 4608; + if (player->speed > 0 && cmd->forwardmove < 0 && player->mo->friction == 59392) + player->mo->friction += 1608; + + // Splitscreen camera + if (splitscreen && player == &players[consoleplayer]) + CV_SetValue(&cv_cam_dist, 190); + if (splitscreen && player == &players[secondarydisplayplayer]) + CV_SetValue(&cv_cam2_dist, 190); + + // DRRRRIIIIFFFFFFTTT!!!! + // Drifting is actually straffing + automatic turning. + // Holding the Jump button will enable drifting. + + // Instead of instantly straffing, you go from running + // straight to slowly turning left/right. + // 536870912 is the normal straffing angle, 90 degrees. + // 35791394 is the speed that's added from 0 to 90. + + // localangle is SRB2's turning code, not angle direction. + // Adding or subtracting by 300 is how much you can turn. + // The higher it is, the faster you turn. + + if (cmd->buttons & BT_DRIFTRIGHT) + player->kartstuff[k_turndir] = 1; + else if (cmd->buttons & BT_DRIFTLEFT) + player->kartstuff[k_turndir] = -1; + else + player->kartstuff[k_turndir] = 0; + + // Moved here so you can't "chain" drifts + // Drift Release + if (((player->kartstuff[k_drift] == 0) || (player->kartstuff[k_drift] == 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] == -1 && player->kartstuff[k_turndir] != -1)) + && player->kartstuff[k_driftcharge] < 30 + && onground) + { + player->kartstuff[k_drift] = 0; + player->kartstuff[k_driftcharge] = 0; + } + else if (((player->kartstuff[k_drift] == 0) || (player->kartstuff[k_drift] == 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] == -1 && player->kartstuff[k_turndir] != -1)) + && (player->kartstuff[k_driftcharge] >= 30 && player->kartstuff[k_driftcharge] < 60) + && onground) + { + player->powers[pw_sneakers] += 16 + (player->acceleration-34); + S_StartSound(player->mo, sfx_mush); + player->kartstuff[k_drift] = 0; + player->kartstuff[k_driftcharge] = 0; + } + else if (((player->kartstuff[k_drift] == 0) || (player->kartstuff[k_drift] == 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] == -1 && player->kartstuff[k_turndir] != -1)) + && player->kartstuff[k_driftcharge] >= 60 + && onground) + { + player->powers[pw_sneakers] += 36 + (player->acceleration-34); + S_StartSound(player->mo, sfx_mush); + player->kartstuff[k_drift] = 0; + player->kartstuff[k_driftcharge] = 0; + } + + if (player->kartstuff[k_turndir] == 1 && player->speed > 10 + && player->kartstuff[k_jmp] == 1 + && player->kartstuff[k_drift] != 1) + player->kartstuff[k_drift] = 1; + else if (player->kartstuff[k_turndir] == -1 && player->speed > 10 + && player->kartstuff[k_jmp] == 1 + && player->kartstuff[k_drift] != -1) + player->kartstuff[k_drift] = -1; + else if (player->kartstuff[k_jmp] == 0 || player->kartstuff[k_turndir] == 0) + player->kartstuff[k_drift] = 0; + + /* + if (cmd->forwardmove == 0) + player->powers[pw_exspeed]--; + + if (cmd->forwardmove > 0) + player->powers[pw_exspeed]++; + */ + + // If you press any strafe key while turning right, then drift right. + if (player->kartstuff[k_introcam] < 2 && player->kartstuff[k_spinouttimer] == 0 + && player->kartstuff[k_jmp] == 1 && (player->kartstuff[k_drift] == 1 || player->kartstuff[k_drift] == -1) + && onground) //Right + { + player->kartstuff[k_driftcharge]++; + } + // Stop drifting + if (player->kartstuff[k_spinouttimer] > 0 // banana peel + || player->speed < 10) // you're too slow! + { + player->kartstuff[k_drift] = 0; + player->kartstuff[k_driftcharge] = 0; + } + + // Quick Turning + // You can't turn your kart when you're not moving. + // So now it's time to burn some rubber! + if (player->kartstuff[k_introcam] < 2 && player->speed < 2 && leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE) + { + if (player->kartstuff[k_turndir]) + player->kartstuff[k_drift] = 1; + if (leveltime % 20 == 0 && player->kartstuff[k_drift]) + S_StartSound(player->mo, sfx_mkslid); + + if (player == &players[consoleplayer] && player->kartstuff[k_turndir] == 1) + localangle -= 800*FRACUNIT; + if (player == &players[consoleplayer] && player->kartstuff[k_turndir] == -1) + localangle += 800*FRACUNIT; + + if (splitscreen && player == &players[secondarydisplayplayer] + && player->kartstuff[k_turndir] == 1) + localangle2 -= 800*FRACUNIT; + if (splitscreen && player == &players[secondarydisplayplayer] + && player->kartstuff[k_turndir] == -1) + localangle2 += 800*FRACUNIT; + } + + // Squishing + // If a Mega Mushroom or a Thwomp crushes you, get flattened instead of being killed. + + if (player->kartstuff[k_squishedtimer] <= 0) + { + player->mo->flags &= ~MF_NOCLIP; + } + else + { + player->mo->flags |= MF_NOCLIP; + player->mo->momx = 0; + player->mo->momy = 0; + } + + /////////////////////// + //LAKITU START SIGNAL// + /////////////////////// + + // Spawn at the beggining of the level, + // not joiner-friendly. + /* + if (leveltime == 3) + { + mobj_t *mo; + angle_t newangle; + fixed_t newx; + fixed_t newy; + fixed_t newz; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 128*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 128*FRACUNIT); + if (player->mo->eflags & MFE_VERTICALFLIP) + newz = player->mo->z - 320*FRACUNIT; + else + newz = player->mo->z + 256*FRACUNIT; + mo = P_SpawnMobj(newx, newy, newz, MT_LAKITU); + if (mo) + { + if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_VERTICALFLIP; + P_SetTarget(&mo->target, player->mo); + } + } + */ + player->kartstuff[k_boostcharge] = 0; + + // Play the stop light's sounds + if ((leveltime == (TICRATE-4)*2) || (leveltime == (TICRATE-2)*3)) + S_StartSound(NULL, sfx_lkt1); + if (leveltime == (TICRATE)*4) + S_StartSound(NULL, sfx_lkt2); + // Start charging once you're given the opportunity. + if (leveltime >= 70 && leveltime <= 140 && cmd->buttons & BT_ACCELERATE && leveltime % 5 == 0) + player->kartstuff[k_boostcharge]++; + if (leveltime >= 70 && leveltime <= 140 && !(cmd->buttons & BT_ACCELERATE)) + player->kartstuff[k_boostcharge] = 0; + // Increase your size while charging your engine. + if (leveltime < 150) + player->mo->destscale = FRACUNIT*((100 + player->kartstuff[k_boostcharge])/100); + + // Determine the outcome of your charge. + if (leveltime > 140 && player->kartstuff[k_boostcharge]) + { + // Get an instant boost! + if (player->kartstuff[k_boostcharge] >= 7 && player->kartstuff[k_boostcharge] <= 10) + { + K_DoMushroom(player, false); + } + // You overcharged your engine? Those things are expensive!!! + if (player->kartstuff[k_boostcharge] > 10) + player->kartstuff[k_boostcharge] = 40; + + player->kartstuff[k_boostcharge] = 0; + } + + ////////////////// + //FISHING LAKITU// + ////////////////// + + // If you die and respawn in Mario Kart, have Lakitu fish you back in. + /* + if (player->airtime == 60) + { + mobj_t *mo; + angle_t newangle; + fixed_t newx; + fixed_t newy; + fixed_t newz; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 0); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 0); + if (player->mo->eflags & MFE_VERTICALFLIP) + newz = player->mo->z - 128*FRACUNIT; + else + newz = player->mo->z + 64*FRACUNIT; + mo = P_SpawnMobj(newx, newy, newz, MT_LAKITU); + if (mo) + { + if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_VERTICALFLIP; + mo->angle = newangle+ANGLE_180; + P_SetTarget(&mo->target, player->mo); + P_SetMobjState(mo, S_LAKITUFSH1); + } + } + */ + if (player->kartstuff[k_lakitu] > 3) + { + player->kartstuff[k_lakitu]--; + player->mo->momz = 0; + player->powers[pw_flashing] = 2; + player->powers[pw_nocontrol] = 2; + if (leveltime % 15 == 0) + S_StartSound(player->mo, sfx_lkt3); + } + // That's enough pointless fishing for now. + if (player->kartstuff[k_lakitu] > 0 && player->kartstuff[k_lakitu] <= 3) + { + if (!onground) + { + player->powers[pw_flashing] = 2; + // If you tried to boost while in the air, + // you lose your chance of boosting at all. + if (cmd->buttons & BT_ACCELERATE) + { + player->powers[pw_flashing] = 0; + player->kartstuff[k_lakitu] = 0; + } + } + else + { + player->kartstuff[k_lakitu]--; + // Quick! You only have three tics to boost! + if (cmd->buttons & BT_ACCELERATE) + { + K_DoMushroom(player, false); + } + } + } + + ////////////////// + //NEW LAP LAKITU// + ////////////////// + + /* + if (player->kartstuff[k_lakitu] == -60) + { + mobj_t *mo; + angle_t newangle; + fixed_t newx; + fixed_t newy; + fixed_t newz; + newangle = player->mo->angle; + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 128*FRACUNIT); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 128*FRACUNIT); + if (player->mo->eflags & MFE_VERTICALFLIP) + newz = player->mo->z - 320*FRACUNIT; + else + newz = player->mo->z + 256*FRACUNIT; + mo = P_SpawnMobj(newx, newy, newz, MT_LAKITU); + if (mo) + { + P_SetTarget(&mo->target, player->mo); + if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_VERTICALFLIP; + + if (player->laps < (unsigned)(cv_numlaps.value - 1)) + { + if (player->laps == 1) + P_SetMobjState(mo, S_LAKITULAP1A); + if (player->laps == 2) + P_SetMobjState(mo, S_LAKITULAP2A); + if (player->laps == 3) + P_SetMobjState(mo, S_LAKITULAP3A); + if (player->laps == 4) + P_SetMobjState(mo, S_LAKITULAP4A); + if (player->laps == 5) + P_SetMobjState(mo, S_LAKITULAP5A); + if (player->laps == 6) + P_SetMobjState(mo, S_LAKITULAP6A); + if (player->laps == 7) + P_SetMobjState(mo, S_LAKITULAP7A); + if (player->laps == 8) + P_SetMobjState(mo, S_LAKITULAP8A); + } + else if (player->laps == (unsigned)(cv_numlaps.value - 1)) + P_SetMobjState(mo, S_LAKITULAPFA); + } + } + */ + if (player->kartstuff[k_lakitu] < 0) + player->kartstuff[k_lakitu]++; } //} @@ -1569,7 +3023,8 @@ void K_drawKartHUD(void) V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), 0, va("%d/%d", stplyr->laps+1, cv_numlaps.value)); // Draw the numerical position - K_DrawKartPositionNum(stplyr->kartstuff[k_position]); + K_DrawKartPositionNum(stplyr->kartstuff[k_spinout]); + //K_DrawKartPositionNum(stplyr->kartstuff[k_position]); // Why is this here????? /* diff --git a/src/k_kart.h b/src/k_kart.h index f2ee8bab..595456db 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -16,9 +16,11 @@ UINT8 K_GetKartColorByName(const char *name); void K_RegisterKartStuff(void); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); -boolean P_SpinPlayerMobj(mobj_t *target, mobj_t *source); -boolean P_SquishPlayerMobj(mobj_t *target, mobj_t *source); -boolean P_ExplodePlayerMobj(mobj_t *target, mobj_t *source); +boolean K_SpinPlayer(player_t *player, mobj_t *source); +boolean K_SquishPlayer(player_t *player, mobj_t *source); +boolean K_ExplodePlayer(player_t *player, mobj_t *source); +void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit); +void K_MoveKartPlayer(player_t *player, boolean onground); void K_LoadKartHUDGraphics(void); void K_drawKartHUD(void); diff --git a/src/m_cheat.c b/src/m_cheat.c index ee4ff193..9e38d974 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -968,7 +968,7 @@ void OP_NightsObjectplace(player_t *player) if (player->pflags & PF_ATTACKDOWN) { // Are ANY objectplace buttons pressed? If no, remove flag. - if (!(cmd->buttons & (BT_ATTACK|BT_TOSSFLAG|BT_USE|BT_CAMRIGHT|BT_CAMLEFT))) + if (!(cmd->buttons & (BT_ATTACK|BT_ACCELERATE|BT_BRAKE|BT_FORWARD|BT_BACKWARD))) player->pflags &= ~PF_ATTACKDOWN; // Do nothing. @@ -1008,7 +1008,7 @@ void OP_NightsObjectplace(player_t *player) } // This places a bumper! - if (cmd->buttons & BT_TOSSFLAG) + if (cmd->buttons & BT_SPECTATE) { player->pflags |= PF_ATTACKDOWN; if (!OP_HeightOkay(player, false)) @@ -1019,7 +1019,7 @@ void OP_NightsObjectplace(player_t *player) } // This places a ring! - if (cmd->buttons & BT_CAMRIGHT) + if (cmd->buttons & BT_BACKWARD) { player->pflags |= PF_ATTACKDOWN; if (!OP_HeightOkay(player, false)) @@ -1030,7 +1030,7 @@ void OP_NightsObjectplace(player_t *player) } // This places a wing item! - if (cmd->buttons & BT_CAMLEFT) + if (cmd->buttons & BT_FORWARD) { player->pflags |= PF_ATTACKDOWN; if (!OP_HeightOkay(player, false)) @@ -1041,7 +1041,7 @@ void OP_NightsObjectplace(player_t *player) } // This places a custom object as defined in the console cv_mapthingnum. - if (cmd->buttons & BT_USE) + if (cmd->buttons & BT_BRAKE) { UINT16 angle; @@ -1101,7 +1101,7 @@ void OP_ObjectplaceMovement(player_t *player) if (cmd->buttons & BT_JUMP) player->mo->z += FRACUNIT*cv_speed.value; - else if (cmd->buttons & BT_USE) + else if (cmd->buttons & BT_BRAKE) player->mo->z -= FRACUNIT*cv_speed.value; if (cmd->forwardmove != 0) @@ -1165,19 +1165,19 @@ void OP_ObjectplaceMovement(player_t *player) if (player->pflags & PF_ATTACKDOWN) { // Are ANY objectplace buttons pressed? If no, remove flag. - if (!(cmd->buttons & (BT_ATTACK|BT_TOSSFLAG|BT_CAMRIGHT|BT_CAMLEFT))) + if (!(cmd->buttons & (BT_ATTACK|BT_SPECTATE|BT_BACKWARD|BT_FORWARD))) player->pflags &= ~PF_ATTACKDOWN; // Do nothing. return; } - if (cmd->buttons & BT_CAMLEFT) + if (cmd->buttons & BT_FORWARD) { OP_CycleThings(-1); player->pflags |= PF_ATTACKDOWN; } - else if (cmd->buttons & BT_CAMRIGHT) + else if (cmd->buttons & BT_BACKWARD) { OP_CycleThings(1); player->pflags |= PF_ATTACKDOWN; diff --git a/src/m_menu.c b/src/m_menu.c index dd7d142a..2b623651 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1039,7 +1039,7 @@ static menuitem_t OP_MoveControlsMenu[] = {IT_CALL | IT_STRING2, NULL, "Turn Left", M_ChangeControl, gc_turnleft }, {IT_CALL | IT_STRING2, NULL, "Turn Right", M_ChangeControl, gc_turnright }, {IT_CALL | IT_STRING2, NULL, "Jump", M_ChangeControl, gc_jump }, - {IT_CALL | IT_STRING2, NULL, "Spin", M_ChangeControl, gc_use }, + {IT_CALL | IT_STRING2, NULL, "Brake", M_ChangeControl, gc_brake }, {IT_CALL | IT_STRING2, NULL, "Strafe Left", M_ChangeControl, gc_strafeleft }, {IT_CALL | IT_STRING2, NULL, "Strafe Right", M_ChangeControl, gc_straferight}, }; @@ -1049,29 +1049,29 @@ static menuitem_t OP_MPControlsMenu[] = {IT_CALL | IT_STRING2, NULL, "Talk key", M_ChangeControl, gc_talkkey }, {IT_CALL | IT_STRING2, NULL, "Team-Talk key", M_ChangeControl, gc_teamkey }, {IT_CALL | IT_STRING2, NULL, "Rankings/Scores", M_ChangeControl, gc_scores }, - {IT_CALL | IT_STRING2, NULL, "Toss Flag", M_ChangeControl, gc_tossflag }, - {IT_CALL | IT_STRING2, NULL, "Next Weapon", M_ChangeControl, gc_weaponnext }, - {IT_CALL | IT_STRING2, NULL, "Prev Weapon", M_ChangeControl, gc_weaponprev }, - {IT_CALL | IT_STRING2, NULL, "Weapon Slot 1", M_ChangeControl, gc_wepslot1 }, - {IT_CALL | IT_STRING2, NULL, "Weapon Slot 2", M_ChangeControl, gc_wepslot2 }, - {IT_CALL | IT_STRING2, NULL, "Weapon Slot 3", M_ChangeControl, gc_wepslot3 }, - {IT_CALL | IT_STRING2, NULL, "Weapon Slot 4", M_ChangeControl, gc_wepslot4 }, - {IT_CALL | IT_STRING2, NULL, "Weapon Slot 5", M_ChangeControl, gc_wepslot5 }, - {IT_CALL | IT_STRING2, NULL, "Weapon Slot 6", M_ChangeControl, gc_wepslot6 }, - {IT_CALL | IT_STRING2, NULL, "Weapon Slot 7", M_ChangeControl, gc_wepslot7 }, + {IT_CALL | IT_STRING2, NULL, "Spectate", M_ChangeControl, gc_spectate }, +// {IT_CALL | IT_STRING2, NULL, "Next Weapon", M_ChangeControl, gc_driftleft }, +// {IT_CALL | IT_STRING2, NULL, "Prev Weapon", M_ChangeControl, gc_driftright }, +// {IT_CALL | IT_STRING2, NULL, "Weapon Slot 1", M_ChangeControl, gc_wepslot1 }, +// {IT_CALL | IT_STRING2, NULL, "Weapon Slot 2", M_ChangeControl, gc_wepslot2 }, +// {IT_CALL | IT_STRING2, NULL, "Weapon Slot 3", M_ChangeControl, gc_wepslot3 }, +// {IT_CALL | IT_STRING2, NULL, "Weapon Slot 4", M_ChangeControl, gc_wepslot4 }, +// {IT_CALL | IT_STRING2, NULL, "Weapon Slot 5", M_ChangeControl, gc_wepslot5 }, +// {IT_CALL | IT_STRING2, NULL, "Weapon Slot 6", M_ChangeControl, gc_wepslot6 }, +// {IT_CALL | IT_STRING2, NULL, "Weapon Slot 7", M_ChangeControl, gc_wepslot7 }, {IT_CALL | IT_STRING2, NULL, "Ring Toss", M_ChangeControl, gc_fire }, - {IT_CALL | IT_STRING2, NULL, "Ring Toss Normal", M_ChangeControl, gc_firenormal }, + {IT_CALL | IT_STRING2, NULL, "Accelerate", M_ChangeControl, gc_accelerate }, }; static menuitem_t OP_CameraControlsMenu[] = { - {IT_CALL | IT_STRING2, NULL, "Look Up", M_ChangeControl, gc_lookup }, - {IT_CALL | IT_STRING2, NULL, "Look Down", M_ChangeControl, gc_lookdown }, - {IT_CALL | IT_STRING2, NULL, "Rotate Camera L", M_ChangeControl, gc_camleft }, - {IT_CALL | IT_STRING2, NULL, "Rotate Camera R", M_ChangeControl, gc_camright }, - {IT_CALL | IT_STRING2, NULL, "Center View", M_ChangeControl, gc_centerview }, - {IT_CALL | IT_STRING2, NULL, "Mouselook", M_ChangeControl, gc_mouseaiming }, - {IT_CALL | IT_STRING2, NULL, "Reset Camera", M_ChangeControl, gc_camreset }, +// {IT_CALL | IT_STRING2, NULL, "Look Up", M_ChangeControl, gc_lookup }, +// {IT_CALL | IT_STRING2, NULL, "Look Down", M_ChangeControl, gc_lookdown }, + {IT_CALL | IT_STRING2, NULL, "Aim Forward", M_ChangeControl, gc_aimforward }, + {IT_CALL | IT_STRING2, NULL, "Aim Backward", M_ChangeControl, gc_aimbackward }, +// {IT_CALL | IT_STRING2, NULL, "Center View", M_ChangeControl, gc_centerview }, +// {IT_CALL | IT_STRING2, NULL, "Mouselook", M_ChangeControl, gc_mouseaiming }, + {IT_CALL | IT_STRING2, NULL, "Look Backward", M_ChangeControl, gc_lookback }, {IT_CALL | IT_STRING2, NULL, "Toggle Chasecam", M_ChangeControl, gc_camtoggle }, }; diff --git a/src/p_enemy.c b/src/p_enemy.c index 025a2597..1ade380c 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -23,6 +23,7 @@ #include "r_things.h" #include "i_video.h" #include "lua_hook.h" +#include "k_kart.h" // SRB2kart #ifdef HW3SOUND #include "hardware/hw3sound.h" @@ -113,6 +114,7 @@ void A_AttractChase(mobj_t *actor); void A_DropMine(mobj_t *actor); void A_FishJump(mobj_t *actor); void A_ThrownRing(mobj_t *actor); +void A_GrenadeRing(mobj_t *actor); void A_SetSolidSteam(mobj_t *actor); void A_UnsetSolidSteam(mobj_t *actor); void A_SignPlayer(mobj_t *actor); @@ -185,6 +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_RedShellChase(mobj_t *actor); // SRB2kart +void A_BobombExplode(mobj_t *actor); // SRB2kart void A_OrbitNights(mobj_t *actor); void A_GhostMe(mobj_t *actor); void A_SetObjectState(mobj_t *actor); @@ -3893,6 +3897,74 @@ void A_ThrownRing(mobj_t *actor) return; } +//{ SRB2kart - A_GRENADERING +static mobj_t *grenade; + +static inline boolean PIT_GrenadeRing(mobj_t *thing) +{ + if (!grenade) + return true; + + if (thing->type != MT_PLAYER) // Don't explode for anything but an actual player. + return true; + + if (thing == grenade->target && !(grenade->threshold == 0)) // Don't blow up at your owner. + return true; + + if (thing->player && thing->player->kartstuff[k_bootaketimer]) + return true; + + if ((gametype == GT_CTF || gametype == GT_MATCH) + && !cv_friendlyfire.value && grenade->target->player && thing->player + && grenade->target->player->ctfteam == thing->player->ctfteam) // Don't blow up at your teammates, unless friendlyfire is on + return true; + + // see if it went over / under + if (grenade->z - grenade->info->painchance > thing->z + thing->height) + return true; // overhead + if (grenade->z + grenade->height + grenade->info->painchance < thing->z) + return true; // underneath + + if (netgame && thing->player && thing->player->spectator) + return true; + + if (!(thing->flags & MF_SHOOTABLE)) + { + // didn't do any damage + return true; + } + + if (P_AproxDistance(P_AproxDistance(thing->x - grenade->x, thing->y - grenade->y), + thing->z - grenade->z) > grenade->info->painchance) + return true; // Too far away + + // Explode! + P_SetMobjState(grenade, grenade->info->deathstate); + return false; +} + +void A_GrenadeRing(mobj_t *actor) +{ + INT32 bx, by, xl, xh, yl, yh; + const fixed_t explodedist = actor->info->painchance; + + if (leveltime % 35 == 0) + S_StartSound(actor, actor->info->activesound); + + // Use blockmap to check for nearby shootables + yh = (unsigned)(actor->y + explodedist - bmaporgy)>>MAPBLOCKSHIFT; + yl = (unsigned)(actor->y - explodedist - bmaporgy)>>MAPBLOCKSHIFT; + xh = (unsigned)(actor->x + explodedist - bmaporgx)>>MAPBLOCKSHIFT; + xl = (unsigned)(actor->x - explodedist - bmaporgx)>>MAPBLOCKSHIFT; + + grenade = actor; + + for (by = yl; by <= yh; by++) + for (bx = xl; bx <= xh; bx++) + P_BlockThingsIterator(bx, by, PIT_GrenadeRing); +} +//} + // Function: A_SetSolidSteam // // Description: Makes steam solid so it collides with the player to boost them. @@ -8001,6 +8073,149 @@ void A_ToggleFlameJet(mobj_t* actor) } } +//{ SRB2kart - A_RedShellChase and A_BobombExplode +void A_RedShellChase(mobj_t *actor) +{ + + INT32 c = 0; + INT32 stop; + player_t *player; + + if (actor->tracer) + { + if (!actor->tracer->health) + { + P_SetTarget(&actor->tracer, NULL); + } + + if (actor->tracer && (actor->tracer->health)) + { + P_Thrust(actor, R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y), actor->info->speed); + return; + } + } + + // first time init, this allow minimum lastlook changes + if (actor->lastlook == -1) + actor->lastlook = P_RandomFixed(); + + actor->lastlook %= MAXPLAYERS; + + stop = (actor->lastlook - 1) & PLAYERSMASK; + + if (actor->lastlook >= 0) + { + for (; ; actor->lastlook = (actor->lastlook + 1) & PLAYERSMASK) + { + if (!playeringame[actor->lastlook]) + continue; + + if (c++ == 2) + return; + + player = &players[actor->lastlook]; + + if (!player->mo) + continue; + + if (player->mo->health <= 0) + continue; // dead + + if ((netgame || multiplayer) && player->spectator) + continue; // spectator + + if (actor->target && actor->target->player) + { + if (player->mo == actor->target) + continue; + + // Don't home in on teammates. + if (gametype == GT_CTF + && actor->target->player->ctfteam == player->ctfteam) + continue; + + if (gametype == GT_RACE) // Only in races, in match and CTF you should go after any nearby players + { + // USER TARGET + if (actor->target->player->kartstuff[k_position] != (player->kartstuff[k_position] + 1)) // Red Shells only go after the person directly ahead of you -Sryder + continue; + } + + if (!(gametype == GT_RACE)) + { + if (P_AproxDistance(P_AproxDistance(player->mo->x-actor->x, + player->mo->y-actor->y), player->mo->z-actor->z) > RING_DIST) + continue; + } + } + + if ((gametype == GT_RACE) || (gametype != GT_RACE // If in match etc. only home in when you get close enough, in race etc. home in all the time + && P_AproxDistance(P_AproxDistance(player->mo->x-actor->x, + player->mo->y-actor->y), player->mo->z-actor->z) < RING_DIST)) + P_SetTarget(&actor->tracer, player->mo); + return; + + // Moved to bottom so it doesn't not check the last player + // done looking + if (actor->lastlook == stop) + { + if (gametype == GT_RACE) + actor->lastlook = -2; + return; + } + } + } + + return; + +} + +void A_BobombExplode(mobj_t *actor) +{ + mobj_t *mo2; + thinker_t *th; + INT32 d; + INT32 locvar1 = var1; + mobjtype_t type; + + type = (mobjtype_t)locvar1; + + for (d = 0; d < 16; d++) + K_SpawnKartExplosion(actor->x, actor->y, actor->z, actor->info->painchance + 32*FRACUNIT, 32, type, d*(ANGLE_45/4), false, false); // 32 <-> 64 + + S_StartSound(actor, sfx_prloop); + + for (th = thinkercap.next; th != &thinkercap; th = th->next) + { + if (th->function.acp1 != (actionf_p1)P_MobjThinker) + continue; + + mo2 = (mobj_t *)th; + + if (mo2 == actor) // Don't explode yourself! Endless loop! + continue; + + if (P_AproxDistance(P_AproxDistance(mo2->x - actor->x, mo2->y - actor->y), mo2->z - actor->z) > actor->info->painchance) + continue; + + if ((mo2->flags & MF_SHOOTABLE) && !(mo2->flags & MF_SCENERY)) + { + actor->flags2 |= MF2_DEBRIS; + + if (mo2->player) // Looks like we're going to have to need a seperate function for this too + K_ExplodePlayer(mo2->player, actor->target); + else + P_DamageMobj(mo2, actor, actor->target, 1); + + + + continue; + } + } + return; +} +//} + // Function: A_OrbitNights // // Description: Used by Chaos Emeralds to orbit around Nights (aka Super Sonic.) diff --git a/src/p_inter.c b/src/p_inter.c index d172a09b..b74fac23 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2988,7 +2988,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (!player->kartstuff[k_startimer] && player->kartstuff[k_growshrinktimer] <= 0) { // Start slipping! - P_SpinPlayerMobj(player->mo, source); + K_SpinPlayer(player, source); // Start shrinking! player->mo->destscale = 70; @@ -3000,7 +3000,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player->kartstuff[k_growshrinktimer] = 2; } // Invincible or not, we still need this. - //P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THUNDERSHIELD); // TODO: Add this + P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_LIGHTNING); return true; } else if (damage == 64 && player == source->player) @@ -3010,8 +3010,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (damage == 65 && player->kartstuff[k_position] == 1) { // 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_THUNBERSHIELD); // TODO: Add this - //P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLODE); // TODO: Add this + P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUELIGHTNING); + P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLOSION); return true; } else if (damage == 65 && player->kartstuff[k_position] > 1) @@ -3043,8 +3043,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return false; else { + player->kartstuff[k_spinouttype] = 1; + K_SpinPlayer(player, source); damage = player->mo->health - 1; P_RingDamage(player, inflictor, source, damage); + player->mo->momx = player->mo->momy = 0; } /* // SRB2kart - don't need these else if (metalrecording) diff --git a/src/p_mobj.c b/src/p_mobj.c index 253e0eda..427f5f53 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1484,7 +1484,7 @@ static void P_XYFriction(mobj_t *mo, fixed_t oldx, fixed_t oldy) ) { // if in a walking frame, stop moving - if (player->panim == PA_WALK) + if (player->panim == PA_WALK && player->kartstuff[k_spinouttimer] == 0) P_SetPlayerMobjState(mo, S_KART_STND); // SRB2kart - was S_PLAY_STND mo->momx = player->cmomx; mo->momy = player->cmomy; @@ -1908,6 +1908,14 @@ void P_XYMovement(mobj_t *mo) return; #endif + //{ SRB2kart stuff + //if (mo->type == MT_SHELLITEM || mo->type == MT_REDSHELLITEM2 || (mo->type == MT_REDSHELLITEM && !mo->tracer)) + // return; + + if (mo->player && mo->player->kartstuff[k_spinouttimer] && mo->player->speed <= mo->player->normalspeed/4) + return; + //} + if (((!(mo->eflags & MFE_VERTICALFLIP) && mo->z > mo->floorz) || (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height < mo->ceilingz)) && !(player && player->pflags & PF_SLIDING)) return; // no friction when airborne @@ -2671,7 +2679,8 @@ static void P_PlayerZMovement(mobj_t *mo) goto nightsdone; } // Get up if you fell. - if (mo->state == &states[mo->info->painstate]) // SRB2kart + if ((mo->state == &states[mo->info->painstate] || (mo->state >= &states[S_KART_SPIN1] && mo->state <= &states[S_KART_SPIN8])) + && mo->player->kartstuff[k_spinouttimer] == 0 && mo->player->kartstuff[k_squishedtimer] == 0) // SRB2kart P_SetPlayerMobjState(mo, S_KART_STND); #ifdef ESLOPE @@ -2760,7 +2769,8 @@ static void P_PlayerZMovement(mobj_t *mo) // Cut momentum in half when you hit the ground and // aren't pressing any controls. - if (!(mo->player->cmd.forwardmove || mo->player->cmd.sidemove) && !mo->player->cmomx && !mo->player->cmomy && !(mo->player->pflags & PF_SPINNING)) + if (!(mo->player->cmd.forwardmove || mo->player->cmd.sidemove) && !mo->player->cmomx && !mo->player->cmomy + && !(mo->player->pflags & PF_SPINNING) && !(mo->player->kartstuff[k_spinouttimer])) { mo->momx = mo->momx/2; mo->momy = mo->momy/2; @@ -2774,26 +2784,54 @@ static void P_PlayerZMovement(mobj_t *mo) mo->player->skidtime = TICRATE; mo->tics = -1; } - else if (mo->player->pflags & PF_JUMPED || (mo->player->pflags & (PF_SPINNING|PF_USEDOWN)) != (PF_SPINNING|PF_USEDOWN) - || mo->player->powers[pw_tailsfly]) // SRB2kart + else if ((mo->player->pflags & PF_JUMPED || (mo->player->pflags & (PF_SPINNING|PF_USEDOWN)) != (PF_SPINNING|PF_USEDOWN) + || mo->player->powers[pw_tailsfly]) && (mo->player->kartstuff[k_spinouttimer] == 0)) // SRB2kart { - if (mo->player->cmomx || mo->player->cmomy) + ticcmd_t *cmd; + + cmd = &mo->player->cmd; + + // Standing frames - S_KART_STND S_KART_STND_L S_KART_STND_R + if (mo->player->speed == 0) { - if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN) - P_SetPlayerMobjState(mo, S_KART_RUN1); - else if ((mo->player->rmomx || mo->player->rmomy) && mo->player->panim != PA_WALK) - P_SetPlayerMobjState(mo, S_KART_WALK1); - else if (!mo->player->rmomx && !mo->player->rmomy && mo->player->panim != PA_IDLE) + if (cmd->buttons & BT_DRIFTRIGHT && !(mo->state == &states[S_KART_STND_R])) + P_SetPlayerMobjState(mo, S_KART_STND_R); + else if (cmd->buttons & BT_DRIFTLEFT && !(mo->state == &states[S_KART_STND_L])) + P_SetPlayerMobjState(mo, S_KART_STND_L); + else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(mo->state == &states[S_KART_STND])) P_SetPlayerMobjState(mo, S_KART_STND); } - else + // Drifting Left - S_KART_DRIFT_L1 + else if (mo->player->kartstuff[k_drift] < 0 && P_IsObjectOnGround(mo)) { - if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) && mo->player->panim != PA_RUN) + if (!(mo->state == &states[S_KART_DRIFT_L1] || mo->state == &states[S_KART_DRIFT_L2])) + P_SetPlayerMobjState(mo, S_KART_DRIFT_L1); + } + // Drifting Right - S_KART_DRIFT_R1 + else if (mo->player->kartstuff[k_drift] > 0 && P_IsObjectOnGround(mo)) + { + if (!(mo->state == &states[S_KART_DRIFT_R1] || mo->state == &states[S_KART_DRIFT_R2])) + P_SetPlayerMobjState(mo, S_KART_DRIFT_R1); + } + // Run frames - S_KART_RUN1 S_KART_RUN_L1 S_KART_RUN_R1 + else if (mo->player->speed > FixedMul(mo->player->runspeed, mo->scale)) + { + if (cmd->buttons & BT_DRIFTRIGHT && !(mo->state == &states[S_KART_RUN_R1] || mo->state == &states[S_KART_RUN_R2])) + P_SetPlayerMobjState(mo, S_KART_RUN_R1); + else if (cmd->buttons & BT_DRIFTLEFT && !(mo->state == &states[S_KART_RUN_L1] || mo->state == &states[S_KART_RUN_L2])) + P_SetPlayerMobjState(mo, S_KART_RUN_L1); + else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(mo->state == &states[S_KART_RUN1] || mo->state == &states[S_KART_RUN2])) P_SetPlayerMobjState(mo, S_KART_RUN1); - else if ((mo->momx || mo->momy) && mo->player->panim != PA_WALK) + } + // Walk frames - S_KART_WALK1 S_KART_WALK_L1 S_KART_WALK_R1 + else if (mo->player->speed <= FixedMul(mo->player->runspeed, mo->scale)) + { + if (cmd->buttons & BT_DRIFTRIGHT && !(mo->state == &states[S_KART_WALK_R1] || mo->state == &states[S_KART_WALK_R2])) + P_SetPlayerMobjState(mo, S_KART_WALK_R1); + else if (cmd->buttons & BT_DRIFTLEFT && !(mo->state == &states[S_KART_WALK_L1] || mo->state == &states[S_KART_WALK_L2])) + P_SetPlayerMobjState(mo, S_KART_WALK_L1); + else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(mo->state == &states[S_KART_WALK1] || mo->state == &states[S_KART_WALK2])) P_SetPlayerMobjState(mo, S_KART_WALK1); - else if (!mo->momx && !mo->momy && mo->player->panim != PA_IDLE) - P_SetPlayerMobjState(mo, S_KART_STND); } } diff --git a/src/p_spec.c b/src/p_spec.c index a958a4b1..d116d00a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4075,7 +4075,7 @@ DoneSection2: if (player->mo->momz > 0) break; - if (player->cmd.buttons & BT_USE) + if (player->cmd.buttons & BT_BRAKE) break; if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate]) diff --git a/src/p_user.c b/src/p_user.c index fb1a91b9..fb26a0f4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -907,17 +907,20 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings) if (!G_IsSpecialStage(gamemap) || !useNightsSS) player->totalring += num_rings; + //{ SRB2kart - rings don't really do anything, but we don't want the player spilling them later. + /* // Can only get up to 9999 rings, sorry! if (player->mo->health > 10000) { player->mo->health = 10000; player->health = 10000; } - else if (player->mo->health < 1) + else if (player->mo->health < 1)*/ { player->mo->health = 1; player->health = 1; } + //} // Now extra life bonuses are handled here instead of in P_MovePlayer, since why not? if (!ultimatemode && !modeattacking && !G_IsSpecialStage(gamemap) && G_GametypeUsesLives()) @@ -2705,7 +2708,7 @@ static void P_DoClimbing(player_t *player) else if ((!(player->mo->momx || player->mo->momy || player->mo->momz) || !climb) && player->mo->state != &states[S_PLAY_CLIMB1]) P_SetPlayerMobjState(player->mo, S_PLAY_CLIMB1); - if (cmd->buttons & BT_USE && !(player->pflags & PF_JUMPSTASIS)) + if (cmd->buttons & BT_BRAKE && !(player->pflags & PF_JUMPSTASIS)) { player->climbing = 0; player->pflags |= PF_JUMPED; @@ -3194,7 +3197,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) I_Assert(player != NULL); I_Assert(!P_MobjWasRemoved(player->mo)); - if (cmd->buttons & BT_ATTACK || cmd->buttons & BT_FIRENORMAL) + if (cmd->buttons & BT_ATTACK) { if (!(player->pflags & PF_ATTACKDOWN) && player->powers[pw_shield] & SH_FIREFLOWER && !player->climbing) { @@ -3209,10 +3212,10 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) mobj_t *mo = NULL; player->pflags |= PF_ATTACKDOWN; - if (cmd->buttons & BT_FIRENORMAL) // No powers, just a regular ring. - goto firenormal; //code repetition sucks. + //if (cmd->buttons & BT_FIRENORMAL) // No powers, just a regular ring. + // goto firenormal; //code repetition sucks. // Bounce ring - else if (player->currentweapon == WEP_BOUNCE && player->powers[pw_bouncering]) + if (player->currentweapon == WEP_BOUNCE && player->powers[pw_bouncering]) { if (player->health <= 1) return; @@ -3333,7 +3336,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) // No powers, just a regular ring. else { -firenormal: +//firenormal: // Infinity ring was selected. // Mystic wants this ONLY to happen specifically if it's selected, // and to not be able to get around it EITHER WAY with firenormal. @@ -3572,6 +3575,9 @@ void P_DoJump(player_t *player, boolean soundandstate) if (!player->jumpfactor) return; + + if (player->kartstuff[k_spinouttimer]) // SRB2kart + return; if (player->climbing) { @@ -3747,7 +3753,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) return; #ifdef HAVE_BLUA - if (cmd->buttons & BT_USE) + if (cmd->buttons & BT_BRAKE) { if (LUAh_SpinSpecial(player)) return; @@ -3758,7 +3764,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) if ((player->charability2 == CA2_SPINDASH) && !(player->pflags & PF_SLIDING) && !player->exiting && !P_PlayerInPain(player)) // subsequent revs { - if ((cmd->buttons & BT_USE) && player->speed < FixedMul(5<mo->scale) && !player->mo->momz && onground && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING) + if ((cmd->buttons & BT_BRAKE) && player->speed < FixedMul(5<mo->scale) && !player->mo->momz && onground && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING) #ifdef ESLOPE && (!player->mo->standingslope || abs(player->mo->standingslope->zdelta) < FRACUNIT/2) #endif @@ -3772,7 +3778,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) //P_SetPlayerMobjState(player->mo, S_PLAY_ATK1); player->pflags |= PF_USEDOWN; } - else if ((cmd->buttons & BT_USE) && (player->pflags & PF_STARTDASH)) + else if ((cmd->buttons & BT_BRAKE) && (player->pflags & PF_STARTDASH)) { player->dashspeed += FixedMul(FRACUNIT, player->mo->scale); @@ -3790,7 +3796,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) // If not moving up or down, and travelling faster than a speed of four while not holding // down the spin button and not spinning. // AKA Just go into a spin on the ground, you idiot. ;) - else if ((cmd->buttons & BT_USE || ((twodlevel || (player->mo->flags2 & MF2_TWOD)) && cmd->forwardmove < -20)) + else if ((cmd->buttons & BT_BRAKE || ((twodlevel || (player->mo->flags2 & MF2_TWOD)) && cmd->forwardmove < -20)) && !player->climbing && !player->mo->momz && onground && (player->speed > FixedMul(5<mo->scale) #ifdef ESLOPE || (player->mo->standingslope && abs(player->mo->standingslope->zdelta) >= FRACUNIT/2) @@ -3929,7 +3935,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd) if (player->pflags & PF_JUMPSTASIS) return; - if (cmd->buttons & BT_USE && !(player->pflags & PF_JUMPDOWN) && !player->exiting && !P_PlayerInPain(player)) + if (cmd->buttons & BT_BRAKE && !(player->pflags & PF_JUMPDOWN) && !player->exiting && !P_PlayerInPain(player)) { if (onground || player->climbing || player->pflags & (PF_CARRIED|PF_ITEMHANG|PF_ROPEHANG)) {} @@ -4533,7 +4539,7 @@ static void P_3dMovement(player_t *player) cmd = &player->cmd; - if (player->exiting || player->pflags & PF_STASIS) + if (player->exiting || player->pflags & PF_STASIS || player->kartstuff[k_spinouttimer]) // pw_introcam? { cmd->forwardmove = cmd->sidemove = 0; if (player->pflags & PF_GLIDING) @@ -4875,7 +4881,7 @@ static void P_SpectatorMovement(player_t *player) if (cmd->buttons & BT_JUMP) player->mo->z += FRACUNIT*16; - else if (cmd->buttons & BT_USE) + else if (cmd->buttons & BT_BRAKE) player->mo->z -= FRACUNIT*16; // Aiming needed for SEENAMES, etc. @@ -5916,8 +5922,8 @@ static void P_NiGHTSMovement(player_t *player) // No more bumper braking if (!player->bumpertime - && ((cmd->buttons & (BT_CAMLEFT|BT_CAMRIGHT)) == (BT_CAMLEFT|BT_CAMRIGHT) - || (cmd->buttons & BT_USE))) + && ((cmd->buttons & (BT_FORWARD|BT_BACKWARD)) == (BT_FORWARD|BT_BACKWARD) + || (cmd->buttons & BT_BRAKE))) { if (!(player->pflags & PF_SKIDDOWN)) S_StartSound(player->mo, sfx_ngskid); @@ -6477,6 +6483,23 @@ static void P_MovePlayer(player_t *player) // MOVEMENT CODE // ////////////////////// + //{ SRB2kart slip net + + if (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinout] == 0) + { + K_SpinPlayer(player, NULL); // Here just for in-level oil spills now + } + // If you have one but not the other, we should get rid of the one we have + else if (player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_spinout] > 0) + player->kartstuff[k_spinout] = 0; + + // If somehow the power has gotten larger than the timer, it should be lowered back to it + if (player->kartstuff[k_spinouttimer] > player->kartstuff[k_spinout]) + player->kartstuff[k_spinouttimer] = player->kartstuff[k_spinout]; + + //} + + if (twodlevel || player->mo->flags2 & MF2_TWOD) // 2d-level, so special control applies. P_2dMovement(player); else @@ -6530,11 +6553,11 @@ static void P_MovePlayer(player_t *player) // Standing frames - S_KART_STND S_KART_STND_L S_KART_STND_R if (player->speed == 0) { - if (cmd->buttons & BT_WEAPONNEXT && !(player->mo->state == &states[S_KART_STND_R])) + if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state == &states[S_KART_STND_R])) P_SetPlayerMobjState(player->mo, S_KART_STND_R); - else if (cmd->buttons & BT_WEAPONPREV && !(player->mo->state == &states[S_KART_STND_L])) + else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state == &states[S_KART_STND_L])) P_SetPlayerMobjState(player->mo, S_KART_STND_L); - else if (!(cmd->buttons & BT_WEAPONNEXT || cmd->buttons & BT_WEAPONPREV) && !(player->mo->state == &states[S_KART_STND])) + else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(player->mo->state == &states[S_KART_STND])) P_SetPlayerMobjState(player->mo, S_KART_STND); } // Drifting Left - S_KART_DRIFT_L1 @@ -6552,21 +6575,21 @@ static void P_MovePlayer(player_t *player) // Run frames - S_KART_RUN1 S_KART_RUN_L1 S_KART_RUN_R1 else if (player->speed > runspd) { - if (cmd->buttons & BT_WEAPONNEXT && !(player->mo->state == &states[S_KART_RUN_R1] || player->mo->state == &states[S_KART_RUN_R2])) + if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state == &states[S_KART_RUN_R1] || player->mo->state == &states[S_KART_RUN_R2])) P_SetPlayerMobjState(player->mo, S_KART_RUN_R1); - else if (cmd->buttons & BT_WEAPONPREV && !(player->mo->state == &states[S_KART_RUN_L1] || player->mo->state == &states[S_KART_RUN_L2])) + else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state == &states[S_KART_RUN_L1] || player->mo->state == &states[S_KART_RUN_L2])) P_SetPlayerMobjState(player->mo, S_KART_RUN_L1); - else if (!(cmd->buttons & BT_WEAPONNEXT || cmd->buttons & BT_WEAPONPREV) && !(player->mo->state == &states[S_KART_RUN1] || player->mo->state == &states[S_KART_RUN2])) + else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(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_WALK_L1 S_KART_WALK_R1 else if (player->speed <= runspd) { - if (cmd->buttons & BT_WEAPONNEXT && !(player->mo->state == &states[S_KART_WALK_R1] || player->mo->state == &states[S_KART_WALK_R2])) + if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state == &states[S_KART_WALK_R1] || player->mo->state == &states[S_KART_WALK_R2])) P_SetPlayerMobjState(player->mo, S_KART_WALK_R1); - else if (cmd->buttons & BT_WEAPONPREV && !(player->mo->state == &states[S_KART_WALK_L1] || player->mo->state == &states[S_KART_WALK_L2])) + else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state == &states[S_KART_WALK_L1] || player->mo->state == &states[S_KART_WALK_L2])) P_SetPlayerMobjState(player->mo, S_KART_WALK_L1); - else if (!(cmd->buttons & BT_WEAPONNEXT || cmd->buttons & BT_WEAPONPREV) && !(player->mo->state == &states[S_KART_WALK1] || player->mo->state == &states[S_KART_WALK2])) + else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(player->mo->state == &states[S_KART_WALK1] || player->mo->state == &states[S_KART_WALK2])) P_SetPlayerMobjState(player->mo, S_KART_WALK1); } } @@ -6575,7 +6598,7 @@ static void P_MovePlayer(player_t *player) // If your running animation is playing, and you're // going too slow, switch back to the walking frames. - if (player->panim == PA_RUN && player->speed < runspd) + if (player->panim == PA_RUN && player->speed < runspd && player->kartstuff[k_spinouttimer] == 0) P_SetPlayerMobjState(player->mo, S_KART_WALK1); // SRB2kart - was S_PLAY_RUN1 // If Springing, but travelling DOWNWARD, change back! @@ -6591,34 +6614,33 @@ static void P_MovePlayer(player_t *player) //{ SRB2kart // Engine Sounds. - /* // -- Need to load these sounds into game first if (!player->exiting) { - if (player->speed == 0 && onground && player->speed == 0 && leveltime % 6 == 0 && kartmode) + if (player->speed == 0 && onground && player->speed == 0 && leveltime % 6 == 0) S_StartSound(player->mo, sfx_kart1); - if ((player->speed < runspd && player->speed != 0) && leveltime % 8 == 0 && kartmode) + if ((player->speed < runspd && player->speed != 0) && leveltime % 8 == 0) S_StartSound(player->mo, sfx_kart2); - if ((player->speed > runspd) && leveltime % 8 == 0 && kartmode) + if ((player->speed > runspd) && leveltime % 8 == 0) S_StartSound(player->mo, sfx_kart3); // Drifting sound - if (kartmode) { // Leveltime being 50 might take a while at times. We'll start it up once, isntantly. - if ((player->powers[pw_drift] == 1 || player->powers[pw_drift] == -1) && onground && !S_SoundPlaying(NULL, sfx_mkdrft)) + if ((player->kartstuff[k_drift] == 1 || player->kartstuff[k_drift] == -1) && onground && !S_SoundPlaying(NULL, sfx_mkdrft)) S_StartSound(player->mo, sfx_mkdrft); // Start looping the sound now. - else if (leveltime % 50 == 0 && ((player->powers[pw_drift] == 1 || player->powers[pw_drift] == -1) && onground)) + else if (leveltime % 50 == 0 && ((player->kartstuff[k_drift] == 1 || player->kartstuff[k_drift] == -1) && onground)) S_StartSound(player->mo, sfx_mkdrft); // Ok, we'll stop now. - else if ((player->powers[pw_drift] == 0) + else if ((player->kartstuff[k_drift] == 0) && (player == &players[consoleplayer] || (splitscreen && player == &players[secondarydisplayplayer]))) S_StopSoundByID(player->mo, sfx_mkdrft); } } - */ + + K_MoveKartPlayer(player, onground); //} @@ -6829,7 +6851,7 @@ static void P_MovePlayer(player_t *player) S_StartSound(player->mo, sfx_putput); // Descend - if (cmd->buttons & BT_USE && !(player->pflags & PF_STASIS) && !player->exiting) + if (cmd->buttons & BT_BRAKE && !(player->pflags & PF_STASIS) && !player->exiting) if (P_MobjFlip(player->mo)*player->mo->momz > -FixedMul(5*actionspd, player->mo->scale)) P_SetObjectMomZ(player->mo, -actionspd/2, true); @@ -6914,7 +6936,7 @@ static void P_MovePlayer(player_t *player) { fixed_t tweenvalue = max(abs(cmd->forwardmove), abs(cmd->sidemove)); - if (tweenvalue < 10 && (cmd->buttons & (BT_CAMLEFT|BT_CAMRIGHT)) == (BT_CAMLEFT|BT_CAMRIGHT)) { + if (tweenvalue < 10 && (cmd->buttons & (BT_FORWARD|BT_BACKWARD)) == (BT_FORWARD|BT_BACKWARD)) { tempangle = (cmd->angleturn << 16); tweenvalue = 16; } @@ -6957,11 +6979,11 @@ static void P_MovePlayer(player_t *player) /////////////////////////// /* // SRB2kart - what's a shield? Never heard of it. Never happened. Nope. - if (cmd->buttons & BT_USE) // Spin button effects + if (cmd->buttons & BT_BRAKE) // Spin button effects { if (player->pflags & PF_JUMPED) // If the player is jumping { - if (!(player->pflags & PF_USEDOWN)) // If the player is not holding down BT_USE + if (!(player->pflags & PF_USEDOWN)) // If the player is not holding down BT_BRAKE { // Jump shield activation if (!P_PlayerInPain(player) // If the player is not in pain @@ -7059,7 +7081,7 @@ static void P_MovePlayer(player_t *player) P_DoTeeter(player); // Toss a flag - if (G_GametypeHasTeams() && (cmd->buttons & BT_TOSSFLAG) && !(player->powers[pw_super]) && !(player->tossdelay)) + if (G_GametypeHasTeams() && (cmd->buttons & BT_SPECTATE) && !(player->powers[pw_super]) && !(player->tossdelay)) { if (!(player->gotflag & (GF_REDFLAG|GF_BLUEFLAG))) P_PlayerEmeraldBurst(player, true); // Toss emeralds @@ -7104,7 +7126,7 @@ static void P_MovePlayer(player_t *player) P_DamageMobj(player->mo, NULL, NULL, 42000); // Respawn crushed spectators else { - P_SquishPlayerMobj(player->mo, NULL); // SRB2kart - we don't kill when squished, we squish when squished. + K_SquishPlayer(player, NULL); // SRB2kart - we don't kill when squished, we squish when squished. /* mobj_t *killer = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_NULL); killer->threshold = 44; // Special flag that it was crushing which killed you. @@ -7373,7 +7395,7 @@ static void P_DoRopeHang(player_t *player) player->mo->height = P_GetPlayerHeight(player); - if (player->cmd.buttons & BT_USE && !(player->pflags & PF_STASIS)) // Drop off of the rope + if (player->cmd.buttons & BT_BRAKE && !(player->pflags & PF_STASIS)) // Drop off of the rope { P_SetTarget(&player->mo->tracer, NULL); @@ -7780,7 +7802,7 @@ static void P_DeathThink(player_t *player) // continue logic if (!(netgame || multiplayer) && player->lives <= 0) { - if (player->deadtimer > TICRATE && (cmd->buttons & BT_USE || cmd->buttons & BT_JUMP) && player->continues > 0) + if (player->deadtimer > TICRATE && (cmd->buttons & BT_BRAKE || cmd->buttons & BT_ACCELERATE || cmd->buttons & BT_JUMP) && player->continues > 0) G_UseContinue(); else if (player->deadtimer >= gameovertics) G_UseContinue(); // Even if we don't have one this handles ending the game @@ -8091,7 +8113,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall } #ifdef REDSANALOG - if (P_AnalogMove(player) && (player->cmd.buttons & (BT_CAMLEFT|BT_CAMRIGHT)) == (BT_CAMLEFT|BT_CAMRIGHT)) { + if (P_AnalogMove(player) && (player->cmd.buttons & (BT_FORWARD|BT_BACKWARD)) == (BT_FORWARD|BT_BACKWARD)) { camstill = true; if (camspeed < 4*FRACUNIT/5) @@ -8148,9 +8170,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (!objectplacing && !(twodlevel || (mo->flags2 & MF2_TWOD)) && !(player->pflags & PF_NIGHTSMODE) && displayplayer == consoleplayer) { #ifdef REDSANALOG - if ((player->cmd.buttons & (BT_CAMLEFT|BT_CAMRIGHT)) == (BT_CAMLEFT|BT_CAMRIGHT)); else + if ((player->cmd.buttons & (BT_FORWARD|BT_BACKWARD)) == (BT_FORWARD|BT_BACKWARD)); else #endif - if (player->cmd.buttons & BT_CAMLEFT) + if (player->cmd.buttons & BT_FORWARD) { if (thiscam == &camera) { @@ -8169,7 +8191,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall : camrotate - 2); } } - else if (player->cmd.buttons & BT_CAMRIGHT) + else if (player->cmd.buttons & BT_BACKWARD) { if (thiscam == &camera) { @@ -8992,7 +9014,7 @@ void P_PlayerThink(player_t *player) if ((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE) { - cmd->buttons &= BT_USE; // Remove all buttons except BT_USE + cmd->buttons &= BT_BRAKE; // Remove all buttons except BT_BRAKE // TODO: ? cmd->forwardmove = 0; cmd->sidemove = 0; } @@ -9132,7 +9154,7 @@ void P_PlayerThink(player_t *player) // check for use if (!(player->pflags & PF_NIGHTSMODE)) { - if (cmd->buttons & BT_USE) + if (cmd->buttons & BT_BRAKE) player->pflags |= PF_USEDOWN; else player->pflags &= ~PF_USEDOWN; @@ -9345,6 +9367,7 @@ void P_PlayerAfterThink(player_t *player) //player->mo->eflags &= ~MFE_VERTICALFLIP; } + /* SRB2kart - don't need no weapon rings if (!(player->pflags & PF_WPNDOWN)) { if (cmd->buttons & BT_WEAPONNEXT) @@ -9455,6 +9478,7 @@ void P_PlayerAfterThink(player_t *player) if (P_IsLocalPlayer(player) && (player->pflags & PF_WPNDOWN) && player->currentweapon != oldweapon) S_StartSound(NULL, sfx_wepchg); + */ /* // SRB2kart if (player->pflags & PF_GLIDING) diff --git a/src/sounds.c b/src/sounds.c index 8ad42ac9..360a7791 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -465,6 +465,38 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3kdal", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3kdbs", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3kdbl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + + // SRB2kart + {"lkt1", true, 127, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"lkt2", true, 127, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"lkt3", true, 127, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kart1", false, 48, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kart2", false, 48, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kart3", false, 48, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mlap", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mush", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"star", true, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mega", true, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"bomb", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"bomb2", true, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR}, + {"peel", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"slip", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"fake", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"grnshl", true, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR}, + {"redshl", true, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR}, + {"shbrk", true, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkdrft", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkslid", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem", true, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem1", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem2", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem3", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem4", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem5", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem6", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem7", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitem8", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"mkitemF", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // skin sounds free slots to add sounds at run time (Boris HACK!!!) // initialized to NULL diff --git a/src/sounds.h b/src/sounds.h index 565d41b5..05380785 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -529,6 +529,42 @@ typedef enum sfx_s3kdbs, sfx_s3kdbl, + sfx_lkt1, + sfx_lkt2, + sfx_lkt3, + sfx_kart1, + sfx_kart2, + sfx_kart3, + sfx_mlap, + sfx_mush, + sfx_star, + sfx_mega, + sfx_bomb, + sfx_bomb2, + sfx_peel, + sfx_slip, + sfx_fake, + sfx_grnshl, + sfx_redshl, + sfx_shbrk, + sfx_mkdrft, + sfx_mkslid, + sfx_mkitem, + sfx_mkitem1, + sfx_mkitem2, + sfx_mkitem3, + sfx_mkitem4, + sfx_mkitem5, + sfx_mkitem6, + sfx_mkitem7, + sfx_mkitem8, + sfx_mkitemF, + + sfx_taunt1, + sfx_taunt2, + sfx_taunt3, + sfx_taunt4, + // free slots for S_AddSoundFx() at run-time -------------------- sfx_freeslot0, // diff --git a/src/tables.h b/src/tables.h index 0e4853cb..05b448ec 100644 --- a/src/tables.h +++ b/src/tables.h @@ -68,6 +68,10 @@ extern fixed_t finetangent[FINEANGLES/2]; #define ANGLE_337h 0xF0000000 #define ANGLE_MAX 0xFFFFFFFF +// SRB2kart +#define ANGLE_120 0x53333333 +#define ANGLE_240 0xA6666666 + typedef UINT32 angle_t; // To get a global angle from Cartesian coordinates, the coordinates are diff --git a/src/y_inter.c b/src/y_inter.c index b2e1cdf9..e5ff97ed 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -685,7 +685,7 @@ void Y_Ticker(void) return; for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && (players[i].cmd.buttons & BT_USE)) + if (playeringame[i] && (players[i].cmd.buttons & BT_BRAKE || players[i].cmd.buttons & BT_ACCELERATE)) skip = true; // bonuses count down by 222 each tic @@ -748,7 +748,7 @@ void Y_Ticker(void) return; for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && (players[i].cmd.buttons & BT_USE)) + if (playeringame[i] && (players[i].cmd.buttons & BT_BRAKE || players[i].cmd.buttons & BT_ACCELERATE)) skip = true; if (tallydonetic != 0)