From 31a13e245c72778491063bffdd30d90e95cf01c6 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 22 Oct 2017 03:06:35 -0400 Subject: [PATCH 01/61] BATLLE MODE AAAAAA --- src/command.c | 4 +- src/d_clisrv.c | 3 + src/d_netcmd.c | 16 ++-- src/d_netcmd.h | 1 + src/d_player.h | 2 + src/dehacked.c | 11 +++ src/info.c | 141 +++++++++++++++++++++++++++- src/info.h | 10 ++ src/k_kart.c | 244 ++++++++++++++++++++++++++++++++++++++----------- src/k_kart.h | 1 + src/p_enemy.c | 2 +- src/p_inter.c | 14 +++ src/p_local.h | 2 +- src/p_mobj.c | 108 ++++++++++++++++++++-- src/p_setup.c | 3 +- src/p_user.c | 73 ++++++--------- 16 files changed, 513 insertions(+), 122 deletions(-) diff --git a/src/command.c b/src/command.c index dd10bc8a..a3ae7a51 100644 --- a/src/command.c +++ b/src/command.c @@ -1447,8 +1447,8 @@ void CV_AddValue(consvar_t *var, INT32 increment) INT32 newvalue, max; // count pointlimit better - if (var == &cv_pointlimit && (gametype == GT_MATCH)) - increment *= 50; + /*if (var == &cv_pointlimit && (gametype == GT_MATCH)) + increment *= 50;*/ newvalue = var->value + increment; if (var->PossibleValue) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f3df4f10..9c26d4f6 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -43,6 +43,7 @@ #include "lzf.h" #include "lua_script.h" #include "lua_hook.h" +#include "k_kart.h" #ifdef CLIENT_LOADINGSCREEN // cl loading screen @@ -2421,6 +2422,8 @@ static void CL_RemovePlayer(INT32 playernum) if (G_TagGametype()) //Check if you still have a game. Location flexible. =P P_CheckSurvivors(); + else if (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF) + K_CheckBalloons(); // SRB2Kart else if (gametype == GT_RACE || gametype == GT_COMPETITION) P_CheckRacers(); } diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 8e35f65d..5a83d4f6 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -316,6 +316,8 @@ consvar_t cv_lightning = {"lightning", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {5, "MAX"}, {0, NULL}}; +consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t speedometer_cons_t[] = {{0, "Off"}, {1, "Kilometers"}, {2, "Miles"}, {3, "Fracunits"}, {0, NULL}}; consvar_t cv_speedometer = {"speedometer", "Kilometers", CV_SAVE, speedometer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // use tics in display @@ -1063,7 +1065,7 @@ UINT8 CanChangeSkin(INT32 playernum) return true; // Can change skin during initial countdown. - if ((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE) + if (leveltime < 4*TICRATE) return true; if (G_TagGametype()) @@ -1868,8 +1870,6 @@ static void Got_Mapcmd(UINT8 **cp, INT32 playernum) // a copy of color if (players[0].mo) players[0].mo->color = players[0].skincolor; - - CV_StealthSetValue(&cv_kartcc, 150); // srb2kart } if (metalrecording) G_BeginMetal(); @@ -2661,6 +2661,8 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) // In tag, check to see if you still have a game. if (G_TagGametype()) P_CheckSurvivors(); + else if (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF) + K_CheckBalloons(); // SRB2Kart } // @@ -3496,9 +3498,9 @@ void D_GameTypeChanged(INT32 lastgametype) case GT_TEAMMATCH: if (!cv_timelimit.changed && !cv_pointlimit.changed) // user hasn't changed limits { - // default settings for match: timelimit 10 mins, no pointlimit + // default settings for match: no timelimit, no pointlimit CV_SetValue(&cv_pointlimit, 0); - CV_SetValue(&cv_timelimit, 10); + CV_SetValue(&cv_timelimit, 0); } if (!cv_itemrespawntime.changed) CV_Set(&cv_itemrespawntime, cv_itemrespawntime.defaultvalue); // respawn normally @@ -3556,7 +3558,7 @@ void D_GameTypeChanged(INT32 lastgametype) // When swapping to a gametype that supports spectators, // make everyone a spectator initially. - if (!splitscreen && (G_GametypeHasSpectators())) + /*if (!splitscreen && (G_GametypeHasSpectators())) { INT32 i; for (i = 0; i < MAXPLAYERS; i++) @@ -3565,7 +3567,7 @@ void D_GameTypeChanged(INT32 lastgametype) players[i].ctfteam = 0; players[i].spectator = true; } - } + }*/ // don't retain teams in other modes or between changes from ctf to team match. // also, stop any and all forms of team scrambling that might otherwise take place. diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 6f50358f..25a9ee89 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -106,6 +106,7 @@ extern consvar_t cv_blueshell, cv_jaws, cv_fireflower, cv_tripleredshell, cv_lig extern consvar_t cv_karthud; extern consvar_t cv_kartcc; +extern consvar_t cv_kartballoons; extern consvar_t cv_speedometer; extern consvar_t cv_collideminimum; diff --git a/src/d_player.h b/src/d_player.h index 12061c36..5f532534 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -302,6 +302,8 @@ typedef enum // 0x4 = 3 Red Shells orbiting, 0x8 = Triple Red Shell in inventory k_lightning, // 0x1 = Lightning in inventory k_kitchensink, // 0x1 = Sink in inventory + k_balloon, // 0x1 = 1 hit left, 0x2 = 2 hits left, 0x4 = 3 hits left + // 0x8 = 4 hits left, 0x16 = 5 hits left NUMKARTSTUFF } kartstufftype_t; diff --git a/src/dehacked.c b/src/dehacked.c index e488d3ee..54c07bb7 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6381,6 +6381,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_SINKTRAIL2", "S_SINKTRAIL3", + // Battle Mode balloon + "S_BATTLEBALLOON", + // Pokey "S_POKEY1", "S_POKEY2", @@ -6953,6 +6956,14 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_SINK", // Kitchen Sink Stuff "MT_SINKTRAIL", + "MT_BATTLEBALLOON1", // Battle Mode balloon stuff + "MT_BATTLEBALLOON2", + "MT_BATTLEBALLOON3", + "MT_BATTLEBALLOON4", + "MT_BATTLEBALLOON5", + + "MT_LAKITU", + "MT_POKEY", // Huh, thought this was a default asset for some reason, guess not. "MT_ENEMYFLIP", "MT_WAYPOINT", diff --git a/src/info.c b/src/info.c index 71711b68..264cf574 100644 --- a/src/info.c +++ b/src/info.c @@ -57,8 +57,8 @@ char sprnames[NUMSPRITES + 1][5] = //SRB2kart Sprites "SPRG","BSPR","RNDM","RPOP","KFRE","DRIF","DSMO","FITM","DFAK","BANA", "DBAN","GSHE","GSTR","DGSH","RSHE","RSTR","DRSH","BOMB","BLIG","LIGH", - "SINK","SITR","LAKI","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS", - "BUZB","CHOM","SACO","CRAB", "SHAD" + "SINK","SITR","KBLN","LAKI","POKE","AUDI","DECO","DOOD","SNES","GBAS", + "SPRS","BUZB","CHOM","SACO","CRAB", "SHAD" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2718,6 +2718,8 @@ state_t states[NUMSTATES] = {SPR_SITR, 1, 5, {NULL}, 0, 0, S_SINKTRAIL3}, // S_SINKTRAIL2 {SPR_SITR, 2, 3, {NULL}, 0, 0, S_NULL}, // S_SINKTRAIL3 + {SPR_KBLN, 0, 1, {NULL}, 0, 0, S_BATTLEBALLOON}, // S_BATTLEBALLOON + {SPR_LAKI, 0, 64, {NULL}, 1, 0, S_LAKITU2}, // S_LAKITU1 {SPR_LAKI, 1, 35, {NULL}, 0, 0, S_NULL}, // S_LAKITU2 @@ -15133,6 +15135,141 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BATTLEBALLOON1 + -1, // doomednum + S_BATTLEBALLOON,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BATTLEBALLOON2 + -1, // doomednum + S_BATTLEBALLOON,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BATTLEBALLOON3 + -1, // doomednum + S_BATTLEBALLOON,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BATTLEBALLOON4 + -1, // doomednum + S_BATTLEBALLOON,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + + { // MT_BATTLEBALLOON5 + -1, // doomednum + S_BATTLEBALLOON,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 16*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound + MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + { // MT_LAKITU -1, // doomednum S_LAKITU1, // spawnstate diff --git a/src/info.h b/src/info.h index c6c448f0..ba016069 100644 --- a/src/info.h +++ b/src/info.h @@ -600,6 +600,7 @@ typedef enum sprite SPR_LIGH, // Lightning SPR_SINK, // Kitchen Sink SPR_SITR, // Kitchen Sink Trail + SPR_KBLN, // Battle Mode Balloon SPR_LAKI, // Lakitu @@ -3223,6 +3224,9 @@ typedef enum state S_SINKTRAIL2, S_SINKTRAIL3, + // Battle Mode balloons + S_BATTLEBALLOON, + // Lakitu S_LAKITU1, S_LAKITU2, @@ -3939,6 +3943,12 @@ typedef enum mobj_type MT_SINK, // Kitchen Sink Stuff MT_SINKTRAIL, + MT_BATTLEBALLOON1, // Battle Mode balloons + MT_BATTLEBALLOON2, + MT_BATTLEBALLOON3, + MT_BATTLEBALLOON4, + MT_BATTLEBALLOON5, + MT_LAKITU, MT_POKEY, // Huh, thought this was a default asset for some reason, guess not. diff --git a/src/k_kart.c b/src/k_kart.c index 94cf0607..34ff874d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -295,6 +295,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_lightning); CV_RegisterVar(&cv_kartcc); + CV_RegisterVar(&cv_kartballoons); CV_RegisterVar(&cv_speedometer); CV_RegisterVar(&cv_collideminimum); CV_RegisterVar(&cv_collidesoundnum); @@ -303,6 +304,16 @@ void K_RegisterKartStuff(void) //} +UINT8 K_GetKartCC(void) +{ + if (gametype == GT_MATCH) + return 50; + else if (modeattacking) + return 150; + else + return cv_kartcc.value; +} + //{ SRB2kart Roulette Code - Position Based #define NUMKARTITEMS 18 @@ -667,28 +678,28 @@ static INT32 K_KartItemOddsPosition_Retro[MAXPLAYERS][NUMKARTITEMS][MAXPLAYERS] */ // Less ugly 2D arrays -static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][9] = +static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = { - //P-Odds 0 1 2 3 4 5 6 7 8 - /*Magnet*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet - /*Boo*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo - /*Mushroom*/ { 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom - /*Triple Mushroom*/ { 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom - /*Mega Mushroom*/ { 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom - /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom - /*Star*/ { 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star + //P-Odds 0 1 2 3 4 5 6 7 8 9 + /*Magnet*/ { 2, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet + /*Boo*/ { 1, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo + /*Mushroom*/ { 1, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom + /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom + /*Mega Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom + /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom + /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star - /*Triple Banana*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana - /*Fake Item*/ { 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item - /*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Green Shell*/ { 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell - /*Red Shell*/ { 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell - /*Triple Green Shell*/ { 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell - /*Bob-omb*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb - /*Blue Shell*/ { 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Blue Shell - /*Fire Flower*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower - /*Triple Red Shell*/ { 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell - /*Lightning*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0 } // Lightning + /*Triple Banana*/ { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana + /*Fake Item*/ { 0, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item + /*Banana*/ { 3, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Green Shell*/ { 4, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell + /*Red Shell*/ { 1, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell + /*Triple Green Shell*/ { 2, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell + /*Bob-omb*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb + /*Blue Shell*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Blue Shell + /*Fire Flower*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower + /*Triple Red Shell*/ { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell + /*Lightning*/ { 0, 0, 0, 0, 0, 0, 0, 1, 2, 0 } // Lightning }; /** \brief Item Roulette for Kart @@ -969,15 +980,16 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) player->kartstuff[k_itemclose] = 0; // Reset the item window closer. - if (pingame == 1) useodds = 0; - else if (pdis <= distvar * 0) useodds = 1; // (64*14) * 0 = 0 - else if (pdis <= distvar * 1) useodds = 2; // (64*14) * 1 = 896 - else if (pdis <= distvar * 2) useodds = 3; // (64*14) * 2 = 1792 - else if (pdis <= distvar * 4) useodds = 4; // (64*14) * 4 = 3584 - else if (pdis <= distvar * 6) useodds = 5; // (64*14) * 6 = 5376 - else if (pdis <= distvar * 9) useodds = 6; // (64*14) * 9 = 8064 - else if (pdis <= distvar * 12) useodds = 7; // (64*14) * 12 = 10752 - else useodds = 8; + if (gametype == GT_MATCH) useodds = 0; // Battle Mode + else if (pingame == 1) useodds = 1; // Record Attack, or just alone + else if (pdis <= distvar * 0) useodds = 2; // (64*14) * 0 = 0 + else if (pdis <= distvar * 1) useodds = 3; // (64*14) * 1 = 896 + else if (pdis <= distvar * 2) useodds = 4; // (64*14) * 2 = 1792 + else if (pdis <= distvar * 4) useodds = 5; // (64*14) * 4 = 3584 + else if (pdis <= distvar * 6) useodds = 6; // (64*14) * 6 = 5376 + else if (pdis <= distvar * 9) useodds = 7; // (64*14) * 9 = 8064 + else if (pdis <= distvar * 12) useodds = 8; // (64*14) * 12 = 10752 + else useodds = 9; #define SETITEMRESULT(pos, itemnum) \ for (chance = 0; chance < K_KartItemOddsDistance_Retro[itemnum-1][pos]; chance++) spawnchance[numchoices++] = itemnum @@ -1497,7 +1509,7 @@ static fixed_t K_GetKartBoostPower(player_t *player, boolean speed) { // Mushroom if (speed) { - switch (cv_kartcc.value) + switch (K_GetKartCC()) { case 50: boostvalue = max(boostvalue, 53740+768); @@ -1525,8 +1537,7 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) fixed_t g_cc = FRACUNIT; fixed_t xspd = 3072; // 4.6875 aka 3/64 fixed_t finalspeed; - - switch (cv_kartcc.value) + switch (K_GetKartCC()) { case 50: g_cc = 53248 + xspd; // 50cc = 81.25 + 4.69 = 85.94% @@ -1594,7 +1605,7 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove void K_SpinPlayer(player_t *player, mobj_t *source) { - (void) source; + //(void) source; if (player->health <= 0) return; @@ -1605,6 +1616,29 @@ void K_SpinPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; + if (gametype == GT_MATCH && gameaction != ga_completed) + { + if (player->kartstuff[k_balloon] & 16) + player->kartstuff[k_balloon] &= ~16; + else if (player->kartstuff[k_balloon] & 8) + player->kartstuff[k_balloon] &= ~8; + else if (player->kartstuff[k_balloon] & 4) + player->kartstuff[k_balloon] &= ~4; + else if (player->kartstuff[k_balloon] & 2) + player->kartstuff[k_balloon] &= ~2; + else if (player->kartstuff[k_balloon] & 1) + { + player->kartstuff[k_balloon] &= ~1; + //P_DamageMobj(player->mo, NULL, NULL, 10000); + //return; + } + + if (source && source->player) + source->player->score++; + + K_CheckBalloons(); + } + if (player->kartstuff[k_spinouttype] <= 0) { if (player->kartstuff[k_spinouttype] == 0) @@ -1635,7 +1669,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) void K_SquishPlayer(player_t *player, mobj_t *source) { - (void) source; + //(void) source; if (player->health <= 0) return; @@ -1646,6 +1680,29 @@ void K_SquishPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; + if (gametype == GT_MATCH && gameaction != ga_completed) + { + if (player->kartstuff[k_balloon] & 16) + player->kartstuff[k_balloon] &= ~16; + else if (player->kartstuff[k_balloon] & 8) + player->kartstuff[k_balloon] &= ~8; + else if (player->kartstuff[k_balloon] & 4) + player->kartstuff[k_balloon] &= ~4; + else if (player->kartstuff[k_balloon] & 2) + player->kartstuff[k_balloon] &= ~2; + else if (player->kartstuff[k_balloon] & 1) + { + player->kartstuff[k_balloon] &= ~1; + //P_DamageMobj(player->mo, NULL, NULL, 10000); + //return; + } + + if (source && source->player) + source->player->score++; + + K_CheckBalloons(); + } + player->kartstuff[k_squishedtimer] = 1*TICRATE; player->powers[pw_flashing] = flashingtics; @@ -1662,7 +1719,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) void 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 { - (void) source; + //(void) source; if (player->health <= 0) return; @@ -1676,6 +1733,29 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; + if (gametype == GT_MATCH && gameaction != ga_completed) + { + if (player->kartstuff[k_balloon] & 16) + player->kartstuff[k_balloon] &= ~16; + else if (player->kartstuff[k_balloon] & 8) + player->kartstuff[k_balloon] &= ~8; + else if (player->kartstuff[k_balloon] & 4) + player->kartstuff[k_balloon] &= ~4; + else if (player->kartstuff[k_balloon] & 2) + player->kartstuff[k_balloon] &= ~2; + else if (player->kartstuff[k_balloon] & 1) + { + player->kartstuff[k_balloon] &= ~1; + //P_DamageMobj(player->mo, NULL, NULL, 10000); + //return; + } + + if (source && source->player) + source->player->score++; + + K_CheckBalloons(); + } + player->kartstuff[k_spinouttype] = 1; player->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; @@ -1896,7 +1976,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map return NULL; // Figure out projectile speed by CC - switch (cv_kartcc.value) + switch (K_GetKartCC()) { case 50: PROJSPEED = 85*FRACUNIT; // Avg Speed is 34 @@ -2084,6 +2164,7 @@ static void K_DoBooSteal(player_t *player) if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE && !players[i].exiting && !players[i].powers[pw_super] && !((netgame || multiplayer) && players[i].spectator) && players[i].kartstuff[k_position] < player->kartstuff[k_position] && player != &players[i] + && (gametype == GT_MATCH && players[i].kartstuff[k_balloon] > 0) && (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] @@ -2540,7 +2621,32 @@ void K_MoveKartPlayer(player_t *player, boolean onground) boolean HOLDING_ITEM = K_CheckForHoldItem(player); boolean NO_BOO = (player->kartstuff[k_boostolentimer] == 0 && player->kartstuff[k_bootaketimer] == 0); - K_KartUpdatePosition(player); + if (gametype == GT_RACE) + K_KartUpdatePosition(player); + else if (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0) // dead in match? BOO! + { + player->kartstuff[k_bootaketimer] = bootime; + player->kartstuff[k_magnet] = 0; // reset all those dang items + player->kartstuff[k_boo] = 0; + player->kartstuff[k_mushroom] = 0; + player->kartstuff[k_megashroom] = 0; + player->kartstuff[k_goldshroom] = 0; + player->kartstuff[k_star] = 0; + player->kartstuff[k_triplebanana] = 0; + player->kartstuff[k_fakeitem] = 0; + player->kartstuff[k_banana] = 0; + player->kartstuff[k_greenshell] = 0; + player->kartstuff[k_redshell] = 0; + player->kartstuff[k_laserwisp] = 0; + player->kartstuff[k_triplegreenshell] = 0; + player->kartstuff[k_bobomb] = 0; + player->kartstuff[k_blueshell] = 0; + player->kartstuff[k_jaws] = 0; + player->kartstuff[k_fireflower] = 0; + player->kartstuff[k_tripleredshell] = 0; + player->kartstuff[k_lightning] = 0; + player->kartstuff[k_kitchensink] = 0; + } // Position Taunt // If you were behind someone but just passed them, taunt at them! @@ -3091,6 +3197,34 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } } +void K_CheckBalloons(void) +{ + UINT8 i; + INT8 winnernum = -1; + + if (gameaction == ga_completed) + return; + + if (!D_NumPlayers()) + return; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator || players[i].kartstuff[k_balloon] <= 0) + continue; + + if (winnernum > -1) + return; + + winnernum = i; + } + + players[winnernum].score += 20; + CONS_Printf(M_GetText("%s has recieved 20 points for surviving!\n"), player_names[winnernum]); + if (server) + SendNetXCmd(XD_EXITLEVEL, NULL, 0); +} + //} //{ SRB2kart HUD Code @@ -4029,29 +4163,31 @@ void K_drawKartHUD(void) else K_drawKartRetroItem(); - // If not splitscreen, draw... - // The little triple-item icons at the bottom - // The top-four faces on the left - if (!(splitscreen || modeattacking)) + //K_DrawKartTripleItem(); + + if (gametype == GT_RACE) // Race-only elements { - //K_DrawKartTripleItem(); - K_drawKartPositionFaces(); + // If not splitscreen, draw... + // The little triple-item icons at the bottom + // The top-four faces on the left + if (!(splitscreen || modeattacking)) + { + K_drawKartPositionFaces(); + // Draw the numerical position + K_DrawKartPositionNum(stplyr->kartstuff[k_position]); + } + + // Draw the lap counter + V_DrawScaledPatch(LAPS_X, STRINGY(LAPS_Y), 0, kp_lapsticker); + if (stplyr->exiting) + V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), 0, "FIN"); + else + V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), 0, va("%d/%d", stplyr->laps+1, cv_numlaps.value)); } // Draw the timestamp K_drawKartTimestamp(); - // Draw the lap counter - V_DrawScaledPatch(LAPS_X, STRINGY(LAPS_Y), 0, kp_lapsticker); - if (stplyr->exiting) - V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), 0, "FIN"); - else - V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), 0, va("%d/%d", stplyr->laps+1, cv_numlaps.value)); - - // Draw the numerical position - if (!modeattacking) - K_DrawKartPositionNum(stplyr->kartstuff[k_position]); - // Draw the speedometer // TODO: Make a better speedometer. K_drawKartSpeedometer(); diff --git a/src/k_kart.h b/src/k_kart.h index dfe7ec39..4bda7dbf 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -28,6 +28,7 @@ void K_MomentumToFacing(player_t *player); fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower); fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove); void K_MoveKartPlayer(player_t *player, boolean onground); +void K_CheckBalloons(void); void K_LoadKartHUDGraphics(void); void K_drawKartHUD(void); diff --git a/src/p_enemy.c b/src/p_enemy.c index 6ab7d79b..a37da386 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -850,7 +850,7 @@ void A_Look(mobj_t *actor) if (!P_LookForPlayers(actor, locvar1 & 65535, false , FixedMul((locvar1 >> 16)*FRACUNIT, actor->scale))) return; - if (leveltime < 4*TICRATE && gametype == GT_RACE) // SRB2kart - no looking before race starts + if (leveltime < 4*TICRATE) // SRB2kart - no looking before race starts return; // go into chase state diff --git a/src/p_inter.c b/src/p_inter.c index 13546ad7..bd0ad18c 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2004,6 +2004,16 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) target->target->player->kartstuff[k_triplebanana] &= ~2; else if (target->type == MT_TRIPLEBANANASHIELD3 && target->target->player->kartstuff[k_triplebanana] & 4) target->target->player->kartstuff[k_triplebanana] &= ~4; + else if (target->type == MT_BATTLEBALLOON1 && target->target->player->kartstuff[k_balloon] & 1) + target->target->player->kartstuff[k_balloon] &= ~1; + else if (target->type == MT_BATTLEBALLOON2 && target->target->player->kartstuff[k_balloon] & 2) + target->target->player->kartstuff[k_balloon] &= ~2; + else if (target->type == MT_BATTLEBALLOON3 && target->target->player->kartstuff[k_balloon] & 4) + target->target->player->kartstuff[k_balloon] &= ~4; + else if (target->type == MT_BATTLEBALLOON4 && target->target->player->kartstuff[k_balloon] & 8) + target->target->player->kartstuff[k_balloon] &= ~8; + else if (target->type == MT_BATTLEBALLOON5 && target->target->player->kartstuff[k_balloon] & 16) + target->target->player->kartstuff[k_balloon] &= ~16; } // @@ -2224,6 +2234,10 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) } } } + else if (gametype == GT_MATCH) + { + K_CheckBalloons(); + } } if (source && target && target->player && source->player) diff --git a/src/p_local.h b/src/p_local.h index c86256ae..48db93c2 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -153,7 +153,7 @@ void P_DoJumpShield(player_t *player); void P_BlackOw(player_t *player); void P_ElementalFireTrail(player_t *player); -void P_DoPityCheck(player_t *player); +//void P_DoPityCheck(player_t *player); void P_PlayerThink(player_t *player); void P_PlayerAfterThink(player_t *player); void P_DoPlayerExit(player_t *player); diff --git a/src/p_mobj.c b/src/p_mobj.c index d14ee865..44eebe56 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -218,7 +218,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) { // Start flashing, since you've landed. player->powers[pw_flashing] = flashingtics-1; - P_DoPityCheck(player); + //P_DoPityCheck(player); } // Set animation state @@ -6573,6 +6573,11 @@ void P_MobjThinker(mobj_t *mobj) case MT_TRIPLEBANANASHIELD1: case MT_TRIPLEBANANASHIELD2: case MT_TRIPLEBANANASHIELD3: + case MT_BATTLEBALLOON1: + case MT_BATTLEBALLOON2: + case MT_BATTLEBALLOON3: + case MT_BATTLEBALLOON4: + case MT_BATTLEBALLOON5: if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { @@ -6588,7 +6593,9 @@ void P_MobjThinker(mobj_t *mobj) //mobj->angle += FixedAngle(12*FRACUNIT); // mobj's actual speed. if (mobj->type == MT_TRIPLEGREENSHIELD1 || mobj->type == MT_TRIPLEGREENSHIELD2 || mobj->type == MT_TRIPLEGREENSHIELD3 - || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3) + || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3 + || mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 + || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) mobj->angle += FixedAngle(mobj->info->speed); else if (mobj->type == MT_TRIPLEBANANASHIELD2) mobj->angle = (mobj->target->angle + ANGLE_135); @@ -6597,8 +6604,12 @@ void P_MobjThinker(mobj_t *mobj) else mobj->angle = (mobj->target->angle + ANGLE_180); + if (mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 + || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + mobj->color = mobj->target->color; + // If the player is on the ceiling, then flip your items as well. - if (mobj->target->player && mobj->target->eflags & MFE_VERTICALFLIP) + if (mobj->target->eflags & MFE_VERTICALFLIP) { mobj->eflags |= MFE_VERTICALFLIP; HEIGHT = mobj->target->height / 2; @@ -6610,8 +6621,7 @@ void P_MobjThinker(mobj_t *mobj) } // Shrink your items if the player shrunk too. - if (mobj->target->player) - mobj->scale = mobj->target->scale; + mobj->scale = mobj->target->scale; P_UnsetThingPosition(mobj); { @@ -6636,7 +6646,12 @@ void P_MobjThinker(mobj_t *mobj) || (mobj->type == MT_TRIPLEBANANASHIELD2 && !(mobj->target->player->kartstuff[k_triplebanana] & 2)) || (mobj->type == MT_TRIPLEBANANASHIELD3 && !(mobj->target->player->kartstuff[k_triplebanana] & 4)) || (mobj->type == MT_BOMBSHIELD && !(mobj->target->player->kartstuff[k_bobomb] & 1)) - || (mobj->type == MT_FAKESHIELD && !(mobj->target->player->kartstuff[k_fakeitem] & 1))) + || (mobj->type == MT_FAKESHIELD && !(mobj->target->player->kartstuff[k_fakeitem] & 1)) + || (mobj->type == MT_BATTLEBALLOON1 && !(mobj->target->player->kartstuff[k_balloon] & 1)) + || (mobj->type == MT_BATTLEBALLOON2 && !(mobj->target->player->kartstuff[k_balloon] & 2)) + || (mobj->type == MT_BATTLEBALLOON3 && !(mobj->target->player->kartstuff[k_balloon] & 4)) + || (mobj->type == MT_BATTLEBALLOON4 && !(mobj->target->player->kartstuff[k_balloon] & 8)) + || (mobj->type == MT_BATTLEBALLOON5 && !(mobj->target->player->kartstuff[k_balloon] & 16))) { P_RemoveMobj(mobj); return; @@ -9030,13 +9045,13 @@ void P_SpawnPlayer(INT32 playernum) { // Special case for (NiGHTS) special stages! // if stage has already started, force players to become spectators until the next stage - if (multiplayer && netgame && G_IsSpecialStage(gamemap) && useNightsSS && leveltime > 0) + /*if (multiplayer && netgame && G_IsSpecialStage(gamemap) && useNightsSS && leveltime > 0) p->spectator = true; - else + else*/ p->spectator = false; } else if (netgame && p->jointime < 1) - p->spectator = true; + /*p->spectator = true*/; else if (multiplayer && !netgame) { // If you're in a team game and you don't have a team assigned yet... @@ -9106,7 +9121,80 @@ void P_SpawnPlayer(INT32 playernum) P_FlashPal(p, 0, 0); // Resets // Spawn with a pity shield if necessary. - P_DoPityCheck(p); + //P_DoPityCheck(p); + + if (gametype == GT_MATCH && p->playerstate != PST_REBORN) // srb2kart + { + angle_t newangle, diff; + fixed_t newx; + fixed_t newy; + mobj_t *mo, *mo2, *mo3, *mo4, *mo5; + + switch (cv_kartballoons.value) // Fallthrough intentional + { + case 5: + p->kartstuff[k_balloon] |= 0x16; + case 4: + p->kartstuff[k_balloon] |= 0x08; + case 3: + p->kartstuff[k_balloon] |= 0x04; + case 2: + p->kartstuff[k_balloon] |= 0x02; + case 1: + p->kartstuff[k_balloon] |= 0x01; + break; + default: + p->kartstuff[k_balloon] = 0x01|0x02|0x04; + break; + } + + newangle = mobj->angle; + diff = FixedAngle(360*FRACUNIT/cv_kartballoons.value); + newx = mobj->x + P_ReturnThrustX(mobj, newangle + ANGLE_180, 64*FRACUNIT); + newy = mobj->y + P_ReturnThrustY(mobj, newangle + ANGLE_180, 64*FRACUNIT); + + mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON1); + mo->threshold = 10; + P_SetTarget(&mo->target, mobj); + mo->angle = 0; + mo->color = mobj->color; + + if (p->kartstuff[k_balloon] & 2) + { + mo2 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON2); + mo2->threshold = 10; + P_SetTarget(&mo2->target, mobj); + mo2->angle = diff; + mo2->color = mobj->color; + } + + if (p->kartstuff[k_balloon] & 4) + { + mo3 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON3); + mo3->threshold = 10; + P_SetTarget(&mo3->target, mobj); + mo3->angle = diff*2; + mo3->color = mobj->color; + } + + if (p->kartstuff[k_balloon] & 8) + { + mo4 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON4); + mo4->threshold = 10; + P_SetTarget(&mo4->target, mobj); + mo4->angle = diff*3; + mo4->color = mobj->color; + } + + if (p->kartstuff[k_balloon] & 16) + { + mo5 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON5); + mo5->threshold = 10; + P_SetTarget(&mo5->target, mobj); + mo5->angle = diff*4; + mo5->color = mobj->color; + } + } } void P_AfterPlayerSpawn(INT32 playernum) diff --git a/src/p_setup.c b/src/p_setup.c index e91acab6..42ad4697 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2566,8 +2566,7 @@ boolean P_SetupLevel(boolean skipprecip) // chasecam on in chaos, race, coop // chasecam off in match, tag, capture the flag - chase = (gametype == GT_RACE || gametype == GT_COMPETITION || gametype == GT_COOP) - || (maptol & TOL_2D); + chase = true; // srb2kart: always on if (!dedicated) { diff --git a/src/p_user.c b/src/p_user.c index 007e3a55..8c066834 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8038,41 +8038,33 @@ static void P_DeathThink(player_t *player) } } - if (gametype == GT_RACE || gametype == GT_COMPETITION || (gametype == GT_COOP && (multiplayer || netgame))) + // Keep time rolling + if (!(countdown2 && !countdown) && !player->exiting && !(player->pflags & PF_TIMEOVER)) + { + if (leveltime >= 4*TICRATE) + player->realtime = leveltime - 4*TICRATE; + else + player->realtime = 0; + } + + if ((gametype == GT_RACE || gametype == GT_COMPETITION || (gametype == GT_COOP && (multiplayer || netgame))) && (player->lives <= 0)) { - // Keep time rolling in race mode - if (!(countdown2 && !countdown) && !player->exiting && !(player->pflags & PF_TIMEOVER)) - { - if (gametype == GT_RACE || gametype == GT_COMPETITION) - { - if (leveltime >= 4*TICRATE) - player->realtime = leveltime - 4*TICRATE; - else - player->realtime = 0; - } - else - player->realtime = leveltime; - } - // Return to level music - if (player->lives <= 0) + if (netgame) { - if (netgame) - { - if (player->deadtimer == gameovertics && P_IsLocalPlayer(player)) - S_ChangeMusic(mapmusname, mapmusflags, true); - } - else if (multiplayer) // local multiplayer only - { - if (player->deadtimer != gameovertics) - ; - // Restore the other player's music once we're dead for long enough - // -- that is, as long as they aren't dead too - else if (player == &players[displayplayer] && players[secondarydisplayplayer].lives > 0) - P_RestoreMusic(&players[secondarydisplayplayer]); - else if (player == &players[secondarydisplayplayer] && players[displayplayer].lives > 0) - P_RestoreMusic(&players[displayplayer]); - } + if (player->deadtimer == gameovertics && P_IsLocalPlayer(player)) + S_ChangeMusic(mapmusname, mapmusflags, true); + } + else if (multiplayer) // local multiplayer only + { + if (player->deadtimer != gameovertics) + ; + // Restore the other player's music once we're dead for long enough + // -- that is, as long as they aren't dead too + else if (player == &players[displayplayer] && players[secondarydisplayplayer].lives > 0) + P_RestoreMusic(&players[secondarydisplayplayer]); + else if (player == &players[secondarydisplayplayer] && players[displayplayer].lives > 0) + P_RestoreMusic(&players[displayplayer]); } } @@ -9007,7 +8999,7 @@ static void P_CalcPostImg(player_t *player) #endif } -void P_DoPityCheck(player_t *player) +/*void P_DoPityCheck(player_t *player) { // No pity outside of match or CTF. if (player->spectator @@ -9024,7 +9016,7 @@ void P_DoPityCheck(player_t *player) player->powers[pw_shield] = SH_PITY; P_SpawnShieldOrb(player); } -} +}*/ // // P_PlayerThink @@ -9252,7 +9244,7 @@ void P_PlayerThink(player_t *player) playerdeadview = false; // SRB2kart 010217 - if (gametype == GT_RACE && leveltime < 4*TICRATE) + if (leveltime < 4*TICRATE) player->powers[pw_nocontrol] = 2; /* if ((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE) @@ -9266,15 +9258,10 @@ void P_PlayerThink(player_t *player) // Synchronizes the "real" amount of time spent in the level. if (!player->exiting) { - if (gametype == GT_RACE || gametype == GT_COMPETITION) - { - if (leveltime >= 4*TICRATE) - player->realtime = leveltime - 4*TICRATE; - else - player->realtime = 0; - } + if (leveltime >= 4*TICRATE) + player->realtime = leveltime - 4*TICRATE; else - player->realtime = leveltime; + player->realtime = 0; } if ((netgame || splitscreen) && player->spectator && cmd->buttons & BT_ATTACK && !player->powers[pw_flashing]) From f84485c68015a3c555dad8a0088749a68c06cf97 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 22 Oct 2017 04:17:44 -0400 Subject: [PATCH 02/61] More equal, chaotic battle item odds --- src/k_kart.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 34ff874d..f653b0db 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -681,7 +681,7 @@ static INT32 K_KartItemOddsPosition_Retro[MAXPLAYERS][NUMKARTITEMS][MAXPLAYERS] static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = { //P-Odds 0 1 2 3 4 5 6 7 8 9 - /*Magnet*/ { 2, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet + /*Magnet*/ { 1, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet /*Boo*/ { 1, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo /*Mushroom*/ { 1, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom @@ -690,14 +690,14 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star /*Triple Banana*/ { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana - /*Fake Item*/ { 0, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item - /*Banana*/ { 3, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Green Shell*/ { 4, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell + /*Fake Item*/ { 1, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item + /*Banana*/ { 1, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Green Shell*/ { 1, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell /*Red Shell*/ { 1, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell - /*Triple Green Shell*/ { 2, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell - /*Bob-omb*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb + /*Triple Green Shell*/ { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell + /*Bob-omb*/ { 1, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb /*Blue Shell*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Blue Shell - /*Fire Flower*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower + /*Fire Flower*/ { 1, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower /*Triple Red Shell*/ { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell /*Lightning*/ { 0, 0, 0, 0, 0, 0, 0, 1, 2, 0 } // Lightning }; From b36fd5c5f96ae73da91bab203a579162f491c00b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 22 Oct 2017 17:26:43 -0400 Subject: [PATCH 03/61] Did you know: Battle Mode - Different sizes for the balloons, depending on how many you have - Balloons are fullbright, cast shadows, and stick closer to players - Mega Mushrooms can now appear - Can steal items with Boo in Battle Mode now, as intended - Death pits make you lose only 1 balloon - Balloons disappear properly if you use Boo - Boo item icon should no longer appear if you're out of balloons - You can now properly respawn in Battle Mode - Can no longer collide with items if you are already holding one --- src/dehacked.c | 4 +- src/g_game.c | 6 +- src/info.c | 234 +++++++++++++++++++++++++------------------------ src/info.h | 4 +- src/k_kart.c | 121 +++++++++++++------------ src/p_inter.c | 56 ++++++++++-- src/p_mobj.c | 108 ++++++++++++++++------- src/p_spec.c | 4 +- src/p_user.c | 24 +++-- 9 files changed, 327 insertions(+), 234 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 54c07bb7..f482eec9 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6382,7 +6382,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_SINKTRAIL3", // Battle Mode balloon - "S_BATTLEBALLOON", + "S_BATTLEBALLOON1", + "S_BATTLEBALLOON2", + "S_BATTLEBALLOON3", // Pokey "S_POKEY1", diff --git a/src/g_game.c b/src/g_game.c index effd2127..d73e90d0 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2188,6 +2188,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart INT32 starpostwp; INT32 offroad; + INT32 balloon; score = players[player].score; lives = players[player].lives; @@ -2242,6 +2243,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart starpostwp = players[player].kartstuff[k_starpostwp]; offroad = players[player].kartstuff[k_offroad]; + balloon = players[player].kartstuff[k_balloon]; p = &players[player]; memset(p, 0, sizeof (*p)); @@ -2297,6 +2299,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync p->kartstuff[k_offroad] = offroad; + p->kartstuff[k_balloon] = balloon; // Don't do anything immediately p->pflags |= PF_USEDOWN; @@ -2801,7 +2804,8 @@ boolean G_GametypeHasTeams(void) // boolean G_GametypeHasSpectators(void) { - return (gametype != GT_COOP && gametype != GT_COMPETITION && gametype != GT_RACE); + return (gametype != GT_COOP && gametype != GT_COMPETITION && gametype != GT_RACE + && gametype != GT_MATCH); // srb2kart: temporary? } // diff --git a/src/info.c b/src/info.c index 264cf574..0ac52481 100644 --- a/src/info.c +++ b/src/info.c @@ -2718,7 +2718,9 @@ state_t states[NUMSTATES] = {SPR_SITR, 1, 5, {NULL}, 0, 0, S_SINKTRAIL3}, // S_SINKTRAIL2 {SPR_SITR, 2, 3, {NULL}, 0, 0, S_NULL}, // S_SINKTRAIL3 - {SPR_KBLN, 0, 1, {NULL}, 0, 0, S_BATTLEBALLOON}, // S_BATTLEBALLOON + {SPR_KBLN, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BATTLEBALLOON1}, // S_BATTLEBALLOON1 + {SPR_KBLN, 1|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BATTLEBALLOON2}, // S_BATTLEBALLOON2 + {SPR_KBLN, 2|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BATTLEBALLOON3}, // S_BATTLEBALLOON3 {SPR_LAKI, 0, 64, {NULL}, 1, 0, S_LAKITU2}, // S_LAKITU1 {SPR_LAKI, 1, 35, {NULL}, 0, 0, S_NULL}, // S_LAKITU2 @@ -15136,138 +15138,138 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = }, { // MT_BATTLEBALLOON1 - -1, // doomednum - S_BATTLEBALLOON,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -1, // doomednum + S_BATTLEBALLOON1,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 8*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate + S_NULL // raisestate }, { // MT_BATTLEBALLOON2 - -1, // doomednum - S_BATTLEBALLOON,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -1, // doomednum + S_BATTLEBALLOON1,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 8*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate + S_NULL // raisestate }, { // MT_BATTLEBALLOON3 - -1, // doomednum - S_BATTLEBALLOON,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -1, // doomednum + S_BATTLEBALLOON1,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 8*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate + S_NULL // raisestate }, { // MT_BATTLEBALLOON4 - -1, // doomednum - S_BATTLEBALLOON,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -1, // doomednum + S_BATTLEBALLOON1,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 8*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate + S_NULL // raisestate }, { // MT_BATTLEBALLOON5 - -1, // doomednum - S_BATTLEBALLOON,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 16*FRACUNIT, // radius - 32*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound + -1, // doomednum + S_BATTLEBALLOON1,// spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 5*FRACUNIT, // speed + 8*FRACUNIT, // radius + 16*FRACUNIT, // height + 0, // display offset + 100, // mass + 1, // damage + sfx_None, // activesound MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate + S_NULL // raisestate }, { // MT_LAKITU diff --git a/src/info.h b/src/info.h index ba016069..fc996cd4 100644 --- a/src/info.h +++ b/src/info.h @@ -3225,7 +3225,9 @@ typedef enum state S_SINKTRAIL3, // Battle Mode balloons - S_BATTLEBALLOON, + S_BATTLEBALLOON1, + S_BATTLEBALLOON2, + S_BATTLEBALLOON3, // Lakitu S_LAKITU1, diff --git a/src/k_kart.c b/src/k_kart.c index f653b0db..e59df3ee 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -685,7 +685,7 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = /*Boo*/ { 1, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo /*Mushroom*/ { 1, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom - /*Mega Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom + /*Mega Mushroom*/ { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star @@ -1633,8 +1633,8 @@ void K_SpinPlayer(player_t *player, mobj_t *source) //return; } - if (source && source->player) - source->player->score++; + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); K_CheckBalloons(); } @@ -1697,8 +1697,8 @@ void K_SquishPlayer(player_t *player, mobj_t *source) //return; } - if (source && source->player) - source->player->score++; + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); K_CheckBalloons(); } @@ -1750,8 +1750,8 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju //return; } - if (source && source->player) - source->player->score++; + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); K_CheckBalloons(); } @@ -2156,15 +2156,15 @@ static void K_DoBooSteal(player_t *player) INT32 stealplayer = 0; // The player that's getting stolen from INT32 prandom = 0; - if (!multiplayer) + if (!multiplayer || (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0)) return; for (i = 0; i < MAXPLAYERS; i++) { if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE - && !players[i].exiting && !players[i].powers[pw_super] && !((netgame || multiplayer) && players[i].spectator) - && players[i].kartstuff[k_position] < player->kartstuff[k_position] && player != &players[i] - && (gametype == GT_MATCH && players[i].kartstuff[k_balloon] > 0) + && player != &players[i] && !players[i].exiting && !players[i].powers[pw_super] && !(players[i].spectator) + && ((gametype == GT_RACE && players[i].kartstuff[k_position] < player->kartstuff[k_position]) + || (gametype == GT_MATCH && players[i].kartstuff[k_balloon] > 0)) && (players[i].kartstuff[k_star] || players[i].kartstuff[k_mushroom] || players[i].kartstuff[k_goldshroom] || players[i].kartstuff[k_megashroom] || players[i].kartstuff[k_lightning] || players[i].kartstuff[k_blueshell] @@ -2623,30 +2623,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (gametype == GT_RACE) K_KartUpdatePosition(player); - else if (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0) // dead in match? BOO! - { - player->kartstuff[k_bootaketimer] = bootime; - player->kartstuff[k_magnet] = 0; // reset all those dang items - player->kartstuff[k_boo] = 0; - player->kartstuff[k_mushroom] = 0; - player->kartstuff[k_megashroom] = 0; - player->kartstuff[k_goldshroom] = 0; - player->kartstuff[k_star] = 0; - player->kartstuff[k_triplebanana] = 0; - player->kartstuff[k_fakeitem] = 0; - player->kartstuff[k_banana] = 0; - player->kartstuff[k_greenshell] = 0; - player->kartstuff[k_redshell] = 0; - player->kartstuff[k_laserwisp] = 0; - player->kartstuff[k_triplegreenshell] = 0; - player->kartstuff[k_bobomb] = 0; - player->kartstuff[k_blueshell] = 0; - player->kartstuff[k_jaws] = 0; - player->kartstuff[k_fireflower] = 0; - player->kartstuff[k_tripleredshell] = 0; - player->kartstuff[k_lightning] = 0; - player->kartstuff[k_kitchensink] = 0; - } // Position Taunt // If you were behind someone but just passed them, taunt at them! @@ -3195,32 +3171,62 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_boostcharge] = 0; } + + if (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0) // dead in match? BOO! + { + player->kartstuff[k_bootaketimer] = bootime; + player->kartstuff[k_magnet] = 0; // reset all those dang items + player->kartstuff[k_boo] = 0; + player->kartstuff[k_mushroom] = 0; + player->kartstuff[k_megashroom] = 0; + player->kartstuff[k_goldshroom] = 0; + player->kartstuff[k_star] = 0; + player->kartstuff[k_triplebanana] = 0; + player->kartstuff[k_fakeitem] = 0; + player->kartstuff[k_banana] = 0; + player->kartstuff[k_greenshell] = 0; + player->kartstuff[k_redshell] = 0; + player->kartstuff[k_laserwisp] = 0; + player->kartstuff[k_triplegreenshell] = 0; + player->kartstuff[k_bobomb] = 0; + player->kartstuff[k_blueshell] = 0; + player->kartstuff[k_jaws] = 0; + player->kartstuff[k_fireflower] = 0; + player->kartstuff[k_tripleredshell] = 0; + player->kartstuff[k_lightning] = 0; + player->kartstuff[k_kitchensink] = 0; + } } void K_CheckBalloons(void) { UINT8 i; + UINT8 numingame = 0; INT8 winnernum = -1; - - if (gameaction == ga_completed) - return; - if (!D_NumPlayers()) + if (gameaction == ga_completed) return; for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i] || players[i].spectator || players[i].kartstuff[k_balloon] <= 0) + if (!playeringame[i] || players[i].spectator) // not even in-game :V continue; - if (winnernum > -1) - return; + numingame++; + if (players[i].kartstuff[k_balloon] <= 0) // if you don't have any balloons, you're probably not a winner + continue; + else if (winnernum > -1) // TWO winners? that's dumb :V + return; winnernum = i; } - players[winnernum].score += 20; - CONS_Printf(M_GetText("%s has recieved 20 points for surviving!\n"), player_names[winnernum]); + if (numingame <= 1) + return; + + P_AddPlayerScore(&players[winnernum], numingame); + CONS_Printf(M_GetText("%s recieved %d points for surviving!\n"), player_names[winnernum], numingame); // numingame/2 == 1 ? "" : "s" + if (server) SendNetXCmd(XD_EXITLEVEL, NULL, 0); } @@ -3679,31 +3685,32 @@ static void K_drawKartRetroItem(void) // The only actual reason is to make triple/double/single mushrooms line up this way in the code below // This shouldn't have any actual baring over how it functions // Boo is first, because we're drawing it on top of the player's current item - if ((stplyr->kartstuff[k_bootaketimer] > 0 - || stplyr->kartstuff[k_boostolentimer] > 0) && (leveltime & 2)) localpatch = kp_boosteal; - else if (stplyr->kartstuff[k_boostolentimer] > 0 && !(leveltime & 2)) localpatch = kp_noitem; + if ((stplyr->kartstuff[k_bootaketimer] > 0 || stplyr->kartstuff[k_boostolentimer] > 0) + && !(gametype == GT_MATCH && stplyr->kartstuff[k_balloon] <= 0) + && (leveltime & 2)) localpatch = kp_boosteal; + else if (stplyr->kartstuff[k_boostolentimer] > 0 && !(leveltime & 2)) localpatch = kp_noitem; else if (stplyr->kartstuff[k_kitchensink] == 1) localpatch = kp_kitchensink; - else if (stplyr->kartstuff[k_lightning] == 1) localpatch = kp_lightning; - else if (stplyr->kartstuff[k_tripleredshell]) localpatch = kp_tripleredshell; // &8 + else if (stplyr->kartstuff[k_lightning] == 1) localpatch = kp_lightning; + else if (stplyr->kartstuff[k_tripleredshell]) localpatch = kp_tripleredshell; // &8 else if (stplyr->kartstuff[k_fireflower] == 1) localpatch = kp_fireflower; - else if (stplyr->kartstuff[k_blueshell] == 1) localpatch = kp_blueshell; - else if (stplyr->kartstuff[k_bobomb]) localpatch = kp_bobomb; // &2 + else if (stplyr->kartstuff[k_blueshell] == 1) localpatch = kp_blueshell; + else if (stplyr->kartstuff[k_bobomb]) localpatch = kp_bobomb; // &2 else if (stplyr->kartstuff[k_triplegreenshell]) localpatch = kp_triplegreenshell; // &8 else if (stplyr->kartstuff[k_redshell]) localpatch = kp_redshell; // &2 - else if (stplyr->kartstuff[k_greenshell]) localpatch = kp_greenshell; // &2 - else if (stplyr->kartstuff[k_banana]) localpatch = kp_banana; // &2 + else if (stplyr->kartstuff[k_greenshell]) localpatch = kp_greenshell; // &2 + else if (stplyr->kartstuff[k_banana]) localpatch = kp_banana; // &2 else if (stplyr->kartstuff[k_fakeitem] & 2) localpatch = kp_fakeitem; else if (stplyr->kartstuff[k_triplebanana]) localpatch = kp_triplebanana; // &8 - else if (stplyr->kartstuff[k_star] == 1) localpatch = kp_star; + else if (stplyr->kartstuff[k_star] == 1) localpatch = kp_star; else if (stplyr->kartstuff[k_goldshroom] == 1 - || (stplyr->kartstuff[k_goldshroomtimer] > 1 && (leveltime & 1))) localpatch = kp_goldshroom; + || (stplyr->kartstuff[k_goldshroomtimer] > 1 && (leveltime & 1))) localpatch = kp_goldshroom; else if (stplyr->kartstuff[k_goldshroomtimer] > 1 && !(leveltime & 1)) localpatch = kp_noitem; else if (stplyr->kartstuff[k_megashroom] == 1 - || (stplyr->kartstuff[k_growshrinktimer] > 1 && (leveltime & 1))) localpatch = kp_megashroom; + || (stplyr->kartstuff[k_growshrinktimer] > 1 && (leveltime & 1))) localpatch = kp_megashroom; else if (stplyr->kartstuff[k_growshrinktimer] > 1 && !(leveltime & 1)) localpatch = kp_noitem; else if (stplyr->kartstuff[k_mushroom] & 4) localpatch = kp_triplemushroom; else if (stplyr->kartstuff[k_mushroom] & 2) localpatch = kp_doublemushroom; - else if (stplyr->kartstuff[k_mushroom] == 1) localpatch = kp_mushroom; + else if (stplyr->kartstuff[k_mushroom] == 1) localpatch = kp_mushroom; else if (stplyr->kartstuff[k_boo] == 1) localpatch = kp_boo; else if (stplyr->kartstuff[k_magnet] == 1) localpatch = kp_magnet; diff --git a/src/p_inter.c b/src/p_inter.c index bd0ad18c..42e8976f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -150,6 +150,30 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) //if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics) // return false; + if (player->kartstuff[k_bootaketimer] + || player->kartstuff[k_boostolentimer] + || player->kartstuff[k_magnet] + || player->kartstuff[k_boo] + || player->kartstuff[k_mushroom] + || player->kartstuff[k_megashroom] + || player->kartstuff[k_goldshroom] + || player->kartstuff[k_star] + || player->kartstuff[k_triplebanana] == 0x8 + || player->kartstuff[k_fakeitem] == 0x2 + || player->kartstuff[k_banana] == 0x2 + || player->kartstuff[k_greenshell] == 0x2 + || player->kartstuff[k_redshell] == 0x2 + || player->kartstuff[k_laserwisp] + || player->kartstuff[k_triplegreenshell] == 0x8 + || player->kartstuff[k_bobomb] == 0x2 + || player->kartstuff[k_blueshell] + || player->kartstuff[k_jaws] == 0x4 + || player->kartstuff[k_fireflower] + || player->kartstuff[k_tripleredshell] == 0x8 + || player->kartstuff[k_lightning] + || player->kartstuff[k_kitchensink]) + return false; + return true; } @@ -2224,7 +2248,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) for (w=0; w < MAXPLAYERS; w++) { if (players[w].pflags & PF_TAGIT) - P_AddPlayerScore(&players[w], 100); + P_AddPlayerScore(&players[w], 1); } target->player->pflags |= PF_TAGGED; @@ -2594,7 +2618,7 @@ static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sou // The tag occurs so long as you aren't shooting another tagger with friendlyfire on. if (source->player->pflags & PF_TAGIT && !(player->pflags & PF_TAGIT)) { - P_AddPlayerScore(source->player, 100); //award points to tagger. + P_AddPlayerScore(source->player, 1); //award points to tagger. P_HitDeathMessages(player, inflictor, source); if (gametype == GT_TAG) //survivor @@ -2708,21 +2732,21 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) P_ResetPlayer(player); P_SetPlayerMobjState(player->mo, player->mo->info->deathstate); - if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG))) + /*if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG))) { P_PlayerFlagBurst(player, false); if (source && source->player) { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) - P_AddPlayerScore(source->player, 25); + P_AddPlayerScore(source->player, 1); } } if (source && source->player && !player->powers[pw_super]) //don't score points against super players { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) - P_AddPlayerScore(source->player, 100); + P_AddPlayerScore(source->player, 1); } // If the player was super, tell them he/she ain't so super nomore. @@ -2732,6 +2756,20 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) HU_SetCEchoFlags(0); HU_SetCEchoDuration(5); HU_DoCEcho(va("%s\\is no longer super.\\\\\\\\", player_names[player-players])); + }*/ + + if (player->kartstuff[k_balloon]) + { + if (player->kartstuff[k_balloon] & 16) + player->kartstuff[k_balloon] &= ~16; + else if (player->kartstuff[k_balloon] & 8) + player->kartstuff[k_balloon] &= ~8; + else if (player->kartstuff[k_balloon] & 4) + player->kartstuff[k_balloon] &= ~4; + else if (player->kartstuff[k_balloon] & 2) + player->kartstuff[k_balloon] &= ~2; + else if (player->kartstuff[k_balloon] & 1) + player->kartstuff[k_balloon] &= ~1; } } @@ -2868,11 +2906,11 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN S_StartSound(player->mo, sfx_spkdth); } - if (source && source->player && !player->powers[pw_super]) //don't score points against super players + /*if (source && source->player && !player->powers[pw_super]) //don't score points against super players { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) - P_AddPlayerScore(source->player, 50); + P_AddPlayerScore(source->player, 1); } if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG))) @@ -2882,9 +2920,9 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN { // Award no points when players shoot each other when cv_friendlyfire is on. if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo)) - P_AddPlayerScore(source->player, 25); + P_AddPlayerScore(source->player, 1); } - } + }*/ // Ring loss sound plays despite hitting spikes P_PlayRinglossSound(player->mo); // Ringledingle! diff --git a/src/p_mobj.c b/src/p_mobj.c index 44eebe56..13e241d4 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6581,21 +6581,21 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { - INT32 zfixds = 56; - INT32 DIST = FixedMul(zfixds, mobj->target->scale); - INT32 HEIGHT; - const fixed_t radius = DIST*FRACUNIT; // mobj's distance from its Target, or Radius. + fixed_t HEIGHT; + fixed_t radius = 56*mobj->target->scale; // mobj's distance from its Target, or Radius. if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) - zfixds = 64; + radius = 64*mobj->target->scale; + else if (mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + radius = 32*mobj->target->scale; else - zfixds = 56; + radius = 56*mobj->target->scale; //mobj->angle += FixedAngle(12*FRACUNIT); // mobj's actual speed. if (mobj->type == MT_TRIPLEGREENSHIELD1 || mobj->type == MT_TRIPLEGREENSHIELD2 || mobj->type == MT_TRIPLEGREENSHIELD3 - || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3 - || mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3 + || mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 + || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) mobj->angle += FixedAngle(mobj->info->speed); else if (mobj->type == MT_TRIPLEBANANASHIELD2) mobj->angle = (mobj->target->angle + ANGLE_135); @@ -6604,10 +6604,6 @@ void P_MobjThinker(mobj_t *mobj) else mobj->angle = (mobj->target->angle + ANGLE_180); - if (mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) - mobj->color = mobj->target->color; - // If the player is on the ceiling, then flip your items as well. if (mobj->target->eflags & MFE_VERTICALFLIP) { @@ -6620,6 +6616,27 @@ void P_MobjThinker(mobj_t *mobj) HEIGHT = mobj->target->height / 5; } + if (mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 + || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + { + mobj->color = mobj->target->color; + + if (!(mobj->target->player->kartstuff[k_balloon] & 4)) + P_SetMobjState(mobj, S_BATTLEBALLOON2); + else if (!(mobj->target->player->kartstuff[k_balloon] & 2)) + P_SetMobjState(mobj, S_BATTLEBALLOON3); + + if (mobj->target->flags2 & MF2_DONTDRAW) + mobj->flags2 |= MF2_DONTDRAW; + else + mobj->flags2 &= !MF2_DONTDRAW; + + if (mobj->target->eflags & MFE_VERTICALFLIP) + HEIGHT += 4*FRACUNIT; + else + HEIGHT -= 4*FRACUNIT; + } + // Shrink your items if the player shrunk too. mobj->scale = mobj->target->scale; @@ -8369,10 +8386,11 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_GREENITEM: case MT_GREENSHIELD: case MT_TRIPLEGREENSHIELD1: case MT_TRIPLEGREENSHIELD2: case MT_TRIPLEGREENSHIELD3: case MT_REDITEM: case MT_REDSHIELD: case MT_REDITEMDUD: - case MT_TRIPLEREDSHIELD1: case MT_TRIPLEREDSHIELD2: case MT_TRIPLEREDSHIELD3: + case MT_TRIPLEREDSHIELD1: case MT_TRIPLEREDSHIELD2: case MT_TRIPLEREDSHIELD3: + case MT_BATTLEBALLOON1: case MT_BATTLEBALLOON2: case MT_BATTLEBALLOON3: + case MT_BATTLEBALLOON4: case MT_BATTLEBALLOON5: case MT_FIREBALL: case MT_FAKEITEM: case MT_FAKESHIELD: case MT_BOMBITEM: case MT_BOMBSHIELD: - case MT_FIREBALL: P_SpawnShadowMobj(mobj); default: break; @@ -9123,41 +9141,49 @@ void P_SpawnPlayer(INT32 playernum) // Spawn with a pity shield if necessary. //P_DoPityCheck(p); - if (gametype == GT_MATCH && p->playerstate != PST_REBORN) // srb2kart + if (gametype == GT_MATCH && (leveltime < 1 || p->kartstuff[k_balloon] > 0)) // srb2kart { angle_t newangle, diff; fixed_t newx; fixed_t newy; mobj_t *mo, *mo2, *mo3, *mo4, *mo5; - - switch (cv_kartballoons.value) // Fallthrough intentional + + if (leveltime < 1) // Start of the map? { - case 5: - p->kartstuff[k_balloon] |= 0x16; - case 4: - p->kartstuff[k_balloon] |= 0x08; - case 3: - p->kartstuff[k_balloon] |= 0x04; - case 2: - p->kartstuff[k_balloon] |= 0x02; - case 1: - p->kartstuff[k_balloon] |= 0x01; - break; - default: - p->kartstuff[k_balloon] = 0x01|0x02|0x04; - break; + p->kartstuff[k_balloon] = 0; // Reset those balloons! + switch (cv_kartballoons.value) + { + case 5: + p->kartstuff[k_balloon] |= 0x16; + case 4: // Fallthru's are intentional + p->kartstuff[k_balloon] |= 0x08; + case 3: + p->kartstuff[k_balloon] |= 0x04; + case 2: + p->kartstuff[k_balloon] |= 0x02; + case 1: + p->kartstuff[k_balloon] |= 0x01; + break; + default: + p->kartstuff[k_balloon] = 0x01|0x02|0x04; // 3 balloons + break; + } } newangle = mobj->angle; diff = FixedAngle(360*FRACUNIT/cv_kartballoons.value); newx = mobj->x + P_ReturnThrustX(mobj, newangle + ANGLE_180, 64*FRACUNIT); newy = mobj->y + P_ReturnThrustY(mobj, newangle + ANGLE_180, 64*FRACUNIT); - + mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON1); mo->threshold = 10; P_SetTarget(&mo->target, mobj); mo->angle = 0; mo->color = mobj->color; + if (mobj->flags2 & MF2_DONTDRAW) + mo->flags2 |= MF2_DONTDRAW; + else + mo->flags2 &= !MF2_DONTDRAW; if (p->kartstuff[k_balloon] & 2) { @@ -9166,6 +9192,10 @@ void P_SpawnPlayer(INT32 playernum) P_SetTarget(&mo2->target, mobj); mo2->angle = diff; mo2->color = mobj->color; + if (mobj->flags2 & MF2_DONTDRAW) + mo2->flags2 |= MF2_DONTDRAW; + else + mo2->flags2 &= !MF2_DONTDRAW; } if (p->kartstuff[k_balloon] & 4) @@ -9175,6 +9205,10 @@ void P_SpawnPlayer(INT32 playernum) P_SetTarget(&mo3->target, mobj); mo3->angle = diff*2; mo3->color = mobj->color; + if (mobj->flags2 & MF2_DONTDRAW) + mo3->flags2 |= MF2_DONTDRAW; + else + mo3->flags2 &= !MF2_DONTDRAW; } if (p->kartstuff[k_balloon] & 8) @@ -9184,6 +9218,10 @@ void P_SpawnPlayer(INT32 playernum) P_SetTarget(&mo4->target, mobj); mo4->angle = diff*3; mo4->color = mobj->color; + if (mobj->flags2 & MF2_DONTDRAW) + mo4->flags2 |= MF2_DONTDRAW; + else + mo4->flags2 &= !MF2_DONTDRAW; } if (p->kartstuff[k_balloon] & 16) @@ -9193,6 +9231,10 @@ void P_SpawnPlayer(INT32 playernum) P_SetTarget(&mo5->target, mobj); mo5->angle = diff*4; mo5->color = mobj->color; + if (mobj->flags2 & MF2_DONTDRAW) + mo5->flags2 |= MF2_DONTDRAW; + else + mo5->flags2 &= !MF2_DONTDRAW; } } } diff --git a/src/p_spec.c b/src/p_spec.c index 27a408c7..3ef62ab3 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3878,7 +3878,7 @@ DoneSection2: mo->spawnpoint = bflagpoint; mo->flags2 |= MF2_JUSTATTACKED; redscore += 1; - P_AddPlayerScore(player, 250); + P_AddPlayerScore(player, 5); } } break; @@ -3911,7 +3911,7 @@ DoneSection2: mo->spawnpoint = rflagpoint; mo->flags2 |= MF2_JUSTATTACKED; bluescore += 1; - P_AddPlayerScore(player, 250); + P_AddPlayerScore(player, 5); } } break; diff --git a/src/p_user.c b/src/p_user.c index 8c066834..594f2078 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -853,13 +853,13 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor) // Point penalty for hitting a hazard during tag. // Discourages players from intentionally hurting themselves to avoid being tagged. - if (gametype == GT_TAG && (!(player->pflags & PF_TAGGED) && !(player->pflags & PF_TAGIT))) + /*if (gametype == GT_TAG && (!(player->pflags & PF_TAGGED) && !(player->pflags & PF_TAGIT))) { - //if (player->score >= 50) - // player->score -= 50; - //else - // player->score = 0; - } + if (player->score >= 50) + player->score -= 50; + else + player->score = 0; + }*/ P_ResetPlayer(player); P_SetPlayerMobjState(player->mo, player->mo->info->painstate); @@ -1007,9 +1007,6 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) { UINT32 oldscore; - return; // SRB2kart - no score. - // This will probably be temporary until we do battle modes? - if (player->bot) player = &players[consoleplayer]; @@ -7973,13 +7970,12 @@ static void P_DeathThink(player_t *player) } //player->kartstuff[k_lakitu] = 48; // See G_PlayerReborn in g_game.c - // SRB2kart - spawn automatically after 1.5 seconds - if (player->deadtimer > (TICRATE + TICRATE/2) && (gametype == GT_RACE || player->spectator)) + // SRB2kart - spawn automatically after 1 second + if (player->deadtimer > TICRATE) player->playerstate = PST_REBORN; - // SRB2kart - spawn after 1.5 seconds & Button press - if ((cmd->buttons & BT_JUMP || cmd->buttons & BT_ACCELERATE) && player->deadtimer > (TICRATE + TICRATE/2) - && (gametype == GT_RACE || player->spectator)) + // SRB2kart - spawn after 5 tics & Button press + if ((cmd->buttons & BT_JUMP || cmd->buttons & BT_ACCELERATE) && player->deadtimer > 5) player->playerstate = PST_REBORN; // Single player auto respawn From a56a7cf9c02be66a58d4f85953949c86944c9063 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 22 Oct 2017 17:36:46 -0400 Subject: [PATCH 04/61] Whoops! Wrong way! --- src/p_mobj.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 13e241d4..f05b35e7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6621,10 +6621,10 @@ void P_MobjThinker(mobj_t *mobj) { mobj->color = mobj->target->color; - if (!(mobj->target->player->kartstuff[k_balloon] & 4)) - P_SetMobjState(mobj, S_BATTLEBALLOON2); - else if (!(mobj->target->player->kartstuff[k_balloon] & 2)) + if (!(mobj->target->player->kartstuff[k_balloon] & 2)) P_SetMobjState(mobj, S_BATTLEBALLOON3); + else if (!(mobj->target->player->kartstuff[k_balloon] & 4)) + P_SetMobjState(mobj, S_BATTLEBALLOON2); if (mobj->target->flags2 & MF2_DONTDRAW) mobj->flags2 |= MF2_DONTDRAW; From e7de9502bae38b9ae925f9a43142305eca9153d8 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 23 Oct 2017 17:27:00 -0400 Subject: [PATCH 05/61] Balloon error fix, and papersprite fix --- src/p_mobj.c | 12 ++++++------ src/r_things.c | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 71c462c3..279712f0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6631,7 +6631,7 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->flags2 & MF2_DONTDRAW) mobj->flags2 |= MF2_DONTDRAW; else - mobj->flags2 &= !MF2_DONTDRAW; + mobj->flags2 &= ~MF2_DONTDRAW; if (mobj->target->eflags & MFE_VERTICALFLIP) HEIGHT += 4*FRACUNIT; @@ -9230,7 +9230,7 @@ void P_SpawnPlayer(INT32 playernum) if (mobj->flags2 & MF2_DONTDRAW) mo->flags2 |= MF2_DONTDRAW; else - mo->flags2 &= !MF2_DONTDRAW; + mo->flags2 &= ~MF2_DONTDRAW; if (p->kartstuff[k_balloon] & 2) { @@ -9242,7 +9242,7 @@ void P_SpawnPlayer(INT32 playernum) if (mobj->flags2 & MF2_DONTDRAW) mo2->flags2 |= MF2_DONTDRAW; else - mo2->flags2 &= !MF2_DONTDRAW; + mo2->flags2 &= ~MF2_DONTDRAW; } if (p->kartstuff[k_balloon] & 4) @@ -9255,7 +9255,7 @@ void P_SpawnPlayer(INT32 playernum) if (mobj->flags2 & MF2_DONTDRAW) mo3->flags2 |= MF2_DONTDRAW; else - mo3->flags2 &= !MF2_DONTDRAW; + mo3->flags2 &= ~MF2_DONTDRAW; } if (p->kartstuff[k_balloon] & 8) @@ -9268,7 +9268,7 @@ void P_SpawnPlayer(INT32 playernum) if (mobj->flags2 & MF2_DONTDRAW) mo4->flags2 |= MF2_DONTDRAW; else - mo4->flags2 &= !MF2_DONTDRAW; + mo4->flags2 &= ~MF2_DONTDRAW; } if (p->kartstuff[k_balloon] & 16) @@ -9281,7 +9281,7 @@ void P_SpawnPlayer(INT32 playernum) if (mobj->flags2 & MF2_DONTDRAW) mo5->flags2 |= MF2_DONTDRAW; else - mo5->flags2 &= !MF2_DONTDRAW; + mo5->flags2 &= ~MF2_DONTDRAW; } } } diff --git a/src/r_things.c b/src/r_things.c index 1a8a69ce..3977949f 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1249,7 +1249,7 @@ static void R_ProjectSprite(mobj_t *thing) offset2 = FixedMul(spritecachedinfo[lump].width, this_scale); tx += FixedMul(offset2, ang_scale); - x2 = ((centerxfrac + FixedMul (tx,xscale)) >>FRACBITS) - 1; + x2 = ((centerxfrac + FixedMul (tx,xscale)) >> FRACBITS) - (papersprite ? 2 : 1); // off the left side if (x2 < 0) From 4c877a64903d7c4bed15db240db8261f4045741a Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 23 Oct 2017 18:38:45 -0400 Subject: [PATCH 06/61] Move some A_ItemPop stuff into P_CanPickupItem --- src/p_enemy.c | 18 ++++-------------- src/p_inter.c | 33 ++++++++++++--------------------- 2 files changed, 16 insertions(+), 35 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index a37da386..e4b1f302 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8090,6 +8090,9 @@ void A_ItemPop(mobj_t *actor) { mobj_t *remains; + if (!(actor->target && actor->target->player && P_CanPickupItem(actor->target->player, false))) + return; + // de-solidify //P_UnsetThingPosition(actor); //actor->flags &= ~MF_SOLID; @@ -8123,20 +8126,7 @@ void A_ItemPop(mobj_t *actor) return; } - if (actor->target && actor->target->player // These used to be &2's and &8's for box only, but are now universal. - && !(actor->target->player->kartstuff[k_greenshell] || actor->target->player->kartstuff[k_triplegreenshell] - || actor->target->player->kartstuff[k_redshell] || actor->target->player->kartstuff[k_tripleredshell] - || actor->target->player->kartstuff[k_banana] || actor->target->player->kartstuff[k_triplebanana] - || actor->target->player->kartstuff[k_fakeitem] & 2 || actor->target->player->kartstuff[k_magnet] - || actor->target->player->kartstuff[k_bobomb] || actor->target->player->kartstuff[k_blueshell] - || actor->target->player->kartstuff[k_mushroom] || actor->target->player->kartstuff[k_fireflower] - || actor->target->player->kartstuff[k_star] || actor->target->player->kartstuff[k_goldshroom] - || actor->target->player->kartstuff[k_lightning] || actor->target->player->kartstuff[k_megashroom] - || actor->target->player->kartstuff[k_itemroulette] - || actor->target->player->kartstuff[k_boo] || actor->target->player->kartstuff[k_bootaketimer] - || actor->target->player->kartstuff[k_boostolentimer] - || actor->target->player->kartstuff[k_growshrinktimer] > 1 - || actor->target->player->kartstuff[k_goldshroomtimer])) + if (actor->target && actor->target->player) actor->target->player->kartstuff[k_itemroulette] = 1; else if (cv_debug && !(actor->target && actor->target->player)) CONS_Printf("ERROR: Powerup has no target!\n"); diff --git a/src/p_inter.c b/src/p_inter.c index 42e8976f..64c2ef94 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -150,28 +150,19 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) //if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics) // return false; - if (player->kartstuff[k_bootaketimer] + if (player->kartstuff[k_greenshell] || player->kartstuff[k_triplegreenshell] + || player->kartstuff[k_redshell] || player->kartstuff[k_tripleredshell] + || player->kartstuff[k_banana] || player->kartstuff[k_triplebanana] + || player->kartstuff[k_fakeitem] & 2 || player->kartstuff[k_magnet] + || player->kartstuff[k_bobomb] || player->kartstuff[k_blueshell] + || player->kartstuff[k_mushroom] || player->kartstuff[k_fireflower] + || player->kartstuff[k_star] || player->kartstuff[k_goldshroom] + || player->kartstuff[k_lightning] || player->kartstuff[k_megashroom] + || player->kartstuff[k_itemroulette] + || player->kartstuff[k_boo] || player->kartstuff[k_bootaketimer] || player->kartstuff[k_boostolentimer] - || player->kartstuff[k_magnet] - || player->kartstuff[k_boo] - || player->kartstuff[k_mushroom] - || player->kartstuff[k_megashroom] - || player->kartstuff[k_goldshroom] - || player->kartstuff[k_star] - || player->kartstuff[k_triplebanana] == 0x8 - || player->kartstuff[k_fakeitem] == 0x2 - || player->kartstuff[k_banana] == 0x2 - || player->kartstuff[k_greenshell] == 0x2 - || player->kartstuff[k_redshell] == 0x2 - || player->kartstuff[k_laserwisp] - || player->kartstuff[k_triplegreenshell] == 0x8 - || player->kartstuff[k_bobomb] == 0x2 - || player->kartstuff[k_blueshell] - || player->kartstuff[k_jaws] == 0x4 - || player->kartstuff[k_fireflower] - || player->kartstuff[k_tripleredshell] == 0x8 - || player->kartstuff[k_lightning] - || player->kartstuff[k_kitchensink]) + || player->kartstuff[k_growshrinktimer] > 1 + || player->kartstuff[k_goldshroomtimer]) return false; return true; From 4efda9b8302215bf6135697cd5f61f4f91576e3e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 23 Oct 2017 18:54:10 -0400 Subject: [PATCH 07/61] Remove some redundancies from the last commit --- src/p_enemy.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index e4b1f302..0de2dfb3 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8091,7 +8091,11 @@ void A_ItemPop(mobj_t *actor) mobj_t *remains; if (!(actor->target && actor->target->player && P_CanPickupItem(actor->target->player, false))) + { + if (cv_debug && !(actor->target && actor->target->player)) + CONS_Printf("ERROR: Powerup has no target!\n"); return; + } // de-solidify //P_UnsetThingPosition(actor); @@ -8126,10 +8130,7 @@ void A_ItemPop(mobj_t *actor) return; } - if (actor->target && actor->target->player) - actor->target->player->kartstuff[k_itemroulette] = 1; - else if (cv_debug && !(actor->target && actor->target->player)) - CONS_Printf("ERROR: Powerup has no target!\n"); + actor->target->player->kartstuff[k_itemroulette] = 1; remains->flags2 &= ~MF2_AMBUSH; From 163eae7325aff7f5fec4aa67ad3c75ea4309ba63 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 23 Oct 2017 18:59:41 -0400 Subject: [PATCH 08/61] Red shells no longer target people without balloons --- src/p_enemy.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 0de2dfb3..9957f15e 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8206,6 +8206,9 @@ void A_RedShellChase(mobj_t *actor) if (!(gametype == GT_RACE)) { + if (player->kartstuff[k_balloon] <= 0) + continue; + if (P_AproxDistance(P_AproxDistance(player->mo->x-actor->x, player->mo->y-actor->y), player->mo->z-actor->z) > RING_DIST) continue; @@ -8214,7 +8217,8 @@ void A_RedShellChase(mobj_t *actor) 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)) + player->mo->y-actor->y), player->mo->z-actor->z) < RING_DIST + && player->kartstuff[k_balloon] > 0)) P_SetTarget(&actor->tracer, player->mo); return; From ccc264345959a4d21992207e080fc791607b2817 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 23 Oct 2017 22:24:10 -0400 Subject: [PATCH 09/61] Reintroduced weighted batle items No more Boos and Mushrooms while they're broken and sucky, too --- src/k_kart.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e59df3ee..25eac841 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -681,23 +681,23 @@ static INT32 K_KartItemOddsPosition_Retro[MAXPLAYERS][NUMKARTITEMS][MAXPLAYERS] static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = { //P-Odds 0 1 2 3 4 5 6 7 8 9 - /*Magnet*/ { 1, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet - /*Boo*/ { 1, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo - /*Mushroom*/ { 1, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom + /*Magnet*/ { 2, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet + /*Boo*/ { 0, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo + /*Mushroom*/ { 0, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom /*Mega Mushroom*/ { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star - /*Triple Banana*/ { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana - /*Fake Item*/ { 1, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item - /*Banana*/ { 1, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Green Shell*/ { 1, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell - /*Red Shell*/ { 1, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell - /*Triple Green Shell*/ { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell - /*Bob-omb*/ { 1, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb + /*Triple Banana*/ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana + /*Fake Item*/ { 2, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item + /*Banana*/ { 2, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Green Shell*/ { 4, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell + /*Red Shell*/ { 2, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell + /*Triple Green Shell*/ { 2, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell + /*Bob-omb*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb /*Blue Shell*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Blue Shell - /*Fire Flower*/ { 1, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower + /*Fire Flower*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower /*Triple Red Shell*/ { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell /*Lightning*/ { 0, 0, 0, 0, 0, 0, 0, 1, 2, 0 } // Lightning }; From 7b88d670d5b324e9488b33877a06bae3f2b32aa3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 24 Oct 2017 00:06:13 -0400 Subject: [PATCH 10/61] Respawn time is now Match-only --- src/p_inter.c | 7 ++++++- src/p_mobj.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 64c2ef94..d5847677 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2091,7 +2091,12 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) P_SetTarget(&target->target, source); source->player->numboxes++; if ((cv_itemrespawn.value && gametype != GT_COOP && (modifiedgame || netgame || multiplayer))) - target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation + { + if (gametype == GT_RACE) + target->fuse = TICRATE + 2; + else + target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation + } } // Award Score Tails diff --git a/src/p_mobj.c b/src/p_mobj.c index 279712f0..152f42fb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8799,7 +8799,7 @@ void P_RemoveSavegameMobj(mobj_t *mobj) } static CV_PossibleValue_t respawnitemtime_cons_t[] = {{1, "MIN"}, {300, "MAX"}, {0, NULL}}; -consvar_t cv_itemrespawntime = {"respawnitemtime", "1", CV_NETVAR|CV_CHEAT, respawnitemtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_itemrespawntime = {"respawnitemtime", "5", CV_NETVAR|CV_CHEAT, respawnitemtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_itemrespawn = {"respawnitem", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t flagtime_cons_t[] = {{0, "MIN"}, {300, "MAX"}, {0, NULL}}; consvar_t cv_flagtime = {"flagtime", "30", CV_NETVAR|CV_CHEAT, flagtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; From d3387f816b54c60a5d516b5a0d65c8560f60ee06 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 24 Oct 2017 17:04:22 -0400 Subject: [PATCH 11/61] Battle Mode item respawning --- src/doomstat.h | 2 +- src/g_game.c | 4 ++ src/p_enemy.c | 3 ++ src/p_local.h | 1 + src/p_mobj.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++- src/p_setup.c | 2 + 6 files changed, 113 insertions(+), 2 deletions(-) diff --git a/src/doomstat.h b/src/doomstat.h index f3955e39..40295d25 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -329,7 +329,7 @@ extern UINT16 emeralds; #define EMERALD7 64 #define ALL7EMERALDS(v) ((v & (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7)) == (EMERALD1|EMERALD2|EMERALD3|EMERALD4|EMERALD5|EMERALD6|EMERALD7)) -extern INT32 nummaprings; //keep track of spawned rings/coins +extern INT32 nummaprings, nummapboxes, numgotboxes; //keep track of spawned rings/coins/battle mode items /** Time attack information, currently a very small structure. */ diff --git a/src/g_game.c b/src/g_game.c index d73e90d0..6d9e4f74 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -179,6 +179,10 @@ UINT32 bluescore, redscore; // CTF and Team Match team scores // ring count... for PERFECT! INT32 nummaprings = 0; +// box respawning in battle mode +INT32 nummapboxes = 0; +INT32 numgotboxes = 0; + // Elminates unnecessary searching. boolean CheckForBustableBlocks; boolean CheckForBouncySector; diff --git a/src/p_enemy.c b/src/p_enemy.c index 9957f15e..90cda70e 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8134,6 +8134,9 @@ void A_ItemPop(mobj_t *actor) remains->flags2 &= ~MF2_AMBUSH; + if (gametype != GT_RACE) + numgotboxes++; + P_RemoveMobj(actor); } diff --git a/src/p_local.h b/src/p_local.h index 48db93c2..235aaa27 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -201,6 +201,7 @@ extern size_t iquehead, iquetail; extern consvar_t cv_gravity, cv_viewheight; void P_RespawnSpecials(void); +void P_RespawnBattleSpecials(void); mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type); diff --git a/src/p_mobj.c b/src/p_mobj.c index 152f42fb..9597a5d8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8420,6 +8420,10 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_COIN: case MT_BLUEBALL: nummaprings++; + break; + case MT_RANDOMITEM: + nummapboxes++; + break; default: break; } @@ -8799,7 +8803,7 @@ void P_RemoveSavegameMobj(mobj_t *mobj) } static CV_PossibleValue_t respawnitemtime_cons_t[] = {{1, "MIN"}, {300, "MAX"}, {0, NULL}}; -consvar_t cv_itemrespawntime = {"respawnitemtime", "5", CV_NETVAR|CV_CHEAT, respawnitemtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_itemrespawntime = {"respawnitemtime", "3", CV_NETVAR|CV_CHEAT, respawnitemtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_itemrespawn = {"respawnitem", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t flagtime_cons_t[] = {{0, "MIN"}, {300, "MAX"}, {0, NULL}}; consvar_t cv_flagtime = {"flagtime", "30", CV_NETVAR|CV_CHEAT, flagtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -9011,6 +9015,12 @@ void P_RespawnSpecials(void) mobj_t *mo = NULL; mapthing_t *mthing = NULL; + if (gametype != GT_RACE) // Battle Mode vers + { + P_RespawnBattleSpecials(); + return; + } + // only respawn items when cv_itemrespawn is on if (!cv_itemrespawn.value) return; @@ -9092,6 +9102,97 @@ void P_RespawnSpecials(void) iquetail = (iquetail+1)&(ITEMQUESIZE-1); } +// +// P_RespawnBattleSpecials +// +void P_RespawnBattleSpecials(void) +{ + fixed_t x, y, z; + subsector_t *ss; + mobj_t *mo = NULL; + mapthing_t *mthing = NULL; + + // only respawn items when cv_itemrespawn is on + if (!cv_itemrespawn.value) + return; + + // Didn't collect enough boxes + if (numgotboxes < nummapboxes) + return; + + // wait a teeeensy bit after collecting everything + if (leveltime - itemrespawntime[iquehead-1] < (tic_t)cv_itemrespawntime.value*TICRATE) + return; + + while (iquehead != iquetail) // respawn EVERYTHING in que! + { + mthing = itemrespawnque[iquetail]; + +#ifdef PARANOIA + if (!mthing) + I_Error("itemrespawnque[iquetail] is NULL!"); +#endif + + if (mthing) + { + mobjtype_t i; + x = mthing->x << FRACBITS; + y = mthing->y << FRACBITS; + ss = R_PointInSubsector(x, y); + + // find which type to spawn + for (i = 0; i < NUMMOBJTYPES; i++) + if (mthing->type == mobjinfo[i].doomednum) + break; + + //CTF rings should continue to respawn as normal rings outside of CTF. + if (gametype != GT_CTF) + { + if (i == MT_REDTEAMRING || i == MT_BLUETEAMRING) + i = MT_RING; + } + + if (mthing->options & MTF_OBJECTFLIP) + { + z = ( +#ifdef ESLOPE + ss->sector->c_slope ? P_GetZAt(ss->sector->c_slope, x, y) : +#endif + ss->sector->ceilingheight) - (mthing->options >> ZSHIFT) * FRACUNIT; + if (mthing->options & MTF_AMBUSH + && (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || P_WeaponOrPanel(i))) + z -= 24*FRACUNIT; + z -= mobjinfo[i].height; // Don't forget the height! + } + else + { + z = ( +#ifdef ESLOPE + ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, x, y) : +#endif + ss->sector->floorheight) + (mthing->options >> ZSHIFT) * FRACUNIT; + if (mthing->options & MTF_AMBUSH + && (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || P_WeaponOrPanel(i))) + z += 24*FRACUNIT; + } + + mo = P_SpawnMobj(x, y, z, i); + mo->spawnpoint = mthing; + mo->angle = ANGLE_45 * (mthing->angle/45); + + if (mthing->options & MTF_OBJECTFLIP) + { + mo->eflags |= MFE_VERTICALFLIP; + mo->flags2 |= MF2_OBJECTFLIP; + } + } + // pull it from the que + iquetail = (iquetail+1)&(ITEMQUESIZE-1); + } + + numgotboxes = 0; +} + // // P_SpawnPlayer // Called when a player is spawned on the level. diff --git a/src/p_setup.c b/src/p_setup.c index 42ad4697..aa569471 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2154,6 +2154,8 @@ static void P_LevelInitStuff(void) tokenbits = 0; runemeraldmanager = false; nummaprings = 0; + nummapboxes = 0; + numgotboxes = 0; // emerald hunt hunt1 = hunt2 = hunt3 = NULL; From fff4194d6255fdca1464b87e53a4c2dbdeab817b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 24 Oct 2017 18:01:00 -0400 Subject: [PATCH 12/61] Silly little thing I just added --- src/p_mobj.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 9597a5d8..a22ad261 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6598,7 +6598,11 @@ void P_MobjThinker(mobj_t *mobj) || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3 || mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) - mobj->angle += FixedAngle(mobj->info->speed); + if ((mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 + || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) && !((mobj->target->player-players) & 1)) + mobj->angle -= FixedAngle(mobj->info->speed); + else + mobj->angle += FixedAngle(mobj->info->speed); else if (mobj->type == MT_TRIPLEBANANASHIELD2) mobj->angle = (mobj->target->angle + ANGLE_135); else if (mobj->type == MT_TRIPLEBANANASHIELD3) From ac55f0ea4d2266fcd1ae4ef7f3ba919cdf62464b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 24 Oct 2017 21:22:09 -0400 Subject: [PATCH 13/61] Okay, battle mode items respawn, for real now --- src/p_mobj.c | 3 --- src/p_setup.c | 3 +++ src/p_user.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 52683a9f..f5df3010 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8469,9 +8469,6 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_BLUEBALL: nummaprings++; break; - case MT_RANDOMITEM: - nummapboxes++; - break; default: break; } diff --git a/src/p_setup.c b/src/p_setup.c index aa569471..c272464f 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -983,6 +983,9 @@ static void P_LoadThings(void) || mt->type == 1702) // MT_AXISTRANSFERLINE continue; // These were already spawned + if (mt->type == 2000) // MT_RANDOMITEM + nummapboxes++; + mt->mobj = NULL; P_SpawnMapThing(mt); } diff --git a/src/p_user.c b/src/p_user.c index 594f2078..c11bf8d1 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7974,8 +7974,8 @@ static void P_DeathThink(player_t *player) if (player->deadtimer > TICRATE) player->playerstate = PST_REBORN; - // SRB2kart - spawn after 5 tics & Button press - if ((cmd->buttons & BT_JUMP || cmd->buttons & BT_ACCELERATE) && player->deadtimer > 5) + // SRB2kart - spawn after 1 second & Button press + if ((cmd->buttons & BT_JUMP || cmd->buttons & BT_ACCELERATE) && player->deadtimer > TICRATE) player->playerstate = PST_REBORN; // Single player auto respawn From 101a560d4eeb4198e4c187a511464fad31d53913 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Wed, 25 Oct 2017 01:58:25 +0100 Subject: [PATCH 14/61] Adjust Trailing items to behave nicer Added extra boolean for P_SlideMove forceslide, since kart's walls are almost all bouncy slidemove will almost always bounce things instead, even if we don't want it to. --- src/lua_baselib.c | 3 ++- src/p_local.h | 2 +- src/p_map.c | 5 +++-- src/p_mobj.c | 21 ++++++++++----------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index e8e8fd02..aa2ebf65 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1009,10 +1009,11 @@ static int lib_pTeleportMove(lua_State *L) static int lib_pSlideMove(lua_State *L) { mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + boolean forceslide = luaL_checkboolean(L, 2); NOHUD if (!mo) return LUA_ErrInvalid(L, "mobj_t"); - P_SlideMove(mo); + P_SlideMove(mo, forceslide); return 0; } diff --git a/src/p_local.h b/src/p_local.h index c86256ae..7533429a 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -326,7 +326,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam); boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff); boolean P_Move(mobj_t *actor, fixed_t speed); boolean P_TeleportMove(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z); -void P_SlideMove(mobj_t *mo); +void P_SlideMove(mobj_t *mo, boolean forceslide); void P_BounceMove(mobj_t *mo); boolean P_CheckSight(mobj_t *t1, mobj_t *t2); void P_CheckHoopPosition(mobj_t *hoopthing, fixed_t x, fixed_t y, fixed_t z, fixed_t radius); diff --git a/src/p_map.c b/src/p_map.c index bf7ad90d..547444ec 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3521,8 +3521,9 @@ stairstep: // and slide along it // // This is a kludgy mess. +// Kart 2017-10-25: add forceslide to hav the option to force something to slide instead of bounce // -void P_SlideMove(mobj_t *mo) +void P_SlideMove(mobj_t *mo, boolean forceslide) { fixed_t leadx, leady, trailx, traily, newx, newy; INT16 hitcount = 0; @@ -3600,7 +3601,7 @@ retry: PT_ADDLINES, PTR_SlideTraverse); // Some walls are bouncy even if you're not - if (bestslideline && !(bestslideline->flags & ML_BOUNCY)) // SRB2kart - All walls are bouncy unless specified otherwise + if (!forceslide && bestslideline && !(bestslideline->flags & ML_BOUNCY)) // SRB2kart - All walls are bouncy unless specified otherwise { P_BounceMove(mo); return; diff --git a/src/p_mobj.c b/src/p_mobj.c index 5e2c25f3..ccce7bf9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1809,7 +1809,7 @@ void P_XYMovement(mobj_t *mo) } else if (player || mo->flags & (MF_SLIDEME|MF_PUSHABLE)) { // try to slide along it - P_SlideMove(mo); + P_SlideMove(mo, false); xmove = ymove = 0; } else if (mo->type == MT_SPINFIRE) @@ -1990,7 +1990,7 @@ static void P_RingXYMovement(mobj_t *mo) I_Assert(!P_MobjWasRemoved(mo)); if (!P_SceneryTryMove(mo, mo->x + mo->momx, mo->y + mo->momy)) - P_SlideMove(mo); + P_SlideMove(mo, false); } static void P_SceneryXYMovement(mobj_t *mo) @@ -2004,7 +2004,7 @@ static void P_SceneryXYMovement(mobj_t *mo) oldy = mo->y; if (!P_SceneryTryMove(mo, mo->x + mo->momx, mo->y + mo->momy)) - P_SlideMove(mo); + P_SlideMove(mo, false); if ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z > mo->floorz) || (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height < mo->ceilingz)) return; // no friction when airborne @@ -6622,14 +6622,13 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player) mobj->scale = mobj->target->scale; - P_UnsetThingPosition(mobj); - { - const angle_t fa = mobj->angle>>ANGLETOFINESHIFT; - mobj->x = mobj->target->x + FixedMul(FINECOSINE(fa),radius); - mobj->y = mobj->target->y + FixedMul(FINESINE(fa), radius); - mobj->z = mobj->target->z + HEIGHT; - P_SetThingPosition(mobj); - } + P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); + mobj->momx = FixedMul(FINECOSINE(mobj->angle>>ANGLETOFINESHIFT),radius); + mobj->momy = FixedMul(FINESINE(mobj->angle>>ANGLETOFINESHIFT), radius); + if (!P_TryMove(mobj, mobj->target->x + mobj->momx, mobj->target->y + mobj->momy, false)) + P_SlideMove(mobj, true); + mobj->z = mobj->floorz; + mobj->momx = mobj->momy = 0; // Was this so hard? if ((mobj->type == MT_GREENSHIELD && !(mobj->target->player->kartstuff[k_greenshell] & 1)) From b9f6a91c37cb119535cf527caad79d5ec160da8f Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Wed, 25 Oct 2017 03:37:13 +0100 Subject: [PATCH 15/61] Improve functionality of held items Can check for falloff from ledges place along the z properly --- src/p_mobj.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index ccce7bf9..d36713e8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6587,7 +6587,7 @@ void P_MobjThinker(mobj_t *mobj) { INT32 zfixds = 56; INT32 DIST = FixedMul(zfixds, mobj->target->scale); - INT32 HEIGHT; + fixed_t z; const fixed_t radius = DIST*FRACUNIT; // mobj's distance from its Target, or Radius. if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) @@ -6610,24 +6610,48 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player && mobj->target->eflags & MFE_VERTICALFLIP) { mobj->eflags |= MFE_VERTICALFLIP; - HEIGHT = mobj->target->height / 2; } else { mobj->eflags &= ~MFE_VERTICALFLIP; - HEIGHT = mobj->target->height / 5; } // Shrink your items if the player shrunk too. if (mobj->target->player) mobj->scale = mobj->target->scale; - P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); + if (P_MobjFlip(mobj) > 0) + { + z = mobj->target->z; + } + else + { + z = mobj->target->z + mobj->target->height - mobj->height; + } + + P_TeleportMove(mobj, mobj->target->x, mobj->target->y, z); mobj->momx = FixedMul(FINECOSINE(mobj->angle>>ANGLETOFINESHIFT),radius); mobj->momy = FixedMul(FINESINE(mobj->angle>>ANGLETOFINESHIFT), radius); - if (!P_TryMove(mobj, mobj->target->x + mobj->momx, mobj->target->y + mobj->momy, false)) + if (!P_TryMove(mobj, mobj->target->x + mobj->momx, mobj->target->y + mobj->momy, true)) P_SlideMove(mobj, true); - mobj->z = mobj->floorz; + if (P_IsObjectOnGround(mobj->target)) + { + if (P_MobjFlip(mobj) > 0) + { + if (mobj->floorz > mobj->target->z - mobj->height) + { + z = mobj->floorz; + } + } + else + { + if (mobj->ceilingz < mobj->target->z + mobj->target->height + mobj->height) + { + z = mobj->ceilingz - mobj->height; + } + } + } + mobj->z = z; mobj->momx = mobj->momy = 0; // Was this so hard? From 2e2d4073b83ae62507ae77a0381b750f123def9d Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Wed, 25 Oct 2017 15:04:08 +0100 Subject: [PATCH 16/61] Bombs should check for teams in team match, not regular match --- src/p_enemy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 90cda70e..d64a66d7 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3924,7 +3924,7 @@ static inline boolean PIT_GrenadeRing(mobj_t *thing) if (thing->player && thing->player->kartstuff[k_bootaketimer]) return true; - if ((gametype == GT_CTF || gametype == GT_MATCH) + if ((gametype == GT_CTF || gametype == GT_TEAMMATCH) && !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; From 6c1269a6f4e59e97268f13422eb3f591f741732f Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 25 Oct 2017 16:15:47 -0400 Subject: [PATCH 17/61] Balloons message --- src/k_kart.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index fdd5951f..29936b4b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1624,7 +1624,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH && gameaction != ga_completed) + if (gametype == GT_MATCH) { if (player->kartstuff[k_balloon] & 16) player->kartstuff[k_balloon] &= ~16; @@ -1637,6 +1637,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) else if (player->kartstuff[k_balloon] & 1) { player->kartstuff[k_balloon] &= ~1; + CONS_Printf(M_GetText("%s lost all of their balloons!"), player_names[players-player]); //P_DamageMobj(player->mo, NULL, NULL, 10000); //return; } @@ -1688,7 +1689,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH && gameaction != ga_completed) + if (gametype == GT_MATCH) { if (player->kartstuff[k_balloon] & 16) player->kartstuff[k_balloon] &= ~16; @@ -1701,6 +1702,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) else if (player->kartstuff[k_balloon] & 1) { player->kartstuff[k_balloon] &= ~1; + CONS_Printf(M_GetText("%s lost all of their balloons!"), player_names[players-player]); //P_DamageMobj(player->mo, NULL, NULL, 10000); //return; } @@ -1741,7 +1743,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH && gameaction != ga_completed) + if (gametype == GT_MATCH) { if (player->kartstuff[k_balloon] & 16) player->kartstuff[k_balloon] &= ~16; @@ -1754,6 +1756,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju else if (player->kartstuff[k_balloon] & 1) { player->kartstuff[k_balloon] &= ~1; + CONS_Printf(M_GetText("%s lost all of their balloons!"), player_names[players-player]); //P_DamageMobj(player->mo, NULL, NULL, 10000); //return; } @@ -3231,12 +3234,12 @@ void K_CheckBalloons(void) UINT8 numingame = 0; INT8 winnernum = -1; - if (gameaction == ga_completed) + if (gamestate == GS_INTERMISSION) return; for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i] || players[i].spectator) // not even in-game :V + if (!playeringame[i] || players[i].spectator) // not even in-game continue; numingame++; From 69d6d43fea5f7bdd154bc4ac68180b807aad85b3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 26 Oct 2017 02:31:01 -0400 Subject: [PATCH 18/61] Everything I did today; mainly player arrows Also some minor tweaks and bug fixes all around --- src/dehacked.c | 20 ++++++++++++ src/info.c | 49 ++++++++++++++++++++++++++++- src/info.h | 22 +++++++++++++ src/k_kart.c | 12 +++++--- src/p_inter.c | 5 +-- src/p_mobj.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/p_user.c | 4 --- 7 files changed, 178 insertions(+), 17 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 08b19a55..4c04a8d5 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6410,6 +6410,24 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_FIREDITEM3", "S_FIREDITEM4", + "S_PLAYERARROW", // Above player arrow + "S_PLAYERARROW_MUSHROOM", + "S_PLAYERARROW_GREENSHELL", + "S_PLAYERARROW_BANANA", + "S_PLAYERARROW_FAKEITEM", + "S_PLAYERARROW_BOO", + "S_PLAYERARROW_FEATHER", + "S_PLAYERARROW_REDSHELL", + "S_PLAYERARROW_BOBOMB", + "S_PLAYERARROW_FIREFLOWER", + "S_PLAYERARROW_TRIPLEGREENSHELL", + "S_PLAYERARROW_TRIPLEBANANA", + "S_PLAYERARROW_TRIPLEREDSHELL", + "S_PLAYERARROW_STAR", + "S_PLAYERARROW_MEGASHROOM", + "S_PLAYERARROW_KITCHENSINK", + "S_PLAYERARROW_EMPTY", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -6986,6 +7004,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_FIREDITEM", + "MT_PLAYERARROW", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index 3c1fb681..b72a5eae 100644 --- a/src/info.c +++ b/src/info.c @@ -58,7 +58,7 @@ char sprnames[NUMSPRITES + 1][5] = "SPRG","BSPR","RNDM","RPOP","KFRE","DRIF","DSMO","FITM","DFAK","BANA", "DBAN","GSHE","DGSH","RSHE","DRSH","BOMB","BLIG","LIGH","SINK","SITR", "KBLN","LAKI","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB", - "CHOM","SACO","CRAB","SHAD","BUMP","FLEN","CLAS","PSHW" + "CHOM","SACO","CRAB","SHAD","BUMP","FLEN","CLAS","PSHW","ARRO" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2865,6 +2865,25 @@ state_t states[NUMSTATES] = {SPR_PSHW, 2, 3, {NULL}, 0, 0, S_FIREDITEM4}, // S_FIREDITEM3 {SPR_PSHW, 3, 3, {NULL}, 0, 0, S_NULL}, // S_FIREDITEM4 + // Above player arrow + {SPR_ARRO, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW + {SPR_ARRO, FF_FULLBRIGHT|1, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_MUSHROOM + {SPR_ARRO, FF_FULLBRIGHT|2, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_GREENSHELL + {SPR_ARRO, FF_FULLBRIGHT|3, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_BANANA + {SPR_ARRO, FF_FULLBRIGHT|4, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_FAKEITEM + {SPR_ARRO, FF_FULLBRIGHT|5, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_BOO + {SPR_ARRO, FF_FULLBRIGHT|6, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_FEATHER + {SPR_ARRO, FF_FULLBRIGHT|7, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_REDSHELL + {SPR_ARRO, FF_FULLBRIGHT|8, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_BOBOMB + {SPR_ARRO, FF_FULLBRIGHT|9, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_FIREFLOWER + {SPR_ARRO, FF_FULLBRIGHT|10, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_TRIPLEGREENSHELL + {SPR_ARRO, FF_FULLBRIGHT|11, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_TRIPLEBANANA + {SPR_ARRO, FF_FULLBRIGHT|12, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_TRIPLEREDSHELL + {SPR_ARRO, FF_FULLBRIGHT|13, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_STAR + {SPR_ARRO, FF_FULLBRIGHT|14, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_MEGASHROOM + {SPR_ARRO, FF_FULLBRIGHT|15, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_KITCHENSINK + {SPR_ARRO, FF_FULLBRIGHT|16, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_EMPTY + #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK #endif @@ -16739,6 +16758,34 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_SCENERY, // flags S_NULL // raisestate }, + + { // MT_PLAYERARROW + -1, // doomednum + S_PLAYERARROW, // 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 + 36*FRACUNIT, // radius + 37*FRACUNIT, // height + 0, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + S_NULL // raisestate + }, + // ============================================================================================================================// #ifdef SEENAMES diff --git a/src/info.h b/src/info.h index 37babceb..55cc83a9 100644 --- a/src/info.h +++ b/src/info.h @@ -621,6 +621,8 @@ typedef enum sprite SPR_CLAS, // items clash SPR_PSHW, // thrown indicator + SPR_ARRO, // player arrows + SPR_FIRSTFREESLOT, SPR_LASTFREESLOT = SPR_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, NUMSPRITES @@ -3383,6 +3385,24 @@ typedef enum state S_FIREDITEM3, S_FIREDITEM4, + S_PLAYERARROW, // Above player arrow + S_PLAYERARROW_MUSHROOM, + S_PLAYERARROW_GREENSHELL, + S_PLAYERARROW_BANANA, + S_PLAYERARROW_FAKEITEM, + S_PLAYERARROW_BOO, + S_PLAYERARROW_FEATHER, + S_PLAYERARROW_REDSHELL, + S_PLAYERARROW_BOBOMB, + S_PLAYERARROW_FIREFLOWER, + S_PLAYERARROW_TRIPLEGREENSHELL, + S_PLAYERARROW_TRIPLEBANANA, + S_PLAYERARROW_TRIPLEREDSHELL, + S_PLAYERARROW_STAR, + S_PLAYERARROW_MEGASHROOM, + S_PLAYERARROW_KITCHENSINK, + S_PLAYERARROW_EMPTY, + #ifdef SEENAMES S_NAMECHECK, #endif @@ -4033,6 +4053,8 @@ typedef enum mobj_type MT_FIREDITEM, + MT_PLAYERARROW, + #ifdef SEENAMES MT_NAMECHECK, #endif diff --git a/src/k_kart.c b/src/k_kart.c index 29936b4b..b3b78465 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -681,7 +681,7 @@ static INT32 K_KartItemOddsPosition_Retro[MAXPLAYERS][NUMKARTITEMS][MAXPLAYERS] static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = { //P-Odds 0 1 2 3 4 5 6 7 8 9 - /*Magnet*/ { 2, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet + /*Magnet*/ { 0, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet /*Boo*/ { 0, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo /*Mushroom*/ { 0, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom @@ -980,7 +980,9 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) player->kartstuff[k_itemclose] = 0; // Reset the item window closer. - if (gametype == GT_MATCH) useodds = 0; // Battle Mode + if (gametype == GT_MATCH + || gametype == GT_TEAMMATCH + || gametype == GT_CTF) useodds = 0; // Battle Mode else if (pingame == 1) useodds = 1; // Record Attack, or just alone else if (pdis <= distvar * 0) useodds = 2; // (64*14) * 0 = 0 else if (pdis <= distvar * 1) useodds = 3; // (64*14) * 1 = 896 @@ -1637,7 +1639,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) else if (player->kartstuff[k_balloon] & 1) { player->kartstuff[k_balloon] &= ~1; - CONS_Printf(M_GetText("%s lost all of their balloons!"), player_names[players-player]); + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); //P_DamageMobj(player->mo, NULL, NULL, 10000); //return; } @@ -1702,7 +1704,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) else if (player->kartstuff[k_balloon] & 1) { player->kartstuff[k_balloon] &= ~1; - CONS_Printf(M_GetText("%s lost all of their balloons!"), player_names[players-player]); + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); //P_DamageMobj(player->mo, NULL, NULL, 10000); //return; } @@ -1756,7 +1758,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju else if (player->kartstuff[k_balloon] & 1) { player->kartstuff[k_balloon] &= ~1; - CONS_Printf(M_GetText("%s lost all of their balloons!"), player_names[players-player]); + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); //P_DamageMobj(player->mo, NULL, NULL, 10000); //return; } diff --git a/src/p_inter.c b/src/p_inter.c index d1115563..5658a131 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2092,10 +2092,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) source->player->numboxes++; if ((cv_itemrespawn.value && gametype != GT_COOP && (modifiedgame || netgame || multiplayer))) { - if (gametype == GT_RACE) - target->fuse = TICRATE + 2; - else - target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation + target->fuse = cv_itemrespawntime.value*TICRATE + 2; // Random box generation } } diff --git a/src/p_mobj.c b/src/p_mobj.c index f5df3010..ffce0300 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6696,6 +6696,77 @@ void P_MobjThinker(mobj_t *mobj) return; } break; + case MT_PLAYERARROW: + if (mobj->target && mobj->target->health + && mobj->target->player && mobj->target->player->mo + && mobj->target->player->health && mobj->target->player->playerstate != PST_DEAD + && !(gametype != GT_RACE && mobj->target->player->kartstuff[k_balloon] <= 0)) + { + fixed_t scale = mobj->target->scale; + mobj->color = mobj->target->color; + + if (mobj->target->player == &players[displayplayer]) + mobj->flags2 |= MF2_DONTDRAW; + else + mobj->flags2 &= ~MF2_DONTDRAW; + + if ((splitscreen || !netgame) + || (gametype == GT_RACE) + || (mobj->target->player->kartstuff[k_bootaketimer] > 0)) + mobj->flags2 |= MF2_DONTDRAW; + + P_UnsetThingPosition(mobj); + mobj->x = mobj->target->x; + mobj->y = mobj->target->y; + + if (!(mobj->target->eflags & MFE_VERTICALFLIP)) + { + mobj->z = mobj->target->z + P_GetPlayerHeight(mobj->target->player)+16*FRACUNIT; + mobj->eflags &= ~MFE_VERTICALFLIP; + } + else + { + mobj->z = mobj->target->z - P_GetPlayerHeight(mobj->target->player)+16*FRACUNIT; + mobj->eflags |= MFE_VERTICALFLIP; + } + P_SetThingPosition(mobj); + + // Set it to use the correct states for its condition + if (mobj->target->player->kartstuff[k_kitchensink]) P_SetMobjState(mobj, S_PLAYERARROW_KITCHENSINK); + else if (mobj->target->player->kartstuff[k_megashroom] == 1 + || (mobj->target->player->kartstuff[k_growshrinktimer] > 1 + && (leveltime & 1))) P_SetMobjState(mobj, S_PLAYERARROW_MEGASHROOM); + else if (mobj->target->player->kartstuff[k_growshrinktimer] > 1 + && !(leveltime & 1)) P_SetMobjState(mobj, S_PLAYERARROW_EMPTY); // S_INVISIBLE + else if (mobj->target->player->kartstuff[k_star] == 1) P_SetMobjState(mobj, S_PLAYERARROW_STAR); + else if (mobj->target->player->kartstuff[k_tripleredshell]) P_SetMobjState(mobj, S_PLAYERARROW_TRIPLEREDSHELL); + else if (mobj->target->player->kartstuff[k_triplebanana]) P_SetMobjState(mobj, S_PLAYERARROW_TRIPLEBANANA); + else if (mobj->target->player->kartstuff[k_triplegreenshell]) P_SetMobjState(mobj, S_PLAYERARROW_TRIPLEGREENSHELL); + else if (mobj->target->player->kartstuff[k_fireflower]) P_SetMobjState(mobj, S_PLAYERARROW_FIREFLOWER); + else if (mobj->target->player->kartstuff[k_bobomb]) P_SetMobjState(mobj, S_PLAYERARROW_BOBOMB); + else if (mobj->target->player->kartstuff[k_redshell]) P_SetMobjState(mobj, S_PLAYERARROW_REDSHELL); + //else if (mobj->target->player->kartstuff[k_feather]) P_SetMobjState(mobj, S_PLAYERARROW_FEATHER); + else if (mobj->target->player->kartstuff[k_boo] == 1) P_SetMobjState(mobj, S_PLAYERARROW_BOO); + else if (mobj->target->player->kartstuff[k_fakeitem] & 2) P_SetMobjState(mobj, S_PLAYERARROW_FAKEITEM); + else if (mobj->target->player->kartstuff[k_banana]) P_SetMobjState(mobj, S_PLAYERARROW_BANANA); + else if (mobj->target->player->kartstuff[k_greenshell]) P_SetMobjState(mobj, S_PLAYERARROW_GREENSHELL); + else if (mobj->target->player->kartstuff[k_mushroom]) P_SetMobjState(mobj, S_PLAYERARROW_MUSHROOM); + else P_SetMobjState(mobj, S_PLAYERARROW); // S_INVISIBLE + + scale += FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, + players[displayplayer].mo->y-mobj->target->y)), RING_DIST), mobj->target->scale); + if (scale > 16*FRACUNIT) + { + scale = 16*FRACUNIT; + } + mobj->destscale = scale; + } + else if (mobj->health > 0) + { + P_KillMobj(mobj, NULL, NULL); + return; + } + break; //} case MT_WATERDROP: P_SceneryCheckWater(mobj); @@ -8849,7 +8920,7 @@ void P_RemoveSavegameMobj(mobj_t *mobj) } static CV_PossibleValue_t respawnitemtime_cons_t[] = {{1, "MIN"}, {300, "MAX"}, {0, NULL}}; -consvar_t cv_itemrespawntime = {"respawnitemtime", "3", CV_NETVAR|CV_CHEAT, respawnitemtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_itemrespawntime = {"respawnitemtime", "1", CV_NETVAR|CV_CHEAT, respawnitemtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_itemrespawn = {"respawnitem", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t flagtime_cons_t[] = {{0, "MIN"}, {300, "MAX"}, {0, NULL}}; consvar_t cv_flagtime = {"flagtime", "30", CV_NETVAR|CV_CHEAT, flagtime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -9167,7 +9238,7 @@ void P_RespawnBattleSpecials(void) return; // wait a teeeensy bit after collecting everything - if (leveltime - itemrespawntime[iquehead-1] < (tic_t)cv_itemrespawntime.value*TICRATE) + if (leveltime - itemrespawntime[iquehead-1] < (tic_t)cv_itemrespawntime.value*(5*TICRATE)) return; while (iquehead != iquetail) // respawn EVERYTHING in que! @@ -9248,6 +9319,7 @@ void P_SpawnPlayer(INT32 playernum) { player_t *p = &players[playernum]; mobj_t *mobj; + mobj_t *overheadarrow; if (p->playerstate == PST_REBORN) G_PlayerReborn(playernum); @@ -9335,7 +9407,12 @@ void P_SpawnPlayer(INT32 playernum) // Spawn with a pity shield if necessary. //P_DoPityCheck(p); - if (gametype == GT_MATCH && (leveltime < 1 || p->kartstuff[k_balloon] > 0)) // srb2kart + overheadarrow = P_SpawnMobj(mobj->x, mobj->y, mobj->z + P_GetPlayerHeight(p)+16*FRACUNIT, MT_PLAYERARROW); + P_SetTarget(&overheadarrow->target, mobj); + overheadarrow->flags2 |= MF2_DONTDRAW; + P_SetScale(overheadarrow, mobj->destscale); + + if (gametype != GT_RACE && (leveltime < 1 || p->kartstuff[k_balloon] > 0)) // srb2kart { angle_t newangle, diff; fixed_t newx; diff --git a/src/p_user.c b/src/p_user.c index c11bf8d1..fa9daa01 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7974,10 +7974,6 @@ static void P_DeathThink(player_t *player) if (player->deadtimer > TICRATE) player->playerstate = PST_REBORN; - // SRB2kart - spawn after 1 second & Button press - if ((cmd->buttons & BT_JUMP || cmd->buttons & BT_ACCELERATE) && player->deadtimer > TICRATE) - player->playerstate = PST_REBORN; - // Single player auto respawn if (!(netgame || multiplayer) && player->deadtimer > 5*TICRATE) player->playerstate = PST_REBORN; From a00123e6637a1603ce7a7747fd8cfe35b460413b Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Wed, 25 Oct 2017 14:56:06 +0100 Subject: [PATCH 19/61] Item Throw distance/height experimentation --- src/k_kart.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4f294b8a..be4049c7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1920,13 +1920,13 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map switch (cv_kartcc.value) { case 50: - PROJSPEED = 85*FRACUNIT; // Avg Speed is 34 + PROJSPEED = 40*FRACUNIT; // Avg Speed is 34 break; case 150: - PROJSPEED = 120*FRACUNIT; // Avg Speed is 48 + PROJSPEED = 60*FRACUNIT; // Avg Speed is 48 break; default: - PROJSPEED = 102*FRACUNIT+FRACUNIT/2; // Avg Speed is 41 + PROJSPEED = 50*FRACUNIT; // Avg Speed is 41 break; } @@ -2029,7 +2029,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map if (dir == 1 || dir == 2) { // Shoot forward - mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + 80*FRACUNIT, mapthing); + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, mapthing); mo->threshold = 10; @@ -2043,22 +2043,19 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map INT32 HEIGHT; if (dir == 2) - HEIGHT = 16*FRACUNIT + player->mo->momz; + HEIGHT = 30*FRACUNIT + player->mo->momz; else - HEIGHT = 8*FRACUNIT + player->mo->momz; + HEIGHT = 20*FRACUNIT + player->mo->momz; - if (HEIGHT > 64*FRACUNIT) - HEIGHT = 64*FRACUNIT; - - mo->momx = FixedMul(FINECOSINE(fa), PROJSPEED); - mo->momy = FixedMul(FINESINE(fa), PROJSPEED); + mo->momx = player->mo->momx + FixedMul(FINECOSINE(fa), PROJSPEED); + mo->momy = player->mo->momy + FixedMul(FINESINE(fa), PROJSPEED); mo->momz = HEIGHT; if (player->mo->eflags & MFE_VERTICALFLIP) mo->eflags |= MFE_VERTICALFLIP; } - mobj_t *throwmo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + 80*FRACUNIT, MT_FIREDITEM); + mobj_t *throwmo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_FIREDITEM); P_SetTarget(&throwmo->target, player->mo); throwmo->movecount = 0; // above player } From b127c02e2c4d10e76e2e0299b6174efa83ef3d88 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 26 Oct 2017 19:37:13 -0400 Subject: [PATCH 20/61] Maybe message fix --- src/k_kart.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b3b78465..70809d29 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3236,7 +3236,7 @@ void K_CheckBalloons(void) UINT8 numingame = 0; INT8 winnernum = -1; - if (gamestate == GS_INTERMISSION) + if (gamestate != GS_LEVEL) return; for (i = 0; i < MAXPLAYERS; i++) @@ -3256,8 +3256,11 @@ void K_CheckBalloons(void) if (numingame <= 1) return; - P_AddPlayerScore(&players[winnernum], numingame); - CONS_Printf(M_GetText("%s recieved %d points for surviving!\n"), player_names[winnernum], numingame); // numingame/2 == 1 ? "" : "s" + if (playeringame[winnernum]) + { + P_AddPlayerScore(&players[winnernum], numingame); + CONS_Printf(M_GetText("%s recieved %d points for surviving!\n"), player_names[winnernum], numingame); // numingame/2 == 1 ? "" : "s" + } if (server) SendNetXCmd(XD_EXITLEVEL, NULL, 0); @@ -3696,8 +3699,8 @@ static void K_drawKartItemRoulette(void) case 39: case 40: case 41: localpatch = kp_goldshroom; break; // Gold Mushroom case 42: case 43: case 44: localpatch = kp_fakeitem; break; // Fake Item case 45: case 46: case 47: localpatch = kp_redshell; break; // Red Shell - case 48: case 49: case 50: localpatch = kp_blueshell; break; // Blue Shell - case 51: case 52: case 53: localpatch = kp_lightning; break; // Lightning + case 48: case 49: case 50: localpatch = kp_blueshell; break; // Blue Shell + case 51: case 52: case 53: localpatch = kp_lightning; break; // Lightning default: break; } From 48e0d64525d2642fd664478aa79c15f3a88fbd7a Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sat, 28 Oct 2017 02:44:25 +0100 Subject: [PATCH 21/61] More changes to thrown items, higher gravity and fly faster --- src/k_kart.c | 10 +++++----- src/p_mobj.c | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9bb5b392..9f2a422a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1927,13 +1927,13 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map switch (cv_kartcc.value) { case 50: - PROJSPEED = 40*FRACUNIT; // Avg Speed is 34 + PROJSPEED = 68*FRACUNIT; // Avg Speed is 34 break; case 150: - PROJSPEED = 60*FRACUNIT; // Avg Speed is 48 + PROJSPEED = 96*FRACUNIT; // Avg Speed is 48 break; default: - PROJSPEED = 50*FRACUNIT; // Avg Speed is 41 + PROJSPEED = 82*FRACUNIT; // Avg Speed is 41 break; } @@ -2050,9 +2050,9 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map INT32 HEIGHT; if (dir == 2) - HEIGHT = 30*FRACUNIT + player->mo->momz; + HEIGHT = 40*FRACUNIT + player->mo->momz; else - HEIGHT = 20*FRACUNIT + player->mo->momz; + HEIGHT = 30*FRACUNIT + player->mo->momz; mo->momx = player->mo->momx + FixedMul(FINECOSINE(fa), PROJSPEED); mo->momy = player->mo->momy + FixedMul(FINESINE(fa), PROJSPEED); diff --git a/src/p_mobj.c b/src/p_mobj.c index d36713e8..e00f0b23 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1378,6 +1378,10 @@ fixed_t P_GetMobjGravity(mobj_t *mo) break; case MT_WATERDROP: gravityadd >>= 1; + case MT_BANANAITEM: + case MT_FAKEITEM: + case MT_BOMBITEM: + gravityadd = FixedMul(gravityadd, 5*FRACUNIT/2); default: break; } From b4a1ad4ef22f2a972c133cadfd4afe7e61df9489 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 31 Oct 2017 16:13:25 -0400 Subject: [PATCH 22/61] Just bumped timer --- src/d_player.h | 1 + src/k_kart.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 12061c36..c4390f9e 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -275,6 +275,7 @@ typedef enum k_startimer, // Invincibility timer k_spinouttimer, // Wipe-out from a banana peel or oil slick (was "pw_bananacam") k_laserwisptimer, // The duration and relative angle of the laser + k_justbumped, // Prevent players from endlessly bumping into each other // Each item needs its own power slot, for the HUD and held use k_magnet, // 0x1 = Magnet in inventory diff --git a/src/k_kart.c b/src/k_kart.c index 9f2a422a..fc605368 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1140,7 +1140,8 @@ void K_KartBouncer(void) && !players[i].kartstuff[k_squishedtimer] && !players[i].kartstuff[k_bootaketimer] && !players[i].kartstuff[k_spinouttimer] - && !players[i].kartstuff[k_startimer]) + && !players[i].kartstuff[k_startimer] + && !players[i].kartstuff[k_justbumped]) { for (j = i+1; j < MAXPLAYERS; j++) if (playeringame[j] && players[j].mo && !P_MobjWasRemoved(players[j].mo) @@ -1148,7 +1149,8 @@ void K_KartBouncer(void) && !players[j].kartstuff[k_growshrinktimer] && !players[j].kartstuff[k_bootaketimer] && !players[j].kartstuff[k_spinouttimer] - && !players[j].kartstuff[k_startimer]) + && !players[j].kartstuff[k_startimer] + && !players[j].kartstuff[k_justbumped]) { if (players[j].mo == players[i].mo) break; @@ -1163,7 +1165,9 @@ void K_KartBouncer(void) else K_SwapMomentum(players[i].mo, players[j].mo, false); players[i].collide[j] = true; + players[i].kartstuff[k_justbumped] = 6; // let the animation finish before letting you bump again :V players[j].collide[i] = true; + players[j].kartstuff[k_justbumped] = 6; } } else @@ -1387,6 +1391,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_sounds]) player->kartstuff[k_sounds]--; + if (player->kartstuff[k_justbumped]) + player->kartstuff[k_justbumped]--; + // ??? /* if (player->kartstuff[k_jmp] > 1 && onground) From e60b3e1b88b604c3bb2511fd88c820d454df13a5 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Wed, 1 Nov 2017 18:40:32 +0000 Subject: [PATCH 23/61] Move Player collision check into the regular collision checking --- src/d_clisrv.c | 4 --- src/d_player.h | 1 - src/g_game.c | 1 - src/k_kart.c | 80 ++++++++------------------------------------- src/k_kart.h | 2 +- src/lua_playerlib.c | 2 -- src/lua_script.c | 1 - src/p_map.c | 29 ++++++++++++++-- src/p_saveg.c | 4 --- src/p_tick.c | 6 ---- 10 files changed, 42 insertions(+), 88 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f3df4f10..ac55febd 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -519,8 +519,6 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->powers[j] = (UINT16)SHORT(players[i].powers[j]); for (j = 0; j < NUMKARTSTUFF; ++j) rsp->kartstuff[j] = LONG(players[i].kartstuff[j]); // SRB2kart - for (j = 0; j < MAXPLAYERS; ++j) - rsp->collide[j] = (UINT8)players[i].collide[j]; // SRB2kart // Score is resynched in the rspfirm resync packet rsp->health = 0; // resynched with mo health @@ -653,8 +651,6 @@ static void resynch_read_player(resynch_pak *rsp) players[i].powers[j] = (UINT16)SHORT(rsp->powers[j]); for (j = 0; j < NUMKARTSTUFF; ++j) players[i].kartstuff[j] = LONG(rsp->kartstuff[j]); // SRB2kart - for (j = 0; j < MAXPLAYERS; ++j) - players[i].collide[j] = (UINT8)rsp->collide[j]; // SRB2kart // Score is resynched in the rspfirm resync packet players[i].health = rsp->health; diff --git a/src/d_player.h b/src/d_player.h index c4390f9e..44902ed6 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -366,7 +366,6 @@ typedef struct player_s // SRB2kart stuff INT32 kartstuff[NUMKARTSTUFF]; - boolean collide[MAXPLAYERS]; // Bit flags. // See pflags_t, above. diff --git a/src/g_game.c b/src/g_game.c index effd2127..0f01562a 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2120,7 +2120,6 @@ static inline void G_PlayerFinishLevel(INT32 player) memset(p->powers, 0, sizeof (p->powers)); memset(p->kartstuff, 0, sizeof (p->kartstuff)); // SRB2kart - memset(p->collide, 0, sizeof (p->collide)); // SRB2kart p->ringweapons = 0; p->mo->flags2 &= ~MF2_SHADOW; // cancel invisibility diff --git a/src/k_kart.c b/src/k_kart.c index fc605368..3135500d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1039,20 +1039,6 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) //{ SRB2kart p_user.c Stuff -boolean K_IsTouching(mobj_t *mobj1, mobj_t *mobj2) -{ - if (mobj1 == NULL || mobj2 == NULL) - return false; - fixed_t absx = abs(mobj1->x - mobj2->x); - fixed_t absy = abs(mobj1->y - mobj2->y); - fixed_t absz = abs(mobj1->z - mobj2->z); - - if (absx < 32*FRACUNIT && absy < 32*FRACUNIT && absz < 32*FRACUNIT) - return true; - else - return false; -} - void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) { fixed_t newx, newy; @@ -1072,7 +1058,7 @@ void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) //S_StartSound(mobj2, cv_collidesoundnum.value); } - fx = P_SpawnMobj((mobj1->x + mobj2->x)/2, (mobj1->y + mobj2->y)/2, (mobj1->z + mobj2->z)/2, MT_BUMP); + fx = P_SpawnMobj(mobj1->x/2 + mobj2->x/2, mobj1->y/2 + mobj2->y/2, mobj1->z/2 + mobj2->z/2, MT_BUMP); if (mobj1->eflags & MFE_VERTICALFLIP) fx->eflags |= MFE_VERTICALFLIP; else @@ -1125,58 +1111,20 @@ void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) mobj1->momz = mobj2->momz; mobj2->momz = newz; } -} -void K_KartBouncer(void) -{ - fixed_t i, j; - for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) - for (j = 0; j < MAXPLAYERS; j++) - players[i].collide[j] = false; - for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo) - && !players[i].kartstuff[k_growshrinktimer] - && !players[i].kartstuff[k_squishedtimer] - && !players[i].kartstuff[k_bootaketimer] - && !players[i].kartstuff[k_spinouttimer] - && !players[i].kartstuff[k_startimer] - && !players[i].kartstuff[k_justbumped]) - { - for (j = i+1; j < MAXPLAYERS; j++) - if (playeringame[j] && players[j].mo && !P_MobjWasRemoved(players[j].mo) - && !players[j].kartstuff[k_squishedtimer] - && !players[j].kartstuff[k_growshrinktimer] - && !players[j].kartstuff[k_bootaketimer] - && !players[j].kartstuff[k_spinouttimer] - && !players[j].kartstuff[k_startimer] - && !players[j].kartstuff[k_justbumped]) - { - if (players[j].mo == players[i].mo) - break; - if (K_IsTouching(players[i].mo, players[j].mo)) - { - if (!players[i].collide[j] && !players[j].collide[i]) - { - if (P_IsObjectOnGround(players[j].mo) && players[i].mo->momz < 0) - K_SwapMomentum(players[i].mo, players[j].mo, true); - else if (P_IsObjectOnGround(players[i].mo) && players[j].mo->momz < 0) - K_SwapMomentum(players[j].mo, players[i].mo, true); - else - K_SwapMomentum(players[i].mo, players[j].mo, false); - players[i].collide[j] = true; - players[i].kartstuff[k_justbumped] = 6; // let the animation finish before letting you bump again :V - players[j].collide[i] = true; - players[j].kartstuff[k_justbumped] = 6; - } - } - else - { - players[i].collide[j] = false; - players[j].collide[i] = false; - } - } - } + // Because this is done during collision now, rmomx and rmomy need to be recalculated + // so that friction doesn't immediately decide to stop the player if they're at a standstill + if (mobj1->player) + { + mobj1->player->rmomx = mobj1->momx - mobj1->player->cmomx; + mobj1->player->rmomy = mobj1->momy - mobj1->player->cmomy; + } + + if (mobj2->player) + { + mobj2->player->rmomx = mobj2->momx - mobj2->player->cmomx; + mobj2->player->rmomy = mobj2->momy - mobj2->player->cmomy; + } } /** \brief Checks that the player is on an offroad subsector for realsies diff --git a/src/k_kart.h b/src/k_kart.h index 1cc5e9a1..1cd16e88 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -15,7 +15,7 @@ UINT8 K_GetKartColorByName(const char *name); void K_RegisterKartStuff(void); -void K_KartBouncer(void); +void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 44a27cd1..06cc69e0 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -130,8 +130,6 @@ static int player_get(lua_State *L) LUA_PushUserdata(L, plr->powers, META_POWERS); else if (fastcmp(field,"kartstuff")) LUA_PushUserdata(L, plr->kartstuff, META_KARTSTUFF); - else if (fastcmp(field,"collide")) - LUA_PushUserdata(L, plr->collide, META_COLLIDE); else if (fastcmp(field,"pflags")) lua_pushinteger(L, plr->pflags); else if (fastcmp(field,"panim")) diff --git a/src/lua_script.c b/src/lua_script.c index 9ba7ce7f..aafabbb9 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -435,7 +435,6 @@ void LUA_InvalidatePlayer(player_t *player) LUA_InvalidateUserdata(player); LUA_InvalidateUserdata(player->powers); LUA_InvalidateUserdata(player->kartstuff); - LUA_InvalidateUserdata(player->collide); LUA_InvalidateUserdata(&player->cmd); } diff --git a/src/p_map.c b/src/p_map.c index 547444ec..18de0df3 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -320,6 +320,7 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object) } } +#if 0 static void P_DoTailsCarry(player_t *sonic, player_t *tails) { INT32 p; @@ -400,6 +401,7 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails) sonic->pflags &= ~PF_CARRIED; } } +#endif // // PIT_CheckThing @@ -1534,7 +1536,8 @@ static boolean PIT_CheckThing(mobj_t *thing) } // Force solid players in hide and seek to avoid corner stacking. - if (cv_tailspickup.value && gametype != GT_HIDEANDSEEK) + // Kart: No Tailspickup ever, players are always solid + /*if (cv_tailspickup.value && gametype != GT_HIDEANDSEEK) { if (tmthing->player && thing->player) { @@ -1546,7 +1549,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player-players == consoleplayer && botingame) CV_SetValue(&cv_analog2, true); thing->player->pflags &= ~PF_CARRIED; - } + }*/ if (thing->player) { @@ -1592,6 +1595,28 @@ static boolean PIT_CheckThing(mobj_t *thing) && tmthing->z <= thing->z + thing->height) iwassprung = P_DoSpring(thing, tmthing); } + else if (thing->player) // bounce when players collide + { + if (thing->player->kartstuff[k_growshrinktimer] || thing->player->kartstuff[k_squishedtimer] + || thing->player->kartstuff[k_bootaketimer] || thing->player->kartstuff[k_spinouttimer] + || thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped] + || tmthing->player->kartstuff[k_growshrinktimer] || tmthing->player->kartstuff[k_squishedtimer] + || tmthing->player->kartstuff[k_bootaketimer] || tmthing->player->kartstuff[k_spinouttimer] + || tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped]) + { + return true; + } + + if (P_IsObjectOnGround(thing) && tmthing->momz < 0) + K_SwapMomentum(tmthing, thing, true); + else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) + K_SwapMomentum(thing, tmthing, true); + else + K_SwapMomentum(tmthing, thing, false); + + thing->player->kartstuff[k_justbumped] = 6; + tmthing->player->kartstuff[k_justbumped] = 6; + } // Are you touching the side of the object you're interacting with? else if (thing->z - FixedMul(FRACUNIT, thing->scale) <= tmthing->z + tmthing->height && thing->z + thing->height + FixedMul(FRACUNIT, thing->scale) >= tmthing->z) diff --git a/src/p_saveg.c b/src/p_saveg.c index e04ee39c..d813337b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -138,8 +138,6 @@ static void P_NetArchivePlayers(void) WRITEUINT16(save_p, players[i].powers[j]); for (j = 0; j < NUMKARTSTUFF; j++) WRITEINT32(save_p, players[i].kartstuff[j]); - for (j = 0; j < MAXPLAYERS; j++) - WRITEUINT8(save_p, players[i].collide[j]); WRITEUINT8(save_p, players[i].playerstate); WRITEUINT32(save_p, players[i].pflags); @@ -321,8 +319,6 @@ static void P_NetUnArchivePlayers(void) players[i].powers[j] = READUINT16(save_p); for (j = 0; j < NUMKARTSTUFF; j++) players[i].kartstuff[j] = READINT32(save_p); - for (j = 0; j < MAXPLAYERS; j++) - players[i].collide[j] = (boolean)READUINT8(save_p); players[i].playerstate = READUINT8(save_p); players[i].pflags = READUINT32(save_p); diff --git a/src/p_tick.c b/src/p_tick.c index 71bd3594..7ea98435 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -625,9 +625,6 @@ void P_Ticker(boolean run) if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) P_PlayerAfterThink(&players[i]); - // SRB2kart - runs bounce collision for players - K_KartBouncer(); - #ifdef HAVE_BLUA LUAh_ThinkFrame(); #endif @@ -743,9 +740,6 @@ void P_PreTicker(INT32 frames) if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) P_PlayerAfterThink(&players[i]); - // SRB2kart - runs bounce collision for players - K_KartBouncer(); - #ifdef HAVE_BLUA LUAh_ThinkFrame(); #endif From 4fce06d80e5b4c5800224dbb93d6c720d739d474 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 1 Nov 2017 16:24:40 -0400 Subject: [PATCH 24/61] Dang it. --- src/k_kart.c | 120 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e86a9163..ab4a073f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1006,24 +1006,24 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) // Check the game type to differentiate odds. //if (gametype == GT_RETRO) //{ - if (cv_magnet.value) SETITEMRESULT(useodds, 1); // Magnet - if (cv_boo.value) SETITEMRESULT(useodds, 2); // Boo - if (cv_mushroom.value) SETITEMRESULT(useodds, 3); // Mushroom - if (cv_mushroom.value) SETITEMRESULT(useodds, 4); // Triple Mushroom - if (cv_megashroom.value) SETITEMRESULT(useodds, 5); // Mega Mushroom - if (cv_goldshroom.value) SETITEMRESULT(useodds, 6); // Gold Mushroom - if (cv_star.value) SETITEMRESULT(useodds, 7); // Star - if (cv_triplebanana.value) SETITEMRESULT(useodds, 8); // Triple Banana - if (cv_fakeitem.value) SETITEMRESULT(useodds, 9); // Fake Item - if (cv_banana.value) SETITEMRESULT(useodds, 10); // Banana - if (cv_greenshell.value) SETITEMRESULT(useodds, 11); // Green Shell - if (cv_redshell.value) SETITEMRESULT(useodds, 12); // Red Shell - if (cv_triplegreenshell.value) SETITEMRESULT(useodds, 13); // Triple Green Shell - if (cv_bobomb.value) SETITEMRESULT(useodds, 14); // Bob-omb - if (cv_blueshell.value && pexiting == 0) SETITEMRESULT(useodds, 15); // Blue Shell - if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower - if (cv_tripleredshell.value) SETITEMRESULT(useodds, 17); // Triple Red Shell - if (cv_lightning.value && pingame > pexiting) SETITEMRESULT(useodds, 18); // Lightning + if (cv_magnet.value) SETITEMRESULT(useodds, 1); // Magnet + if (cv_boo.value) SETITEMRESULT(useodds, 2); // Boo + if (cv_mushroom.value) SETITEMRESULT(useodds, 3); // Mushroom + if (cv_mushroom.value) SETITEMRESULT(useodds, 4); // Triple Mushroom + if (cv_megashroom.value && !player->kartstuff[k_poweritemtimer]) SETITEMRESULT(useodds, 5); // Mega Mushroom + if (cv_goldshroom.value) SETITEMRESULT(useodds, 6); // Gold Mushroom + if (cv_star.value && !player->kartstuff[k_poweritemtimer]) SETITEMRESULT(useodds, 7); // Star + if (cv_triplebanana.value) SETITEMRESULT(useodds, 8); // Triple Banana + if (cv_fakeitem.value) SETITEMRESULT(useodds, 9); // Fake Item + if (cv_banana.value) SETITEMRESULT(useodds, 10); // Banana + if (cv_greenshell.value) SETITEMRESULT(useodds, 11); // Green Shell + if (cv_redshell.value) SETITEMRESULT(useodds, 12); // Red Shell + if (cv_triplegreenshell.value) SETITEMRESULT(useodds, 13); // Triple Green Shell + if (cv_bobomb.value) SETITEMRESULT(useodds, 14); // Bob-omb + if (cv_blueshell.value && pexiting == 0) SETITEMRESULT(useodds, 15); // Blue Shell + if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower + if (cv_tripleredshell.value) SETITEMRESULT(useodds, 17); // Triple Red Shell + if (cv_lightning.value && pingame > pexiting) SETITEMRESULT(useodds, 18); // Lightning prandom = P_RandomKey(numchoices); @@ -1395,6 +1395,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_laserwisptimer]) player->kartstuff[k_laserwisptimer]--; + if (player->kartstuff[k_poweritemtimer]) + player->kartstuff[k_poweritemtimer]--; + if (player->kartstuff[k_lapanimation]) player->kartstuff[k_lapanimation]--; @@ -2654,6 +2657,57 @@ static boolean K_CheckForHoldItem(player_t *player) ) return true; return false; } + +static void K_StripItems(player_t *player) +{ + if ( player->kartstuff[k_kitchensink] + || player->kartstuff[k_lightning] + || player->kartstuff[k_tripleredshell] + || player->kartstuff[k_fireflower] + || player->kartstuff[k_blueshell] + || player->kartstuff[k_bobomb] + || player->kartstuff[k_triplegreenshell] + || player->kartstuff[k_redshell] + || player->kartstuff[k_greenshell] + || player->kartstuff[k_banana] + || player->kartstuff[k_fakeitem] & 2 + || player->kartstuff[k_triplebanana] + || player->kartstuff[k_star] + || player->kartstuff[k_goldshroom] + || player->kartstuff[k_megashroom] + || player->kartstuff[k_mushroom] + || player->kartstuff[k_boo] + || player->kartstuff[k_magnet] + //|| player->kartstuff[k_bootaketimer] // uncomment when proper comeback mechanic is in + || player->kartstuff[k_boostolentimer] + || player->kartstuff[k_goldshroomtimer] + || player->kartstuff[k_growshrinktimer] + ) player->kartstuff[k_itemclose] = 10; + player->kartstuff[k_kitchensink] = 0; + player->kartstuff[k_lightning] = 0; + player->kartstuff[k_tripleredshell] = 0; + player->kartstuff[k_fireflower] = 0; + player->kartstuff[k_blueshell] = 0; + player->kartstuff[k_bobomb] = 0; + player->kartstuff[k_triplegreenshell] = 0; + player->kartstuff[k_redshell] = 0; + player->kartstuff[k_greenshell] = 0; + player->kartstuff[k_banana] = 0; + player->kartstuff[k_fakeitem] = 0; + player->kartstuff[k_triplebanana] = 0; + player->kartstuff[k_star] = 0; + player->kartstuff[k_goldshroom] = 0; + player->kartstuff[k_megashroom] = 0; + player->kartstuff[k_mushroom] = 0; + player->kartstuff[k_boo] = 0; + player->kartstuff[k_magnet] = 0; + //player->kartstuff[k_bootaketimer] = 0; + player->kartstuff[k_boostolentimer] = 0; + player->kartstuff[k_goldshroomtimer] = 0; + player->kartstuff[k_growshrinktimer] = 0; + player->kartstuff[k_magnettimer] = 0; + player->kartstuff[k_startimer] = 0; +} // // K_MoveKartPlayer // @@ -2762,6 +2816,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_startimer] = itemtime; // Activate it K_PlayTauntSound(player->mo); player->kartstuff[k_star] = 0; + if (gametype != GT_RACE) + player->kartstuff[k_poweritemtimer] = 10*TICRATE; player->kartstuff[k_itemclose] = 10; player->pflags |= PF_ATTACKDOWN; } @@ -3077,6 +3133,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) S_StartSound(player->mo, sfx_mario3); player->pflags |= PF_ATTACKDOWN; player->kartstuff[k_megashroom] = 0; + if (gametype != GT_RACE) + player->kartstuff[k_poweritemtimer] = 10*TICRATE; player->kartstuff[k_itemclose] = 10; } // Boo @@ -3126,6 +3184,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_growshrinktimer] == 26) S_StartSound(player->mo, sfx_mario8); + if ((gametype != GT_RACE) + && (player->kartstuff[k_star] || player->kartstuff[k_megashroom] + || player->kartstuff[k_startimer] || player->kartstuff[k_growshrinktimer] > 0)) + player->kartstuff[k_poweritemtimer] = 10*TICRATE; + if (player->kartstuff[k_bootaketimer] > 0) { if ((player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) @@ -3217,27 +3280,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0) // dead in match? BOO! { + K_StripItems(player); player->kartstuff[k_bootaketimer] = bootime; - player->kartstuff[k_magnet] = 0; // reset all those dang items - player->kartstuff[k_boo] = 0; - player->kartstuff[k_mushroom] = 0; - player->kartstuff[k_megashroom] = 0; - player->kartstuff[k_goldshroom] = 0; - player->kartstuff[k_star] = 0; - player->kartstuff[k_triplebanana] = 0; - player->kartstuff[k_fakeitem] = 0; - player->kartstuff[k_banana] = 0; - player->kartstuff[k_greenshell] = 0; - player->kartstuff[k_redshell] = 0; - player->kartstuff[k_laserwisp] = 0; - player->kartstuff[k_triplegreenshell] = 0; - player->kartstuff[k_bobomb] = 0; - player->kartstuff[k_blueshell] = 0; - player->kartstuff[k_jaws] = 0; - player->kartstuff[k_fireflower] = 0; - player->kartstuff[k_tripleredshell] = 0; - player->kartstuff[k_lightning] = 0; - player->kartstuff[k_kitchensink] = 0; } } From cc01d2c3f02274184c25b6094fdb509ad59bbde5 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 1 Nov 2017 18:46:35 -0400 Subject: [PATCH 25/61] Balloon revamp Supports arbitrary balloon counts now --- src/d_netcmd.c | 3 +- src/d_netcmd.h | 1 + src/dehacked.c | 6 +-- src/info.c | 110 +------------------------------------- src/info.h | 6 +-- src/k_kart.c | 142 +++++++++++++++++++++++++++++++++---------------- src/p_inter.c | 30 ++++------- src/p_mobj.c | 119 +++++++---------------------------------- 8 files changed, 132 insertions(+), 285 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5a83d4f6..8f4e63aa 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -316,8 +316,9 @@ consvar_t cv_lightning = {"lightning", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {5, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {99, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t speedometer_cons_t[] = {{0, "Off"}, {1, "Kilometers"}, {2, "Miles"}, {3, "Fracunits"}, {0, NULL}}; consvar_t cv_speedometer = {"speedometer", "Kilometers", CV_SAVE, speedometer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // use tics in display diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 25a9ee89..75d3a0ba 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -107,6 +107,7 @@ extern consvar_t cv_blueshell, cv_jaws, cv_fireflower, cv_tripleredshell, cv_lig extern consvar_t cv_karthud; extern consvar_t cv_kartcc; extern consvar_t cv_kartballoons; +extern consvar_t cv_kartfrantic; extern consvar_t cv_speedometer; extern consvar_t cv_collideminimum; diff --git a/src/dehacked.c b/src/dehacked.c index 4c04a8d5..dba84072 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6985,11 +6985,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_SINK", // Kitchen Sink Stuff "MT_SINKTRAIL", - "MT_BATTLEBALLOON1", // Battle Mode balloon stuff - "MT_BATTLEBALLOON2", - "MT_BATTLEBALLOON3", - "MT_BATTLEBALLOON4", - "MT_BATTLEBALLOON5", + "MT_BATTLEBALLOON", // Battle Mode balloon "MT_LAKITU", diff --git a/src/info.c b/src/info.c index b72a5eae..c53af0a0 100644 --- a/src/info.c +++ b/src/info.c @@ -15139,115 +15139,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_BATTLEBALLOON1 - -1, // doomednum - S_BATTLEBALLOON1,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate - }, - - { // MT_BATTLEBALLOON2 - -1, // doomednum - S_BATTLEBALLOON1,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate - }, - - { // MT_BATTLEBALLOON3 - -1, // doomednum - S_BATTLEBALLOON1,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate - }, - - { // MT_BATTLEBALLOON4 - -1, // doomednum - S_BATTLEBALLOON1,// spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate - S_NULL, // deathstate - S_NULL, // xdeathstate - sfx_None, // deathsound - 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 16*FRACUNIT, // height - 0, // display offset - 100, // mass - 1, // damage - sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags - S_NULL // raisestate - }, - - { // MT_BATTLEBALLOON5 + { // MT_BATTLEBALLOON -1, // doomednum S_BATTLEBALLOON1,// spawnstate 1000, // spawnhealth diff --git a/src/info.h b/src/info.h index 55cc83a9..f701c5fb 100644 --- a/src/info.h +++ b/src/info.h @@ -3977,11 +3977,7 @@ typedef enum mobj_type MT_SINK, // Kitchen Sink Stuff MT_SINKTRAIL, - MT_BATTLEBALLOON1, // Battle Mode balloons - MT_BATTLEBALLOON2, - MT_BATTLEBALLOON3, - MT_BATTLEBALLOON4, - MT_BATTLEBALLOON5, + MT_BATTLEBALLOON, // Battle Mode balloons MT_LAKITU, diff --git a/src/k_kart.c b/src/k_kart.c index ab4a073f..7473f87b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -303,6 +303,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartcc); CV_RegisterVar(&cv_kartballoons); + CV_RegisterVar(&cv_kartfrantic); CV_RegisterVar(&cv_speedometer); CV_RegisterVar(&cv_collideminimum); CV_RegisterVar(&cv_collidesoundnum); @@ -987,6 +988,12 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) player->kartstuff[k_itemclose] = 0; // Reset the item window closer. + if (cv_kartfrantic.value) // Stupid items + { + pdis = (13*pdis/14); // multiply... + pdis += distvar; // then set everyone back another place... + } + if (gametype == GT_MATCH || gametype == GT_TEAMMATCH || gametype == GT_CTF) useodds = 0; // Battle Mode @@ -1636,23 +1643,12 @@ void K_SpinPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH) + if (gametype != GT_RACE) { - if (player->kartstuff[k_balloon] & 16) - player->kartstuff[k_balloon] &= ~16; - else if (player->kartstuff[k_balloon] & 8) - player->kartstuff[k_balloon] &= ~8; - else if (player->kartstuff[k_balloon] & 4) - player->kartstuff[k_balloon] &= ~4; - else if (player->kartstuff[k_balloon] & 2) - player->kartstuff[k_balloon] &= ~2; - else if (player->kartstuff[k_balloon] & 1) - { - player->kartstuff[k_balloon] &= ~1; + player->kartstuff[k_balloon]--; + + if (player->kartstuff[k_balloon] <= 0) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); - //P_DamageMobj(player->mo, NULL, NULL, 10000); - //return; - } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1701,23 +1697,12 @@ void K_SquishPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH) + if (gametype != GT_RACE) { - if (player->kartstuff[k_balloon] & 16) - player->kartstuff[k_balloon] &= ~16; - else if (player->kartstuff[k_balloon] & 8) - player->kartstuff[k_balloon] &= ~8; - else if (player->kartstuff[k_balloon] & 4) - player->kartstuff[k_balloon] &= ~4; - else if (player->kartstuff[k_balloon] & 2) - player->kartstuff[k_balloon] &= ~2; - else if (player->kartstuff[k_balloon] & 1) - { - player->kartstuff[k_balloon] &= ~1; + player->kartstuff[k_balloon]--; + + if (player->kartstuff[k_balloon] <= 0) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); - //P_DamageMobj(player->mo, NULL, NULL, 10000); - //return; - } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1755,23 +1740,12 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - if (gametype == GT_MATCH) + if (gametype != GT_RACE) { - if (player->kartstuff[k_balloon] & 16) - player->kartstuff[k_balloon] &= ~16; - else if (player->kartstuff[k_balloon] & 8) - player->kartstuff[k_balloon] &= ~8; - else if (player->kartstuff[k_balloon] & 4) - player->kartstuff[k_balloon] &= ~4; - else if (player->kartstuff[k_balloon] & 2) - player->kartstuff[k_balloon] &= ~2; - else if (player->kartstuff[k_balloon] & 1) - { - player->kartstuff[k_balloon] &= ~1; + player->kartstuff[k_balloon]--; + + if (player->kartstuff[k_balloon] <= 0) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); - //P_DamageMobj(player->mo, NULL, NULL, 10000); - //return; - } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1801,6 +1775,84 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju return; } +/*void K_StealBalloon(player_t *player, player_t *victim) +{ + //(void) source; + if (gametype == GT_RACE) + return; + + if (player->health <= 0 || victim->health <= 0) + return; + + if (player == victim) + return; + + 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 || player->kartstuff[k_balloon] >= 3) + || (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinout] > 0) + || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootaketimer] > 0 || victim->kartstuff[k_balloon] <= 0)) + return; + + victim->kartstuff[k_mushroomtimer] = 0; + victim->kartstuff[k_driftboost] = 0; + + CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); + + player->kartstuff[k_balloon]++; + + { + angle_t newangle, diff; + fixed_t newx; + fixed_t newy; + mobj_t *mo; + + newangle = player->mo->angle; + diff = FixedAngle(360*FRACUNIT/cv_kartballoons.value); + 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_BATTLEBALLOON); + mo->threshold = 10; + P_SetTarget(&mo->target, player->mo); + P_SetTarget(&mo->tracer, victim->mo); + mo->angle = 0; + mo->color = player->mo->color; + if (player->mo->flags2 & MF2_DONTDRAW) + mo->flags2 |= MF2_DONTDRAW; + else + mo->flags2 &= ~MF2_DONTDRAW; + } + + victim->kartstuff[k_balloon]--; + + if (victim->kartstuff[k_balloon] <= 0) + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[victim-players]); + + P_AddPlayerScore(player, 1); + K_CheckBalloons(); + + 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; + + 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; + + P_PlayRinglossSound(player->mo); + + if (P_IsLocalPlayer(player)) + { + quake.intensity = 64*FRACUNIT; + quake.time = 5; + } + + return; +}*/ + 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; diff --git a/src/p_inter.c b/src/p_inter.c index 5658a131..d95e190a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2019,16 +2019,8 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) target->target->player->kartstuff[k_triplebanana] &= ~2; else if (target->type == MT_TRIPLEBANANASHIELD3 && target->target->player->kartstuff[k_triplebanana] & 4) target->target->player->kartstuff[k_triplebanana] &= ~4; - else if (target->type == MT_BATTLEBALLOON1 && target->target->player->kartstuff[k_balloon] & 1) - target->target->player->kartstuff[k_balloon] &= ~1; - else if (target->type == MT_BATTLEBALLOON2 && target->target->player->kartstuff[k_balloon] & 2) - target->target->player->kartstuff[k_balloon] &= ~2; - else if (target->type == MT_BATTLEBALLOON3 && target->target->player->kartstuff[k_balloon] & 4) - target->target->player->kartstuff[k_balloon] &= ~4; - else if (target->type == MT_BATTLEBALLOON4 && target->target->player->kartstuff[k_balloon] & 8) - target->target->player->kartstuff[k_balloon] &= ~8; - else if (target->type == MT_BATTLEBALLOON5 && target->target->player->kartstuff[k_balloon] & 16) - target->target->player->kartstuff[k_balloon] &= ~16; + else if (target->type == MT_BATTLEBALLOON && target->target->player->kartstuff[k_balloon] >= target->threshold) + target->target->player->kartstuff[k_triplebanana] = target->threshold-1; } // @@ -2751,18 +2743,14 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) HU_DoCEcho(va("%s\\is no longer super.\\\\\\\\", player_names[player-players])); }*/ - if (player->kartstuff[k_balloon]) + if (gametype != GT_RACE) { - if (player->kartstuff[k_balloon] & 16) - player->kartstuff[k_balloon] &= ~16; - else if (player->kartstuff[k_balloon] & 8) - player->kartstuff[k_balloon] &= ~8; - else if (player->kartstuff[k_balloon] & 4) - player->kartstuff[k_balloon] &= ~4; - else if (player->kartstuff[k_balloon] & 2) - player->kartstuff[k_balloon] &= ~2; - else if (player->kartstuff[k_balloon] & 1) - player->kartstuff[k_balloon] &= ~1; + player->kartstuff[k_balloon]--; + + if (player->kartstuff[k_balloon] <= 0) + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + + K_CheckBalloons(); } } diff --git a/src/p_mobj.c b/src/p_mobj.c index ffce0300..48e25a31 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6582,11 +6582,7 @@ void P_MobjThinker(mobj_t *mobj) case MT_TRIPLEBANANASHIELD1: case MT_TRIPLEBANANASHIELD2: case MT_TRIPLEBANANASHIELD3: - case MT_BATTLEBALLOON1: - case MT_BATTLEBALLOON2: - case MT_BATTLEBALLOON3: - case MT_BATTLEBALLOON4: - case MT_BATTLEBALLOON5: + case MT_BATTLEBALLOON: if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { @@ -6595,7 +6591,7 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) radius = 64*mobj->target->scale; - else if (mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + else if (mobj->type == MT_BATTLEBALLOON) radius = 32*mobj->target->scale; else radius = 56*mobj->target->scale; @@ -6603,10 +6599,8 @@ void P_MobjThinker(mobj_t *mobj) //mobj->angle += FixedAngle(12*FRACUNIT); // mobj's actual speed. if (mobj->type == MT_TRIPLEGREENSHIELD1 || mobj->type == MT_TRIPLEGREENSHIELD2 || mobj->type == MT_TRIPLEGREENSHIELD3 || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3 - || mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) - if ((mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) && !((mobj->target->player-players) & 1)) + || mobj->type == MT_BATTLEBALLOON) + if ((mobj->type == MT_BATTLEBALLOON) && !((mobj->target->player-players) & 1)) mobj->angle -= FixedAngle(mobj->info->speed); else mobj->angle += FixedAngle(mobj->info->speed); @@ -6629,14 +6623,13 @@ void P_MobjThinker(mobj_t *mobj) HEIGHT = mobj->target->height / 5; } - if (mobj->type == MT_BATTLEBALLOON1 || mobj->type == MT_BATTLEBALLOON2 || mobj->type == MT_BATTLEBALLOON3 - || mobj->type == MT_BATTLEBALLOON4 || mobj->type == MT_BATTLEBALLOON5) + if (mobj->type == MT_BATTLEBALLOON) { mobj->color = mobj->target->color; - if (!(mobj->target->player->kartstuff[k_balloon] & 2)) + if (mobj->target->player->kartstuff[k_balloon] <= 1) P_SetMobjState(mobj, S_BATTLEBALLOON3); - else if (!(mobj->target->player->kartstuff[k_balloon] & 4)) + else if (mobj->target->player->kartstuff[k_balloon] == 2) P_SetMobjState(mobj, S_BATTLEBALLOON2); if (mobj->target->flags2 & MF2_DONTDRAW) @@ -6677,11 +6670,7 @@ void P_MobjThinker(mobj_t *mobj) || (mobj->type == MT_TRIPLEBANANASHIELD3 && !(mobj->target->player->kartstuff[k_triplebanana] & 4)) || (mobj->type == MT_BOMBSHIELD && !(mobj->target->player->kartstuff[k_bobomb] & 1)) || (mobj->type == MT_FAKESHIELD && !(mobj->target->player->kartstuff[k_fakeitem] & 1)) - || (mobj->type == MT_BATTLEBALLOON1 && !(mobj->target->player->kartstuff[k_balloon] & 1)) - || (mobj->type == MT_BATTLEBALLOON2 && !(mobj->target->player->kartstuff[k_balloon] & 2)) - || (mobj->type == MT_BATTLEBALLOON3 && !(mobj->target->player->kartstuff[k_balloon] & 4)) - || (mobj->type == MT_BATTLEBALLOON4 && !(mobj->target->player->kartstuff[k_balloon] & 8)) - || (mobj->type == MT_BATTLEBALLOON5 && !(mobj->target->player->kartstuff[k_balloon] & 16))) + || (mobj->type == MT_BATTLEBALLOON && (mobj->target->player->kartstuff[k_balloon] <= mobj->threshold))) { P_RemoveMobj(mobj); return; @@ -8555,8 +8544,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_TRIPLEGREENSHIELD1: case MT_TRIPLEGREENSHIELD2: case MT_TRIPLEGREENSHIELD3: case MT_REDITEM: case MT_REDSHIELD: case MT_REDITEMDUD: case MT_TRIPLEREDSHIELD1: case MT_TRIPLEREDSHIELD2: case MT_TRIPLEREDSHIELD3: - case MT_BATTLEBALLOON1: case MT_BATTLEBALLOON2: case MT_BATTLEBALLOON3: - case MT_BATTLEBALLOON4: case MT_BATTLEBALLOON5: case MT_FIREBALL: + case MT_BATTLEBALLOON: case MT_FIREBALL: case MT_FAKEITEM: case MT_FAKESHIELD: case MT_BOMBITEM: case MT_BOMBSHIELD: P_SpawnShadowMobj(mobj); @@ -9414,98 +9402,31 @@ void P_SpawnPlayer(INT32 playernum) if (gametype != GT_RACE && (leveltime < 1 || p->kartstuff[k_balloon] > 0)) // srb2kart { + INT32 i; angle_t newangle, diff; fixed_t newx; fixed_t newy; - mobj_t *mo, *mo2, *mo3, *mo4, *mo5; + mobj_t *mo; if (leveltime < 1) // Start of the map? - { - p->kartstuff[k_balloon] = 0; // Reset those balloons! - switch (cv_kartballoons.value) - { - case 5: - p->kartstuff[k_balloon] |= 0x16; - case 4: // Fallthru's are intentional - p->kartstuff[k_balloon] |= 0x08; - case 3: - p->kartstuff[k_balloon] |= 0x04; - case 2: - p->kartstuff[k_balloon] |= 0x02; - case 1: - p->kartstuff[k_balloon] |= 0x01; - break; - default: - p->kartstuff[k_balloon] = 0x01|0x02|0x04; // 3 balloons - break; - } - } + p->kartstuff[k_balloon] = cv_kartballoons.value; // Reset those balloons! newangle = mobj->angle; diff = FixedAngle(360*FRACUNIT/cv_kartballoons.value); newx = mobj->x + P_ReturnThrustX(mobj, newangle + ANGLE_180, 64*FRACUNIT); newy = mobj->y + P_ReturnThrustY(mobj, newangle + ANGLE_180, 64*FRACUNIT); - mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON1); - mo->threshold = 10; - P_SetTarget(&mo->target, mobj); - mo->angle = 0; - mo->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo->flags2 |= MF2_DONTDRAW; - else - mo->flags2 &= ~MF2_DONTDRAW; - - if (p->kartstuff[k_balloon] & 2) + for (i = 0; i < cv_kartballoons.value; i++) { - mo2 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON2); - mo2->threshold = 10; - P_SetTarget(&mo2->target, mobj); - mo2->angle = diff; - mo2->color = mobj->color; + mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON); + mo->threshold = i; + P_SetTarget(&mo->target, mobj); + mo->angle = (diff * (i-1)); + mo->color = mobj->color; if (mobj->flags2 & MF2_DONTDRAW) - mo2->flags2 |= MF2_DONTDRAW; + mo->flags2 |= MF2_DONTDRAW; else - mo2->flags2 &= ~MF2_DONTDRAW; - } - - if (p->kartstuff[k_balloon] & 4) - { - mo3 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON3); - mo3->threshold = 10; - P_SetTarget(&mo3->target, mobj); - mo3->angle = diff*2; - mo3->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo3->flags2 |= MF2_DONTDRAW; - else - mo3->flags2 &= ~MF2_DONTDRAW; - } - - if (p->kartstuff[k_balloon] & 8) - { - mo4 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON4); - mo4->threshold = 10; - P_SetTarget(&mo4->target, mobj); - mo4->angle = diff*3; - mo4->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo4->flags2 |= MF2_DONTDRAW; - else - mo4->flags2 &= ~MF2_DONTDRAW; - } - - if (p->kartstuff[k_balloon] & 16) - { - mo5 = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON5); - mo5->threshold = 10; - P_SetTarget(&mo5->target, mobj); - mo5->angle = diff*4; - mo5->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo5->flags2 |= MF2_DONTDRAW; - else - mo5->flags2 &= ~MF2_DONTDRAW; + mo->flags2 &= ~MF2_DONTDRAW; } } } From 9522e1b95e0f0904b41a5ab2be70495885398a71 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 2 Nov 2017 00:35:10 -0400 Subject: [PATCH 26/61] CHECK indicator Turn it off with the kartcheck console var --- src/d_netcmd.c | 1 + src/d_netcmd.h | 1 + src/k_kart.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 8f4e63aa..1e586d79 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -315,6 +315,7 @@ consvar_t cv_tripleredshell = {"tripleredshells", "On", CV_NETVAR|CV_CHEAT, CV consvar_t cv_lightning = {"lightning", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartcheck = {"kartcheck", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {99, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 75d3a0ba..42b208f2 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -105,6 +105,7 @@ extern consvar_t cv_greenshell, cv_redshell, cv_laserwisp, cv_triplegreenshell, extern consvar_t cv_blueshell, cv_jaws, cv_fireflower, cv_tripleredshell, cv_lightning; extern consvar_t cv_karthud; +extern consvar_t cv_kartcheck; extern consvar_t cv_kartcc; extern consvar_t cv_kartballoons; extern consvar_t cv_kartfrantic; diff --git a/src/k_kart.c b/src/k_kart.c index 7473f87b..625665b4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -301,6 +301,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_tripleredshell); CV_RegisterVar(&cv_lightning); + CV_RegisterVar(&cv_kartcheck); CV_RegisterVar(&cv_kartcc); CV_RegisterVar(&cv_kartballoons); CV_RegisterVar(&cv_kartfrantic); @@ -3431,6 +3432,12 @@ static patch_t *kp_triplegreenshellicon; static patch_t *kp_singleredshellicon; static patch_t *kp_doubleredshellicon; static patch_t *kp_tripleredshellicon; +static patch_t *kp_check; +static patch_t *kp_checkw; +static patch_t *kp_checkstar; +static patch_t *kp_checkstarw; +static patch_t *kp_checkmega; +static patch_t *kp_checkmegaw; /* static patch_t *kp_neonoitem; static patch_t *kp_electroshield; @@ -3567,6 +3574,14 @@ void K_LoadKartHUDGraphics(void) kp_doubleredshellicon = W_CachePatchName("K_TRRED2", PU_HUDGFX); kp_tripleredshellicon = W_CachePatchName("K_TRRED3", PU_HUDGFX); + // CHECK indicators + kp_check = W_CachePatchName("K_CHECK1", PU_HUDGFX); + kp_checkw = W_CachePatchName("K_CHECK2", PU_HUDGFX); + kp_checkstar = W_CachePatchName("K_CHECK3", PU_HUDGFX); + kp_checkstarw = W_CachePatchName("K_CHECK4", PU_HUDGFX); + kp_checkmega = W_CachePatchName("K_CHECK5", PU_HUDGFX); + kp_checkmegaw = W_CachePatchName("K_CHECK6", PU_HUDGFX); + /* // Neo-Kart item windows kp_electroshield = W_CachePatchName("KNITELEC", PU_HUDGFX); @@ -4176,6 +4191,98 @@ static void K_drawKartSpeedometer(void) } } +fixed_t K_FindCheckX(INT32 p, fixed_t mx, fixed_t my) +{ + fixed_t camx, camy, dist, x; + angle_t camangle; + camera_t *c = &camera; + + if (players[p].awayviewtics) + { + camx = players[p].awayviewmobj->x; + camy = players[p].awayviewmobj->y; + camangle = players[p].awayviewmobj->angle; + } + else if (c->chase) + { + camx = c->x; + camy = c->y; + camangle = c->angle; + } + else + { + camx = players[p].mo->x; + camy = players[p].mo->y; + camangle = players[p].mo->angle; + } + + dist = abs(R_PointToDist2(camx, camy, mx, my)); + if (dist > RING_DIST) + return -320; + + camangle = camangle+ANGLE_180; + x = camangle-R_PointToAngle2(camx, camy, mx, my); + + if (x > ANGLE_90 || x < ANGLE_270) + return -320; + else + x = FixedMul(FINETANGENT(((x+ANGLE_90)>>ANGLETOFINESHIFT) & FINEMASK), 160<>FRACBITS); +} + +static void K_drawKartPlayerCheck(void) +{ + INT32 i; + UINT8 *colormap; + fixed_t x; + patch_t *localpatch; + + if (splitscreen) + return; + + if (players[displayplayer].mo == NULL) + return; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (i == displayplayer) + continue; + if (players[i].mo == NULL) + continue; + + if ((players[i].kartstuff[k_startimer] <= 0) && (leveltime & 2)) + { + if (players[i].kartstuff[k_megashroom] || players[i].kartstuff[k_growshrinktimer] > 0) + localpatch = kp_checkmegaw; + else if (players[i].kartstuff[k_star] || players[i].kartstuff[k_startimer]) + localpatch = kp_checkstarw; + else + localpatch = kp_checkw; + } + else + { + if (players[i].kartstuff[k_megashroom] || players[i].kartstuff[k_growshrinktimer] > 0) + localpatch = kp_checkmega; + else if (players[i].kartstuff[k_star] || players[i].kartstuff[k_startimer]) + localpatch = kp_checkstar; + else + localpatch = kp_check; + } + + x = K_FindCheckX(displayplayer, players[i].mo->x, players[i].mo->y); + if (x <= 320 && x >= 0) + { + if (x < 14) + x = 14; + else if (x > 306) + x = 306; + colormap = R_GetTranslationColormap(-1, players[i].mo->color, 0); + V_DrawMappedPatch(x, 200, 0, localpatch, colormap); + } + } +} + static void K_drawStartLakitu(void) { patch_t *localpatch = kp_nodraw; @@ -4287,6 +4394,10 @@ void K_drawKartHUD(void) // This is handled by console/menu values K_initKartHUD(); + // Draw the CHECK indicator first, so it's overlapped by everything else + if (cv_kartcheck.value) + K_drawKartPlayerCheck(); + // Draw Lakitu // This is done first so that regardless of HUD layers, // he'll appear to be in the 'real world' From b7432cd154fb1e45b06ec9c145ab3e6250e59389 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 2 Nov 2017 00:41:04 -0400 Subject: [PATCH 27/61] Change draw order Lakitu is a bottom --- src/k_kart.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 625665b4..22f8d95a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4394,10 +4394,6 @@ void K_drawKartHUD(void) // This is handled by console/menu values K_initKartHUD(); - // Draw the CHECK indicator first, so it's overlapped by everything else - if (cv_kartcheck.value) - K_drawKartPlayerCheck(); - // Draw Lakitu // This is done first so that regardless of HUD layers, // he'll appear to be in the 'real world' @@ -4410,6 +4406,10 @@ void K_drawKartHUD(void) K_drawLapLakitu(); } + // Draw the CHECK indicator first, so it's overlapped by everything else + if (cv_kartcheck.value) + K_drawKartPlayerCheck(); + // If the item window is closing, draw it closing! if (stplyr->kartstuff[k_itemclose]) K_drawKartItemClose(); From d0a455c7ddec584e510af0a869a93b436fadf893 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 2 Nov 2017 01:18:16 -0400 Subject: [PATCH 28/61] More tinkering with the item list Increased item variety (triple reds added with same chances as star & megashroom, triple bananas are back), and the deadliest items should be less likely due to more weight on the weak items. Doesn't add up to 20 anymore, though; will likely be fixed when balloon-based items get implemented. --- src/k_kart.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 22f8d95a..3b267d9a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -698,16 +698,16 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star - /*Triple Banana*/ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana - /*Fake Item*/ { 2, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item - /*Banana*/ { 2, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Green Shell*/ { 4, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell + /*Triple Banana*/ { 2, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana + /*Fake Item*/ { 6, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item + /*Banana*/ { 6, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Green Shell*/ { 6, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell /*Red Shell*/ { 2, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell /*Triple Green Shell*/ { 2, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell /*Bob-omb*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb /*Blue Shell*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Blue Shell /*Fire Flower*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower - /*Triple Red Shell*/ { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell + /*Triple Red Shell*/ { 1, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell /*Lightning*/ { 0, 0, 0, 0, 0, 0, 0, 1, 2, 0 } // Lightning }; From 9a822fae8046c6178dd6eedcd887f936756648fd Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 2 Nov 2017 20:43:03 -0400 Subject: [PATCH 29/61] Balloon stealing! Mushroom is back! --- src/info.c | 8 +-- src/k_kart.c | 94 ++++++++++++++++++++---------------- src/k_kart.h | 1 + src/p_inter.c | 4 +- src/p_mobj.c | 131 ++++++++++++++++++++++++++++++++++++-------------- 5 files changed, 154 insertions(+), 84 deletions(-) diff --git a/src/info.c b/src/info.c index c53af0a0..df9579f4 100644 --- a/src/info.c +++ b/src/info.c @@ -2708,9 +2708,9 @@ state_t states[NUMSTATES] = {SPR_SITR, 1, 5, {NULL}, 0, 0, S_SINKTRAIL3}, // S_SINKTRAIL2 {SPR_SITR, 2, 3, {NULL}, 0, 0, S_NULL}, // S_SINKTRAIL3 - {SPR_KBLN, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BATTLEBALLOON1}, // S_BATTLEBALLOON1 - {SPR_KBLN, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_BATTLEBALLOON2}, // S_BATTLEBALLOON2 - {SPR_KBLN, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BATTLEBALLOON3}, // S_BATTLEBALLOON3 + {SPR_KBLN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_BATTLEBALLOON1}, // S_BATTLEBALLOON1 + {SPR_KBLN, FF_FULLBRIGHT|1, -1, {NULL}, 0, 0, S_BATTLEBALLOON2}, // S_BATTLEBALLOON2 + {SPR_KBLN, FF_FULLBRIGHT|2, -1, {NULL}, 0, 0, S_BATTLEBALLOON3}, // S_BATTLEBALLOON3 {SPR_LAKI, 0, 64, {NULL}, 1, 0, S_LAKITU2}, // S_LAKITU1 {SPR_LAKI, 1, 35, {NULL}, 0, 0, S_NULL}, // S_LAKITU2 @@ -15155,7 +15155,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound - 5*FRACUNIT, // speed + 4*FRACUNIT, // speed 8*FRACUNIT, // radius 16*FRACUNIT, // height 0, // display offset diff --git a/src/k_kart.c b/src/k_kart.c index 3b267d9a..458357e3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -692,16 +692,16 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = //P-Odds 0 1 2 3 4 5 6 7 8 9 /*Magnet*/ { 0, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet /*Boo*/ { 0, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo - /*Mushroom*/ { 0, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom + /*Mushroom*/ { 5, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom /*Mega Mushroom*/ { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star /*Triple Banana*/ { 2, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana - /*Fake Item*/ { 6, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item - /*Banana*/ { 6, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Green Shell*/ { 6, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell + /*Fake Item*/ { 5, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item + /*Banana*/ { 5, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Green Shell*/ { 5, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell /*Red Shell*/ { 2, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell /*Triple Green Shell*/ { 2, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell /*Bob-omb*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb @@ -1184,6 +1184,12 @@ void K_KartBouncer(void) K_SwapMomentum(players[j].mo, players[i].mo, true); else K_SwapMomentum(players[i].mo, players[j].mo, false); + + if (players[i].kartstuff[k_mushroomtimer] && !(players[j].kartstuff[k_mushroomtimer])) + K_StealBalloon(&players[i], &players[j]); + else if (players[j].kartstuff[k_mushroomtimer] && !(players[i].kartstuff[k_mushroomtimer])) + K_StealBalloon(&players[j], &players[i]); + players[i].collide[j] = true; players[j].collide[i] = true; } @@ -1776,8 +1782,13 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju return; } -/*void K_StealBalloon(player_t *player, player_t *victim) +void K_StealBalloon(player_t *player, player_t *victim) { + INT32 newballoon; + angle_t newangle, diff; + fixed_t newx, newy; + mobj_t *newmo; + //(void) source; if (gametype == GT_RACE) return; @@ -1785,13 +1796,13 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju if (player->health <= 0 || victim->health <= 0) return; - if (player == victim) + if (victim->kartstuff[k_balloon] <= 0) // || player->kartstuff[k_balloon] >= cv_kartballoons.value+2 return; 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 || player->kartstuff[k_balloon] >= 3) + || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootaketimer] > 0) || (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinout] > 0) - || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootaketimer] > 0 || victim->kartstuff[k_balloon] <= 0)) + || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootaketimer] > 0)) return; victim->kartstuff[k_mushroomtimer] = 0; @@ -1799,31 +1810,30 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); + newballoon = player->kartstuff[k_balloon]; + newangle = player->mo->angle; + if (newballoon <= 1) + diff = 0; + else + diff = FixedAngle(360*FRACUNIT/newballoon); + 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); + + newmo = P_SpawnMobj(newx, newy, player->mo->z, MT_BATTLEBALLOON); + newmo->threshold = newballoon; + P_SetTarget(&newmo->tracer, victim->mo); + P_SetTarget(&newmo->target, player->mo); + newmo->angle = (diff * (newballoon-1)); + newmo->color = victim->skincolor; + + if (newballoon+1 <= 1) + P_SetMobjState(newmo, S_BATTLEBALLOON3); + else if (newballoon+1 == 2) + P_SetMobjState(newmo, S_BATTLEBALLOON2); + else + P_SetMobjState(newmo, S_BATTLEBALLOON1); + player->kartstuff[k_balloon]++; - - { - angle_t newangle, diff; - fixed_t newx; - fixed_t newy; - mobj_t *mo; - - newangle = player->mo->angle; - diff = FixedAngle(360*FRACUNIT/cv_kartballoons.value); - 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_BATTLEBALLOON); - mo->threshold = 10; - P_SetTarget(&mo->target, player->mo); - P_SetTarget(&mo->tracer, victim->mo); - mo->angle = 0; - mo->color = player->mo->color; - if (player->mo->flags2 & MF2_DONTDRAW) - mo->flags2 |= MF2_DONTDRAW; - else - mo->flags2 &= ~MF2_DONTDRAW; - } - victim->kartstuff[k_balloon]--; if (victim->kartstuff[k_balloon] <= 0) @@ -1832,27 +1842,27 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju P_AddPlayerScore(player, 1); K_CheckBalloons(); - player->kartstuff[k_spinouttype] = 1; - player->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); - player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; + victim->kartstuff[k_spinouttype] = 1; + victim->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); + victim->kartstuff[k_spinout] = victim->kartstuff[k_spinouttimer]; - player->powers[pw_flashing] = flashingtics; + victim->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 (!(victim->mo->state >= &states[S_KART_SPIN1] && victim->mo->state <= &states[S_KART_SPIN8])) + P_SetPlayerMobjState(victim->mo, S_KART_SPIN1); - player->kartstuff[k_spinouttype] = 0; + victim->kartstuff[k_spinouttype] = 0; - P_PlayRinglossSound(player->mo); + P_PlayRinglossSound(victim->mo); - if (P_IsLocalPlayer(player)) + if (P_IsLocalPlayer(victim)) { quake.intensity = 64*FRACUNIT; quake.time = 5; } return; -}*/ +} 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) { diff --git a/src/k_kart.h b/src/k_kart.h index bf5a5387..6eb17fd7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -20,6 +20,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source); +void K_StealBalloon(player_t *player, player_t *victim); 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_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); diff --git a/src/p_inter.c b/src/p_inter.c index d95e190a..6d8bdd54 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2019,8 +2019,8 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) target->target->player->kartstuff[k_triplebanana] &= ~2; else if (target->type == MT_TRIPLEBANANASHIELD3 && target->target->player->kartstuff[k_triplebanana] & 4) target->target->player->kartstuff[k_triplebanana] &= ~4; - else if (target->type == MT_BATTLEBALLOON && target->target->player->kartstuff[k_balloon] >= target->threshold) - target->target->player->kartstuff[k_triplebanana] = target->threshold-1; + /*else if (target->type == MT_BATTLEBALLOON && target->target->player->kartstuff[k_balloon] > target->threshold-1) + target->target->player->kartstuff[k_balloon] = target->threshold-1;*/ } // diff --git a/src/p_mobj.c b/src/p_mobj.c index 48e25a31..5950df38 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6582,28 +6582,21 @@ void P_MobjThinker(mobj_t *mobj) case MT_TRIPLEBANANASHIELD1: case MT_TRIPLEBANANASHIELD2: case MT_TRIPLEBANANASHIELD3: - case MT_BATTLEBALLOON: if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { fixed_t HEIGHT; - fixed_t radius = 56*mobj->target->scale; // mobj's distance from its Target, or Radius. + fixed_t radius; // mobj's distance from its Target, or Radius. if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) radius = 64*mobj->target->scale; - else if (mobj->type == MT_BATTLEBALLOON) - radius = 32*mobj->target->scale; else radius = 56*mobj->target->scale; //mobj->angle += FixedAngle(12*FRACUNIT); // mobj's actual speed. if (mobj->type == MT_TRIPLEGREENSHIELD1 || mobj->type == MT_TRIPLEGREENSHIELD2 || mobj->type == MT_TRIPLEGREENSHIELD3 - || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3 - || mobj->type == MT_BATTLEBALLOON) - if ((mobj->type == MT_BATTLEBALLOON) && !((mobj->target->player-players) & 1)) - mobj->angle -= FixedAngle(mobj->info->speed); - else - mobj->angle += FixedAngle(mobj->info->speed); + || mobj->type == MT_TRIPLEREDSHIELD1 || mobj->type == MT_TRIPLEREDSHIELD2 || mobj->type == MT_TRIPLEREDSHIELD3) + mobj->angle += FixedAngle(mobj->info->speed); else if (mobj->type == MT_TRIPLEBANANASHIELD2) mobj->angle = (mobj->target->angle + ANGLE_135); else if (mobj->type == MT_TRIPLEBANANASHIELD3) @@ -6623,26 +6616,6 @@ void P_MobjThinker(mobj_t *mobj) HEIGHT = mobj->target->height / 5; } - if (mobj->type == MT_BATTLEBALLOON) - { - mobj->color = mobj->target->color; - - if (mobj->target->player->kartstuff[k_balloon] <= 1) - P_SetMobjState(mobj, S_BATTLEBALLOON3); - else if (mobj->target->player->kartstuff[k_balloon] == 2) - P_SetMobjState(mobj, S_BATTLEBALLOON2); - - if (mobj->target->flags2 & MF2_DONTDRAW) - mobj->flags2 |= MF2_DONTDRAW; - else - mobj->flags2 &= ~MF2_DONTDRAW; - - if (mobj->target->eflags & MFE_VERTICALFLIP) - HEIGHT += 4*FRACUNIT; - else - HEIGHT -= 4*FRACUNIT; - } - // Shrink your items if the player shrunk too. mobj->scale = mobj->target->scale; @@ -6669,8 +6642,90 @@ void P_MobjThinker(mobj_t *mobj) || (mobj->type == MT_TRIPLEBANANASHIELD2 && !(mobj->target->player->kartstuff[k_triplebanana] & 2)) || (mobj->type == MT_TRIPLEBANANASHIELD3 && !(mobj->target->player->kartstuff[k_triplebanana] & 4)) || (mobj->type == MT_BOMBSHIELD && !(mobj->target->player->kartstuff[k_bobomb] & 1)) - || (mobj->type == MT_FAKESHIELD && !(mobj->target->player->kartstuff[k_fakeitem] & 1)) - || (mobj->type == MT_BATTLEBALLOON && (mobj->target->player->kartstuff[k_balloon] <= mobj->threshold))) + || (mobj->type == MT_FAKESHIELD && !(mobj->target->player->kartstuff[k_fakeitem] & 1))) + { + P_RemoveMobj(mobj); + return; + } + } + else if ((mobj->health > 0 + && (!mobj->target || !mobj->target->player || !mobj->target->player->mo || mobj->target->player->health <= 0 || mobj->target->player->spectator)) + || (mobj->health <= 0 && mobj->z <= mobj->floorz) + || P_CheckDeathPitCollide(mobj)) // When in death state + { + P_RemoveMobj(mobj); + return; + } + break; + case MT_BATTLEBALLOON: + if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo + && mobj->target->player->health > 0 && !mobj->target->player->spectator) + { + fixed_t rad = 32*mobj->target->scale; + fixed_t offz; + angle_t ang, diff; + + if (!((mobj->target->player-players) & 1)) + ang = (FixedAngle(mobj->info->speed) * -1); + else + ang = FixedAngle(mobj->info->speed); + + if (mobj->target->player->kartstuff[k_balloon] <= 1) + diff = 0; + else + diff = FixedAngle(360*FRACUNIT/mobj->target->player->kartstuff[k_balloon]); + + ang = (ang*leveltime) + (diff * (mobj->threshold-1)); + + // If the player is on the ceiling, then flip your items as well. + if (mobj->target->eflags & MFE_VERTICALFLIP) + { + mobj->eflags |= MFE_VERTICALFLIP; + offz = mobj->target->height / 2; + } + else + { + mobj->eflags &= ~MFE_VERTICALFLIP; + offz = mobj->target->height / 5; + } + + if (mobj->target->flags2 & MF2_DONTDRAW) + mobj->flags2 |= MF2_DONTDRAW; + else + mobj->flags2 &= ~MF2_DONTDRAW; + + if (mobj->target->eflags & MFE_VERTICALFLIP) + offz += 4*FRACUNIT; + else + offz -= 4*FRACUNIT; + + if (mobj->tracer && mobj->tracer->player && mobj->tracer->player->mo + && mobj->tracer->player->health > 0 && !mobj->tracer->player->spectator) // STOLEN + mobj->color = mobj->tracer->player->skincolor; // don't do star flashing for stolen balloons + else + mobj->color = mobj->target->color; // but do so if it belongs to you :B + + if (mobj->target->player->kartstuff[k_balloon] <= 1) + P_SetMobjState(mobj, S_BATTLEBALLOON3); + else if (mobj->target->player->kartstuff[k_balloon] == 2) + P_SetMobjState(mobj, S_BATTLEBALLOON2); + else + P_SetMobjState(mobj, S_BATTLEBALLOON1); + + // Shrink your items if the player shrunk too. + mobj->scale = mobj->target->scale; + + P_UnsetThingPosition(mobj); + { + const angle_t fa = ang>>ANGLETOFINESHIFT; + mobj->x = mobj->target->x + FixedMul(FINECOSINE(fa), rad); + mobj->y = mobj->target->y + FixedMul(FINESINE(fa), rad); + mobj->z = mobj->target->z + offz; + P_SetThingPosition(mobj); + } + + // Was this so hard? + if (mobj->target->player->kartstuff[k_balloon] <= mobj->threshold) { P_RemoveMobj(mobj); return; @@ -9400,7 +9455,7 @@ void P_SpawnPlayer(INT32 playernum) overheadarrow->flags2 |= MF2_DONTDRAW; P_SetScale(overheadarrow, mobj->destscale); - if (gametype != GT_RACE && (leveltime < 1 || p->kartstuff[k_balloon] > 0)) // srb2kart + if (gametype != GT_RACE && ((leveltime < 1 || D_NumPlayers() <= 1) || p->kartstuff[k_balloon] > 0)) // srb2kart { INT32 i; angle_t newangle, diff; @@ -9408,15 +9463,19 @@ void P_SpawnPlayer(INT32 playernum) fixed_t newy; mobj_t *mo; - if (leveltime < 1) // Start of the map? + if (leveltime < 1 || D_NumPlayers() <= 1) // Start of the map? p->kartstuff[k_balloon] = cv_kartballoons.value; // Reset those balloons! + if (p->kartstuff[k_balloon] <= 1) + diff = 0; + else + diff = FixedAngle(360*FRACUNIT/p->kartstuff[k_balloon]); + newangle = mobj->angle; - diff = FixedAngle(360*FRACUNIT/cv_kartballoons.value); newx = mobj->x + P_ReturnThrustX(mobj, newangle + ANGLE_180, 64*FRACUNIT); newy = mobj->y + P_ReturnThrustY(mobj, newangle + ANGLE_180, 64*FRACUNIT); - for (i = 0; i < cv_kartballoons.value; i++) + for (i = 0; i < p->kartstuff[k_balloon]; i++) { mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON); mo->threshold = i; From e5a32eb699eea2e8b91fb9cfe2dd81b68802719c Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Fri, 3 Nov 2017 00:43:51 +0000 Subject: [PATCH 30/61] New collision mechanics, player's transfer their speed along movement when they collide, then bounce off at a set speed away depending on weight from each other --- src/k_kart.c | 88 ++++++++++++++++++++++++---------------------------- src/k_kart.h | 2 +- src/p_map.c | 6 ++-- 3 files changed, 45 insertions(+), 51 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3135500d..994588e6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1039,23 +1039,20 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) //{ SRB2kart p_user.c Stuff -void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) +void K_KartBilliards(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) { - fixed_t newx, newy; mobj_t *fx; + fixed_t ndistx, ndisty, ndistlength; + fixed_t a1, a2; + fixed_t optimizedP; + fixed_t mass1, mass2; - if (mobj1 == NULL || mobj2 == NULL) + if (!mobj1 || !mobj2) return; - fixed_t meanX = (mobj1->momx + mobj2->momx) / 2; - fixed_t meanY = (mobj1->momy + mobj2->momy) / 2; - fixed_t deltaV1 = P_AproxDistance((mobj1->momx - meanX), (mobj1->momy - meanY)); - fixed_t deltaV2 = P_AproxDistance((mobj2->momx - meanX), (mobj2->momy - meanY)); - //fixed_t clashvolume = (deltaV1 / FRACUNIT) * 8; // In case you want to do a scaling bump sound volume. if (cv_collidesounds.value == 1) { S_StartSound(mobj1, cv_collidesoundnum.value); - //S_StartSound(mobj2, cv_collidesoundnum.value); } fx = P_SpawnMobj(mobj1->x/2 + mobj2->x/2, mobj1->y/2 + mobj2->y/2, mobj1->z/2 + mobj2->z/2, MT_BUMP); @@ -1064,45 +1061,42 @@ void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) else fx->eflags &= ~MFE_VERTICALFLIP; fx->scale = mobj1->scale; - - if (deltaV1 < (cv_collideminimum.value * FRACUNIT / 2)) - { - fixed_t a = 0; - if (deltaV1 != 0) - a = FixedDiv((cv_collideminimum.value * FRACUNIT / 2), deltaV1); - else if (deltaV2 != 0) - a = FixedDiv((cv_collideminimum.value * FRACUNIT / 2), deltaV2); - else - a = 0; - fixed_t deltax1 = (mobj1->momx - meanX); - fixed_t deltax2 = (mobj2->momx - meanX); - fixed_t deltay1 = (mobj1->momy - meanY); - fixed_t deltay2 = (mobj2->momy - meanY); - mobj1->momx = meanX + FixedMul(deltax1, a); - mobj1->momy = meanY + FixedMul(deltay1, a); - mobj2->momx = meanX + FixedMul(deltax2, a); - mobj2->momy = meanY + FixedMul(deltay2, a); - } - /* - if (mobj1->player && mobj2->player) // Weight is applicable if both are players - { - fixed_t m1w = 15 + mobj1->player->kartweight; - fixed_t m2w = 15 + mobj2->player->kartweight; - newx = FixedMul(mobj1->momx, FixedDiv(m1w*FRACUNIT, m2w*FRACUNIT)); - newy = FixedMul(mobj1->momy, FixedDiv(m1w*FRACUNIT, m2w*FRACUNIT)); - mobj1->momx = FixedMul(mobj2->momx, FixedDiv(m2w*FRACUNIT, m1w*FRACUNIT)); - mobj1->momy = FixedMul(mobj2->momy, FixedDiv(m2w*FRACUNIT, m1w*FRACUNIT)); - } - else*/ - //{ - newx = mobj1->momx; - newy = mobj1->momy; - mobj1->momx = mobj2->momx; - mobj1->momy = mobj2->momy; - //} - mobj2->momx = newx; - mobj2->momy = newy; + mass1 = mass2 = 1*FRACUNIT; + if (mobj1->player) + mass1 = (1+mobj1->player->kartweight*20)*FRACUNIT; + if (mobj2->player) + mass2 = (1+mobj2->player->kartweight*20)*FRACUNIT; + + // find normalised vector from centre of each mobj + ndistx = mobj1->x - mobj2->x; + ndisty = mobj1->y - mobj2->y; + ndistlength = P_AproxDistance(ndistx, ndisty); + ndistx = FixedDiv(ndistx, ndistlength); + ndisty = FixedDiv(ndisty, ndistlength); + + // find length of the component from the movement along n + a1 = FixedMul(mobj1->momx, ndistx) + FixedMul(mobj1->momy, ndisty); + a2 = FixedMul(mobj2->momx, ndistx) + FixedMul(mobj2->momy, ndisty); + + optimizedP = FixedDiv(FixedMul(2*FRACUNIT, a1 - a2), mass1 + mass2); + + // calculate new movement of mobj1 + mobj1->momx = mobj1->momx - FixedMul(FixedMul(optimizedP, mass2), ndistx); + mobj1->momy = mobj1->momy - FixedMul(FixedMul(optimizedP, mass2), ndisty); + + // calculate new movement of mobj2 + mobj2->momx = mobj2->momx + FixedMul(FixedMul(optimizedP, mass1), ndistx); + mobj2->momy = mobj2->momy + FixedMul(FixedMul(optimizedP, mass1), ndisty); + + // In addition to knocking players based on their momentum into each other + // I will bounce them away from each other based on weight + optimizedP = FixedDiv(cv_collideminimum.value*FRACUNIT, mass1 + mass2); // reuse these variables for helping decide bounce speed + a1 = FixedMul(optimizedP, mass2); + a2 = FixedMul(optimizedP, mass1); + P_Thrust(mobj1, R_PointToAngle2(mobj1->x, mobj1->y, mobj2->x, mobj2->y)+ANGLE_180, a1); + P_Thrust(mobj2, R_PointToAngle2(mobj1->x, mobj1->y, mobj2->x, mobj2->y), a2); + if (bounce == true) // Perform a Goomba Bounce. mobj1->momz = -mobj1->momz; else diff --git a/src/k_kart.h b/src/k_kart.h index 1cd16e88..f3242dff 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -15,7 +15,7 @@ UINT8 K_GetKartColorByName(const char *name); void K_RegisterKartStuff(void); -void K_SwapMomentum(mobj_t *mobj1, mobj_t *mobj2, boolean bounce); +void K_KartBilliards(mobj_t *mobj1, mobj_t *mobj2, boolean bounce); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); diff --git a/src/p_map.c b/src/p_map.c index 18de0df3..aa0dc1e7 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1608,11 +1608,11 @@ static boolean PIT_CheckThing(mobj_t *thing) } if (P_IsObjectOnGround(thing) && tmthing->momz < 0) - K_SwapMomentum(tmthing, thing, true); + K_KartBilliards(tmthing, thing, true); else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) - K_SwapMomentum(thing, tmthing, true); + K_KartBilliards(thing, tmthing, true); else - K_SwapMomentum(tmthing, thing, false); + K_KartBilliards(tmthing, thing, false); thing->player->kartstuff[k_justbumped] = 6; tmthing->player->kartstuff[k_justbumped] = 6; From 1dcdaf0c4467799a947ee200504975bbe21d0d76 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 2 Nov 2017 21:40:06 -0400 Subject: [PATCH 31/61] I actually didn't do any of this right!! Whoops!! Also made red shells dumb in battle mode --- src/d_player.h | 1 + src/k_kart.c | 26 ++++++++++++-------------- src/k_kart.h | 1 + src/p_map.c | 4 ++-- src/p_mobj.c | 14 +++++++++----- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 9e59b341..6687e76c 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -275,6 +275,7 @@ typedef enum k_startimer, // Invincibility timer k_spinouttimer, // Wipe-out from a banana peel or oil slick (was "pw_bananacam") k_laserwisptimer, // The duration and relative angle of the laser + k_justbumped, // Prevent players from endlessly bumping into each other k_poweritemtimer, // Battle mode, how long before you're allowed another power item (Star, Megashroom) // Each item needs its own power slot, for the HUD and held use diff --git a/src/k_kart.c b/src/k_kart.c index 2de5fe15..466d7483 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1128,8 +1128,6 @@ void K_KartBilliards(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) mobj2->momz = newz; } -void K_KartBouncer(void) -{ // Because this is done during collision now, rmomx and rmomy need to be recalculated // so that friction doesn't immediately decide to stop the player if they're at a standstill if (mobj1->player) @@ -1360,6 +1358,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_sounds]) player->kartstuff[k_sounds]--; + if (player->kartstuff[k_justbumped]) + player->kartstuff[k_justbumped]--; + // ??? /* if (player->kartstuff[k_jmp] > 1 && onground) @@ -2020,13 +2021,13 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map switch (K_GetKartCC()) { case 50: - PROJSPEED = 85*FRACUNIT; // Avg Speed is 34 + PROJSPEED = 68*FRACUNIT; // Avg Speed is 34 break; case 150: - PROJSPEED = 120*FRACUNIT; // Avg Speed is 48 + PROJSPEED = 96*FRACUNIT; // Avg Speed is 48 break; default: - PROJSPEED = 102*FRACUNIT+FRACUNIT/2; // Avg Speed is 41 + PROJSPEED = 82*FRACUNIT; // Avg Speed is 41 break; } @@ -2129,7 +2130,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map if (dir == 1 || dir == 2) { // Shoot forward - mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + 80*FRACUNIT, mapthing); + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, mapthing); mo->threshold = 10; @@ -2143,22 +2144,19 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map INT32 HEIGHT; if (dir == 2) - HEIGHT = 16*FRACUNIT + player->mo->momz; + HEIGHT = 40*FRACUNIT + player->mo->momz; else - HEIGHT = 8*FRACUNIT + player->mo->momz; + HEIGHT = 30*FRACUNIT + player->mo->momz; - if (HEIGHT > 64*FRACUNIT) - HEIGHT = 64*FRACUNIT; - - mo->momx = FixedMul(FINECOSINE(fa), PROJSPEED); - mo->momy = FixedMul(FINESINE(fa), PROJSPEED); + mo->momx = player->mo->momx + FixedMul(FINECOSINE(fa), PROJSPEED); + mo->momy = player->mo->momy + FixedMul(FINESINE(fa), PROJSPEED); mo->momz = HEIGHT; if (player->mo->eflags & MFE_VERTICALFLIP) mo->eflags |= MFE_VERTICALFLIP; } - mobj_t *throwmo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + 80*FRACUNIT, MT_FIREDITEM); + mobj_t *throwmo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_FIREDITEM); P_SetTarget(&throwmo->target, player->mo); throwmo->movecount = 0; // above player } diff --git a/src/k_kart.h b/src/k_kart.h index b0ce5b7b..8e5a9186 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -15,6 +15,7 @@ UINT8 K_GetKartColorByName(const char *name); void K_RegisterKartStuff(void); +UINT8 K_GetKartCC(void); void K_KartBilliards(mobj_t *mobj1, mobj_t *mobj2, boolean bounce); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); diff --git a/src/p_map.c b/src/p_map.c index af5cc924..389a1cbc 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1617,9 +1617,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (gametype != GT_RACE) { if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) - K_StealBalloon(&thing->player, &tmthing->player); + K_StealBalloon(thing->player, tmthing->player); else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) - K_StealBalloon(&tmthing->player, &thing->player); + K_StealBalloon(tmthing->player, thing->player); } thing->player->kartstuff[k_justbumped] = 6; diff --git a/src/p_mobj.c b/src/p_mobj.c index 5950df38..7ad58e00 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1378,6 +1378,10 @@ fixed_t P_GetMobjGravity(mobj_t *mo) break; case MT_WATERDROP: gravityadd >>= 1; + case MT_BANANAITEM: + case MT_FAKEITEM: + case MT_BOMBITEM: + gravityadd = FixedMul(gravityadd, 5*FRACUNIT/2); default: break; } @@ -7686,11 +7690,11 @@ void P_MobjThinker(mobj_t *mobj) P_SpawnGhostMobj(mobj); - if (cv_kartcc.value == 50) + if (K_GetKartCC() == 50) { finalspeed = FixedMul(finalspeed, FRACUNIT-FRACUNIT/4); } - else if (cv_kartcc.value == 150) + else if (K_GetKartCC() == 150) { finalspeed = FixedMul(finalspeed, FRACUNIT+FRACUNIT/4); } @@ -7728,18 +7732,18 @@ void P_MobjThinker(mobj_t *mobj) if (leveltime % 7 == 0) S_StartSound(mobj, mobj->info->activesound); - if (cv_kartcc.value == 50) + if (K_GetKartCC() == 50) { topspeed = FixedMul(topspeed, FRACUNIT-FRACUNIT/4); distbarrier = FixedMul(distbarrier, FRACUNIT-FRACUNIT/4); } - else if (cv_kartcc.value == 150) + else if (K_GetKartCC() == 150) { topspeed = FixedMul(topspeed, FRACUNIT+FRACUNIT/4); distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/4); } - if (mobj->tracer) + if (gametype == GT_RACE && mobj->tracer) { distaway = P_AproxDistance(mobj->tracer->x - mobj->x, mobj->tracer->y - mobj->y); if (distaway < distbarrier) From 8315ccd475b836f41fa5d7bf366b921c1ba7256c Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sat, 4 Nov 2017 13:19:06 +0000 Subject: [PATCH 32/61] Change player collision again, they bounce away from each other naturally Need to meddle and test with a "minimum bounce" still --- src/k_kart.c | 48 ++++++++++++++++-------------------------------- src/k_kart.h | 2 +- src/p_map.c | 13 ++++++++++--- 3 files changed, 27 insertions(+), 36 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 994588e6..0078dff2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1039,12 +1039,12 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) //{ SRB2kart p_user.c Stuff -void K_KartBilliards(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) +void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) { mobj_t *fx; - fixed_t ndistx, ndisty, ndistlength; - fixed_t a1, a2; - fixed_t optimizedP; + fixed_t momdifx, momdify; + fixed_t distx, disty; + fixed_t dot, p; fixed_t mass1, mass2; if (!mobj1 || !mobj2) @@ -1064,38 +1064,22 @@ void K_KartBilliards(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) mass1 = mass2 = 1*FRACUNIT; if (mobj1->player) - mass1 = (1+mobj1->player->kartweight*20)*FRACUNIT; + mass1 = (mobj1->player->kartweight)*FRACUNIT; if (mobj2->player) - mass2 = (1+mobj2->player->kartweight*20)*FRACUNIT; + mass2 = (mobj2->player->kartweight)*FRACUNIT; - // find normalised vector from centre of each mobj - ndistx = mobj1->x - mobj2->x; - ndisty = mobj1->y - mobj2->y; - ndistlength = P_AproxDistance(ndistx, ndisty); - ndistx = FixedDiv(ndistx, ndistlength); - ndisty = FixedDiv(ndisty, ndistlength); + momdifx = mobj1->momx - mobj2->momx; + momdify = mobj1->momy - mobj2->momy; + distx = mobj1->x - mobj2->x; + disty = mobj1->y - mobj2->y; + dot = FixedMul(momdifx, distx) + FixedMul(momdify, disty); + p = FixedDiv(dot, FixedMul(distx, distx)+FixedMul(disty, disty)); - // find length of the component from the movement along n - a1 = FixedMul(mobj1->momx, ndistx) + FixedMul(mobj1->momy, ndisty); - a2 = FixedMul(mobj2->momx, ndistx) + FixedMul(mobj2->momy, ndisty); + mobj1->momx = mobj1->momx - FixedMul(FixedMul(FixedDiv(2*mass2, mass1 + mass2), p), distx); + mobj1->momy = mobj1->momy - FixedMul(FixedMul(FixedDiv(2*mass2, mass1 + mass2), p), disty); - optimizedP = FixedDiv(FixedMul(2*FRACUNIT, a1 - a2), mass1 + mass2); - - // calculate new movement of mobj1 - mobj1->momx = mobj1->momx - FixedMul(FixedMul(optimizedP, mass2), ndistx); - mobj1->momy = mobj1->momy - FixedMul(FixedMul(optimizedP, mass2), ndisty); - - // calculate new movement of mobj2 - mobj2->momx = mobj2->momx + FixedMul(FixedMul(optimizedP, mass1), ndistx); - mobj2->momy = mobj2->momy + FixedMul(FixedMul(optimizedP, mass1), ndisty); - - // In addition to knocking players based on their momentum into each other - // I will bounce them away from each other based on weight - optimizedP = FixedDiv(cv_collideminimum.value*FRACUNIT, mass1 + mass2); // reuse these variables for helping decide bounce speed - a1 = FixedMul(optimizedP, mass2); - a2 = FixedMul(optimizedP, mass1); - P_Thrust(mobj1, R_PointToAngle2(mobj1->x, mobj1->y, mobj2->x, mobj2->y)+ANGLE_180, a1); - P_Thrust(mobj2, R_PointToAngle2(mobj1->x, mobj1->y, mobj2->x, mobj2->y), a2); + mobj2->momx = mobj2->momx - FixedMul(FixedMul(FixedDiv(2*mass1, mass1 + mass2), p), -distx); + mobj2->momy = mobj2->momy - FixedMul(FixedMul(FixedDiv(2*mass1, mass1 + mass2), p), -disty); if (bounce == true) // Perform a Goomba Bounce. mobj1->momz = -mobj1->momz; diff --git a/src/k_kart.h b/src/k_kart.h index f3242dff..912780f8 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -15,7 +15,7 @@ UINT8 K_GetKartColorByName(const char *name); void K_RegisterKartStuff(void); -void K_KartBilliards(mobj_t *mobj1, mobj_t *mobj2, boolean bounce); +void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); diff --git a/src/p_map.c b/src/p_map.c index aa0dc1e7..40997a0d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1597,6 +1597,12 @@ static boolean PIT_CheckThing(mobj_t *thing) } else if (thing->player) // bounce when players collide { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + if (thing->player->kartstuff[k_growshrinktimer] || thing->player->kartstuff[k_squishedtimer] || thing->player->kartstuff[k_bootaketimer] || thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped] @@ -1608,14 +1614,15 @@ static boolean PIT_CheckThing(mobj_t *thing) } if (P_IsObjectOnGround(thing) && tmthing->momz < 0) - K_KartBilliards(tmthing, thing, true); + K_KartBouncing(tmthing, thing, true); else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) - K_KartBilliards(thing, tmthing, true); + K_KartBouncing(thing, tmthing, true); else - K_KartBilliards(tmthing, thing, false); + K_KartBouncing(tmthing, thing, false); thing->player->kartstuff[k_justbumped] = 6; tmthing->player->kartstuff[k_justbumped] = 6; + return true; } // Are you touching the side of the object you're interacting with? else if (thing->z - FixedMul(FRACUNIT, thing->scale) <= tmthing->z + tmthing->height From a9c1b3e747a3475e963ac3c704f435aaace280aa Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 5 Nov 2017 01:43:47 -0500 Subject: [PATCH 33/61] Everything. - Player arrows now show if a player is in the item roulette - Boo has been improved, and added back to Battle's item roulette - The CHECK HUD item is now more accurate, and should appear more often - Early comeback mechanic. Functional, but really unpolished - Attempted (again) to make the first player to join in a netgame spawn with balloons - No longer shows respawn text on death --- src/d_player.h | 5 +- src/dehacked.c | 3 + src/doomstat.h | 2 + src/g_game.c | 2 + src/info.c | 5 +- src/info.h | 5 ++ src/k_kart.c | 224 +++++++++++++++++++++++++------------------------ src/p_enemy.c | 8 +- src/p_inter.c | 17 ++-- src/p_map.c | 54 +++++++++--- src/p_mobj.c | 87 +++++++++++-------- src/p_spec.c | 2 +- src/p_user.c | 2 +- src/st_stuff.c | 4 +- 14 files changed, 249 insertions(+), 171 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 6687e76c..f0360f30 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -266,6 +266,7 @@ typedef enum // Some items use timers for their duration or effects k_magnettimer, // Duration of Magnet's item-break and item box pull + k_bootimer, // Duration of the boo offroad effect itself k_bootaketimer, // You are stealing an item, this is your timer k_boostolentimer, // You are being stolen from, this is your timer k_mushroomtimer, // Duration of the Mushroom Boost itself @@ -277,6 +278,7 @@ typedef enum k_laserwisptimer, // The duration and relative angle of the laser k_justbumped, // Prevent players from endlessly bumping into each other k_poweritemtimer, // Battle mode, how long before you're allowed another power item (Star, Megashroom) + k_comebacktimer, // Battle mode, how long before you become a bomb after death // Each item needs its own power slot, for the HUD and held use k_magnet, // 0x1 = Magnet in inventory @@ -304,8 +306,7 @@ typedef enum // 0x4 = 3 Red Shells orbiting, 0x8 = Triple Red Shell in inventory k_lightning, // 0x1 = Lightning in inventory k_kitchensink, // 0x1 = Sink in inventory - k_balloon, // 0x1 = 1 hit left, 0x2 = 2 hits left, 0x4 = 3 hits left - // 0x8 = 4 hits left, 0x16 = 5 hits left + k_balloon, // Number of balloons left NUMKARTSTUFF } kartstufftype_t; diff --git a/src/dehacked.c b/src/dehacked.c index dba84072..82786d17 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6427,6 +6427,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAYERARROW_MEGASHROOM", "S_PLAYERARROW_KITCHENSINK", "S_PLAYERARROW_EMPTY", + "S_PLAYERARROW_ROULETTE", + + "S_PLAYERBOMB", // Player bomb overlay #ifdef SEENAMES "S_NAMECHECK", diff --git a/src/doomstat.h b/src/doomstat.h index 40295d25..94618c56 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -401,8 +401,10 @@ extern UINT16 extralifetics; // SRB2kart extern INT32 bootime; +extern INT32 boostealtime; extern INT32 mushroomtime; extern INT32 itemtime; +extern INT32 comebacktime; extern UINT8 introtoplay; extern UINT8 creditscutscene; diff --git a/src/g_game.c b/src/g_game.c index 673964be..4d2c386a 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -202,8 +202,10 @@ UINT16 extralifetics = 4*TICRATE; // SRB2kart INT32 bootime = 7*TICRATE; +INT32 boostealtime = TICRATE/2; INT32 mushroomtime = TICRATE + (TICRATE/3); INT32 itemtime = 8*TICRATE; +INT32 comebacktime = 5*TICRATE; INT32 gameovertics = 15*TICRATE; diff --git a/src/info.c b/src/info.c index df9579f4..e9e5548e 100644 --- a/src/info.c +++ b/src/info.c @@ -58,7 +58,7 @@ char sprnames[NUMSPRITES + 1][5] = "SPRG","BSPR","RNDM","RPOP","KFRE","DRIF","DSMO","FITM","DFAK","BANA", "DBAN","GSHE","DGSH","RSHE","DRSH","BOMB","BLIG","LIGH","SINK","SITR", "KBLN","LAKI","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB", - "CHOM","SACO","CRAB","SHAD","BUMP","FLEN","CLAS","PSHW","ARRO" + "CHOM","SACO","CRAB","SHAD","BUMP","FLEN","CLAS","PSHW","ARRO","PBOM" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2883,6 +2883,9 @@ state_t states[NUMSTATES] = {SPR_ARRO, FF_FULLBRIGHT|14, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_MEGASHROOM {SPR_ARRO, FF_FULLBRIGHT|15, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_KITCHENSINK {SPR_ARRO, FF_FULLBRIGHT|16, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_EMPTY + {SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE + + {SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERBOMB #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK diff --git a/src/info.h b/src/info.h index f701c5fb..be4a58f2 100644 --- a/src/info.h +++ b/src/info.h @@ -623,6 +623,8 @@ typedef enum sprite SPR_ARRO, // player arrows + SPR_PBOM, // player bomb + SPR_FIRSTFREESLOT, SPR_LASTFREESLOT = SPR_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, NUMSPRITES @@ -3402,6 +3404,9 @@ typedef enum state S_PLAYERARROW_MEGASHROOM, S_PLAYERARROW_KITCHENSINK, S_PLAYERARROW_EMPTY, + S_PLAYERARROW_ROULETTE, + + S_PLAYERBOMB, #ifdef SEENAMES S_NAMECHECK, diff --git a/src/k_kart.c b/src/k_kart.c index 466d7483..d558fc23 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -691,17 +691,17 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = { //P-Odds 0 1 2 3 4 5 6 7 8 9 /*Magnet*/ { 0, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet - /*Boo*/ { 0, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo - /*Mushroom*/ { 5, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom + /*Boo*/ { 4, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo + /*Mushroom*/ { 4, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom /*Mega Mushroom*/ { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star /*Triple Banana*/ { 2, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana - /*Fake Item*/ { 5, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item - /*Banana*/ { 5, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Green Shell*/ { 5, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell + /*Fake Item*/ { 4, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item + /*Banana*/ { 4, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Green Shell*/ { 4, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell /*Red Shell*/ { 2, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell /*Triple Green Shell*/ { 2, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell /*Bob-omb*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb @@ -1337,6 +1337,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) && player->kartstuff[k_goldshroomtimer]) player->kartstuff[k_goldshroomtimer]--; + if (player->kartstuff[k_bootimer]) + player->kartstuff[k_bootimer]--; + if (player->kartstuff[k_bootaketimer]) player->kartstuff[k_bootaketimer]--; @@ -1349,18 +1352,21 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_laserwisptimer]) player->kartstuff[k_laserwisptimer]--; + if (player->kartstuff[k_justbumped]) + player->kartstuff[k_justbumped]--; + if (player->kartstuff[k_poweritemtimer]) player->kartstuff[k_poweritemtimer]--; + if (player->kartstuff[k_comebacktimer]) + player->kartstuff[k_comebacktimer]--; + if (player->kartstuff[k_lapanimation]) player->kartstuff[k_lapanimation]--; if (player->kartstuff[k_sounds]) player->kartstuff[k_sounds]--; - if (player->kartstuff[k_justbumped]) - player->kartstuff[k_justbumped]--; - // ??? /* if (player->kartstuff[k_jmp] > 1 && onground) @@ -1447,7 +1453,7 @@ static fixed_t K_GetKartBoostPower(player_t *player, boolean speed) fixed_t boostvalue = 0; // Offroad is separate, it's difficult to factor it in with a variable value anyway. - if (!(player->kartstuff[k_startimer] || player->kartstuff[k_bootaketimer] || player->kartstuff[k_mushroomtimer]) + if (!(player->kartstuff[k_startimer] || player->kartstuff[k_bootimer] || player->kartstuff[k_mushroomtimer]) && player->kartstuff[k_offroad] >= 0 && speed) boostpower = FixedDiv(boostpower, player->kartstuff[k_offroad] + FRACUNIT); @@ -1587,21 +1593,26 @@ void K_SpinPlayer(player_t *player, mobj_t *source) return; 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) + || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || (gametype != GT_RACE && (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]))) return; player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; + player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { - player->kartstuff[k_balloon]--; - - if (player->kartstuff[k_balloon] <= 0) - CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + if (player->kartstuff[k_balloon] > 0) + { + if (player->kartstuff[k_balloon] == 1) + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + player->kartstuff[k_balloon]--; + } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); + source->player->kartstuff[k_comebacktimer] = comebacktime; K_CheckBalloons(); } @@ -1640,22 +1651,27 @@ void K_SquishPlayer(player_t *player, mobj_t *source) if (player->health <= 0) return; - 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) + if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_startimer] > 0 + || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || (gametype != GT_RACE && (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]))) return; player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; + player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { - player->kartstuff[k_balloon]--; - - if (player->kartstuff[k_balloon] <= 0) - CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + if (player->kartstuff[k_balloon] > 0) + { + if (player->kartstuff[k_balloon] == 1) + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + player->kartstuff[k_balloon]--; + } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); + source->player->kartstuff[k_comebacktimer] = comebacktime; K_CheckBalloons(); } @@ -1681,7 +1697,8 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju return; 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) + || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || (gametype != GT_RACE && (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]))) return; player->mo->momz = 18*FRACUNIT; @@ -1689,16 +1706,20 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; + player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { - player->kartstuff[k_balloon]--; - - if (player->kartstuff[k_balloon] <= 0) - CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + if (player->kartstuff[k_balloon] > 0) + { + if (player->kartstuff[k_balloon] == 1) + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + player->kartstuff[k_balloon]--; + } if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); + source->player->kartstuff[k_comebacktimer] = comebacktime; K_CheckBalloons(); } @@ -1743,22 +1764,21 @@ void K_StealBalloon(player_t *player, player_t *victim) return; 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) + || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer])) || (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinout] > 0) - || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootaketimer] > 0)) + || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootimer] > 0)) return; - victim->kartstuff[k_mushroomtimer] = 0; - victim->kartstuff[k_driftboost] = 0; - CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); newballoon = player->kartstuff[k_balloon]; - newangle = player->mo->angle; if (newballoon <= 1) diff = 0; else diff = FixedAngle(360*FRACUNIT/newballoon); + + 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); @@ -1769,40 +1789,14 @@ void K_StealBalloon(player_t *player, player_t *victim) newmo->angle = (diff * (newballoon-1)); newmo->color = victim->skincolor; - if (newballoon+1 <= 1) + if (newballoon+1 < 2) P_SetMobjState(newmo, S_BATTLEBALLOON3); - else if (newballoon+1 == 2) + else if (newballoon+1 < 3) P_SetMobjState(newmo, S_BATTLEBALLOON2); else P_SetMobjState(newmo, S_BATTLEBALLOON1); player->kartstuff[k_balloon]++; - victim->kartstuff[k_balloon]--; - - if (victim->kartstuff[k_balloon] <= 0) - CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[victim-players]); - - P_AddPlayerScore(player, 1); - K_CheckBalloons(); - - victim->kartstuff[k_spinouttype] = 1; - victim->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); - victim->kartstuff[k_spinout] = victim->kartstuff[k_spinouttimer]; - - victim->powers[pw_flashing] = flashingtics; - - if (!(victim->mo->state >= &states[S_KART_SPIN1] && victim->mo->state <= &states[S_KART_SPIN8])) - P_SetPlayerMobjState(victim->mo, S_KART_SPIN1); - - victim->kartstuff[k_spinouttype] = 0; - - P_PlayRinglossSound(victim->mo); - - if (P_IsLocalPlayer(victim)) - { - quake.intensity = 64*FRACUNIT; - quake.time = 5; - } return; } @@ -1966,7 +1960,7 @@ void K_SpawnDriftTrail(player_t *player) for (i = 0; i < 2; i++) { - if (player->kartstuff[k_bootaketimer] != 0) + if (player->kartstuff[k_bootimer] != 0 || (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0)) continue; newx = player->mo->x + P_ReturnThrustX(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(24*FRACUNIT, player->mo->scale)); @@ -2209,7 +2203,7 @@ static void K_DoBooSteal(player_t *player) if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE && player != &players[i] && !players[i].exiting && !players[i].powers[pw_super] && !(players[i].spectator) && ((gametype == GT_RACE && players[i].kartstuff[k_position] < player->kartstuff[k_position]) - || (gametype == GT_MATCH && players[i].kartstuff[k_balloon] > 0)) + || (gametype != GT_RACE && players[i].kartstuff[k_balloon] > 0)) && (players[i].kartstuff[k_star] || players[i].kartstuff[k_mushroom] || players[i].kartstuff[k_goldshroom] || players[i].kartstuff[k_megashroom] || players[i].kartstuff[k_lightning] || players[i].kartstuff[k_blueshell] @@ -2228,7 +2222,8 @@ static void K_DoBooSteal(player_t *player) 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_bootimer] = bootime; + player->kartstuff[k_bootaketimer] = boostealtime; player->kartstuff[k_boo] = 0; return; } @@ -2245,9 +2240,10 @@ static void K_DoBooSteal(player_t *player) { stealplayer -= 1; // stealplayer is +1 so we know if it found there actually WAS a player - player->kartstuff[k_bootaketimer] = bootime; + player->kartstuff[k_bootimer] = bootime; + player->kartstuff[k_bootaketimer] = boostealtime; player->kartstuff[k_boo] = 0; - players[stealplayer].kartstuff[k_boostolentimer] = bootime; + players[stealplayer].kartstuff[k_boostolentimer] = boostealtime; if (players[stealplayer].kartstuff[k_star]) { @@ -2681,10 +2677,12 @@ static void K_StripItems(player_t *player) || player->kartstuff[k_mushroom] || player->kartstuff[k_boo] || player->kartstuff[k_magnet] - //|| player->kartstuff[k_bootaketimer] // uncomment when proper comeback mechanic is in + || player->kartstuff[k_bootimer] + || player->kartstuff[k_bootaketimer] || player->kartstuff[k_boostolentimer] || player->kartstuff[k_goldshroomtimer] || player->kartstuff[k_growshrinktimer] + || player->kartstuff[k_itemroulette] ) player->kartstuff[k_itemclose] = 10; player->kartstuff[k_kitchensink] = 0; player->kartstuff[k_lightning] = 0; @@ -2704,7 +2702,9 @@ static void K_StripItems(player_t *player) player->kartstuff[k_mushroom] = 0; player->kartstuff[k_boo] = 0; player->kartstuff[k_magnet] = 0; - //player->kartstuff[k_bootaketimer] = 0; + player->kartstuff[k_itemroulette] = 0; + player->kartstuff[k_bootimer] = 0; + player->kartstuff[k_bootaketimer] = 0; player->kartstuff[k_boostolentimer] = 0; player->kartstuff[k_goldshroomtimer] = 0; player->kartstuff[k_growshrinktimer] = 0; @@ -3192,11 +3192,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) || player->kartstuff[k_startimer] || player->kartstuff[k_growshrinktimer] > 0)) player->kartstuff[k_poweritemtimer] = 10*TICRATE; - if (player->kartstuff[k_bootaketimer] > 0) + if (player->kartstuff[k_bootimer] > 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)))) + && (player->kartstuff[k_bootimer] < 1*TICRATE/2 || player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) { if (leveltime & 1) player->mo->flags2 |= MF2_DONTDRAW; @@ -3206,14 +3206,35 @@ void K_MoveKartPlayer(player_t *player, boolean onground) 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 + player->powers[pw_flashing] = player->kartstuff[k_bootimer]; // We'll do this for now, let's people know about the invisible people through subtle hints } - else if (player->kartstuff[k_bootaketimer] == 0) + else if (player->kartstuff[k_bootimer] == 0) { player->mo->flags2 &= ~MF2_DONTDRAW; } } + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) // dead in match? you da bomb + { + K_StripItems(player); + player->mo->flags2 |= MF2_DONTDRAW; + + if (player->kartstuff[k_comebacktimer]) + player->powers[pw_flashing] = 2; + + if (!(player->mo->tracer)) + player->mo->tracer = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_OVERLAY); + + P_SetMobjState(player->mo->tracer, S_PLAYERBOMB); + P_SetTarget(&player->mo->tracer, player->mo); + player->mo->tracer->color = player->mo->color; + } + else if (player->mo->tracer && player->mo->tracer->state == &states[S_PLAYERBOMB]) + { + player->mo->flags2 &= ~MF2_DONTDRAW; + P_RemoveMobj(player->mo->tracer); + } + if (player->kartstuff[k_growshrinktimer] > 1) player->powers[pw_flashing] = 2; @@ -3280,12 +3301,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_boostcharge] = 0; } - - if (gametype == GT_MATCH && player->kartstuff[k_balloon] <= 0) // dead in match? BOO! - { - K_StripItems(player); - player->kartstuff[k_bootaketimer] = bootime; - } } void K_CheckBalloons(void) @@ -3294,7 +3309,13 @@ void K_CheckBalloons(void) UINT8 numingame = 0; INT8 winnernum = -1; - if (gamestate != GS_LEVEL) + if (!(multiplayer || netgame)) + return; + + if (gametype == GT_RACE) + return; + + if (gameaction == ga_completed) return; for (i = 0; i < MAXPLAYERS; i++) @@ -3793,7 +3814,6 @@ static void K_drawKartRetroItem(void) // This shouldn't have any actual baring over how it functions // Boo is first, because we're drawing it on top of the player's current item if ((stplyr->kartstuff[k_bootaketimer] > 0 || stplyr->kartstuff[k_boostolentimer] > 0) - && !(gametype == GT_MATCH && stplyr->kartstuff[k_balloon] <= 0) && (leveltime & 2)) localpatch = kp_boosteal; else if (stplyr->kartstuff[k_boostolentimer] > 0 && !(leveltime & 2)) localpatch = kp_noitem; else if (stplyr->kartstuff[k_kitchensink] == 1) localpatch = kp_kitchensink; @@ -4141,44 +4161,23 @@ static void K_drawKartSpeedometer(void) } } -fixed_t K_FindCheckX(INT32 p, fixed_t mx, fixed_t my) +fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my) { - fixed_t camx, camy, dist, x; - angle_t camangle; - camera_t *c = &camera; + fixed_t dist, x; + angle_t diff; - if (players[p].awayviewtics) - { - camx = players[p].awayviewmobj->x; - camy = players[p].awayviewmobj->y; - camangle = players[p].awayviewmobj->angle; - } - else if (c->chase) - { - camx = c->x; - camy = c->y; - camangle = c->angle; - } - else - { - camx = players[p].mo->x; - camy = players[p].mo->y; - camangle = players[p].mo->angle; - } - - dist = abs(R_PointToDist2(camx, camy, mx, my)); - if (dist > RING_DIST) + dist = abs(R_PointToDist2(px, py, mx, my)); + if (dist > RING_DIST/4) return -320; - camangle = camangle+ANGLE_180; - x = camangle-R_PointToAngle2(camx, camy, mx, my); + diff = R_PointToAngle2(px, py, mx, my) - ang; - if (x > ANGLE_90 || x < ANGLE_270) + if (diff < ANGLE_90 || diff > ANGLE_270) return -320; else - x = FixedMul(FINETANGENT(((x+ANGLE_90)>>ANGLETOFINESHIFT) & FINEMASK), 160<>ANGLETOFINESHIFT) & 4095), 160<>FRACBITS); + return (x>>FRACBITS); } static void K_drawKartPlayerCheck(void) @@ -4191,7 +4190,10 @@ static void K_drawKartPlayerCheck(void) if (splitscreen) return; - if (players[displayplayer].mo == NULL) + if (!(players[displayplayer].mo)) + return; + + if (players[displayplayer].awayviewtics) return; for (i = 0; i < MAXPLAYERS; i++) @@ -4219,8 +4221,8 @@ static void K_drawKartPlayerCheck(void) else localpatch = kp_check; } - - x = K_FindCheckX(displayplayer, players[i].mo->x, players[i].mo->y); + + x = K_FindCheckX(players[displayplayer].mo->x, players[displayplayer].mo->y, players[displayplayer].mo->angle, players[i].mo->x, players[i].mo->y); if (x <= 320 && x >= 0) { if (x < 14) diff --git a/src/p_enemy.c b/src/p_enemy.c index d64a66d7..2a0be039 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3921,7 +3921,8 @@ static inline boolean PIT_GrenadeRing(mobj_t *thing) if (thing == grenade->target && !(grenade->threshold == 0)) // Don't blow up at your owner. return true; - if (thing->player && thing->player->kartstuff[k_bootaketimer]) + if (thing->player && (thing->player->kartstuff[k_bootimer] + || (thing->player->kartstuff[k_balloon] <= 0 && thing->player->kartstuff[k_comebacktimer]))) return true; if ((gametype == GT_CTF || gametype == GT_TEAMMATCH) @@ -8207,7 +8208,7 @@ void A_RedShellChase(mobj_t *actor) continue; } - if (!(gametype == GT_RACE)) + if (gametype != GT_RACE) { if (player->kartstuff[k_balloon] <= 0) continue; @@ -8267,6 +8268,9 @@ void A_BobombExplode(mobj_t *actor) if (mo2 == actor || mo2->type == MT_BOMBEXPLOSIONSOUND) // Don't explode yourself! Endless loop! continue; + if (actor->target && actor->target->player && actor->target->player->kartstuff[k_balloon] <= 0 && mo2 == actor->target) + continue; + if (P_AproxDistance(P_AproxDistance(mo2->x - actor->x, mo2->y - actor->y), mo2->z - actor->z) > actor->info->painchance) continue; diff --git a/src/p_inter.c b/src/p_inter.c index 6d8bdd54..3e3899a2 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -150,7 +150,11 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) //if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics) // return false; - if (player->kartstuff[k_greenshell] || player->kartstuff[k_triplegreenshell] + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + return false; + + if (player->kartstuff[k_itemroulette] + || player->kartstuff[k_greenshell] || player->kartstuff[k_triplegreenshell] || player->kartstuff[k_redshell] || player->kartstuff[k_tripleredshell] || player->kartstuff[k_banana] || player->kartstuff[k_triplebanana] || player->kartstuff[k_fakeitem] & 2 || player->kartstuff[k_magnet] @@ -158,7 +162,6 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) || player->kartstuff[k_mushroom] || player->kartstuff[k_fireflower] || player->kartstuff[k_star] || player->kartstuff[k_goldshroom] || player->kartstuff[k_lightning] || player->kartstuff[k_megashroom] - || player->kartstuff[k_itemroulette] || player->kartstuff[k_boo] || player->kartstuff[k_bootaketimer] || player->kartstuff[k_boostolentimer] || player->kartstuff[k_growshrinktimer] > 1 @@ -2745,10 +2748,12 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage) if (gametype != GT_RACE) { - player->kartstuff[k_balloon]--; - - if (player->kartstuff[k_balloon] <= 0) - CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + if (player->kartstuff[k_balloon] > 0) + { + if (player->kartstuff[k_balloon] == 1) + CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); + player->kartstuff[k_balloon]--; + } K_CheckBalloons(); } diff --git a/src/p_map.c b/src/p_map.c index 389a1cbc..bc657c9d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1598,15 +1598,55 @@ static boolean PIT_CheckThing(mobj_t *thing) else if (thing->player) // bounce when players collide { if (thing->player->kartstuff[k_growshrinktimer] || thing->player->kartstuff[k_squishedtimer] - || thing->player->kartstuff[k_bootaketimer] || thing->player->kartstuff[k_spinouttimer] + || thing->player->kartstuff[k_bootimer] || thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped] + || (gametype != GT_RACE && (thing->player->kartstuff[k_balloon] <= 0 && thing->player->kartstuff[k_comebacktimer])) || tmthing->player->kartstuff[k_growshrinktimer] || tmthing->player->kartstuff[k_squishedtimer] - || tmthing->player->kartstuff[k_bootaketimer] || tmthing->player->kartstuff[k_spinouttimer] - || tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped]) + || tmthing->player->kartstuff[k_bootimer] || tmthing->player->kartstuff[k_spinouttimer] + || tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped] + || (gametype != GT_RACE && (tmthing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_comebacktimer]))) { return true; } + if (gametype != GT_RACE) + { + if (thing->player->kartstuff[k_balloon] <= 0 || tmthing->player->kartstuff[k_balloon] <= 0) + { + thing->player->kartstuff[k_justbumped] = 6; + tmthing->player->kartstuff[k_justbumped] = 6; + if (tmthing->player->kartstuff[k_balloon] > 0) + { + if (tmthing->player->kartstuff[k_balloon] == 1) + K_StealBalloon(thing->player, tmthing->player); + thing->player->kartstuff[k_comebacktimer] = comebacktime; + K_ExplodePlayer(tmthing->player, thing); + return true; + } + else if (thing->player->kartstuff[k_balloon] > 0) + { + if (thing->player->kartstuff[k_balloon] == 1) + K_StealBalloon(tmthing->player, thing->player); + tmthing->player->kartstuff[k_comebacktimer] = comebacktime; + K_ExplodePlayer(thing->player, thing); + return true; + } + } + else + { + if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) + { + K_StealBalloon(thing->player, tmthing->player); + K_SpinPlayer(tmthing->player, thing); + } + else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) + { + K_StealBalloon(tmthing->player, thing->player); + K_SpinPlayer(thing->player, tmthing); + } + } + } + if (P_IsObjectOnGround(thing) && tmthing->momz < 0) K_KartBilliards(tmthing, thing, true); else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) @@ -1614,14 +1654,6 @@ static boolean PIT_CheckThing(mobj_t *thing) else K_KartBilliards(tmthing, thing, false); - if (gametype != GT_RACE) - { - if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) - K_StealBalloon(thing->player, tmthing->player); - else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) - K_StealBalloon(tmthing->player, thing->player); - } - thing->player->kartstuff[k_justbumped] = 6; tmthing->player->kartstuff[k_justbumped] = 6; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 7ad58e00..dcaadcdc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6509,11 +6509,11 @@ void P_MobjThinker(mobj_t *mobj) INT32 HEIGHT; fixed_t radius; - if (mobj->target->player->kartstuff[k_bootaketimer] > 0) + if (mobj->target->player->kartstuff[k_bootimer] > 0) { if ((mobj->target->player == &players[displayplayer] || (splitscreen && mobj->target->player == &players[secondarydisplayplayer])) || (!(mobj->target->player == &players[displayplayer] || (splitscreen && mobj->target->player == &players[secondarydisplayplayer])) - && (mobj->target->player->kartstuff[k_bootaketimer] < 1*TICRATE/2 || mobj->target->player->kartstuff[k_bootaketimer] > bootime-(1*TICRATE/2)))) + && (mobj->target->player->kartstuff[k_bootimer] < 1*TICRATE/2 || mobj->target->player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) { if (leveltime & 1) mobj->flags2 |= MF2_DONTDRAW; @@ -6523,7 +6523,7 @@ void P_MobjThinker(mobj_t *mobj) else mobj->flags2 |= MF2_DONTDRAW; } - else if (mobj->target->player->kartstuff[k_bootaketimer] == 0) + else if (mobj->target->player->kartstuff[k_bootimer] == 0) { mobj->flags2 &= ~MF2_DONTDRAW; } @@ -6709,9 +6709,9 @@ void P_MobjThinker(mobj_t *mobj) else mobj->color = mobj->target->color; // but do so if it belongs to you :B - if (mobj->target->player->kartstuff[k_balloon] <= 1) + if (mobj->target->player->kartstuff[k_balloon] < 2) P_SetMobjState(mobj, S_BATTLEBALLOON3); - else if (mobj->target->player->kartstuff[k_balloon] == 2) + else if (mobj->target->player->kartstuff[k_balloon] < 3) P_SetMobjState(mobj, S_BATTLEBALLOON2); else P_SetMobjState(mobj, S_BATTLEBALLOON1); @@ -6759,8 +6759,9 @@ void P_MobjThinker(mobj_t *mobj) mobj->flags2 &= ~MF2_DONTDRAW; if ((splitscreen || !netgame) - || (gametype == GT_RACE) - || (mobj->target->player->kartstuff[k_bootaketimer] > 0)) + || gametype == GT_RACE + || mobj->target->player->kartstuff[k_bootimer] + || (mobj->target->player->kartstuff[k_balloon] <= 0 && mobj->target->player->kartstuff[k_comebacktimer])) mobj->flags2 |= MF2_DONTDRAW; P_UnsetThingPosition(mobj); @@ -6780,7 +6781,12 @@ void P_MobjThinker(mobj_t *mobj) P_SetThingPosition(mobj); // Set it to use the correct states for its condition - if (mobj->target->player->kartstuff[k_kitchensink]) P_SetMobjState(mobj, S_PLAYERARROW_KITCHENSINK); + if (mobj->target->player->kartstuff[k_itemroulette]) + { + if (mobj->state != &states[S_PLAYERARROW_ROULETTE]) // don't reset FF_ANIMATE + P_SetMobjState(mobj, S_PLAYERARROW_ROULETTE); + } + else if (mobj->target->player->kartstuff[k_kitchensink]) P_SetMobjState(mobj, S_PLAYERARROW_KITCHENSINK); else if (mobj->target->player->kartstuff[k_megashroom] == 1 || (mobj->target->player->kartstuff[k_growshrinktimer] > 1 && (leveltime & 1))) P_SetMobjState(mobj, S_PLAYERARROW_MEGASHROOM); @@ -9459,37 +9465,50 @@ void P_SpawnPlayer(INT32 playernum) overheadarrow->flags2 |= MF2_DONTDRAW; P_SetScale(overheadarrow, mobj->destscale); - if (gametype != GT_RACE && ((leveltime < 1 || D_NumPlayers() <= 1) || p->kartstuff[k_balloon] > 0)) // srb2kart + if (gametype != GT_RACE) { INT32 i; - angle_t newangle, diff; - fixed_t newx; - fixed_t newy; - mobj_t *mo; + INT32 pcount = 0; - if (leveltime < 1 || D_NumPlayers() <= 1) // Start of the map? - p->kartstuff[k_balloon] = cv_kartballoons.value; // Reset those balloons! - - if (p->kartstuff[k_balloon] <= 1) - diff = 0; - else - diff = FixedAngle(360*FRACUNIT/p->kartstuff[k_balloon]); - - newangle = mobj->angle; - newx = mobj->x + P_ReturnThrustX(mobj, newangle + ANGLE_180, 64*FRACUNIT); - newy = mobj->y + P_ReturnThrustY(mobj, newangle + ANGLE_180, 64*FRACUNIT); - - for (i = 0; i < p->kartstuff[k_balloon]; i++) + for (i = 0; i < MAXPLAYERS; i++) { - mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON); - mo->threshold = i; - P_SetTarget(&mo->target, mobj); - mo->angle = (diff * (i-1)); - mo->color = mobj->color; - if (mobj->flags2 & MF2_DONTDRAW) - mo->flags2 |= MF2_DONTDRAW; + if (!playeringame[i] || players[i].spectator || &players[i] == p) + continue; + pcount++; + } + + if (p->kartstuff[k_balloon] > 0 || leveltime < 1 || pcount <= 1) // srb2kart + { + angle_t newangle; + angle_t diff; + fixed_t newx; + fixed_t newy; + mobj_t *mo; + + if (leveltime < 1 || pcount <= 1) // Start of the map? + p->kartstuff[k_balloon] = cv_kartballoons.value; // Reset those balloons! + + if (p->kartstuff[k_balloon] <= 1) + diff = 0; else - mo->flags2 &= ~MF2_DONTDRAW; + diff = FixedAngle(360*FRACUNIT/p->kartstuff[k_balloon]); + + newangle = mobj->angle; + newx = mobj->x + P_ReturnThrustX(mobj, newangle + ANGLE_180, 64*FRACUNIT); + newy = mobj->y + P_ReturnThrustY(mobj, newangle + ANGLE_180, 64*FRACUNIT); + + for (i = 0; i < p->kartstuff[k_balloon]; i++) + { + mo = P_SpawnMobj(newx, newy, mobj->z, MT_BATTLEBALLOON); + mo->threshold = i; + P_SetTarget(&mo->target, mobj); + mo->angle = (diff * (i-1)); + mo->color = mobj->color; + if (mobj->flags2 & MF2_DONTDRAW) + mo->flags2 |= MF2_DONTDRAW; + else + mo->flags2 &= ~MF2_DONTDRAW; + } } } } diff --git a/src/p_spec.c b/src/p_spec.c index a68608bc..40c60d9f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7140,7 +7140,7 @@ void T_Friction(friction_t *f) // friction works for all mobj's // (or at least MF_PUSHABLEs, which is all I care about anyway) if ((!(thing->flags & (MF_NOGRAVITY | MF_NOCLIP)) && thing->z == thing->floorz) && (thing->player - && (thing->player->kartstuff[k_startimer] == 0 && thing->player->kartstuff[k_bootaketimer] == 0 + && (thing->player->kartstuff[k_startimer] == 0 && thing->player->kartstuff[k_bootimer] == 0 && thing->player->kartstuff[k_mushroomtimer] == 0 && thing->player->kartstuff[k_growshrinktimer] <= 0))) { if (f->roverfriction) diff --git a/src/p_user.c b/src/p_user.c index fa9daa01..935d61bd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -9497,7 +9497,7 @@ void P_PlayerThink(player_t *player) { // SRB2kart - fixes boo not flashing when it should. Mega doesn't flash either. Flashing is local. if ((player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) - && player->kartstuff[k_bootaketimer] == 0 && player->kartstuff[k_growshrinktimer] <= 0) + && player->kartstuff[k_bootimer] == 0 && player->kartstuff[k_growshrinktimer] <= 0) { if (player->powers[pw_flashing] > 0 && player->powers[pw_flashing] < flashingtics && (leveltime & 1)) player->mo->flags2 |= MF2_DONTDRAW; diff --git a/src/st_stuff.c b/src/st_stuff.c index a05bb686..15343adc 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1922,14 +1922,14 @@ static void ST_overlayDrawer(void) V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(116), 0, M_GetText("You cannot move while hiding.")); V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(132), 0, M_GetText("Press F12 to watch another player.")); } - else if (!G_PlatformGametype() && stplyr->playerstate == PST_DEAD && stplyr->lives) //Death overrides spectator text. + /*else if (!G_PlatformGametype() && stplyr->playerstate == PST_DEAD && stplyr->lives) //Death overrides spectator text. { INT32 respawntime = cv_respawntime.value - stplyr->deadtimer/TICRATE; if (respawntime > 0 && !stplyr->spectator) V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(132), V_HUDTRANSHALF, va(M_GetText("Respawn in: %d second%s."), respawntime, respawntime == 1 ? "" : "s")); else V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(132), V_HUDTRANSHALF, M_GetText("Press Jump to respawn.")); - } + }*/ else if (stplyr->spectator #ifdef HAVE_BLUA && LUA_HudEnabled(hud_textspectator) From 7b01a6c46e72233c46065ce878b5358cf45f4861 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 5 Nov 2017 01:49:31 -0500 Subject: [PATCH 34/61] Less strict item respawn requirement --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index dcaadcdc..5d1206dd 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9287,7 +9287,7 @@ void P_RespawnBattleSpecials(void) return; // Didn't collect enough boxes - if (numgotboxes < nummapboxes) + if (numgotboxes < (9*nummapboxes/10)) return; // wait a teeeensy bit after collecting everything From c0ed28e828e2cd65f0d600af6a0615bd2504b4cd Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 5 Nov 2017 02:17:13 -0500 Subject: [PATCH 35/61] why didn't this merge before?? --- src/lua_baselib.c | 3 ++- src/p_local.h | 2 +- src/p_map.c | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index e8e8fd02..aa2ebf65 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1009,10 +1009,11 @@ static int lib_pTeleportMove(lua_State *L) static int lib_pSlideMove(lua_State *L) { mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + boolean forceslide = luaL_checkboolean(L, 2); NOHUD if (!mo) return LUA_ErrInvalid(L, "mobj_t"); - P_SlideMove(mo); + P_SlideMove(mo, forceslide); return 0; } diff --git a/src/p_local.h b/src/p_local.h index 235aaa27..8d27d69e 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -327,7 +327,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam); boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff); boolean P_Move(mobj_t *actor, fixed_t speed); boolean P_TeleportMove(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z); -void P_SlideMove(mobj_t *mo); +void P_SlideMove(mobj_t *mo, boolean forceslide); void P_BounceMove(mobj_t *mo); boolean P_CheckSight(mobj_t *t1, mobj_t *t2); void P_CheckHoopPosition(mobj_t *hoopthing, fixed_t x, fixed_t y, fixed_t z, fixed_t radius); diff --git a/src/p_map.c b/src/p_map.c index bc657c9d..6717eaa6 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3587,7 +3587,7 @@ stairstep: // // This is a kludgy mess. // -void P_SlideMove(mobj_t *mo) +void P_SlideMove(mobj_t *mo, boolean forceslide) { fixed_t leadx, leady, trailx, traily, newx, newy; INT16 hitcount = 0; @@ -3665,7 +3665,7 @@ retry: PT_ADDLINES, PTR_SlideTraverse); // Some walls are bouncy even if you're not - if (bestslideline && !(bestslideline->flags & ML_BOUNCY)) // SRB2kart - All walls are bouncy unless specified otherwise + if (!forceslide && bestslideline && !(bestslideline->flags & ML_BOUNCY)) // SRB2kart - All walls are bouncy unless specified otherwise { P_BounceMove(mo); return; From 10818f254b6abdbc72d759ad68cfae55eb071a0f Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sun, 5 Nov 2017 16:46:26 +0000 Subject: [PATCH 36/61] Minimum bounce speed --- src/k_kart.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index f73d6868..80aa32d4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1070,6 +1070,17 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) momdifx = mobj1->momx - mobj2->momx; momdify = mobj1->momy - mobj2->momy; + + // if the speed difference is less than this let's assume they're going proportionately faster from each other + if (P_AproxDistance(momdifx, momdify) < 25*FRACUNIT/2) + { + fixed_t momdiflength = P_AproxDistance(momdifx, momdify); + fixed_t normalisedx = FixedDiv(momdifx, momdiflength); + fixed_t normalisedy = FixedDiv(momdify, momdiflength); + momdifx = FixedMul(25*FRACUNIT/2, normalisedx); + momdify = FixedMul(25*FRACUNIT/2, normalisedy); + } + distx = mobj1->x - mobj2->x; disty = mobj1->y - mobj2->y; dot = FixedMul(momdifx, distx) + FixedMul(momdify, disty); From 351670513da2b8a862511de96e7357fb06290e1c Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sun, 5 Nov 2017 17:15:19 +0000 Subject: [PATCH 37/61] Give explosion particle mobjs the target of who spawned it (bomb thrower, blue lightning user) So that explosion particles can trigger voice lines (and not crash) and add points for players in battle Also don't play voice lines when you hit yourself --- src/k_kart.c | 6 ++++-- src/k_kart.h | 2 +- src/p_enemy.c | 2 +- src/p_inter.c | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 80aa32d4..3754f7c7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1613,7 +1613,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) || player->kartstuff[k_startimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootaketimer] > 0) return; - if (source && source->player && !source->player->kartstuff[k_sounds]) + if (source && source != player->mo && source->player && !source->player->kartstuff[k_sounds]) { S_StartSound(source, sfx_hitem); source->player->kartstuff[k_sounds] = 50; @@ -1715,7 +1715,8 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju return; } -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) +// source is the mobj that originally threw the bomb that exploded etc. +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 *source) { mobj_t *mobj; mobj_t *ghost = NULL; @@ -1795,6 +1796,7 @@ void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 mobj->flags |= MF_NOCLIPTHING; mobj->flags &= ~MF_SPECIAL; + P_SetTarget(&mobj->target, source); } } diff --git a/src/k_kart.h b/src/k_kart.h index 3437f53f..e39a4662 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -21,7 +21,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); void 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_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 *source); void K_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); diff --git a/src/p_enemy.c b/src/p_enemy.c index 6ab7d79b..8acea233 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8253,7 +8253,7 @@ void A_BobombExplode(mobj_t *actor) 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 + K_SpawnKartExplosion(actor->x, actor->y, actor->z, actor->info->painchance + 32*FRACUNIT, 32, type, d*(ANGLE_45/4), false, false, actor->target); // 32 <-> 64 P_SpawnMobj(actor->x, actor->y, actor->z, MT_BOMBEXPLOSIONSOUND); diff --git a/src/p_inter.c b/src/p_inter.c index bcf7a8ef..ccdb36a1 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3092,7 +3092,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { // Just need to do this now! Being thrown upwards is done by the explosion. P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUELIGHTNING); - P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLOSION); + mobj_t *blueexplode = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLOSION); + P_SetTarget(&blueexplode->target, source); return true; } else if (damage == 65 && player->kartstuff[k_position] > 1) From a0b8eff8f1d9c741263c1fdf4ea5f7c39ab8c4b2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 5 Nov 2017 12:29:19 -0500 Subject: [PATCH 38/61] fuck OFF stepmove dick --- src/p_map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_map.c b/src/p_map.c index a75e577f..0a2903c1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2685,7 +2685,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) if (!(thing->flags & MF_NOCLIP)) { //All things are affected by their scale. - fixed_t maxstep = FixedMul(MAXSTEPMOVE, thing->scale); + fixed_t maxstep = MAXSTEPMOVE; //FixedMul(MAXSTEPMOVE, thing->scale); if (thing->player) { From 3d11e2ae286912ffd2c250d1fcd2b528cf563b65 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sun, 5 Nov 2017 21:33:22 +0000 Subject: [PATCH 39/61] Increase minimum bounce Don't run xy bouncing if objects are directly ontop of each other Don't run xy bouncing if objects are moving away from each other Move z bouncing to be done first so that returning from xy collision doesn't stop it --- src/k_kart.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3754f7c7..4be0b489 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1062,6 +1062,15 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) fx->eflags &= ~MFE_VERTICALFLIP; fx->scale = mobj1->scale; + if (bounce == true) // Perform a Goomba Bounce. + mobj1->momz = -mobj1->momz; + else + { + fixed_t newz = mobj1->momz; + mobj1->momz = mobj2->momz; + mobj2->momz = newz; + } + mass1 = mass2 = 1*FRACUNIT; if (mobj1->player) mass1 = (mobj1->player->kartweight)*FRACUNIT; @@ -1072,18 +1081,32 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) momdify = mobj1->momy - mobj2->momy; // if the speed difference is less than this let's assume they're going proportionately faster from each other - if (P_AproxDistance(momdifx, momdify) < 25*FRACUNIT/2) + if (P_AproxDistance(momdifx, momdify) < 25*FRACUNIT) { fixed_t momdiflength = P_AproxDistance(momdifx, momdify); fixed_t normalisedx = FixedDiv(momdifx, momdiflength); fixed_t normalisedy = FixedDiv(momdify, momdiflength); - momdifx = FixedMul(25*FRACUNIT/2, normalisedx); - momdify = FixedMul(25*FRACUNIT/2, normalisedy); + momdifx = FixedMul(25*FRACUNIT, normalisedx); + momdify = FixedMul(25*FRACUNIT, normalisedy); } distx = mobj1->x - mobj2->x; disty = mobj1->y - mobj2->y; + + if (distx == 0 && disty == 0) + { + // if there's no distance between the 2, they're directly on top of each other, don't run this + return; + } + dot = FixedMul(momdifx, distx) + FixedMul(momdify, disty); + + if (dot >= 0) + { + // They're moving away from each other + return; + } + p = FixedDiv(dot, FixedMul(distx, distx)+FixedMul(disty, disty)); mobj1->momx = mobj1->momx - FixedMul(FixedMul(FixedDiv(2*mass2, mass1 + mass2), p), distx); @@ -1092,15 +1115,6 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) mobj2->momx = mobj2->momx - FixedMul(FixedMul(FixedDiv(2*mass1, mass1 + mass2), p), -distx); mobj2->momy = mobj2->momy - FixedMul(FixedMul(FixedDiv(2*mass1, mass1 + mass2), p), -disty); - if (bounce == true) // Perform a Goomba Bounce. - mobj1->momz = -mobj1->momz; - else - { - fixed_t newz = mobj1->momz; - mobj1->momz = mobj2->momz; - mobj2->momz = newz; - } - // Because this is done during collision now, rmomx and rmomy need to be recalculated // so that friction doesn't immediately decide to stop the player if they're at a standstill if (mobj1->player) From 875629390632a2d193f6314d26e8efeddbdc5ee7 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 5 Nov 2017 20:41:54 -0500 Subject: [PATCH 40/61] Minor fixes --- src/g_game.c | 1 + src/k_kart.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 845bbac1..dbda2fe9 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2305,6 +2305,7 @@ void G_PlayerReborn(INT32 player) p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync p->kartstuff[k_offroad] = offroad; p->kartstuff[k_balloon] = balloon; + p->kartstuff[k_comebacktimer] = comebacktime; // Don't do anything immediately p->pflags |= PF_USEDOWN; diff --git a/src/k_kart.c b/src/k_kart.c index 6b4e049d..744abf22 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1683,8 +1683,10 @@ void K_SpinPlayer(player_t *player, mobj_t *source) } if (source && source->player && player != source->player) + { P_AddPlayerScore(source->player, 1); source->player->kartstuff[k_comebacktimer] = comebacktime; + } K_CheckBalloons(); } @@ -1741,8 +1743,10 @@ void K_SquishPlayer(player_t *player, mobj_t *source) } if (source && source->player && player != source->player) + { P_AddPlayerScore(source->player, 1); source->player->kartstuff[k_comebacktimer] = comebacktime; + } K_CheckBalloons(); } @@ -1788,8 +1792,10 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju } if (source && source->player && player != source->player) + { P_AddPlayerScore(source->player, 1); source->player->kartstuff[k_comebacktimer] = comebacktime; + } K_CheckBalloons(); } @@ -3296,7 +3302,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else player->mo->flags2 &= ~MF2_DONTDRAW; } - else if (player->kartstuff[k_balloon] > 0) + else if (gametype == GT_RACE || player->kartstuff[k_balloon] > 0) player->mo->flags2 &= ~MF2_DONTDRAW; } } From 7eb4a958f7692f663e3b09a73880b73d2b6d31d6 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 5 Nov 2017 23:18:58 -0500 Subject: [PATCH 41/61] More adjustments - Comeback timer gets higher the more you get hit - Your ghost appears over the bomb - Speed & accel is set to worst while a bomb - CHECK range scales with kartcc --- src/d_player.h | 3 +- src/g_game.c | 7 +++- src/info.c | 2 +- src/k_kart.c | 110 ++++++++++++++++++++++++++++++++----------------- src/p_map.c | 44 ++++++++++++++------ src/p_mobj.c | 13 +++++- src/p_user.c | 4 +- 7 files changed, 124 insertions(+), 59 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 463b4ca7..80bf47f1 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -306,7 +306,8 @@ typedef enum // 0x4 = 3 Red Shells orbiting, 0x8 = Triple Red Shell in inventory k_lightning, // 0x1 = Lightning in inventory k_kitchensink, // 0x1 = Sink in inventory - k_balloon, // Number of balloons left + k_balloon, // Battle mode, number of balloons left + k_comebackhits, // Battle mode, number of times hit in comeback mode NUMKARTSTUFF } kartstufftype_t; diff --git a/src/g_game.c b/src/g_game.c index dbda2fe9..7fbba166 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -205,7 +205,7 @@ INT32 bootime = 7*TICRATE; INT32 boostealtime = TICRATE/2; INT32 mushroomtime = TICRATE + (TICRATE/3); INT32 itemtime = 8*TICRATE; -INT32 comebacktime = 15*TICRATE; +INT32 comebacktime = 10*TICRATE; INT32 gameovertics = 15*TICRATE; @@ -2194,6 +2194,7 @@ void G_PlayerReborn(INT32 player) INT32 starpostwp; INT32 offroad; INT32 balloon; + INT32 comebackhits; score = players[player].score; lives = players[player].lives; @@ -2249,6 +2250,7 @@ void G_PlayerReborn(INT32 player) starpostwp = players[player].kartstuff[k_starpostwp]; offroad = players[player].kartstuff[k_offroad]; balloon = players[player].kartstuff[k_balloon]; + comebackhits = players[player].kartstuff[k_comebackhits]; p = &players[player]; memset(p, 0, sizeof (*p)); @@ -2305,7 +2307,8 @@ void G_PlayerReborn(INT32 player) p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync p->kartstuff[k_offroad] = offroad; p->kartstuff[k_balloon] = balloon; - p->kartstuff[k_comebacktimer] = comebacktime; + p->kartstuff[k_comebackhits] = comebackhits; + p->kartstuff[k_comebacktimer] = comebacktime * (comebackhits+1); // Don't do anything immediately p->pflags |= PF_USEDOWN; diff --git a/src/info.c b/src/info.c index f532187d..79433ecd 100644 --- a/src/info.c +++ b/src/info.c @@ -2881,7 +2881,7 @@ state_t states[NUMSTATES] = {SPR_ARRO, FF_FULLBRIGHT|16, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_EMPTY {SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE - {SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERBOMB + {SPR_PBOM, 0, -1, {NULL}, 1, 0, S_NULL}, // S_PLAYERBOMB #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK diff --git a/src/k_kart.c b/src/k_kart.c index 744abf22..ba27a307 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1301,13 +1301,8 @@ void K_LakituChecker(player_t *player) void K_KartMoveAnimation(player_t *player) { ticcmd_t *cmd = &player->cmd; - // Battle Mode bomb overrides everything else - if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) - { - P_SetPlayerMobjState(player->mo, S_PLAYERBOMB); - } // Standing frames - S_KART_STND1 S_KART_STND1_L S_KART_STND1_R - else if (player->speed == 0) + if (player->speed == 0) { if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state >= &states[S_KART_STND1_R] && player->mo->state <= &states[S_KART_STND2_R])) P_SetPlayerMobjState(player->mo, S_KART_STND1_R); @@ -1434,6 +1429,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_sounds]) player->kartstuff[k_sounds]--; + if (player->kartstuff[k_comebackhits] > 5) + player->kartstuff[k_comebackhits] = 5; + // ??? /* if (player->kartstuff[k_jmp] > 1 && onground) @@ -1600,7 +1598,10 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) break; } - k_speed += player->kartspeed*3; // 153 - 177 + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + k_speed += 3; // 153 + else + k_speed += player->kartspeed*3; // 153 - 177 finalspeed = FixedMul(FixedMul(k_speed<<14, g_cc), player->mo->scale); @@ -1613,8 +1614,11 @@ static fixed_t K_GetKartAccel(player_t *player) { fixed_t k_accel = 32; // 36; - //k_accel += 3 * (9 - player->kartspeed); // 36 - 60 - k_accel += 4 * (9 - player->kartspeed); // 32 - 64 + if (gametype == GT_RACE || player->kartstuff[k_balloon] > 0) + { + //k_accel += 3 * (9 - player->kartspeed); // 36 - 60 + k_accel += 4 * (9 - player->kartspeed); // 32 - 64 + } return FixedMul(k_accel, K_GetKartBoostPower(player, false)); } @@ -1671,7 +1675,6 @@ void K_SpinPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { @@ -1681,16 +1684,17 @@ void K_SpinPlayer(player_t *player, mobj_t *source) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } + else + player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) - { P_AddPlayerScore(source->player, 1); - source->player->kartstuff[k_comebacktimer] = comebacktime; - } K_CheckBalloons(); } + player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + if (player->kartstuff[k_spinouttype] <= 0) { if (player->kartstuff[k_spinouttype] == 0) @@ -1731,7 +1735,6 @@ void K_SquishPlayer(player_t *player, mobj_t *source) player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { @@ -1741,16 +1744,17 @@ void K_SquishPlayer(player_t *player, mobj_t *source) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } + else + player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) - { P_AddPlayerScore(source->player, 1); - source->player->kartstuff[k_comebacktimer] = comebacktime; - } K_CheckBalloons(); } + player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + player->kartstuff[k_squishedtimer] = 1*TICRATE; player->powers[pw_flashing] = flashingtics; @@ -1780,7 +1784,6 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju player->kartstuff[k_mushroomtimer] = 0; player->kartstuff[k_driftboost] = 0; - player->kartstuff[k_comebacktimer] = comebacktime; if (gametype != GT_RACE) { @@ -1790,16 +1793,17 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } + else + player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) - { P_AddPlayerScore(source->player, 1); - source->player->kartstuff[k_comebacktimer] = comebacktime; - } K_CheckBalloons(); } + player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + player->kartstuff[k_spinouttype] = 1; player->kartstuff[k_spinouttimer] = 2*TICRATE+(TICRATE/2); player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; @@ -2509,9 +2513,16 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) static void K_KartDrift(player_t *player, boolean onground) { + fixed_t dsone; + fixed_t dstwo; + // IF YOU CHANGE THESE: MAKE SURE YOU UPDATE THE SAME VALUES IN p_mobjc, "case MT_DRIFT:" - fixed_t dsone = 26*4 + player->kartspeed*2 + (9 - player->kartweight); - fixed_t dstwo = dsone*2; + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + dsone = 26*4 + 2; + else + dsone = 26*4 + player->kartspeed*2 + (9 - player->kartweight); + + dstwo = dsone*2; // Drifting is actually straffing + automatic turning. // Holding the Jump button will enable drifting. @@ -3287,23 +3298,38 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (player->kartstuff[k_bootimer] == 0) { - if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) // dead in match? you da bomb - { - K_StripItems(player); - if (player->kartstuff[k_comebacktimer] > 0) - { - if (leveltime & 1) - player->mo->flags2 |= MF2_DONTDRAW; - else - player->mo->flags2 &= ~MF2_DONTDRAW; + player->mo->flags2 &= ~MF2_DONTDRAW; + } + + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) // dead in match? you da bomb + { + K_StripItems(player); + player->mo->flags2 |= MF2_SHADOW; - player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; - } + if (!(player->mo->tracer)) + player->mo->tracer = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_OVERLAY); + + P_SetTarget(&player->mo->tracer->target, player->mo); + P_SetMobjState(player->mo->tracer, S_PLAYERBOMB); + player->mo->tracer->color = player->mo->color; + + if (player->kartstuff[k_comebacktimer] > 0) + { + if (leveltime & 1) + player->mo->tracer->flags2 |= MF2_DONTDRAW; else - player->mo->flags2 &= ~MF2_DONTDRAW; + player->mo->tracer->flags2 &= ~MF2_DONTDRAW; + + player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; } - else if (gametype == GT_RACE || player->kartstuff[k_balloon] > 0) - player->mo->flags2 &= ~MF2_DONTDRAW; + else + player->mo->tracer->flags2 &= ~MF2_DONTDRAW; + } + else if (gametype == GT_RACE || player->kartstuff[k_balloon] > 0) + { + player->mo->flags2 &= ~MF2_SHADOW; + if (player->mo->tracer && player->mo->tracer->state == &states[S_PLAYERBOMB]) + P_RemoveMobj(player->mo->tracer); } } @@ -3381,6 +3407,11 @@ void K_CheckBalloons(void) UINT8 numingame = 0; INT8 winnernum = -1; +// Quick thing for testing comeback in splitscreen +#if 0 + return; +#endif + if (!(multiplayer || netgame)) return; @@ -4236,10 +4267,13 @@ static void K_drawKartSpeedometer(void) fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my) { fixed_t dist, x; + fixed_t range = RING_DIST/4; angle_t diff; + range *= (K_GetKartCC()/50); + dist = abs(R_PointToDist2(px, py, mx, my)); - if (dist > RING_DIST/4) + if (dist > range) return -320; diff = R_PointToAngle2(px, py, mx, my) - ang; diff --git a/src/p_map.c b/src/p_map.c index 0a2903c1..846d1cd1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1621,34 +1621,41 @@ static boolean PIT_CheckThing(mobj_t *thing) { thing->player->kartstuff[k_justbumped] = 6; tmthing->player->kartstuff[k_justbumped] = 6; + if (tmthing->player->kartstuff[k_balloon] > 0) { if (tmthing->player->kartstuff[k_balloon] == 1) K_StealBalloon(thing->player, tmthing->player); - thing->player->kartstuff[k_comebacktimer] = comebacktime; + K_ExplodePlayer(tmthing->player, thing); + + thing->player->kartstuff[k_comebackhits]++; + thing->player->kartstuff[k_comebacktimer] = comebacktime * (thing->player->kartstuff[k_comebackhits]+1); return true; } else if (thing->player->kartstuff[k_balloon] > 0) { if (thing->player->kartstuff[k_balloon] == 1) K_StealBalloon(tmthing->player, thing->player); - tmthing->player->kartstuff[k_comebacktimer] = comebacktime; - K_ExplodePlayer(thing->player, thing); + + K_ExplodePlayer(thing->player, tmthing); + + tmthing->player->kartstuff[k_comebackhits]++; + tmthing->player->kartstuff[k_comebacktimer] = comebacktime * (tmthing->player->kartstuff[k_comebackhits]+1); return true; } - } - else - { - if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) + else if (thing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_balloon] <= 0) { - K_StealBalloon(thing->player, tmthing->player); - K_SpinPlayer(tmthing->player, thing); - } - else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) - { - K_StealBalloon(tmthing->player, thing->player); + K_KartBouncing(tmthing, thing, false); + K_SpinPlayer(thing->player, tmthing); + K_SpinPlayer(tmthing->player, thing); + + thing->player->kartstuff[k_comebackhits]++; + thing->player->kartstuff[k_comebacktimer] = comebacktime * (thing->player->kartstuff[k_comebackhits]+1); + tmthing->player->kartstuff[k_comebackhits]++; + tmthing->player->kartstuff[k_comebacktimer] = comebacktime * (tmthing->player->kartstuff[k_comebackhits]+1); + return true; } } } @@ -1660,6 +1667,17 @@ static boolean PIT_CheckThing(mobj_t *thing) else K_KartBouncing(tmthing, thing, false); + if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) + { + K_StealBalloon(thing->player, tmthing->player); + K_SpinPlayer(tmthing->player, thing); + } + else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) + { + K_StealBalloon(tmthing->player, thing->player); + K_SpinPlayer(thing->player, tmthing); + } + thing->player->kartstuff[k_justbumped] = 6; tmthing->player->kartstuff[k_justbumped] = 6; return true; diff --git a/src/p_mobj.c b/src/p_mobj.c index 241b1581..2aa44891 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6456,8 +6456,16 @@ void P_MobjThinker(mobj_t *mobj) //{ SRB2kart mobs case MT_DRIFT: { - fixed_t dsone = 26*4 + mobj->target->player->kartspeed*2 + (9 - mobj->target->player->kartweight); - fixed_t dstwo = dsone*2; + fixed_t dsone; + fixed_t dstwo; + + if (gametype != GT_RACE && mobj->target->player->kartstuff[k_balloon] <= 0) + dsone = 26*4 + 2 + (9 - mobj->target->player->kartweight); + else + dsone = 26*4 + mobj->target->player->kartspeed*2 + (9 - mobj->target->player->kartweight); + + dstwo = dsone*2; + if ((mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) && (mobj->type == MT_DRIFT && mobj->target->player->kartstuff[k_driftcharge] >= dsone)) { @@ -6696,6 +6704,7 @@ void P_MobjThinker(mobj_t *mobj) if ((splitscreen || !netgame) || gametype == GT_RACE || mobj->target->player == &players[displayplayer] + || mobj->target->player->kartstuff[k_balloon] <= 0 || (mobj->target->player->mo->flags2 & MF2_DONTDRAW)) mobj->flags2 |= MF2_DONTDRAW; else diff --git a/src/p_user.c b/src/p_user.c index 00d01e15..02d545ae 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8694,7 +8694,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall } // Make player translucent if camera is too close (only in single player). - if (!(multiplayer || netgame) && !splitscreen) + /*if (!(multiplayer || netgame) && !splitscreen) { fixed_t vx = 0, vy = 0; if (player->awayviewtics) { @@ -8713,7 +8713,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall player->mo->flags2 &= ~MF2_SHADOW; } else - player->mo->flags2 &= ~MF2_SHADOW; + player->mo->flags2 &= ~MF2_SHADOW;*/ /* if (!resetcalled && (player->pflags & PF_NIGHTSMODE && player->exiting)) { From 8f532b48ef2960dccd5165b385ca706c93225364 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Mon, 6 Nov 2017 15:27:15 +0000 Subject: [PATCH 42/61] Various held and thrown items tweaks "Missile" items are spawned on the ground and should follow slopes when the player is on the ground Forwards thrown items should work in reverse gravity Dropped items are dropped slightly closer (depends on player and item radius) and have their position set correctly Held items are held closer (depends on player and item radius) --- src/k_kart.c | 96 +++++++++++++++++++--------------------------------- src/p_mobj.c | 9 +---- 2 files changed, 36 insertions(+), 69 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4be0b489..9059c1ba 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1831,12 +1831,29 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle x = source->x + source->momx; y = source->y + source->momy; - z = source->z + source->height/3; + z = source->z; // spawn on the ground please + + if (P_MobjFlip(source) < 0) + { + z = source->z+source->height - mobjinfo[type].height; + } th = P_SpawnMobj(x, y, z, type); th->flags2 |= flags2; + if (P_IsObjectOnGround(source)) + { + // spawn on the ground if the player is on the ground + if (P_MobjFlip(source) < 0) + { + th->z = th->ceilingz - th->height; + th->eflags |= MFE_VERTICALFLIP; + } + else + th->z = th->floorz; + } + th->threshold = 10; #ifdef WEAPON_SFX @@ -1976,51 +1993,23 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map { if (mapthing == MT_FIREBALL) // Messy { - mobj_t *mo2; - mobj_t *mo3; - mobj_t *mo4; - mobj_t *mo5; if (dir == -1) { // Shoot backward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 - 0x06000000, 0, PROJSPEED/2); - mo2 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 - 0x03000000, 0, PROJSPEED/2); - mo3 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/2); - mo4 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 + 0x03000000, 0, PROJSPEED/2); - mo5 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 + 0x06000000, 0, PROJSPEED/2); - - if (mo) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - { - mo->eflags |= MFE_VERTICALFLIP; - mo2->eflags |= MFE_VERTICALFLIP; - mo3->eflags |= MFE_VERTICALFLIP; - mo4->eflags |= MFE_VERTICALFLIP; - mo5->eflags |= MFE_VERTICALFLIP; - } - } + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 - 0x06000000, 0, PROJSPEED/2); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 - 0x03000000, 0, PROJSPEED/2); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/2); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 + 0x03000000, 0, PROJSPEED/2); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 + 0x06000000, 0, PROJSPEED/2); } else { // Shoot forward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x06000000, 0, PROJSPEED); - mo2 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x03000000, 0, PROJSPEED); - mo3 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); - mo4 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x03000000, 0, PROJSPEED); - mo5 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x06000000, 0, PROJSPEED); - - if (mo) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - { - mo->eflags |= MFE_VERTICALFLIP; - mo2->eflags |= MFE_VERTICALFLIP; - mo3->eflags |= MFE_VERTICALFLIP; - mo4->eflags |= MFE_VERTICALFLIP; - mo5->eflags |= MFE_VERTICALFLIP; - } - } + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x06000000, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x03000000, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x03000000, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x06000000, 0, PROJSPEED); } } else // Shells @@ -2029,23 +2018,11 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map { // Shoot backward mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/2); - - 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, PROJSPEED + player->speed); - - if (mo) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - mo->eflags |= MFE_VERTICALFLIP; - } } } } @@ -2057,7 +2034,6 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, mapthing); mo->threshold = 10; - P_SetTarget(&mo->target, player->mo); S_StartSound(player->mo, mo->info->seesound); @@ -2074,7 +2050,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map mo->momx = player->mo->momx + FixedMul(FINECOSINE(fa), PROJSPEED); mo->momy = player->mo->momy + FixedMul(FINESINE(fa), PROJSPEED); - mo->momz = HEIGHT; + mo->momz = P_MobjFlip(player->mo) * HEIGHT; if (player->mo->eflags & MFE_VERTICALFLIP) mo->eflags |= MFE_VERTICALFLIP; @@ -2086,21 +2062,19 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map } else { + fixed_t dropradius = FixedHypot(player->mo->radius, player->mo->radius) + FixedHypot(mobjinfo[mapthing].radius, mobjinfo[mapthing].radius); + // Drop it directly behind you. newangle = player->mo->angle; - mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, mapthing); + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, dropradius); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, dropradius); + + mo = P_SpawnMobj(newx, newy, 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) diff --git a/src/p_mobj.c b/src/p_mobj.c index 19b0662f..8370fb64 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6544,15 +6544,8 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { - INT32 zfixds = 56; - INT32 DIST = FixedMul(zfixds, mobj->target->scale); fixed_t z; - const fixed_t radius = DIST*FRACUNIT; // mobj's distance from its Target, or Radius. - - if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) - zfixds = 64; - else - zfixds = 56; + const fixed_t radius = FixedHypot(mobj->target->radius, mobj->target->radius) + FixedHypot(mobj->radius, mobj->radius); // mobj's distance from its Target, or Radius. //mobj->angle += FixedAngle(12*FRACUNIT); // mobj's actual speed. if (mobj->type == MT_TRIPLEGREENSHIELD1 || mobj->type == MT_TRIPLEGREENSHIELD2 || mobj->type == MT_TRIPLEGREENSHIELD3 From bd7e5bc313a5dbd4f81d84d94ebedc3190fb17a5 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 6 Nov 2017 17:31:52 -0500 Subject: [PATCH 43/61] HUD shenanigans In battle because it messes with CHECK, and also I'm too lazy to switch branches --- src/k_kart.c | 173 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 109 insertions(+), 64 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ba27a307..21fa22ec 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3701,19 +3701,21 @@ static INT32 STRINGY(INT32 y) return y; } -static INT32 SCX(INT32 x) +/*static INT32 SCX(INT32 x) { return FixedInt(FixedMul(x<kartstuff[k_boo] == 1) localpatch = kp_boo; else if (stplyr->kartstuff[k_magnet] == 1) localpatch = kp_magnet; - V_DrawScaledPatch(ITEM_X, STRINGY(ITEM_Y), V_SNAPTORIGHT|V_SNAPTOTOP, localpatch); + if (splitscreen) + flags = 0; + V_DrawScaledPatch(ITEM_X, STRINGY(ITEM_Y), flags, localpatch); } /* @@ -4052,8 +4077,12 @@ static void K_drawKartTimestamp(void) // TIME_Y = 6; // 6 INT32 TIME_XB; + INT32 flags = V_SNAPTORIGHT|V_SNAPTOTOP; + + if (splitscreen) + flags = 0; - V_DrawScaledPatch(TIME_X, STRINGY(TIME_Y), 0, kp_timestickerwide); + V_DrawScaledPatch(TIME_X, STRINGY(TIME_Y), flags, kp_timestickerwide); TIME_XB = TIME_X+33; @@ -4062,44 +4091,44 @@ static void K_drawKartTimestamp(void) // zero minute if (stplyr->realtime/(60*TICRATE) < 10) { - V_DrawKartString(TIME_XB, STRINGY(TIME_Y+3), 0, va("0")); + V_DrawKartString(TIME_XB, STRINGY(TIME_Y+3), flags, va("0")); // minutes time 0 __ __ - V_DrawKartString(TIME_XB+12, STRINGY(TIME_Y+3), 0, va("%d", stplyr->realtime/(60*TICRATE))); + V_DrawKartString(TIME_XB+12, STRINGY(TIME_Y+3), flags, va("%d", stplyr->realtime/(60*TICRATE))); } // minutes time 0 __ __ else - V_DrawKartString(TIME_XB, STRINGY(TIME_Y+3), 0, va("%d", stplyr->realtime/(60*TICRATE))); + V_DrawKartString(TIME_XB, STRINGY(TIME_Y+3), flags, va("%d", stplyr->realtime/(60*TICRATE))); // apostrophe location _'__ __ - V_DrawKartString(TIME_XB+24, STRINGY(TIME_Y+3), 0, va("'")); + V_DrawKartString(TIME_XB+24, STRINGY(TIME_Y+3), flags, va("'")); // zero second _ 0_ __ if ((stplyr->realtime/TICRATE % 60) < 10) { - V_DrawKartString(TIME_XB+36, STRINGY(TIME_Y+3), 0, va("0")); + V_DrawKartString(TIME_XB+36, STRINGY(TIME_Y+3), flags, va("0")); // seconds time _ _0 __ - V_DrawKartString(TIME_XB+48, STRINGY(TIME_Y+3), 0, va("%d", stplyr->realtime/TICRATE % 60)); + V_DrawKartString(TIME_XB+48, STRINGY(TIME_Y+3), flags, va("%d", stplyr->realtime/TICRATE % 60)); } // zero second _ 00 __ else - V_DrawKartString(TIME_XB+36, STRINGY(TIME_Y+3), 0, va("%d", stplyr->realtime/TICRATE % 60)); + V_DrawKartString(TIME_XB+36, STRINGY(TIME_Y+3), flags, va("%d", stplyr->realtime/TICRATE % 60)); // quotation mark location _ __"__ - V_DrawKartString(TIME_XB+60, STRINGY(TIME_Y+3), 0, va("\"")); + V_DrawKartString(TIME_XB+60, STRINGY(TIME_Y+3), flags, va("\"")); // zero tick _ __ 0_ if (G_TicsToCentiseconds(stplyr->realtime) < 10) { - V_DrawKartString(TIME_XB+72, STRINGY(TIME_Y+3), 0, va("0")); + V_DrawKartString(TIME_XB+72, STRINGY(TIME_Y+3), flags, va("0")); // tics _ __ _0 - V_DrawKartString(TIME_XB+84, STRINGY(TIME_Y+3), 0, va("%d", G_TicsToCentiseconds(stplyr->realtime))); + V_DrawKartString(TIME_XB+84, STRINGY(TIME_Y+3), flags, va("%d", G_TicsToCentiseconds(stplyr->realtime))); } // zero tick _ __ 00 if (G_TicsToCentiseconds(stplyr->realtime) >= 10) - V_DrawKartString(TIME_XB+72, STRINGY(TIME_Y+3), 0, va("%d", G_TicsToCentiseconds(stplyr->realtime))); + V_DrawKartString(TIME_XB+72, STRINGY(TIME_Y+3), flags, va("%d", G_TicsToCentiseconds(stplyr->realtime))); } else - V_DrawKartString(TIME_XB, STRINGY(TIME_Y+3), 0, va("99'59\"99")); + V_DrawKartString(TIME_XB, STRINGY(TIME_Y+3), flags, va("99'59\"99")); } static void K_DrawKartPositionNum(INT32 num) @@ -4107,14 +4136,18 @@ static void K_DrawKartPositionNum(INT32 num) // POSI_X = BASEVIDWIDTH - 51; // 269 // POSI_Y = BASEVIDHEIGHT- 64; // 136 - INT32 X = POSI_X+SCX(43); // +43 to offset where it's being drawn if there are more than one + INT32 X = POSI_X+43; // +43 to offset where it's being drawn if there are more than one INT32 W = SHORT(kp_positionnum[0][0]->width); + INT32 flags = V_TRANSLUCENT|V_SNAPTORIGHT|V_SNAPTOBOTTOM; patch_t *localpatch = kp_positionnum[0][0]; + if (splitscreen) + flags = V_TRANSLUCENT; + // Special case for 0 if (!num) { - V_DrawTranslucentPatch(X-(W*vid.dupx), POSI_Y, V_NOSCALESTART|V_TRANSLUCENT|V_SNAPTORIGHT|V_SNAPTOBOTTOM, kp_positionnum[0][0]); + V_DrawTranslucentPatch(X-W, STRINGY(POSI_Y), flags, kp_positionnum[0][0]); return; } @@ -4123,7 +4156,7 @@ static void K_DrawKartPositionNum(INT32 num) // Draw the number while (num) { - X -= (W*vid.dupx); + X -= W; // Check for the final lap if (stplyr->laps+1 == cv_numlaps.value) @@ -4132,19 +4165,19 @@ static void K_DrawKartPositionNum(INT32 num) switch (leveltime % 9) { case 1: case 2: case 3: - if (stplyr->kartstuff[k_position] >= 4) + if (stplyr->kartstuff[k_position] >= 4 || (splitscreen && stplyr->kartstuff[k_position] >= 2)) localpatch = kp_positionnum[num % 10][4]; else localpatch = kp_positionnum[num % 10][1]; break; case 4: case 5: case 6: - if (stplyr->kartstuff[k_position] >= 4) + if (stplyr->kartstuff[k_position] >= 4 || (splitscreen && stplyr->kartstuff[k_position] >= 2)) localpatch = kp_positionnum[num % 10][5]; else localpatch = kp_positionnum[num % 10][2]; break; case 7: case 8: case 9: - if (stplyr->kartstuff[k_position] >= 4) + if (stplyr->kartstuff[k_position] >= 4 || (splitscreen && stplyr->kartstuff[k_position] >= 2)) localpatch = kp_positionnum[num % 10][6]; else localpatch = kp_positionnum[num % 10][3]; @@ -4157,7 +4190,7 @@ static void K_DrawKartPositionNum(INT32 num) else localpatch = kp_positionnum[num % 10][0]; - V_DrawTranslucentPatch(X, POSI_Y, V_NOSCALESTART|V_TRANSLUCENT|V_SNAPTORIGHT|V_SNAPTOBOTTOM, localpatch); + V_DrawTranslucentPatch(X, STRINGY(POSI_Y), flags, localpatch); num /= 10; } } @@ -4215,17 +4248,17 @@ static void K_drawKartPositionFaces(void) { colormap = colormaps; if (rankplayer[i] != myplayer) - V_DrawSmallTranslucentPatch(FACE_X, Y, 0, faceprefix[players[rankplayer[i]].skin]); + V_DrawSmallTranslucentPatch(FACE_X, STRINGY(Y), V_SNAPTOLEFT, faceprefix[players[rankplayer[i]].skin]); else - V_DrawSmallScaledPatch(FACE_X, Y, 0, faceprefix[players[rankplayer[i]].skin]); + V_DrawSmallScaledPatch(FACE_X, STRINGY(Y), V_SNAPTOLEFT, faceprefix[players[rankplayer[i]].skin]); } else { colormap = R_GetTranslationColormap(players[rankplayer[i]].skin, players[rankplayer[i]].mo->color, GTC_CACHE); if (rankplayer[i] != myplayer) - V_DrawSmallTranslucentMappedPatch(FACE_X, Y, 0, faceprefix[players[rankplayer[i]].skin], colormap); + V_DrawSmallTranslucentMappedPatch(FACE_X, STRINGY(Y), V_SNAPTOLEFT, faceprefix[players[rankplayer[i]].skin], colormap); else - V_DrawSmallMappedPatch(FACE_X, Y, 0, faceprefix[players[rankplayer[i]].skin], colormap); + V_DrawSmallMappedPatch(FACE_X, STRINGY(Y), V_SNAPTOLEFT, faceprefix[players[rankplayer[i]].skin], colormap); } // Draws the little number over the face switch (players[rankplayer[i]].kartstuff[k_position]) @@ -4237,30 +4270,47 @@ static void K_drawKartPositionFaces(void) default: break; } if (rankplayer[i] != myplayer) - V_DrawSmallTranslucentPatch(FACE_X, Y, 0, localpatch); + V_DrawSmallTranslucentPatch(FACE_X, STRINGY(Y), V_SNAPTOLEFT, localpatch); else - V_DrawSmallScaledPatch(FACE_X, Y, 0, localpatch); + V_DrawSmallScaledPatch(FACE_X, STRINGY(Y), V_SNAPTOLEFT, localpatch); Y += 18; } } +static void K_drawKartLaps(void) +{ + INT32 flags = V_SNAPTOLEFT|V_SNAPTOBOTTOM; + if (splitscreen) + flags = 0; + + V_DrawScaledPatch(LAPS_X, STRINGY(LAPS_Y), flags, kp_lapsticker); + + if (stplyr->exiting) + V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), flags, "FIN"); + else + V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), flags, va("%d/%d", stplyr->laps+1, cv_numlaps.value)); +} + static void K_drawKartSpeedometer(void) { fixed_t convSpeed; + INT32 flags = V_SNAPTOLEFT|V_SNAPTOBOTTOM; + if (splitscreen) + flags = 0; if (cv_speedometer.value == 1) { convSpeed = FixedMul(stplyr->speed, 142371)/FRACUNIT; // 2.172409058 - V_DrawKartString(9, STRINGY(155), 0, va("%3d km/h", convSpeed)); + V_DrawKartString(SPDM_X, STRINGY(SPDM_Y), flags, va("%3d km/h", convSpeed)); } else if (cv_speedometer.value == 2) { convSpeed = FixedMul(stplyr->speed, 88465)/FRACUNIT; // 1.349868774 - V_DrawKartString(9, STRINGY(155), 0, va("%3d mph", convSpeed)); + V_DrawKartString(SPDM_X, STRINGY(SPDM_Y), flags, va("%3d mph", convSpeed)); } else if (cv_speedometer.value == 3) { convSpeed = stplyr->speed/FRACUNIT; - V_DrawKartString(9, STRINGY(155), 0, va("%3d Fracunits/s", convSpeed)); + V_DrawKartString(SPDM_X, STRINGY(SPDM_Y), flags, va("%3d Fracunits/s", convSpeed)); } } @@ -4290,23 +4340,20 @@ static void K_drawKartPlayerCheck(void) { INT32 i; UINT8 *colormap; - fixed_t x; + INT32 x; patch_t *localpatch; - if (splitscreen) + if (!(stplyr->mo)) return; - if (!(players[displayplayer].mo)) - return; - - if (players[displayplayer].awayviewtics) + if (stplyr->awayviewtics) return; for (i = 0; i < MAXPLAYERS; i++) { - if (i == displayplayer) + if (&players[i] == stplyr) continue; - if (players[i].mo == NULL) + if (!(players[i].mo)) continue; if ((players[i].kartstuff[k_startimer] <= 0) && (leveltime & 2)) @@ -4328,15 +4375,16 @@ static void K_drawKartPlayerCheck(void) localpatch = kp_check; } - x = K_FindCheckX(players[displayplayer].mo->x, players[displayplayer].mo->y, players[displayplayer].mo->angle, players[i].mo->x, players[i].mo->y); + x = K_FindCheckX(stplyr->mo->x, stplyr->mo->y, stplyr->mo->angle, players[i].mo->x, players[i].mo->y); if (x <= 320 && x >= 0) { if (x < 14) x = 14; else if (x > 306) x = 306; + colormap = R_GetTranslationColormap(-1, players[i].mo->color, 0); - V_DrawMappedPatch(x, 200, 0, localpatch, colormap); + V_DrawMappedPatch(x, STRINGY(CHEK_Y), V_SNAPTOBOTTOM, localpatch, colormap); } } } @@ -4462,11 +4510,11 @@ void K_drawKartHUD(void) if (stplyr->kartstuff[k_lapanimation]) K_drawLapLakitu(); - } - // Draw the CHECK indicator first, so it's overlapped by everything else - if (cv_kartcheck.value) - K_drawKartPlayerCheck(); + // Draw the CHECK indicator before the other items too, so it's overlapped by everything else + if (cv_kartcheck.value) + K_drawKartPlayerCheck(); + } // If the item window is closing, draw it closing! if (stplyr->kartstuff[k_itemclose]) @@ -4485,22 +4533,19 @@ void K_drawKartHUD(void) if (gametype == GT_RACE) // Race-only elements { - // If not splitscreen, draw... - // The little triple-item icons at the bottom - // The top-four faces on the left if (!(splitscreen || modeattacking)) { + // If not splitscreen, draw... + // The little triple-item icons at the bottom + // The top-four faces on the left K_drawKartPositionFaces(); - // Draw the numerical position - K_DrawKartPositionNum(stplyr->kartstuff[k_position]); } + // Draw the numerical position + K_DrawKartPositionNum(stplyr->kartstuff[k_position]); + // Draw the lap counter - V_DrawScaledPatch(LAPS_X, STRINGY(LAPS_Y), 0, kp_lapsticker); - if (stplyr->exiting) - V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), 0, "FIN"); - else - V_DrawKartString(LAPS_X+33, STRINGY(LAPS_Y+3), 0, va("%d/%d", stplyr->laps+1, cv_numlaps.value)); + K_drawKartLaps(); } // Draw the timestamp From 7fcca8f2d1ffbc8c0fa0f50f63d0ed016a4c44ab Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 7 Nov 2017 00:57:42 -0500 Subject: [PATCH 44/61] Added feather --- src/d_netcmd.c | 1 + src/d_netcmd.h | 1 + src/d_player.h | 1 + src/k_kart.c | 36 +++++++++++++++++++++++++++++++++--- src/p_inter.c | 13 +++++++------ src/p_map.c | 14 ++++++++++++++ src/p_mobj.c | 2 +- src/p_user.c | 6 ++++-- src/sounds.c | 1 + src/sounds.h | 1 + 10 files changed, 64 insertions(+), 12 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 8f583f20..ee26c09a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -313,6 +313,7 @@ consvar_t cv_jaws = {"jaws", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, consvar_t cv_fireflower = {"fireflowers", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_tripleredshell = {"tripleredshells", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_lightning = {"lightning", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_feather = {"feathers", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcheck = {"kartcheck", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 42b208f2..deda42cd 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -103,6 +103,7 @@ extern consvar_t cv_magnet, cv_boo, cv_mushroom, cv_triplemushroom, cv_megashroo extern consvar_t cv_goldshroom, cv_star, cv_triplebanana, cv_fakeitem, cv_banana; extern consvar_t cv_greenshell, cv_redshell, cv_laserwisp, cv_triplegreenshell, cv_bobomb; extern consvar_t cv_blueshell, cv_jaws, cv_fireflower, cv_tripleredshell, cv_lightning; +extern consvar_t cv_feather; extern consvar_t cv_karthud; extern consvar_t cv_kartcheck; diff --git a/src/d_player.h b/src/d_player.h index 80bf47f1..287a8fee 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -305,6 +305,7 @@ typedef enum k_tripleredshell, // 0x1 = 1 Red Shell orbiting, 0x2 = 2 Red Shells orbiting // 0x4 = 3 Red Shells orbiting, 0x8 = Triple Red Shell in inventory k_lightning, // 0x1 = Lightning in inventory + k_feather, // 0x1 = Feather in inventory, 0x2 = Player is feather jumping k_kitchensink, // 0x1 = Sink in inventory k_balloon, // Battle mode, number of balloons left k_comebackhits, // Battle mode, number of times hit in comeback mode diff --git a/src/k_kart.c b/src/k_kart.c index 9517ca91..8081065a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -300,6 +300,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_fireflower); CV_RegisterVar(&cv_tripleredshell); CV_RegisterVar(&cv_lightning); + CV_RegisterVar(&cv_feather); CV_RegisterVar(&cv_kartcheck); CV_RegisterVar(&cv_kartcc); @@ -325,7 +326,7 @@ UINT8 K_GetKartCC(void) //{ SRB2kart Roulette Code - Position Based -#define NUMKARTITEMS 18 +#define NUMKARTITEMS 19 #define NUMKARTODDS 40 // Ugly ol' 3D arrays @@ -708,7 +709,9 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = /*Blue Shell*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Blue Shell /*Fire Flower*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower /*Triple Red Shell*/ { 1, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell - /*Lightning*/ { 0, 0, 0, 0, 0, 0, 0, 1, 2, 0 } // Lightning + /*Lightning*/ { 0, 0, 0, 0, 0, 0, 0, 1, 2, 0 }, // Lightning + + /*Feather*/ { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Feather }; /** \brief Item Roulette for Kart @@ -789,6 +792,9 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro case 18: // Lightning player->kartstuff[k_lightning] = 1; break; + case 19: // Feather + player->kartstuff[k_feather] |= 1; + break; default: // Mushroom - Doing it here as a fail-safe if (getitem != 3) CONS_Printf("ERROR: P_KartGetItemResult - Item roulette gave bad item (%d), giving Mushroom instead.\n", getitem); @@ -1032,6 +1038,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower if (cv_tripleredshell.value) SETITEMRESULT(useodds, 17); // Triple Red Shell if (cv_lightning.value && pingame > pexiting) SETITEMRESULT(useodds, 18); // Lightning + if (cv_feather.value) SETITEMRESULT(useodds, 19); // Triple Red Shell prandom = P_RandomKey(numchoices); @@ -1441,7 +1448,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->mo->momz *= player->kartstuff[k_jmp]; player->kartstuff[k_jmp] = 0; } - */ + */ + + if (P_IsObjectOnGround(player->mo) && !(player->mo->momz) + && player->kartstuff[k_feather] & 2) + player->kartstuff[k_feather] &= ~2; if (cmd->buttons & BT_JUMP) player->kartstuff[k_jmp] = 1; @@ -2722,6 +2733,7 @@ static boolean K_CheckForHoldItem(player_t *player) static void K_StripItems(player_t *player) { if ( player->kartstuff[k_kitchensink] + || player->kartstuff[k_feather] & 1 || player->kartstuff[k_lightning] || player->kartstuff[k_tripleredshell] || player->kartstuff[k_fireflower] @@ -2747,6 +2759,7 @@ static void K_StripItems(player_t *player) || player->kartstuff[k_itemroulette] ) player->kartstuff[k_itemclose] = 10; player->kartstuff[k_kitchensink] = 0; + player->kartstuff[k_feather] = 0; player->kartstuff[k_lightning] = 0; player->kartstuff[k_tripleredshell] = 0; player->kartstuff[k_fireflower] = 0; @@ -3216,6 +3229,20 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->pflags |= PF_ATTACKDOWN; player->kartstuff[k_magnet] = 0; } + // Feather + else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_feather] & 1 && NO_BOO) + { + S_StartSound(player->mo, sfx_boing); // Boing! + K_PlayTauntSound(player->mo); + + player->mo->momz = FixedMul(15<mo->scale); + + player->pflags |= PF_ATTACKDOWN; + player->kartstuff[k_feather] |= 2; + player->kartstuff[k_feather] &= ~1; + + player->kartstuff[k_itemclose] = 10; + } // Mushroom Boost if (((player->kartstuff[k_mushroomtimer] > 0 && player->kartstuff[k_boosting] == 0) @@ -3465,6 +3492,7 @@ static patch_t *kp_blueshell; static patch_t *kp_fireflower; static patch_t *kp_tripleredshell; static patch_t *kp_lightning; +static patch_t *kp_feather; static patch_t *kp_kitchensink; static patch_t *kp_itemused1; static patch_t *kp_itemused2; @@ -3602,6 +3630,7 @@ void K_LoadKartHUDGraphics(void) kp_fireflower = W_CachePatchName("K_ITFIRE", PU_HUDGFX); kp_tripleredshell = W_CachePatchName("K_ITTRED", PU_HUDGFX); kp_lightning = W_CachePatchName("K_ITLIGH", PU_HUDGFX); + kp_feather = W_CachePatchName("K_ITFETH", PU_HUDGFX); kp_kitchensink = W_CachePatchName("K_ITSINK", PU_HUDGFX); // Item-used - Closing the item window after an item is used @@ -3917,6 +3946,7 @@ static void K_drawKartRetroItem(void) && (leveltime & 2)) localpatch = kp_boosteal; else if (stplyr->kartstuff[k_boostolentimer] > 0 && !(leveltime & 2)) localpatch = kp_noitem; else if (stplyr->kartstuff[k_kitchensink] == 1) localpatch = kp_kitchensink; + else if (stplyr->kartstuff[k_feather] & 1) localpatch = kp_feather; else if (stplyr->kartstuff[k_lightning] == 1) localpatch = kp_lightning; else if (stplyr->kartstuff[k_tripleredshell]) localpatch = kp_tripleredshell; // &8 else if (stplyr->kartstuff[k_fireflower] == 1) localpatch = kp_fireflower; diff --git a/src/p_inter.c b/src/p_inter.c index acda04be..ba4c7c93 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -150,9 +150,13 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) //if (player->powers[pw_flashing] > (flashingtics/4)*3 && player->powers[pw_flashing] <= flashingtics) // return false; - if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) // No balloons in Match return false; - + + if (player->kartstuff[k_bootaketimer] || player->kartstuff[k_boostolentimer] + || player->kartstuff[k_growshrinktimer] > 1 || player->kartstuff[k_goldshroomtimer]) // Item-specific timer going off + return false; + if (player->kartstuff[k_itemroulette] || player->kartstuff[k_greenshell] || player->kartstuff[k_triplegreenshell] || player->kartstuff[k_redshell] || player->kartstuff[k_tripleredshell] @@ -162,10 +166,7 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) || player->kartstuff[k_mushroom] || player->kartstuff[k_fireflower] || player->kartstuff[k_star] || player->kartstuff[k_goldshroom] || player->kartstuff[k_lightning] || player->kartstuff[k_megashroom] - || player->kartstuff[k_boo] || player->kartstuff[k_bootaketimer] - || player->kartstuff[k_boostolentimer] - || player->kartstuff[k_growshrinktimer] > 1 - || player->kartstuff[k_goldshroomtimer]) + || player->kartstuff[k_boo] || player->kartstuff[k_feather] & 1) // Item slot already taken up return false; return true; diff --git a/src/p_map.c b/src/p_map.c index 846d1cd1..dd9ce6b4 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1661,9 +1661,23 @@ static boolean PIT_CheckThing(mobj_t *thing) } if (P_IsObjectOnGround(thing) && tmthing->momz < 0) + { K_KartBouncing(tmthing, thing, true); + if (tmthing->player->kartstuff[k_feather] & 2) + { + K_StealBalloon(tmthing->player, thing->player); + K_SpinPlayer(thing->player, tmthing); + } + } else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) + { K_KartBouncing(thing, tmthing, true); + if (thing->player->kartstuff[k_feather] & 2) + { + K_StealBalloon(thing->player, tmthing->player); + K_SpinPlayer(tmthing->player, thing); + } + } else K_KartBouncing(tmthing, thing, false); diff --git a/src/p_mobj.c b/src/p_mobj.c index 7f2f005b..c7f6f54c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6778,7 +6778,7 @@ void P_MobjThinker(mobj_t *mobj) else if (mobj->target->player->kartstuff[k_fireflower]) P_SetMobjState(mobj, S_PLAYERARROW_FIREFLOWER); else if (mobj->target->player->kartstuff[k_bobomb]) P_SetMobjState(mobj, S_PLAYERARROW_BOBOMB); else if (mobj->target->player->kartstuff[k_redshell]) P_SetMobjState(mobj, S_PLAYERARROW_REDSHELL); - //else if (mobj->target->player->kartstuff[k_feather]) P_SetMobjState(mobj, S_PLAYERARROW_FEATHER); + else if (mobj->target->player->kartstuff[k_feather] & 1) P_SetMobjState(mobj, S_PLAYERARROW_FEATHER); else if (mobj->target->player->kartstuff[k_boo] == 1) P_SetMobjState(mobj, S_PLAYERARROW_BOO); else if (mobj->target->player->kartstuff[k_fakeitem] & 2) P_SetMobjState(mobj, S_PLAYERARROW_FAKEITEM); else if (mobj->target->player->kartstuff[k_banana]) P_SetMobjState(mobj, S_PLAYERARROW_BANANA); diff --git a/src/p_user.c b/src/p_user.c index 02d545ae..ed36497b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6700,10 +6700,12 @@ static void P_MovePlayer(player_t *player) { K_KartMoveAnimation(player); - player->frameangle = player->mo->angle; + if (player->kartstuff[k_feather] & 2) + player->frameangle += ANGLE_22h; + else + player->frameangle = player->mo->angle; } - player->mo->movefactor = FRACUNIT; // We're not going to do any more with this, so let's change it back for the next frame. // If you are stopped and are still walking, stand still! diff --git a/src/sounds.c b/src/sounds.c index 75b5e259..a968f999 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -502,6 +502,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"tossed", false,150, 8, -1, NULL, 0, -1, -1, LUMPERROR}, {"shelit", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR}, {"vroom", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"boing", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // SRB2kart - Skin sounds {"kwin", false, 64, 0, -1, NULL, 0, SKSWIN, -1, LUMPERROR}, diff --git a/src/sounds.h b/src/sounds.h index 20084985..df3653d9 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -574,6 +574,7 @@ typedef enum sfx_tossed, sfx_shelit, sfx_vroom, + sfx_boing, sfx_kwin, sfx_klose, From 01afd52ad0c97dd63117629317dd12542a1f1275 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 7 Nov 2017 02:36:27 -0500 Subject: [PATCH 45/61] Bounce pad sector type Uses Ice/Sludge sector effect (new friction doesn't need it) --- src/k_kart.c | 24 +++++++++++++++++++++--- src/k_kart.h | 1 + src/p_mobj.c | 2 +- src/p_spec.c | 12 +++++++++++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8081065a..fa084fb7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2444,6 +2444,26 @@ static void K_DoLightning(player_t *player, boolean bluelightning) player->kartstuff[k_sounds] = 50; } +void K_DoBouncePad(player_t *player, fixed_t vertispeed) +{ + if (player->spectator || !player->mo) + return; + + if (player->mo->eflags & MFE_SPRUNG) + return; + +#ifdef ESLOPE + player->mo->standingslope = NULL; +#endif + player->mo->eflags |= MFE_SPRUNG; + + if (player->mo->eflags & MFE_VERTICALFLIP) + vertispeed *= -1; + + player->mo->momz = FixedMul(vertispeed, player->mo->scale); + S_StartSound(player->mo, sfx_boing); +} + // countersteer is how strong the controls are telling us we are turning // turndir is the direction the controls are telling us to turn, -1 if turning right and 1 if turning left static INT16 K_GetKartDriftValue(player_t *player, fixed_t countersteer) @@ -3232,10 +3252,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Feather else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_feather] & 1 && NO_BOO) { - S_StartSound(player->mo, sfx_boing); // Boing! K_PlayTauntSound(player->mo); - - player->mo->momz = FixedMul(15<mo->scale); + K_DoBouncePad(player, 16<pflags |= PF_ATTACKDOWN; player->kartstuff[k_feather] |= 2; diff --git a/src/k_kart.h b/src/k_kart.h index f7be4204..36c8c0b9 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -26,6 +26,7 @@ void K_StealBalloon(player_t *player, player_t *victim); 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 *source); void K_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); +void K_DoBouncePad(player_t *player, fixed_t vertispeed); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); void K_MomentumToFacing(player_t *player); fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower); diff --git a/src/p_mobj.c b/src/p_mobj.c index c7f6f54c..7c5fca01 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9266,7 +9266,7 @@ void P_RespawnBattleSpecials(void) return; // Didn't collect enough boxes - if (numgotboxes < (9*nummapboxes/10)) + if (numgotboxes < (4*nummapboxes/5)) return; // wait a teeeensy bit after collecting everything diff --git a/src/p_spec.c b/src/p_spec.c index 8830e007..bc25ac79 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3728,7 +3728,17 @@ DoneSection2: // Process Section 3 switch (special) { - case 1: // Unused (was "Ice/Sludge") + case 1: // SRB2kart: bounce pad + if (!P_IsObjectOnGround(player->mo)) + break; + + if (player->speed < K_GetKartSpeed(player, true)/16 && !(player->mo->eflags & MFE_SPRUNG)) // Push forward to prevent getting stuck + P_InstaThrust(player->mo, player->mo->angle, FixedMul(K_GetKartSpeed(player, true)/16, player->mo->scale)); + + K_DoBouncePad(player, 12< Date: Tue, 7 Nov 2017 15:04:21 -0500 Subject: [PATCH 46/61] Made Frantic Mode work in Battle Mode & provide more silly results Also fixed flashing --- src/k_kart.c | 41 ++++++++++++++++++++++++++--------------- src/p_user.c | 3 ++- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index fa084fb7..7902976a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -692,26 +692,26 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][10] = { //P-Odds 0 1 2 3 4 5 6 7 8 9 /*Magnet*/ { 0, 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet - /*Boo*/ { 4, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo - /*Mushroom*/ { 4, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom + /*Boo*/ { 3, 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo + /*Mushroom*/ { 5, 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom /*Mega Mushroom*/ { 1, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Gold Mushroom /*Star*/ { 1, 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Star - /*Triple Banana*/ { 2, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana - /*Fake Item*/ { 4, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item - /*Banana*/ { 4, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Green Shell*/ { 4, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell - /*Red Shell*/ { 2, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell - /*Triple Green Shell*/ { 2, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell - /*Bob-omb*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb + /*Triple Banana*/ { 3, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana + /*Fake Item*/ { 5, 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item + /*Banana*/ { 5, 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Green Shell*/ { 5, 0, 6, 4, 3, 2, 0, 0, 0, 0 }, // Green Shell + /*Red Shell*/ { 3, 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell + /*Triple Green Shell*/ { 3, 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell + /*Bob-omb*/ { 3, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb /*Blue Shell*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Blue Shell - /*Fire Flower*/ { 2, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower + /*Fire Flower*/ { 3, 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower /*Triple Red Shell*/ { 1, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell /*Lightning*/ { 0, 0, 0, 0, 0, 0, 0, 1, 2, 0 }, // Lightning - /*Feather*/ { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Feather + /*Feather*/ { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Feather }; /** \brief Item Roulette for Kart @@ -936,6 +936,16 @@ static void K_KartItemRouletteByPosition(player_t *player, ticcmd_t *cmd) //} +static INT32 K_KartGetItemOdds(INT32 pos, INT32 itemnum) +{ + INT32 newodds = (K_KartItemOddsDistance_Retro[itemnum-1][pos]); + if ((cv_kartfrantic.value) && (itemnum == 1 || itemnum == 4 || itemnum == 5 || itemnum == 6 + || itemnum == 7 || itemnum == 8 || itemnum == 12 || itemnum == 13 || itemnum == 14 || itemnum == 15 + || itemnum == 16 || itemnum == 17 || itemnum == 18)) + newodds *= 2; + return newodds; +} + //{ SRB2kart Roulette Code - Distance Based, no waypoints static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) @@ -997,8 +1007,8 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (cv_kartfrantic.value) // Stupid items { - pdis = (13*pdis/14); // multiply... - pdis += distvar; // then set everyone back another place... + pdis = (15*pdis/14); // multiply... + pdis += distvar; // set everyone back another place... } if (gametype == GT_MATCH @@ -1015,7 +1025,8 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) else useodds = 9; #define SETITEMRESULT(pos, itemnum) \ - for (chance = 0; chance < K_KartItemOddsDistance_Retro[itemnum-1][pos]; chance++) spawnchance[numchoices++] = itemnum + for (chance = 0; chance < K_KartGetItemOdds(pos, itemnum); chance++) \ + spawnchance[numchoices++] = itemnum // Check the game type to differentiate odds. //if (gametype == GT_RETRO) @@ -1038,7 +1049,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower if (cv_tripleredshell.value) SETITEMRESULT(useodds, 17); // Triple Red Shell if (cv_lightning.value && pingame > pexiting) SETITEMRESULT(useodds, 18); // Lightning - if (cv_feather.value) SETITEMRESULT(useodds, 19); // Triple Red Shell + if (cv_feather.value) SETITEMRESULT(useodds, 19); // Feather prandom = P_RandomKey(numchoices); diff --git a/src/p_user.c b/src/p_user.c index ed36497b..b8b5cae7 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -9464,7 +9464,8 @@ void P_PlayerThink(player_t *player) { // SRB2kart - fixes boo not flashing when it should. Mega doesn't flash either. Flashing is local. if ((player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) - && player->kartstuff[k_bootimer] == 0 && player->kartstuff[k_comebacktimer] == 0 && player->kartstuff[k_growshrinktimer] <= 0) + && player->kartstuff[k_bootimer] == 0 && player->kartstuff[k_growshrinktimer] <= 0 + && (player->kartstuff[k_comebacktimer] == 0 || (gametype != GT_RACE && player->kartstuff[k_balloon] > 0))) { if (player->powers[pw_flashing] > 0 && player->powers[pw_flashing] < flashingtics && (leveltime & 1)) player->mo->flags2 |= MF2_DONTDRAW; From 890637c4ab5aae5dc06be2fa7e2cc13682774fe4 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 7 Nov 2017 18:35:05 -0500 Subject: [PATCH 47/61] Expose some functions to Lua --- src/k_kart.c | 2 +- src/lua_baselib.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++ src/p_user.c | 2 +- 3 files changed, 175 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7902976a..e3d703dc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1111,7 +1111,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) mobj2->momz = newz; } - mass1 = mass2 = 1*FRACUNIT; + mass1 = mass2 = 5*FRACUNIT; if (mobj1->player) mass1 = (mobj1->player->kartweight)*FRACUNIT; if (mobj2->player) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index aa2ebf65..61d9e8f3 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -20,6 +20,7 @@ #include "m_random.h" #include "s_sound.h" #include "g_game.h" +#include "k_kart.h" #include "lua_script.h" #include "lua_libs.h" @@ -1981,6 +1982,163 @@ static int lib_gTicsToMilliseconds(lua_State *L) return 1; } +// K_KART +//////////// + +static int lib_kGetKartColorByName(lua_State *L) +{ + const char *name = luaL_checkstring(L, 1); + //HUDSAFE + lua_pushinteger(L, K_GetKartColorByName(name)); + return 1; +} + +static int lib_kGetKartCC(lua_State *L) +{ + //HUDSAFE + lua_pushinteger(L, K_GetKartCC()); + return 1; +} + +static int lib_kKartBouncing(lua_State *L) +{ + mobj_t *mobj1 = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + mobj_t *mobj2 = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ)); + boolean bounce = luaL_checkboolean(L, 3); + NOHUD + if (!mobj1) + return LUA_ErrInvalid(L, "mobj_t"); + if (!mobj2) + return LUA_ErrInvalid(L, "mobj_t"); + K_KartBouncing(mobj1, mobj2, bounce); + return 0; +} + +static int lib_kSpinPlayer(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + mobj_t *source = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ)); + NOHUD + if (!player) + return LUA_ErrInvalid(L, "player_t"); + if (!source) + return LUA_ErrInvalid(L, "mobj_t"); + K_SpinPlayer(player, source); + return 0; +} + +static int lib_kSquishPlayer(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + mobj_t *source = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ)); + NOHUD + if (!player) + return LUA_ErrInvalid(L, "player_t"); + if (!source) + return LUA_ErrInvalid(L, "mobj_t"); + K_SquishPlayer(player, source); + return 0; +} + +static int lib_kExplodePlayer(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + mobj_t *source = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ)); + NOHUD + if (!player) + return LUA_ErrInvalid(L, "player_t"); + if (!source) + return LUA_ErrInvalid(L, "mobj_t"); + K_ExplodePlayer(player, source); + return 0; +} + +static int lib_kStealBalloon(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + player_t *victim = *((player_t **)luaL_checkudata(L, 2, META_PLAYER)); + NOHUD + if (!player) + return LUA_ErrInvalid(L, "player_t"); + if (!victim) + return LUA_ErrInvalid(L, "player_t"); + K_StealBalloon(player, victim); + return 0; +} + +static int lib_kSpawnKartExplosion(lua_State *L) +{ + fixed_t x = luaL_checkfixed(L, 1); + fixed_t y = luaL_checkfixed(L, 2); + fixed_t z = luaL_checkfixed(L, 3); + fixed_t radius = luaL_checkfixed(L, 4); + INT32 number = (INT32)luaL_checkinteger(L, 5); + mobjtype_t type = luaL_checkinteger(L, 6); + angle_t rotangle = luaL_checkangle(L, 7); + boolean spawncenter = luaL_checkboolean(L, 8); + boolean ghostit = luaL_checkboolean(L, 9); + mobj_t *source = *((mobj_t **)luaL_checkudata(L, 10, META_MOBJ)); + NOHUD + if (!source) + return LUA_ErrInvalid(L, "mobj_t"); + K_SpawnKartExplosion(x, y, z, radius, number, type, rotangle, spawncenter, ghostit, source); + return 0; +} + +static int lib_kSpawnDriftTrail(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + NOHUD + if (!player) + return LUA_ErrInvalid(L, "player_t"); + K_SpawnDriftTrail(player); + return 0; +} + +static int lib_kDoMushroom(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + boolean doPFlag = luaL_checkboolean(L, 2); + boolean startboost = luaL_checkboolean(L, 3); + NOHUD + if (!player) + return LUA_ErrInvalid(L, "player_t"); + K_DoMushroom(player, doPFlag, startboost); + return 0; +} + +static int lib_kDoBouncePad(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + fixed_t vertispeed = luaL_checkfixed(L, 2); + NOHUD + if (!player) + return LUA_ErrInvalid(L, "player_t"); + K_DoBouncePad(player, vertispeed); + return 0; +} + +static int lib_kMomentumToFacing(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + NOHUD + if (!player) + return LUA_ErrInvalid(L, "player_t"); + K_MomentumToFacing(player); + return 0; +} + +static int lib_kGetKartSpeed(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + boolean doboostpower = luaL_checkboolean(L, 2); + //HUDSAFE + if (!player) + return LUA_ErrInvalid(L, "player_t"); + lua_pushinteger(L, K_GetKartSpeed(player, doboostpower)); + return 0; +} + static luaL_Reg lib[] = { {"print", lib_print}, {"EvalMath", lib_evalMath}, @@ -2154,6 +2312,21 @@ static luaL_Reg lib[] = { {"G_TicsToCentiseconds",lib_gTicsToCentiseconds}, {"G_TicsToMilliseconds",lib_gTicsToMilliseconds}, + // k_kart + {"K_GetKartColorByName",lib_kGetKartColorByName}, + {"K_GetKartCC",lib_kGetKartCC}, + {"K_KartBouncing",lib_kKartBouncing}, + {"K_SpinPlayer",lib_kSpinPlayer}, + {"K_SquishPlayer",lib_kSquishPlayer}, + {"K_ExplodePlayer",lib_kExplodePlayer}, + {"K_StealBalloon",lib_kStealBalloon}, + {"K_SpawnKartExplosion",lib_kSpawnKartExplosion}, + {"K_SpawnDriftTrail",lib_kSpawnDriftTrail}, + {"K_DoMushroom",lib_kDoMushroom}, + {"K_DoBouncePad",lib_kDoBouncePad}, + {"K_MomentumToFacing",lib_kMomentumToFacing}, + {"K_GetKartSpeed",lib_kGetKartSpeed}, + {NULL, NULL} }; diff --git a/src/p_user.c b/src/p_user.c index b8b5cae7..f08dfd3e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6499,7 +6499,7 @@ static void P_MovePlayer(player_t *player) */ cmd = &player->cmd; - runspd = FixedMul(player->runspeed, player->mo->scale); + runspd = 14*player->mo->scale; //srb2kart // Let's have some movement speed fun on low-friction surfaces, JUST for players... // (high friction surfaces shouldn't have any adjustment, since the acceleration in From 8fbdbb4c6441356e0ed75f55b974411d9d35538b Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sat, 11 Nov 2017 00:25:57 +0000 Subject: [PATCH 48/61] Fix shells spawning under FOFs Make items dropped behind you fall on the floor properly Fix bananas getting stuck in midair if they aren't moving --- src/k_kart.c | 52 ++++++++++++++++++++++++++++++++++++++++------------ src/p_mobj.c | 15 ++++++++------- 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9059c1ba..37f1a43d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1842,18 +1842,6 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle th->flags2 |= flags2; - if (P_IsObjectOnGround(source)) - { - // spawn on the ground if the player is on the ground - if (P_MobjFlip(source) < 0) - { - th->z = th->ceilingz - th->height; - th->eflags |= MFE_VERTICALFLIP; - } - else - th->z = th->floorz; - } - th->threshold = 10; #ifdef WEAPON_SFX @@ -1868,6 +1856,21 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle P_SetTarget(&th->target, source); + if (P_IsObjectOnGround(source)) + { + // floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn + // This should set it for FOFs + P_TeleportMove(th, th->x, th->y, th->z); + // spawn on the ground if the player is on the ground + if (P_MobjFlip(source) < 0) + { + th->z = th->ceilingz - th->height; + th->eflags |= MFE_VERTICALFLIP; + } + else + th->z = th->floorz; + } + th->angle = an; th->momx = FixedMul(speed, FINECOSINE(an>>ANGLETOFINESHIFT)); th->momy = FixedMul(speed, FINESINE(an>>ANGLETOFINESHIFT)); @@ -2072,9 +2075,34 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map mo = P_SpawnMobj(newx, newy, player->mo->z, mapthing); + if (P_MobjFlip(player->mo) < 0) + mo->z = player->mo->z + player->mo->height - mo->height; + mo->threshold = 10; P_SetTarget(&mo->target, player->mo); + if (P_IsObjectOnGround(player->mo)) + { + // floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn + // This should set it for FOFs + P_TeleportMove(mo, mo->x, mo->y, mo->z); + + if (P_MobjFlip(mo) > 0) + { + if (mo->floorz > mo->target->z - mo->height) + { + mo->z = mo->floorz; + } + } + else + { + if (mo->ceilingz < mo->target->z + mo->target->height + mo->height) + { + mo->z = mo->ceilingz - mo->height; + } + } + } + if (mo) { if (player->mo->eflags & MFE_VERTICALFLIP) diff --git a/src/p_mobj.c b/src/p_mobj.c index 8370fb64..aa2d0ff3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2303,6 +2303,14 @@ static boolean P_ZMovement(mobj_t *mo) case MT_BIGTUMBLEWEED: case MT_LITTLETUMBLEWEED: case MT_SHELL: + // SRB2kart stuff that should die in pits + // Shouldn't stop moving along the Z if there's no speed though! + case MT_FAKEITEM: + case MT_BANANAITEM: + case MT_GREENITEM: + case MT_REDITEM: + case MT_REDITEMDUD: + case MT_FIREBALL: // Remove stuff from death pits. if (P_CheckDeathPitCollide(mo)) { @@ -2329,13 +2337,6 @@ static boolean P_ZMovement(mobj_t *mo) case MT_FLINGCOIN: case MT_FLINGRANDOMITEM: case MT_FLINGEMERALD: - // SRB2kart stuff that should die in pits - case MT_RANDOMITEM: - case MT_BANANAITEM: - case MT_GREENITEM: - case MT_REDITEM: - case MT_REDITEMDUD: - case MT_FIREBALL: // Remove flinged stuff from death pits. if (P_CheckDeathPitCollide(mo)) { From d480ce24a95b8bc857b8b629abdf929e90b88c60 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sat, 11 Nov 2017 01:17:42 +0000 Subject: [PATCH 49/61] Stop players bumping when they're reborn --- src/k_kart.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 37f1a43d..4bbb7b40 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1050,6 +1050,11 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce) if (!mobj1 || !mobj2) return; + // Don't bump when you're being reborn + if ((mobj1->player && mobj1->player->playerstate != PST_LIVE) + || (mobj2->player && mobj2->player->playerstate != PST_LIVE)) + return; + if (cv_collidesounds.value == 1) { S_StartSound(mobj1, cv_collidesoundnum.value); From c5920b431f1cbade2828f4509cce7e17e6a4adea Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 10 Nov 2017 21:10:01 -0500 Subject: [PATCH 50/61] Lots of misc stuff - Bomb overlay is invisible during comeback timer, and flickers back in when it's almost up - Show comeback timer on HUD - Feather is stronger & has more gravity - Option to use SMK star alarm instead of overlapping music - Using P_MobjDamage normally on players now defaults to normal spinout instead of shell's instant stop - Some general gametype case fixes (most notably, being able to spin people out in Race using a mushroom) --- src/d_netcmd.c | 2 ++ src/d_netcmd.h | 1 + src/k_kart.c | 33 +++++++++++++++++++++++---------- src/p_inter.c | 25 ++++++++++++++++--------- src/p_map.c | 25 +++++++++++++++---------- src/p_mobj.c | 2 ++ src/p_user.c | 2 +- src/sounds.c | 11 ++++++----- src/sounds.h | 1 + 9 files changed, 67 insertions(+), 35 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ee26c09a..345e8193 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -317,6 +317,8 @@ consvar_t cv_feather = {"feathers", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NU consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcheck = {"kartcheck", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +static CV_PossibleValue_t kartstarsfx_cons_t[] = {{0, "Music"}, {1, "SMK"}, {0, NULL}}; +consvar_t cv_kartstarsfx = {"kartstarsfx", "Music", CV_SAVE, kartstarsfx_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // change default to "SMK"? consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {12, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/d_netcmd.h b/src/d_netcmd.h index deda42cd..8b3cb3ca 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -107,6 +107,7 @@ extern consvar_t cv_feather; extern consvar_t cv_karthud; extern consvar_t cv_kartcheck; +extern consvar_t cv_kartstarsfx; extern consvar_t cv_kartcc; extern consvar_t cv_kartballoons; extern consvar_t cv_kartfrantic; diff --git a/src/k_kart.c b/src/k_kart.c index e3d703dc..571e4d3e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -303,6 +303,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_feather); CV_RegisterVar(&cv_kartcheck); + CV_RegisterVar(&cv_kartstarsfx); CV_RegisterVar(&cv_kartcc); CV_RegisterVar(&cv_kartballoons); CV_RegisterVar(&cv_kartfrantic); @@ -1382,6 +1383,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_spinouttimer]) player->kartstuff[k_spinouttimer]--; + else if (player->kartstuff[k_comebacktimer]) + player->kartstuff[k_comebacktimer]--; if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == flashingtics) player->powers[pw_flashing]--; @@ -1438,9 +1441,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_poweritemtimer]) player->kartstuff[k_poweritemtimer]--; - if (player->kartstuff[k_comebacktimer]) - player->kartstuff[k_comebacktimer]--; - if (player->kartstuff[k_lapanimation]) player->kartstuff[k_lapanimation]--; @@ -1493,6 +1493,15 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StopSoundByID(player->mo, sfx_mega); // Stop it } + if (player->mo->health > 0 && (player->mo->player->kartstuff[k_startimer] > 0 + || player->mo->player->kartstuff[k_growshrinktimer] > 0)) + { + if (leveltime % 13 == 0 && !P_IsLocalPlayer(player)) + S_StartSound(player->mo, sfx_smkinv); + } + else if (S_SoundPlaying(player->mo, sfx_smkinv)) + S_StopSoundByID(player->mo, sfx_smkinv); + // Plays the music after the starting countdown. if (P_IsLocalPlayer(player) && leveltime == 158) S_ChangeMusicInternal(mapmusname, true); @@ -1652,7 +1661,7 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove fixed_t p_speed = K_GetKartSpeed(player, true); fixed_t p_accel = K_GetKartAccel(player); - if (!onground) return 0; // If the player isn't on the ground, there is no change in speed + if (!onground && !(player->kartstuff[k_feather] & 2)) return 0; // If the player isn't on the ground, there is no change in speed // ACCELCODE!!!1!11! oldspeed = R_PointToDist2(0, 0, player->rmomx, player->rmomy); // FixedMul(P_AproxDistance(player->rmomx, player->rmomy), player->mo->scale); @@ -2920,7 +2929,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { if (P_IsLocalPlayer(player) && !player->exiting) S_ChangeMusicInternal("minvnc", true); - if (!P_IsLocalPlayer(player)) + if (!cv_kartstarsfx.value && !P_IsLocalPlayer(player)) S_StartSound(player->mo, sfx_star); player->kartstuff[k_startimer] = itemtime; // Activate it K_PlayTauntSound(player->mo); @@ -3235,7 +3244,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { if (P_IsLocalPlayer(player) && !player->exiting) S_ChangeMusicInternal("mega", true); - if (!P_IsLocalPlayer(player)) + if (!cv_kartstarsfx.value && !P_IsLocalPlayer(player)) S_StartSound(player->mo, sfx_mega); K_PlayTauntSound(player->mo); player->kartstuff[k_growshrinktimer] = itemtime + TICRATE*2; @@ -3264,7 +3273,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_feather] & 1 && NO_BOO) { K_PlayTauntSound(player->mo); - K_DoBouncePad(player, 16<pflags |= PF_ATTACKDOWN; player->kartstuff[k_feather] |= 2; @@ -3345,10 +3354,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_comebacktimer] > 0) { - if (leveltime & 1) - player->mo->tracer->flags2 |= MF2_DONTDRAW; - else + if (player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1)) player->mo->tracer->flags2 &= ~MF2_DONTDRAW; + else + player->mo->tracer->flags2 |= MF2_DONTDRAW; player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; } @@ -4587,6 +4596,10 @@ void K_drawKartHUD(void) // Draw the speedometer // TODO: Make a better speedometer. K_drawKartSpeedometer(); + + if (gametype != GT_RACE && !stplyr->kartstuff[k_spinouttimer] + && stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer]) + V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(176), 0, va("%d", (stplyr->kartstuff[k_comebacktimer]+TICRATE)/TICRATE)); } //} diff --git a/src/p_inter.c b/src/p_inter.c index ba4c7c93..22e737ae 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3164,17 +3164,24 @@ 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); if (inflictor && (inflictor->type == MT_GREENITEM || inflictor->type == MT_REDITEM || inflictor->type == MT_REDITEMDUD)) - P_PlayerRingBurst(player, 5); - player->mo->momx = player->mo->momy = 0; - if (P_IsLocalPlayer(player)) { - quake.intensity = 32*FRACUNIT; - quake.time = 5; + player->kartstuff[k_spinouttype] = 1; + K_SpinPlayer(player, source); + damage = player->mo->health - 1; + P_RingDamage(player, inflictor, source, damage); + P_PlayerRingBurst(player, 5); + player->mo->momx = player->mo->momy = 0; + if (P_IsLocalPlayer(player)) + { + quake.intensity = 32*FRACUNIT; + quake.time = 5; + } + } + else + { + player->kartstuff[k_spinouttype] = -1; + K_SpinPlayer(player, source); } return true; } diff --git a/src/p_map.c b/src/p_map.c index dd9ce6b4..924ddf46 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1628,6 +1628,7 @@ static boolean PIT_CheckThing(mobj_t *thing) K_StealBalloon(thing->player, tmthing->player); K_ExplodePlayer(tmthing->player, thing); + P_AddPlayerScore(thing->player, 1); // 2 points instead of 1 for getting someone in comeback mode thing->player->kartstuff[k_comebackhits]++; thing->player->kartstuff[k_comebacktimer] = comebacktime * (thing->player->kartstuff[k_comebackhits]+1); @@ -1639,6 +1640,7 @@ static boolean PIT_CheckThing(mobj_t *thing) K_StealBalloon(tmthing->player, thing->player); K_ExplodePlayer(thing->player, tmthing); + P_AddPlayerScore(thing->player, 1); // 2 points instead of 1 for getting someone in comeback mode tmthing->player->kartstuff[k_comebackhits]++; tmthing->player->kartstuff[k_comebacktimer] = comebacktime * (tmthing->player->kartstuff[k_comebackhits]+1); @@ -1663,7 +1665,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (P_IsObjectOnGround(thing) && tmthing->momz < 0) { K_KartBouncing(tmthing, thing, true); - if (tmthing->player->kartstuff[k_feather] & 2) + if (gametype != GT_RACE && tmthing->player->kartstuff[k_feather] & 2) { K_StealBalloon(tmthing->player, thing->player); K_SpinPlayer(thing->player, tmthing); @@ -1672,7 +1674,7 @@ static boolean PIT_CheckThing(mobj_t *thing) else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) { K_KartBouncing(thing, tmthing, true); - if (thing->player->kartstuff[k_feather] & 2) + if (gametype != GT_RACE && thing->player->kartstuff[k_feather] & 2) { K_StealBalloon(thing->player, tmthing->player); K_SpinPlayer(tmthing->player, thing); @@ -1681,15 +1683,18 @@ static boolean PIT_CheckThing(mobj_t *thing) else K_KartBouncing(tmthing, thing, false); - if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) + if (gametype != GT_RACE) { - K_StealBalloon(thing->player, tmthing->player); - K_SpinPlayer(tmthing->player, thing); - } - else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) - { - K_StealBalloon(tmthing->player, thing->player); - K_SpinPlayer(thing->player, tmthing); + if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) + { + K_StealBalloon(thing->player, tmthing->player); + K_SpinPlayer(tmthing->player, thing); + } + else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) + { + K_StealBalloon(tmthing->player, thing->player); + K_SpinPlayer(thing->player, tmthing); + } } thing->player->kartstuff[k_justbumped] = 6; diff --git a/src/p_mobj.c b/src/p_mobj.c index 7c5fca01..9382ac00 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1331,6 +1331,8 @@ fixed_t P_GetMobjGravity(mobj_t *mo) } if (wasflip == !(mo->eflags & MFE_VERTICALFLIP)) // note!! == ! is not equivalent to != here - turns numeric into bool this way P_PlayerFlip(mo); + if (mo->player->kartstuff[k_feather] & 2) + gravityadd = FixedMul(gravityadd, 5*FRACUNIT/2); } else { diff --git a/src/p_user.c b/src/p_user.c index f08dfd3e..4dfced7d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -9465,7 +9465,7 @@ void P_PlayerThink(player_t *player) // SRB2kart - fixes boo not flashing when it should. Mega doesn't flash either. Flashing is local. if ((player == &players[displayplayer] || (splitscreen && player == &players[secondarydisplayplayer])) && player->kartstuff[k_bootimer] == 0 && player->kartstuff[k_growshrinktimer] <= 0 - && (player->kartstuff[k_comebacktimer] == 0 || (gametype != GT_RACE && player->kartstuff[k_balloon] > 0))) + && (player->kartstuff[k_comebacktimer] == 0 || (gametype == GT_RACE || player->kartstuff[k_balloon] > 0))) { if (player->powers[pw_flashing] > 0 && player->powers[pw_flashing] < flashingtics && (leveltime & 1)) player->mo->flags2 |= MF2_DONTDRAW; diff --git a/src/sounds.c b/src/sounds.c index a968f999..22f966ee 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -498,11 +498,12 @@ sfxinfo_t S_sfx[NUMSFX] = {"mkitm7", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"mkitm8", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"mkitmF", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"clash", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR}, - {"tossed", false,150, 8, -1, NULL, 0, -1, -1, LUMPERROR}, - {"shelit", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR}, - {"vroom", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"boing", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"clash", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR}, + {"tossed", false, 150, 8, -1, NULL, 0, -1, -1, LUMPERROR}, + {"shelit", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"vroom", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"boing", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"smkinv", false, 140, 16, -1, NULL, 0, -1, -1, LUMPERROR}, // SRB2kart - Skin sounds {"kwin", false, 64, 0, -1, NULL, 0, SKSWIN, -1, LUMPERROR}, diff --git a/src/sounds.h b/src/sounds.h index df3653d9..9ffc3a87 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -575,6 +575,7 @@ typedef enum sfx_shelit, sfx_vroom, sfx_boing, + sfx_smkinv, sfx_kwin, sfx_klose, From 1f6877e1e75806c99c3dcaa5bd7bf0175ee7d2dc Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sat, 11 Nov 2017 03:28:20 +0000 Subject: [PATCH 51/61] Don't allow the player to respawn on a mapthing if it will collide them with another player Mainly effects battle where match starts are used, race will be effected at the beginning of races though --- src/g_game.c | 3 +++ src/k_kart.c | 22 ++++++++++++++++++++++ src/k_kart.h | 1 + 3 files changed, 26 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 7fbba166..bdcf8885 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2411,6 +2411,9 @@ static boolean G_CheckSpot(INT32 playernum, mapthing_t *mthing) if (!P_CheckPosition(players[playernum].mo, x, y)) return false; + if (!K_CheckPlayersRespawnColliding(playernum, x, y)) + return false; + return true; } diff --git a/src/k_kart.c b/src/k_kart.c index e3d703dc..a952d70d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2475,6 +2475,28 @@ void K_DoBouncePad(player_t *player, fixed_t vertispeed) S_StartSound(player->mo, sfx_boing); } +// Returns false if this player being placed here causes them to collide with any other player +// Used in g_game.c for match etc. respawning +// This does not check along the z because the z is not correctly set for the spawnee at this point +boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y) +{ + INT32 i; + fixed_t p1radius = players[playernum].mo->radius; + for (i = 0; i < MAXPLAYERS; i++) + { + if (playernum == i || !playeringame[i] || players[i].spectator || !players[i].mo || players[i].mo->health <= 0 + || players[i].playerstate != PST_LIVE || (players[i].mo->flags & MF_NOCLIP) || (players[i].mo->flags & MF_NOCLIPTHING)) + continue; + + if (abs(x - players[i].mo->x) < (p1radius + players[i].mo->radius) + && abs(y - players[i].mo->y) < (p1radius + players[i].mo->radius)) + { + return false; + } + } + return true; +} + // countersteer is how strong the controls are telling us we are turning // turndir is the direction the controls are telling us to turn, -1 if turning right and 1 if turning left static INT16 K_GetKartDriftValue(player_t *player, fixed_t countersteer) diff --git a/src/k_kart.h b/src/k_kart.h index 36c8c0b9..187cbd9c 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -27,6 +27,7 @@ void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 void K_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); void K_DoBouncePad(player_t *player, fixed_t vertispeed); +boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); void K_MomentumToFacing(player_t *player); fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower); From 005e01850d1414c0ca29fd3db6411317411db35b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 11 Nov 2017 22:29:38 -0500 Subject: [PATCH 52/61] Fix magnet & star --- src/p_enemy.c | 2 +- src/p_inter.c | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index e7bf5b07..a9704f66 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8091,7 +8091,7 @@ void A_ItemPop(mobj_t *actor) { mobj_t *remains; - if (!(actor->target && actor->target->player && P_CanPickupItem(actor->target->player, false))) + if (!(actor->target && actor->target->player)) { if (cv_debug && !(actor->target && actor->target->player)) CONS_Printf("ERROR: Powerup has no target!\n"); diff --git a/src/p_inter.c b/src/p_inter.c index 22e737ae..684c0913 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -153,6 +153,9 @@ boolean P_CanPickupItem(player_t *player, boolean weapon) if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) // No balloons in Match return false; + if (player->kartstuff[k_magnettimer]) // You should probably collect stuff when you're attracting it :V + return true; + if (player->kartstuff[k_bootaketimer] || player->kartstuff[k_boostolentimer] || player->kartstuff[k_growshrinktimer] > 1 || player->kartstuff[k_goldshroomtimer]) // Item-specific timer going off return false; @@ -407,7 +410,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) { case MT_RANDOMITEM: // SRB2kart case MT_FLINGRANDOMITEM: - if (!(P_CanPickupItem(player, false))) + if (!P_CanPickupItem(player, false) && special->tracer != toucher) return; special->momx = special->momy = special->momz = 0; P_SetTarget(&special->target, toucher); @@ -3164,7 +3167,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return false; else { - if (inflictor && (inflictor->type == MT_GREENITEM || inflictor->type == MT_REDITEM || inflictor->type == MT_REDITEMDUD)) + if (inflictor && (inflictor->type == MT_GREENITEM || inflictor->type == MT_REDITEM || inflictor->type == MT_REDITEMDUD || inflictor->player)) { player->kartstuff[k_spinouttype] = 1; K_SpinPlayer(player, source); From 2360516e660765f66731a2f3239021fc8a8f9383 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 12 Nov 2017 22:48:32 -0500 Subject: [PATCH 53/61] Yet more comeback stuff! - You can now choose to carry an item to someone instead of bombing - You need to bomb someone or give an item a combined total of three times in order to come back. - Bombing somone gives 2 points while giving items doesn't award you any points. - Position number still flashes after you've won, and it flashes rainbow for people who have won and are in 1st place! - Flashing players can no longer eat items - Fixed kartstarsfx playing the alarm in conjunction with music - Fixed some items no longer causing wipeout --- src/d_player.h | 8 ++++-- src/k_kart.c | 59 ++++++++++++++++++++++++++++++++++++----- src/p_enemy.c | 2 ++ src/p_inter.c | 38 ++++++++++++++++++++++++++- src/p_map.c | 71 +++++++++++++++++++++++++++++++++++++++++--------- src/p_user.c | 3 --- 6 files changed, 157 insertions(+), 24 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 287a8fee..0e4a8090 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -307,8 +307,12 @@ typedef enum k_lightning, // 0x1 = Lightning in inventory k_feather, // 0x1 = Feather in inventory, 0x2 = Player is feather jumping k_kitchensink, // 0x1 = Sink in inventory - k_balloon, // Battle mode, number of balloons left - k_comebackhits, // Battle mode, number of times hit in comeback mode + + // Battle Mode vars + k_balloon, // Number of balloons left + k_comebackhits, // Number of times hit in comeback mode + k_comebackpoints, // Number of times you've bombed or gave an item to someone; once it's 3 it gets set back to 0 and you're given a balloon + k_comebackmode, // 0 = bomb, 1 = item NUMKARTSTUFF } kartstufftype_t; diff --git a/src/k_kart.c b/src/k_kart.c index 251a776b..352ca393 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1449,6 +1449,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_comebackhits] > 5) player->kartstuff[k_comebackhits] = 5; + else if (player->kartstuff[k_comebackhits] < 0) + player->kartstuff[k_comebackhits] = 0; // ??? /* @@ -1461,6 +1463,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } */ + if (player->kartstuff[k_comebacktimer]) + player->kartstuff[k_comebackmode] = 0; + if (P_IsObjectOnGround(player->mo) && !(player->mo->momz) && player->kartstuff[k_feather] & 2) player->kartstuff[k_feather] &= ~2; @@ -1493,10 +1498,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StopSoundByID(player->mo, sfx_mega); // Stop it } + // AAAAAAND handle the SMK star alarm if (player->mo->health > 0 && (player->mo->player->kartstuff[k_startimer] > 0 || player->mo->player->kartstuff[k_growshrinktimer] > 0)) { - if (leveltime % 13 == 0 && !P_IsLocalPlayer(player)) + if (leveltime % 13 == 0 && cv_kartstarsfx.value && !P_IsLocalPlayer(player)) S_StartSound(player->mo, sfx_smkinv); } else if (S_SoundPlaying(player->mo, sfx_smkinv)) @@ -1880,7 +1886,7 @@ void K_StealBalloon(player_t *player, player_t *victim) || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootimer] > 0)) return; - CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); + //CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); newballoon = player->kartstuff[k_balloon]; if (newballoon <= 1) @@ -1907,6 +1913,7 @@ void K_StealBalloon(player_t *player, player_t *victim) P_SetMobjState(newmo, S_BATTLEBALLOON1); player->kartstuff[k_balloon]++; + player->powers[pw_flashing] = flashingtics; return; } @@ -3361,7 +3368,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { player->mo->flags2 &= ~MF2_DONTDRAW; } - + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) // dead in match? you da bomb { K_StripItems(player); @@ -3383,6 +3390,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->powers[pw_flashing] = player->kartstuff[k_comebacktimer]; } + else if (player->kartstuff[k_comebackmode] != 0) + player->mo->tracer->flags2 |= MF2_DONTDRAW; else player->mo->tracer->flags2 &= ~MF2_DONTDRAW; } @@ -3468,7 +3477,7 @@ void K_CheckBalloons(void) UINT8 numingame = 0; INT8 winnernum = -1; -// Quick thing for testing comeback in splitscreen +// Set to 1 if you need to test comeback in splitscreen #if 0 return; #endif @@ -3527,6 +3536,7 @@ static patch_t *kp_lapstickernarrow; static patch_t *kp_lakitustart[NUMLAKIFRAMES]; static patch_t *kp_lakitulaps[17]; static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES]; +static patch_t *kp_winnernum[NUMPOSFRAMES]; static patch_t *kp_facenull; static patch_t *kp_facefirst; static patch_t *kp_facesecond; @@ -3663,6 +3673,13 @@ void K_LoadKartHUDGraphics(void) kp_positionnum[i][j] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); } } + + for (i = 0; i < NUMPOSFRAMES; i++) + { + sprintf(buffer, "K_POSNW%d", i); + kp_winnernum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } + kp_facenull = W_CachePatchName("K_PFACE0", PU_HUDGFX); kp_facefirst = W_CachePatchName("K_PFACE1", PU_HUDGFX); kp_facesecond = W_CachePatchName("K_PFACE2", PU_HUDGFX); @@ -4222,8 +4239,38 @@ static void K_DrawKartPositionNum(INT32 num) { X -= W; - // Check for the final lap - if (stplyr->laps+1 == cv_numlaps.value) + if (stplyr->exiting && num == 1) // 1st place winner? You get rainbows!! + { + // Alternate frame every three frames + switch (leveltime % 21) + { + case 1: case 2: case 3: + localpatch = kp_winnernum[0]; + break; + case 4: case 5: case 6: + localpatch = kp_winnernum[1]; + break; + case 7: case 8: case 9: + localpatch = kp_winnernum[2]; + break; + case 10: case 11: case 12: + localpatch = kp_winnernum[3]; + break; + case 13: case 14: case 15: + localpatch = kp_winnernum[4]; + break; + case 16: case 17: case 18: + localpatch = kp_winnernum[5]; + break; + case 19: case 20: case 21: + localpatch = kp_winnernum[6]; + break; + default: + localpatch = kp_positionnum[1][0]; + break; + } + } + else if (stplyr->laps+1 == cv_numlaps.value || stplyr->exiting) // Check for the final lap, or won { // Alternate frame every three frames switch (leveltime % 9) diff --git a/src/p_enemy.c b/src/p_enemy.c index a9704f66..deeb7b82 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3633,6 +3633,8 @@ void A_AttractChase(mobj_t *actor) || !P_CheckSight(actor, actor->tracer)) // You have to be able to SEE it...sorta { // Lost attracted rings don't through walls anymore. + if (actor->tracer && actor->tracer->player) + actor->tracer->player->kartstuff[k_comebackmode] = 0; actor->flags &= ~MF_NOCLIP; P_SetTarget(&actor->tracer, NULL); return; diff --git a/src/p_inter.c b/src/p_inter.c index 684c0913..a3d91120 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -410,8 +410,39 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) { case MT_RANDOMITEM: // SRB2kart case MT_FLINGRANDOMITEM: + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + { + if (player->kartstuff[k_comebackmode] == 0 && !player->kartstuff[k_comebacktimer]) + { + P_SetTarget(&special->tracer, toucher); + player->kartstuff[k_comebackmode] = 1; + } + return; + } + if (!P_CanPickupItem(player, false) && special->tracer != toucher) return; + + if (gametype != GT_RACE && special->tracer && special->tracer->player) + { + special->tracer->player->kartstuff[k_comebackmode] = 0; + + special->tracer->player->kartstuff[k_comebackpoints]++; + CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[special->tracer->player-players], player_names[player-players]); + + if (special->tracer->player->kartstuff[k_comebackpoints] >= 3) + { + K_StealBalloon(special->tracer->player, player); + special->tracer->player->kartstuff[k_comebackpoints] = 0; + CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[special->tracer->player-players]); + } + + special->tracer->player->kartstuff[k_comebackhits]--; + if (special->tracer->player->kartstuff[k_comebackhits] < 0) + special->tracer->player->kartstuff[k_comebackhits] = 0; + special->tracer->player->kartstuff[k_comebacktimer] = comebacktime * (special->tracer->player->kartstuff[k_comebackhits]+1); + } + special->momx = special->momy = special->momz = 0; P_SetTarget(&special->target, toucher); P_SetMobjState(special, special->info->deathstate); @@ -3167,7 +3198,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return false; else { - if (inflictor && (inflictor->type == MT_GREENITEM || inflictor->type == MT_REDITEM || inflictor->type == MT_REDITEMDUD || inflictor->player)) + if (inflictor && (inflictor->type == MT_GREENITEM || inflictor->type == MT_GREENSHIELD + || inflictor->type == MT_REDITEM || inflictor->type == MT_REDSHIELD || inflictor->type == MT_REDITEMDUD + || inflictor->type == MT_FAKEITEM || inflictor->type == MT_FAKESHIELD + || inflictor->type == MT_TRIPLEGREENSHIELD1 || inflictor->type == MT_TRIPLEGREENSHIELD2 || inflictor->type == MT_TRIPLEGREENSHIELD3 + || inflictor->type == MT_TRIPLEREDSHIELD1 || inflictor->type == MT_TRIPLEREDSHIELD2 || inflictor->type == MT_TRIPLEREDSHIELD3 + || inflictor->player)) { player->kartstuff[k_spinouttype] = 1; K_SpinPlayer(player, source); diff --git a/src/p_map.c b/src/p_map.c index 924ddf46..ca40ba7d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -675,6 +675,9 @@ static boolean PIT_CheckThing(mobj_t *thing) && (tmthing->target == thing->target)) // Don't hit each other if you have the same target return true; + if (thing->player && thing->player->powers[pw_flashing]) + return true; + if (thing->type == MT_PLAYER) { // Player Damage @@ -810,6 +813,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (((tmthing->target == thing) || (tmthing->target == thing->target)) && (tmthing->threshold > 0 || (thing->type != MT_PLAYER && thing->threshold > 0))) return true; + if (thing->player && thing->player->powers[pw_flashing]) + return true; + if (thing->type == MT_PLAYER) { S_StartSound(NULL, sfx_cgot); //let all players hear it. @@ -834,6 +840,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (!(thing->type == MT_PLAYER)) return true; + if (thing->player && thing->player->powers[pw_flashing]) + return true; + if (thing->type == MT_PLAYER) { K_SpinPlayer(thing->player, tmthing->target); @@ -865,6 +874,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->type == MT_FIREBALL && thing->type == MT_FIREBALL) return true; // Fireballs don't collide with eachother + if (thing->player && thing->player->powers[pw_flashing]) + return true; + if (thing->type == MT_PLAYER) { // Player Damage @@ -962,6 +974,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->health <= 0 || thing->health <= 0) return true; + if (thing->player && thing->player->powers[pw_flashing]) + return true; + if (thing->type == MT_GREENITEM // When these items collide with the fake item, just the fake item is destroyed || thing->type == MT_REDITEM || thing->type == MT_REDITEMDUD || thing->type == MT_BOMBITEM @@ -1045,6 +1060,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->health <= 0 || thing->health <= 0) return true; + if (thing->player && thing->player->powers[pw_flashing]) + return true; + if (thing->type == MT_PLAYER) { P_KillMobj(tmthing, thing, thing); @@ -1089,6 +1107,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->z + tmthing->height < thing->z) return true; // underneath + if (tmthing->player && tmthing->player->powers[pw_flashing]) + return true; + if (thing->type == MT_GREENSHIELD || thing->type == MT_TRIPLEGREENSHIELD1 || thing->type == MT_TRIPLEGREENSHIELD2 || thing->type == MT_TRIPLEGREENSHIELD3 || thing->type == MT_REDSHIELD || thing->type == MT_TRIPLEREDSHIELD1 || thing->type == MT_TRIPLEREDSHIELD2 || thing->type == MT_TRIPLEREDSHIELD3 || thing->type == MT_GREENITEM || thing->type == MT_REDITEM || thing->type == MT_REDITEMDUD @@ -1606,49 +1627,71 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player->kartstuff[k_growshrinktimer] || thing->player->kartstuff[k_squishedtimer] || thing->player->kartstuff[k_bootimer] || thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_startimer] || thing->player->kartstuff[k_justbumped] - || (gametype != GT_RACE && (thing->player->kartstuff[k_balloon] <= 0 && thing->player->kartstuff[k_comebacktimer])) + || (gametype != GT_RACE && (thing->player->kartstuff[k_balloon] <= 0 + && (thing->player->kartstuff[k_comebacktimer] || thing->player->kartstuff[k_comebackmode] == 1))) || tmthing->player->kartstuff[k_growshrinktimer] || tmthing->player->kartstuff[k_squishedtimer] || tmthing->player->kartstuff[k_bootimer] || tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_startimer] || tmthing->player->kartstuff[k_justbumped] - || (gametype != GT_RACE && (tmthing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_comebacktimer]))) + || (gametype != GT_RACE && (tmthing->player->kartstuff[k_balloon] <= 0 + && (tmthing->player->kartstuff[k_comebacktimer] || tmthing->player->kartstuff[k_comebackmode] == 1)))) { return true; } if (gametype != GT_RACE) { - if (thing->player->kartstuff[k_balloon] <= 0 || tmthing->player->kartstuff[k_balloon] <= 0) + if ((thing->player->kartstuff[k_balloon] <= 0 || tmthing->player->kartstuff[k_balloon] <= 0) + && (thing->player->kartstuff[k_comebackmode] == 0 && tmthing->player->kartstuff[k_comebackmode] == 0)) { - thing->player->kartstuff[k_justbumped] = 6; - tmthing->player->kartstuff[k_justbumped] = 6; - if (tmthing->player->kartstuff[k_balloon] > 0) { - if (tmthing->player->kartstuff[k_balloon] == 1) + thing->player->kartstuff[k_comebackpoints]++; + CONS_Printf(M_GetText("%s bombed %s!\n"), player_names[thing->player-players], player_names[tmthing->player-players]); + + if (thing->player->kartstuff[k_comebackpoints] >= 3) + { K_StealBalloon(thing->player, tmthing->player); + thing->player->kartstuff[k_comebackpoints] = 0; + CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[thing->player-players]); + } K_ExplodePlayer(tmthing->player, thing); - P_AddPlayerScore(thing->player, 1); // 2 points instead of 1 for getting someone in comeback mode + P_AddPlayerScore(thing->player, 1); // 2 points instead of 1 for getting someone in comeback mode, since it's REALLY tough :V + + thing->player->kartstuff[k_comebackhits]--; + if (thing->player->kartstuff[k_comebackhits] < 0) + thing->player->kartstuff[k_comebackhits] = 0; - thing->player->kartstuff[k_comebackhits]++; thing->player->kartstuff[k_comebacktimer] = comebacktime * (thing->player->kartstuff[k_comebackhits]+1); return true; } else if (thing->player->kartstuff[k_balloon] > 0) { - if (thing->player->kartstuff[k_balloon] == 1) + tmthing->player->kartstuff[k_comebackpoints]++; + CONS_Printf(M_GetText("%s bombed %s!\n"), player_names[tmthing->player-players], player_names[thing->player-players]); + + if (tmthing->player->kartstuff[k_comebackpoints] >= 3) + { K_StealBalloon(tmthing->player, thing->player); + thing->player->kartstuff[k_comebackpoints] = 0; + CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[tmthing->player-players]); + } K_ExplodePlayer(thing->player, tmthing); - P_AddPlayerScore(thing->player, 1); // 2 points instead of 1 for getting someone in comeback mode + P_AddPlayerScore(tmthing->player, 1); // 2 points instead of 1 for getting someone in comeback mode, since it's REALLY tough :V + + tmthing->player->kartstuff[k_comebackhits]--; + if (tmthing->player->kartstuff[k_comebackhits] < 0) + tmthing->player->kartstuff[k_comebackhits] = 0; - tmthing->player->kartstuff[k_comebackhits]++; tmthing->player->kartstuff[k_comebacktimer] = comebacktime * (tmthing->player->kartstuff[k_comebackhits]+1); return true; } else if (thing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_balloon] <= 0) { K_KartBouncing(tmthing, thing, false); + thing->player->kartstuff[k_justbumped] = 6; + tmthing->player->kartstuff[k_justbumped] = 6; K_SpinPlayer(thing->player, tmthing); K_SpinPlayer(tmthing->player, thing); @@ -1669,6 +1712,7 @@ static boolean PIT_CheckThing(mobj_t *thing) { K_StealBalloon(tmthing->player, thing->player); K_SpinPlayer(thing->player, tmthing); + CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[tmthing->player-players], player_names[thing->player-players]); } } else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) @@ -1678,6 +1722,7 @@ static boolean PIT_CheckThing(mobj_t *thing) { K_StealBalloon(thing->player, tmthing->player); K_SpinPlayer(tmthing->player, thing); + CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[thing->player-players], player_names[tmthing->player-players]); } } else @@ -1689,11 +1734,13 @@ static boolean PIT_CheckThing(mobj_t *thing) { K_StealBalloon(thing->player, tmthing->player); K_SpinPlayer(tmthing->player, thing); + CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[thing->player-players], player_names[tmthing->player-players]); } else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) { K_StealBalloon(tmthing->player, thing->player); K_SpinPlayer(thing->player, tmthing); + CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[tmthing->player-players], player_names[thing->player-players]); } } diff --git a/src/p_user.c b/src/p_user.c index 4dfced7d..b5f64537 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1010,9 +1010,6 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) if (player->bot) player = &players[consoleplayer]; - if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) - return; - // NiGHTS does it different! if (gamestate == GS_LEVEL && mapheaderinfo[gamemap-1]->typeoflevel & TOL_NIGHTS) { From 3d3972fac991b6ebda746bc4b1067dc6724294eb Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 13 Nov 2017 20:45:57 -0500 Subject: [PATCH 54/61] Battle HUD stuff --- src/d_netcmd.c | 3 +- src/d_netcmd.h | 1 + src/d_player.h | 1 + src/g_game.c | 10 +++- src/k_kart.c | 153 ++++++++++++++++++++++++++++++++++++++++++++----- src/p_user.c | 11 ++-- 6 files changed, 157 insertions(+), 22 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 345e8193..e4a23e24 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -318,11 +318,12 @@ consvar_t cv_feather = {"feathers", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NU consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartcheck = {"kartcheck", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartstarsfx_cons_t[] = {{0, "Music"}, {1, "SMK"}, {0, NULL}}; -consvar_t cv_kartstarsfx = {"kartstarsfx", "Music", CV_SAVE, kartstarsfx_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // change default to "SMK"? +consvar_t cv_kartstarsfx = {"kartstarsfx", "SMK", CV_SAVE, kartstarsfx_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // change default to "SMK"? consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {12, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartcomeback = {"kartcomeback", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t speedometer_cons_t[] = {{0, "Off"}, {1, "Kilometers"}, {2, "Miles"}, {3, "Fracunits"}, {0, NULL}}; consvar_t cv_speedometer = {"speedometer", "Kilometers", CV_SAVE, speedometer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // use tics in display diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 8b3cb3ca..ed70af44 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -111,6 +111,7 @@ extern consvar_t cv_kartstarsfx; extern consvar_t cv_kartcc; extern consvar_t cv_kartballoons; extern consvar_t cv_kartfrantic; +extern consvar_t cv_kartcomeback; extern consvar_t cv_speedometer; extern consvar_t cv_collideminimum; diff --git a/src/d_player.h b/src/d_player.h index 0e4a8090..3732cddf 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -313,6 +313,7 @@ typedef enum k_comebackhits, // Number of times hit in comeback mode k_comebackpoints, // Number of times you've bombed or gave an item to someone; once it's 3 it gets set back to 0 and you're given a balloon k_comebackmode, // 0 = bomb, 1 = item + k_comebackshowninfo,// Have you already seen the info screen before? NUMKARTSTUFF } kartstufftype_t; diff --git a/src/g_game.c b/src/g_game.c index bdcf8885..6e575686 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1790,7 +1790,7 @@ boolean G_Responder(event_t *ev) if (players[displayplayer].spectator) continue; - if (G_GametypeHasTeams()) + /*if (G_GametypeHasTeams()) { if (players[consoleplayer].ctfteam && players[displayplayer].ctfteam != players[consoleplayer].ctfteam) @@ -1812,6 +1812,12 @@ boolean G_Responder(event_t *ev) { if (!players[consoleplayer].spectator) continue; + }*/ + + if (gametype != GT_RACE) // srb2kart + { + if (players[consoleplayer].kartstuff[k_balloon] > 0) + continue; } break; @@ -3082,7 +3088,7 @@ static void G_DoWorldDone(void) // don't reset player between maps D_MapChange(nextmap+1, gametype, ultimatemode, false, 0, false, false); else - // resetplayer in match/chaos/tag/CTF/race for more equality + // resetplayer in match/tag/CTF for more equality D_MapChange(nextmap+1, gametype, ultimatemode, true, 0, false, false); } diff --git a/src/k_kart.c b/src/k_kart.c index 93212277..88c9a442 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -18,6 +18,7 @@ #include "z_zone.h" #include "m_misc.h" #include "k_kart.h" +#include "f_finale.h" //{ SRB2kart Color Code @@ -307,6 +308,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartcc); CV_RegisterVar(&cv_kartballoons); CV_RegisterVar(&cv_kartfrantic); + CV_RegisterVar(&cv_kartcomeback); CV_RegisterVar(&cv_speedometer); CV_RegisterVar(&cv_collideminimum); CV_RegisterVar(&cv_collidesoundnum); @@ -1383,8 +1385,14 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_spinouttimer]) player->kartstuff[k_spinouttimer]--; + else if (!cv_kartcomeback.value) + player->kartstuff[k_comebacktimer] = comebacktime; else if (player->kartstuff[k_comebacktimer]) + { player->kartstuff[k_comebacktimer]--; + if (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer] <= 0) + player->kartstuff[k_comebackshowninfo] = 1; + } if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == flashingtics) player->powers[pw_flashing]--; @@ -3524,6 +3532,9 @@ void K_CheckBalloons(void) if (!playeringame[i] || players[i].spectator) // not even in-game continue; + if (players[i].exiting) // we're already exiting! stop! + return; + numingame++; if (players[i].kartstuff[k_balloon] <= 0) // if you don't have any balloons, you're probably not a winner @@ -3539,11 +3550,11 @@ void K_CheckBalloons(void) if (playeringame[winnernum]) { P_AddPlayerScore(&players[winnernum], numingame); - CONS_Printf(M_GetText("%s recieved %d points for surviving!\n"), player_names[winnernum], numingame); // numingame/2 == 1 ? "" : "s" + CONS_Printf(M_GetText("%s recieved %d points for winning!\n"), player_names[winnernum], numingame); // numingame/2 == 1 ? "" : "s" } - if (server) - SendNetXCmd(XD_EXITLEVEL, NULL, 0); + for (i = 0; i < MAXPLAYERS; i++) + P_DoPlayerExit(&players[i]); } //} @@ -3561,6 +3572,10 @@ static patch_t *kp_timesticker; static patch_t *kp_timestickerwide; static patch_t *kp_lapsticker; static patch_t *kp_lapstickernarrow; +static patch_t *kp_balloonsticker; +static patch_t *kp_balloonstickerwide; +static patch_t *kp_karmasticker; +static patch_t *kp_timeoutsticker; static patch_t *kp_lakitustart[NUMLAKIFRAMES]; static patch_t *kp_lakitulaps[17]; static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES]; @@ -3570,6 +3585,10 @@ static patch_t *kp_facefirst; static patch_t *kp_facesecond; static patch_t *kp_facethird; static patch_t *kp_facefourth; +static patch_t *kp_battlewin; +static patch_t *kp_battlelose; +static patch_t *kp_battlewait; +static patch_t *kp_battleinfo; static patch_t *kp_magnet; static patch_t *kp_boo; static patch_t *kp_boosteal; @@ -3656,6 +3675,10 @@ void K_LoadKartHUDGraphics(void) kp_timestickerwide = W_CachePatchName("K_STTIMW", PU_HUDGFX); kp_lapsticker = W_CachePatchName("K_STLAPS", PU_HUDGFX); kp_lapstickernarrow = W_CachePatchName("K_STLAPN", PU_HUDGFX); + kp_balloonsticker = W_CachePatchName("K_STBALN", PU_HUDGFX); + kp_balloonstickerwide = W_CachePatchName("K_STBALW", PU_HUDGFX); + kp_karmasticker = W_CachePatchName("K_STKARM", PU_HUDGFX); + kp_timeoutsticker = W_CachePatchName("K_STTOUT", PU_HUDGFX); // Lakitu Start-up Frames kp_lakitustart[0] = W_CachePatchName("K_LAKISA", PU_HUDGFX); @@ -3714,6 +3737,12 @@ void K_LoadKartHUDGraphics(void) kp_facethird = W_CachePatchName("K_PFACE3", PU_HUDGFX); kp_facefourth = W_CachePatchName("K_PFACE4", PU_HUDGFX); + // Battle graphics + kp_battlewin = W_CachePatchName("K_BWIN", PU_HUDGFX); + kp_battlelose = W_CachePatchName("K_BLOSE", PU_HUDGFX); + kp_battlewait = W_CachePatchName("K_BWAIT", PU_HUDGFX); + kp_battleinfo = W_CachePatchName("K_BINFO", PU_HUDGFX); + // Kart Item Windows kp_magnet = W_CachePatchName("K_ITMAGN", PU_HUDGFX); kp_boo = W_CachePatchName("K_ITBOO1", PU_HUDGFX); @@ -4453,6 +4482,36 @@ static void K_drawKartSpeedometer(void) } } +static void K_drawKartBalloonsOrKarma(void) +{ + UINT8 *colormap = R_GetTranslationColormap(-1, stplyr->skincolor, 0); + INT32 flags = V_SNAPTOLEFT|V_SNAPTOBOTTOM; + if (splitscreen) + flags = 0; + + if (stplyr->kartstuff[k_balloon] <= 0) + { + V_DrawScaledPatch(LAPS_X, STRINGY(LAPS_Y), flags, kp_karmasticker); + V_DrawKartString(LAPS_X+58, STRINGY(LAPS_Y+3), flags, va("%d", stplyr->kartstuff[k_comebackhits])); + V_DrawKartString(LAPS_X+85, STRINGY(LAPS_Y+3), flags, va("3")); + } + else + { + if (cv_kartballoons.value > 9) + { + V_DrawMappedPatch(LAPS_X, STRINGY(LAPS_Y), flags, kp_balloonstickerwide, colormap); + V_DrawKartString(LAPS_X+46, STRINGY(LAPS_Y+3), flags, va("%2d", stplyr->kartstuff[k_balloon])); + V_DrawKartString(LAPS_X+83, STRINGY(LAPS_Y+3), flags, va("%2d", cv_kartballoons.value)); + } + else + { + V_DrawMappedPatch(LAPS_X, STRINGY(LAPS_Y), flags, kp_balloonsticker, colormap); + V_DrawKartString(LAPS_X+46, STRINGY(LAPS_Y+3), flags, va("%d", stplyr->kartstuff[k_balloon])); + V_DrawKartString(LAPS_X+73, STRINGY(LAPS_Y+3), flags, va("%d", cv_kartballoons.value)); + } + } +} + fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my) { fixed_t dist, x; @@ -4528,6 +4587,54 @@ static void K_drawKartPlayerCheck(void) } } +static void K_drawBattleWait(void) +{ + INT32 t = ((stplyr->kartstuff[k_comebacktimer]+TICRATE)/TICRATE); + INT32 X = BASEVIDWIDTH/2; + + if (!WipeInAction || !menuactive || !splitscreen) + V_DrawFadeScreen(); + + while (t) + { + X -= 8; + t /= 10; + } + + if (!stplyr->kartstuff[k_comebackshowninfo]) + { + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battleinfo); + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY((BASEVIDHEIGHT/2) + 66), 0, kp_timeoutsticker); + V_DrawKartString(X, STRINGY((BASEVIDHEIGHT/2) + 66), 0, va("%d", ((stplyr->kartstuff[k_comebacktimer]+TICRATE)/TICRATE))); + } + else + { + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlewait); + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY((BASEVIDHEIGHT/2) + 30), 0, kp_timeoutsticker); + V_DrawKartString(X, STRINGY((BASEVIDHEIGHT/2) + 30), 0, va("%d", ((stplyr->kartstuff[k_comebacktimer]+TICRATE)/TICRATE))); + } +} + +static void K_drawBattleExit(void) +{ + if (!WipeInAction || !menuactive || !(splitscreen && stplyr != &players[consoleplayer])) + V_DrawFadeScreen(); + if (splitscreen) + { + if (stplyr->kartstuff[k_balloon]) + V_DrawScaledPatch(96, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlewin); + else + V_DrawScaledPatch(BASEVIDWIDTH-96, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlelose); + } + else + { + if (stplyr->kartstuff[k_balloon]) + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlewin); + else + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlelose); + } +} + static void K_drawStartLakitu(void) { patch_t *localpatch = kp_nodraw; @@ -4639,6 +4746,21 @@ void K_drawKartHUD(void) // This is handled by console/menu values K_initKartHUD(); + // Draw full screen stuff that turns off the rest of the HUD + if (gametype != GT_RACE) + { + if (stplyr->exiting) + { + K_drawBattleExit(); + return; + } + else if (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && cv_kartcomeback.value) + { + K_drawBattleWait(); + return; + } + } + // Draw Lakitu // This is done first so that regardless of HUD layers, // he'll appear to be in the 'real world' @@ -4669,6 +4791,9 @@ void K_drawKartHUD(void) K_drawKartRetroItem(); //K_DrawKartTripleItem(); + + // Draw the timestamp + K_drawKartTimestamp(); if (gametype == GT_RACE) // Race-only elements { @@ -4682,21 +4807,19 @@ void K_drawKartHUD(void) // Draw the numerical position K_DrawKartPositionNum(stplyr->kartstuff[k_position]); - + + // Draw the speedometer + // TODO: Make a better speedometer. + K_drawKartSpeedometer(); + // Draw the lap counter K_drawKartLaps(); } - - // Draw the timestamp - K_drawKartTimestamp(); - - // Draw the speedometer - // TODO: Make a better speedometer. - K_drawKartSpeedometer(); - - if (gametype != GT_RACE && !stplyr->kartstuff[k_spinouttimer] - && stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer]) - V_DrawCenteredString(BASEVIDWIDTH/2, STRINGY(176), 0, va("%d", (stplyr->kartstuff[k_comebacktimer]+TICRATE)/TICRATE)); + else if (gametype == GT_MATCH) // Battle-only + { + // Draw the hits left! + K_drawKartBalloonsOrKarma(); + } } //} diff --git a/src/p_user.c b/src/p_user.c index b5f64537..34fd0cd4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1010,6 +1010,9 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) if (player->bot) player = &players[consoleplayer]; + if (player->exiting) // srb2kart + return; + // NiGHTS does it different! if (gamestate == GS_LEVEL && mapheaderinfo[gamemap-1]->typeoflevel & TOL_NIGHTS) { @@ -1604,9 +1607,9 @@ void P_DoPlayerExit(player_t *player) if (player->exiting) return; - if (cv_allowexitlevel.value == 0 && !G_PlatformGametype()) + /*if (cv_allowexitlevel.value == 0 && !G_PlatformGametype()) // srb2kart return; - else if (gametype == GT_RACE || gametype == GT_COMPETITION) // If in Race Mode, allow + else*/ if (gametype == GT_RACE || gametype == GT_COMPETITION) // If in Race Mode, allow { // SRB2kart 120217 if (!countdown && !(netgame || multiplayer)) @@ -1665,8 +1668,8 @@ void P_DoPlayerExit(player_t *player) player->powers[pw_spacetime] = 0; P_RestoreMusic(player); - if (playeringame[player-players] && netgame && !circuitmap) - CONS_Printf(M_GetText("%s has completed the level.\n"), player_names[player-players]); + /*if (playeringame[player-players] && netgame && !circuitmap) + CONS_Printf(M_GetText("%s has completed the level.\n"), player_names[player-players]);*/ } #define SPACESPECIAL 12 From cca30d1095a06b5a524e8e7baec57602a4083f81 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 17 Nov 2017 00:48:36 -0500 Subject: [PATCH 55/61] Lots of small tweaks & fixes, that should make Battle a LOT more bearable - Comeback timer is now always 10 seconds instead of scaling - Takes 10 seconds before exiting - Flashing tics is doubled in Battle Mode - Removed a bunch of bomb nerfs - Bombs are back to making only 1 point per hit - Exposed K_GetKartAccel & K_GetKartFlashing to Lua - Item boxes should no longer drop while going up slopes - Trading item boxes with a bomb should turn you back into a bomb - Balloons should no longer all respawn when dying in pits in 2-player games - Flashing players are able to kill *thrown* shells again (shields and trap items are still unkillable). Prevents red shells from being able to stick to a flashing player and hurt them again as soon as they're done flashing - CHECK appears at a farther distance --- src/d_player.h | 1 - src/g_game.c | 10 ++-- src/k_kart.c | 144 +++++++++++++++++++++------------------------- src/k_kart.h | 2 + src/lua_baselib.c | 22 +++++++ src/m_cheat.c | 6 +- src/p_enemy.c | 4 +- src/p_inter.c | 11 ++-- src/p_map.c | 35 ++--------- src/p_mobj.c | 6 +- src/p_spec.c | 2 +- src/p_user.c | 16 +++--- 12 files changed, 124 insertions(+), 135 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 3732cddf..db880ba5 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -310,7 +310,6 @@ typedef enum // Battle Mode vars k_balloon, // Number of balloons left - k_comebackhits, // Number of times hit in comeback mode k_comebackpoints, // Number of times you've bombed or gave an item to someone; once it's 3 it gets set back to 0 and you're given a balloon k_comebackmode, // 0 = bomb, 1 = item k_comebackshowninfo,// Have you already seen the info screen before? diff --git a/src/g_game.c b/src/g_game.c index 6e575686..49822076 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2200,7 +2200,7 @@ void G_PlayerReborn(INT32 player) INT32 starpostwp; INT32 offroad; INT32 balloon; - INT32 comebackhits; + INT32 comebackpoints; score = players[player].score; lives = players[player].lives; @@ -2256,7 +2256,7 @@ void G_PlayerReborn(INT32 player) starpostwp = players[player].kartstuff[k_starpostwp]; offroad = players[player].kartstuff[k_offroad]; balloon = players[player].kartstuff[k_balloon]; - comebackhits = players[player].kartstuff[k_comebackhits]; + comebackpoints = players[player].kartstuff[k_comebackpoints]; p = &players[player]; memset(p, 0, sizeof (*p)); @@ -2313,8 +2313,8 @@ void G_PlayerReborn(INT32 player) p->kartstuff[k_starpostwp] = starpostwp; // TODO: get these out of kartstuff, it causes desync p->kartstuff[k_offroad] = offroad; p->kartstuff[k_balloon] = balloon; - p->kartstuff[k_comebackhits] = comebackhits; - p->kartstuff[k_comebacktimer] = comebacktime * (comebackhits+1); + p->kartstuff[k_comebackpoints] = comebackpoints; + p->kartstuff[k_comebacktimer] = comebacktime; // Don't do anything immediately p->pflags |= PF_USEDOWN; @@ -2326,7 +2326,7 @@ void G_PlayerReborn(INT32 player) p->panim = PA_IDLE; // standing animation if ((netgame || multiplayer) && !p->spectator) - p->powers[pw_flashing] = flashingtics-1; // Babysitting deterrent + p->powers[pw_flashing] = K_GetKartFlashing(p)-1; // Babysitting deterrent if (p-players == consoleplayer) { diff --git a/src/k_kart.c b/src/k_kart.c index 88c9a442..0cd2a1ea 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1394,7 +1394,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->kartstuff[k_comebackshowninfo] = 1; } - if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == flashingtics) + if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == K_GetKartFlashing(player)) player->powers[pw_flashing]--; if (player->kartstuff[k_magnettimer]) @@ -1455,11 +1455,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_sounds]) player->kartstuff[k_sounds]--; - if (player->kartstuff[k_comebackhits] > 5) - player->kartstuff[k_comebackhits] = 5; - else if (player->kartstuff[k_comebackhits] < 0) - player->kartstuff[k_comebackhits] = 0; - // ??? /* if (player->kartstuff[k_jmp] > 1 && onground) @@ -1643,10 +1638,7 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) break; } - if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) - k_speed += 3; // 153 - else - k_speed += player->kartspeed*3; // 153 - 177 + k_speed += player->kartspeed*3; // 153 - 177 finalspeed = FixedMul(FixedMul(k_speed<<14, g_cc), player->mo->scale); @@ -1655,19 +1647,27 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) return finalspeed; } -static fixed_t K_GetKartAccel(player_t *player) +fixed_t K_GetKartAccel(player_t *player) { fixed_t k_accel = 32; // 36; - if (gametype == GT_RACE || player->kartstuff[k_balloon] > 0) - { - //k_accel += 3 * (9 - player->kartspeed); // 36 - 60 - k_accel += 4 * (9 - player->kartspeed); // 32 - 64 - } + //k_accel += 3 * (9 - player->kartspeed); // 36 - 60 + k_accel += 4 * (9 - player->kartspeed); // 32 - 64 return FixedMul(k_accel, K_GetKartBoostPower(player, false)); } +UINT16 K_GetKartFlashing(player_t *player) +{ + UINT16 tics = flashingtics; + if (gametype != GT_RACE) + { + tics *= 2; + //tics += (3*TICRATE/8) * (player->kartspeed-1); + } + return tics; +} + fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove) { fixed_t accelmax = 4000; @@ -1729,8 +1729,6 @@ void K_SpinPlayer(player_t *player, mobj_t *source) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } - else - player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1738,7 +1736,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) K_CheckBalloons(); } - player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + player->kartstuff[k_comebacktimer] = comebacktime; if (player->kartstuff[k_spinouttype] <= 0) { @@ -1756,7 +1754,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) else player->kartstuff[k_spinouttimer] = 1*TICRATE; // ? Whipeout - player->powers[pw_flashing] = flashingtics; + player->powers[pw_flashing] = K_GetKartFlashing(player); player->kartstuff[k_spinout] = player->kartstuff[k_spinouttimer]; @@ -1789,8 +1787,6 @@ void K_SquishPlayer(player_t *player, mobj_t *source) CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } - else - player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1798,11 +1794,11 @@ void K_SquishPlayer(player_t *player, mobj_t *source) K_CheckBalloons(); } - player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + player->kartstuff[k_comebacktimer] = comebacktime; player->kartstuff[k_squishedtimer] = 1*TICRATE; - player->powers[pw_flashing] = flashingtics; + player->powers[pw_flashing] = K_GetKartFlashing(player); player->mo->flags |= MF_NOCLIP; @@ -1838,8 +1834,6 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju CONS_Printf(M_GetText("%s lost all of their balloons!\n"), player_names[player-players]); player->kartstuff[k_balloon]--; } - else - player->kartstuff[k_comebackhits]++; if (source && source->player && player != source->player) P_AddPlayerScore(source->player, 1); @@ -1847,13 +1841,13 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju K_CheckBalloons(); } - player->kartstuff[k_comebacktimer] = comebacktime * (player->kartstuff[k_comebackhits]+1); + player->kartstuff[k_comebacktimer] = comebacktime; 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] = K_GetKartFlashing(player); if (player->mo->state != &states[S_KART_SPIN]) P_SetPlayerMobjState(player->mo, S_KART_SPIN); @@ -1921,7 +1915,7 @@ void K_StealBalloon(player_t *player, player_t *victim) P_SetMobjState(newmo, S_BATTLEBALLOON1); player->kartstuff[k_balloon]++; - player->powers[pw_flashing] = flashingtics; + player->powers[pw_flashing] = K_GetKartFlashing(player); return; } @@ -4492,7 +4486,7 @@ static void K_drawKartBalloonsOrKarma(void) if (stplyr->kartstuff[k_balloon] <= 0) { V_DrawScaledPatch(LAPS_X, STRINGY(LAPS_Y), flags, kp_karmasticker); - V_DrawKartString(LAPS_X+58, STRINGY(LAPS_Y+3), flags, va("%d", stplyr->kartstuff[k_comebackhits])); + V_DrawKartString(LAPS_X+58, STRINGY(LAPS_Y+3), flags, va("%d", stplyr->kartstuff[k_comebackpoints])); V_DrawKartString(LAPS_X+85, STRINGY(LAPS_Y+3), flags, va("3")); } else @@ -4515,7 +4509,7 @@ static void K_drawKartBalloonsOrKarma(void) fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my) { fixed_t dist, x; - fixed_t range = RING_DIST/4; + fixed_t range = RING_DIST/3; angle_t diff; range *= (K_GetKartCC()/50); @@ -4587,51 +4581,51 @@ static void K_drawKartPlayerCheck(void) } } -static void K_drawBattleWait(void) +static void K_drawBattleFullscreen(void) { - INT32 t = ((stplyr->kartstuff[k_comebacktimer]+TICRATE)/TICRATE); - INT32 X = BASEVIDWIDTH/2; - - if (!WipeInAction || !menuactive || !splitscreen) + if (!WipeInAction && !menuactive && !splitscreen) V_DrawFadeScreen(); - while (t) + if (stplyr->exiting) { - X -= 8; - t /= 10; - } - - if (!stplyr->kartstuff[k_comebackshowninfo]) - { - V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battleinfo); - V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY((BASEVIDHEIGHT/2) + 66), 0, kp_timeoutsticker); - V_DrawKartString(X, STRINGY((BASEVIDHEIGHT/2) + 66), 0, va("%d", ((stplyr->kartstuff[k_comebacktimer]+TICRATE)/TICRATE))); - } - else - { - V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlewait); - V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY((BASEVIDHEIGHT/2) + 30), 0, kp_timeoutsticker); - V_DrawKartString(X, STRINGY((BASEVIDHEIGHT/2) + 30), 0, va("%d", ((stplyr->kartstuff[k_comebacktimer]+TICRATE)/TICRATE))); - } -} - -static void K_drawBattleExit(void) -{ - if (!WipeInAction || !menuactive || !(splitscreen && stplyr != &players[consoleplayer])) - V_DrawFadeScreen(); - if (splitscreen) - { - if (stplyr->kartstuff[k_balloon]) - V_DrawScaledPatch(96, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlewin); + if (splitscreen) + { + if (stplyr->kartstuff[k_balloon]) + V_DrawScaledPatch(96, STRINGY(100), 0, kp_battlewin); + else + V_DrawScaledPatch(BASEVIDWIDTH-96, STRINGY(100), 0, kp_battlelose); + } else - V_DrawScaledPatch(BASEVIDWIDTH-96, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlelose); + { + if (stplyr->kartstuff[k_balloon]) + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(100), 0, kp_battlewin); + else + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(100), 0, kp_battlelose); + } } - else + else if (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && cv_kartcomeback.value) { - if (stplyr->kartstuff[k_balloon]) - V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlewin); + INT32 t = stplyr->kartstuff[k_comebacktimer]/TICRATE; + INT32 X = BASEVIDWIDTH/2; + + while (t) + { + X -= 8; + t /= 10; + } + + if (!stplyr->kartstuff[k_comebackshowninfo]) + { + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battleinfo); + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY((BASEVIDHEIGHT/2) + 66), 0, kp_timeoutsticker); + V_DrawKartString(X, STRINGY((BASEVIDHEIGHT/2) + 66), 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE)); + } else - V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlelose); + { + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY(BASEVIDHEIGHT/2), 0, kp_battlewait); + V_DrawScaledPatch(BASEVIDWIDTH/2, STRINGY((BASEVIDHEIGHT/2) + 30), 0, kp_timeoutsticker); + V_DrawKartString(X, STRINGY((BASEVIDHEIGHT/2) + 30), 0, va("%d", stplyr->kartstuff[k_comebacktimer]/TICRATE)); + } } } @@ -4747,18 +4741,10 @@ void K_drawKartHUD(void) K_initKartHUD(); // Draw full screen stuff that turns off the rest of the HUD - if (gametype != GT_RACE) + if ((gametype != GT_RACE) && (stplyr->exiting || (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && cv_kartcomeback.value))) { - if (stplyr->exiting) - { - K_drawBattleExit(); - return; - } - else if (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && cv_kartcomeback.value) - { - K_drawBattleWait(); - return; - } + K_drawBattleFullscreen(); + return; } // Draw Lakitu diff --git a/src/k_kart.h b/src/k_kart.h index 187cbd9c..e329ce13 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -31,6 +31,8 @@ boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); void K_MomentumToFacing(player_t *player); fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower); +fixed_t K_GetKartAccel(player_t *player); +UINT16 K_GetKartFlashing(player_t *player); fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove); void K_MoveKartPlayer(player_t *player, boolean onground); void K_CheckBalloons(void); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 61d9e8f3..dd4a1102 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2139,6 +2139,26 @@ static int lib_kGetKartSpeed(lua_State *L) return 0; } +static int lib_kGetKartAccel(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + //HUDSAFE + if (!player) + return LUA_ErrInvalid(L, "player_t"); + lua_pushinteger(L, K_GetKartAccel(player)); + return 0; +} + +static int lib_kGetKartFlashing(lua_State *L) +{ + player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + //HUDSAFE + if (!player) + return LUA_ErrInvalid(L, "player_t"); + lua_pushinteger(L, K_GetKartFlashing(player)); + return 0; +} + static luaL_Reg lib[] = { {"print", lib_print}, {"EvalMath", lib_evalMath}, @@ -2326,6 +2346,8 @@ static luaL_Reg lib[] = { {"K_DoBouncePad",lib_kDoBouncePad}, {"K_MomentumToFacing",lib_kMomentumToFacing}, {"K_GetKartSpeed",lib_kGetKartSpeed}, + {"K_GetKartAccel",lib_kGetKartAccel}, + {"K_GetKartFlashing",lib_kGetKartFlashing}, {NULL, NULL} }; diff --git a/src/m_cheat.c b/src/m_cheat.c index cad35431..69e691a5 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -33,6 +33,8 @@ #include "z_zone.h" #include "p_slopes.h" +#include "k_kart.h" // srb2kart + #include "lua_script.h" #include "lua_hook.h" @@ -1348,7 +1350,7 @@ void Command_ObjectPlace_f(void) players[0].mo->color = op_oldcolor; // This is necessary for recovery of dying players. - if (players[0].powers[pw_flashing] >= flashingtics) - players[0].powers[pw_flashing] = flashingtics - 1; + if (players[0].powers[pw_flashing] >= K_GetKartFlashing(&players[0])) + players[0].powers[pw_flashing] = K_GetKartFlashing(&players[0]) - 1; } } diff --git a/src/p_enemy.c b/src/p_enemy.c index deeb7b82..2b010327 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3627,7 +3627,9 @@ void A_AttractChase(mobj_t *actor) P_LookForShield(actor); // Go find 'em, boy! - if (!actor->tracer + if (actor->tracer && actor->tracer->player && actor->tracer->player->kartstuff[k_comebackmode] == 1) + ; + else if (!actor->tracer || !actor->tracer->player || !actor->tracer->health || !P_CheckSight(actor, actor->tracer)) // You have to be able to SEE it...sorta diff --git a/src/p_inter.c b/src/p_inter.c index a3d91120..ec0875fb 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -414,6 +414,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) { if (player->kartstuff[k_comebackmode] == 0 && !player->kartstuff[k_comebacktimer]) { + if (special->tracer && special->tracer->player) + special->tracer->player->kartstuff[k_comebackmode] = 0; P_SetTarget(&special->tracer, toucher); player->kartstuff[k_comebackmode] = 1; } @@ -437,10 +439,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[special->tracer->player-players]); } - special->tracer->player->kartstuff[k_comebackhits]--; - if (special->tracer->player->kartstuff[k_comebackhits] < 0) - special->tracer->player->kartstuff[k_comebackhits] = 0; - special->tracer->player->kartstuff[k_comebacktimer] = comebacktime * (special->tracer->player->kartstuff[k_comebackhits]+1); + special->tracer->player->kartstuff[k_comebacktimer] = comebacktime; } special->momx = special->momy = special->momz = 0; @@ -2596,7 +2595,7 @@ static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source) target->momy = FixedMul(FINESINE(fa),target->target->radius); } - player->powers[pw_flashing] = flashingtics; + player->powers[pw_flashing] = K_GetKartFlashing(player); P_SetMobjState(target->tracer, S_NIGHTSHURT1); S_StartSound(target, sfx_nghurt); @@ -3313,7 +3312,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player->health -= damage; // mirror mobj health here if (damage < 10000) { - target->player->powers[pw_flashing] = flashingtics; + target->player->powers[pw_flashing] = K_GetKartFlashing(target->player); if (damage > 0) // don't spill emeralds/ammo/panels for shield damage P_PlayerRingBurst(player, damage); } diff --git a/src/p_map.c b/src/p_map.c index ca40ba7d..2006cc5b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -675,7 +675,8 @@ static boolean PIT_CheckThing(mobj_t *thing) && (tmthing->target == thing->target)) // Don't hit each other if you have the same target return true; - if (thing->player && thing->player->powers[pw_flashing]) + if (thing->player && thing->player->powers[pw_flashing] + && !(tmthing->type == MT_GREENITEM || tmthing->type == MT_REDITEM || tmthing->type == MT_REDITEMDUD)) return true; if (thing->type == MT_PLAYER) @@ -1107,7 +1108,8 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->z + tmthing->height < thing->z) return true; // underneath - if (tmthing->player && tmthing->player->powers[pw_flashing]) + if (tmthing->player && tmthing->player->powers[pw_flashing] + && !(thing->type == MT_GREENITEM || thing->type == MT_REDITEM || thing->type == MT_REDITEMDUD)) return true; if (thing->type == MT_GREENSHIELD || thing->type == MT_TRIPLEGREENSHIELD1 || thing->type == MT_TRIPLEGREENSHIELD2 || thing->type == MT_TRIPLEGREENSHIELD3 @@ -1656,13 +1658,8 @@ static boolean PIT_CheckThing(mobj_t *thing) } K_ExplodePlayer(tmthing->player, thing); - P_AddPlayerScore(thing->player, 1); // 2 points instead of 1 for getting someone in comeback mode, since it's REALLY tough :V - thing->player->kartstuff[k_comebackhits]--; - if (thing->player->kartstuff[k_comebackhits] < 0) - thing->player->kartstuff[k_comebackhits] = 0; - - thing->player->kartstuff[k_comebacktimer] = comebacktime * (thing->player->kartstuff[k_comebackhits]+1); + thing->player->kartstuff[k_comebacktimer] = comebacktime; return true; } else if (thing->player->kartstuff[k_balloon] > 0) @@ -1678,28 +1675,8 @@ static boolean PIT_CheckThing(mobj_t *thing) } K_ExplodePlayer(thing->player, tmthing); - P_AddPlayerScore(tmthing->player, 1); // 2 points instead of 1 for getting someone in comeback mode, since it's REALLY tough :V - tmthing->player->kartstuff[k_comebackhits]--; - if (tmthing->player->kartstuff[k_comebackhits] < 0) - tmthing->player->kartstuff[k_comebackhits] = 0; - - tmthing->player->kartstuff[k_comebacktimer] = comebacktime * (tmthing->player->kartstuff[k_comebackhits]+1); - return true; - } - else if (thing->player->kartstuff[k_balloon] <= 0 && tmthing->player->kartstuff[k_balloon] <= 0) - { - K_KartBouncing(tmthing, thing, false); - thing->player->kartstuff[k_justbumped] = 6; - tmthing->player->kartstuff[k_justbumped] = 6; - - K_SpinPlayer(thing->player, tmthing); - K_SpinPlayer(tmthing->player, thing); - - thing->player->kartstuff[k_comebackhits]++; - thing->player->kartstuff[k_comebacktimer] = comebacktime * (thing->player->kartstuff[k_comebackhits]+1); - tmthing->player->kartstuff[k_comebackhits]++; - tmthing->player->kartstuff[k_comebacktimer] = comebacktime * (tmthing->player->kartstuff[k_comebackhits]+1); + tmthing->player->kartstuff[k_comebacktimer] = comebacktime; return true; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 589887c0..a32f36e1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -216,10 +216,10 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) } } // You were in pain state after taking a hit, and you're moving out of pain state now? - else */if (mobj->state == &states[mobj->info->painstate] && player->powers[pw_flashing] == flashingtics && state != mobj->info->painstate) + else */if (mobj->state == &states[mobj->info->painstate] && player->powers[pw_flashing] == K_GetKartFlashing(player) && state != mobj->info->painstate) { // Start flashing, since you've landed. - player->powers[pw_flashing] = flashingtics-1; + player->powers[pw_flashing] = K_GetKartFlashing(player)-1; //P_DoPityCheck(player); } @@ -9456,6 +9456,8 @@ void P_SpawnPlayer(INT32 playernum) { if (!playeringame[i] || players[i].spectator || &players[i] == p) continue; + if (players[i].jointime > 0) + continue; pcount++; } diff --git a/src/p_spec.c b/src/p_spec.c index bc25ac79..0d429b8e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -7547,7 +7547,7 @@ void T_Pusher(pusher_t *p) if (thing->player && thing->player->pflags & PF_ROPEHANG) continue; - if (thing->player && (thing->state == &states[thing->info->painstate]) && (thing->player->powers[pw_flashing] > (flashingtics/4)*3 && thing->player->powers[pw_flashing] <= flashingtics)) + if (thing->player && (thing->state == &states[thing->info->painstate]) && (thing->player->powers[pw_flashing] > (K_GetKartFlashing(thing->player)/4)*3 && thing->player->powers[pw_flashing] <= K_GetKartFlashing(thing->player))) continue; inFOF = touching = moved = false; diff --git a/src/p_user.c b/src/p_user.c index 34fd0cd4..5e2d1256 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -863,7 +863,7 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor) P_ResetPlayer(player); P_SetPlayerMobjState(player->mo, player->mo->info->painstate); - player->powers[pw_flashing] = flashingtics; + player->powers[pw_flashing] = K_GetKartFlashing(player); if (player->timeshit != UINT8_MAX) ++player->timeshit; @@ -1607,9 +1607,7 @@ void P_DoPlayerExit(player_t *player) if (player->exiting) return; - /*if (cv_allowexitlevel.value == 0 && !G_PlatformGametype()) // srb2kart - return; - else*/ if (gametype == GT_RACE || gametype == GT_COMPETITION) // If in Race Mode, allow + if (gametype == GT_RACE || gametype == GT_COMPETITION) // If in Race Mode, allow { // SRB2kart 120217 if (!countdown && !(netgame || multiplayer)) @@ -3557,7 +3555,7 @@ static void P_DoSuperStuff(player_t *player) } if (gametype != GT_COOP) - player->powers[pw_flashing] = flashingtics-1; + player->powers[pw_flashing] = K_GetKartFlashing(player)-1; /* if (player->mo->health > 0) @@ -5842,7 +5840,7 @@ static void P_NiGHTSMovement(player_t *player) } // Currently reeling from being hit. - if (player->powers[pw_flashing] > (2*flashingtics)/3) + if (player->powers[pw_flashing] > (2*K_GetKartFlashing(player))/3) { { const angle_t fa = (FixedAngle(player->flyangle*FRACUNIT)>>ANGLETOFINESHIFT) & FINEMASK; @@ -9120,7 +9118,7 @@ void P_PlayerThink(player_t *player) // If it is set, start subtracting // Don't allow it to go back to 0 - if (player->exiting > 1 && player->exiting < 3*TICRATE && player->exiting > 1) // SRB2kart - " && player->exiting > 1" + if (player->exiting > 1 && (player->exiting < 3*TICRATE || gametype != GT_RACE)) // SRB2kart - "&& player->exiting > 1" player->exiting--; if (player->exiting && countdown2) @@ -9375,7 +9373,7 @@ void P_PlayerThink(player_t *player) if (player->powers[pw_invulnerability] && player->powers[pw_invulnerability] < UINT16_MAX) player->powers[pw_invulnerability]--; - if (player->powers[pw_flashing] && player->powers[pw_flashing] < UINT16_MAX && ((player->pflags & PF_NIGHTSMODE) || player->powers[pw_flashing] < flashingtics)) + if (player->powers[pw_flashing] && player->powers[pw_flashing] < UINT16_MAX && ((player->pflags & PF_NIGHTSMODE) || player->powers[pw_flashing] < K_GetKartFlashing(player))) player->powers[pw_flashing]--; if (player->powers[pw_tailsfly] && player->powers[pw_tailsfly] < UINT16_MAX && player->charability != CA_SWIM && !(player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))) // tails fly counter @@ -9467,7 +9465,7 @@ void P_PlayerThink(player_t *player) && player->kartstuff[k_bootimer] == 0 && player->kartstuff[k_growshrinktimer] <= 0 && (player->kartstuff[k_comebacktimer] == 0 || (gametype == GT_RACE || player->kartstuff[k_balloon] > 0))) { - if (player->powers[pw_flashing] > 0 && player->powers[pw_flashing] < flashingtics && (leveltime & 1)) + if (player->powers[pw_flashing] > 0 && player->powers[pw_flashing] < K_GetKartFlashing(player) && (leveltime & 1)) player->mo->flags2 |= MF2_DONTDRAW; else player->mo->flags2 &= ~MF2_DONTDRAW; From 06eca5fbb5bc0aa27e992269152e59812c9b0e10 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 17 Nov 2017 17:36:04 -0500 Subject: [PATCH 56/61] Minor things - crash fix - commented out player 2 spawning with balloons - double checked battle exiting is 10 sec --- src/k_kart.c | 11 ++--------- src/p_mobj.c | 20 +++++++------------- src/p_user.c | 2 ++ 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 0cd2a1ea..9c5d60c7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2597,16 +2597,9 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) static void K_KartDrift(player_t *player, boolean onground) { - fixed_t dsone; - fixed_t dstwo; - // IF YOU CHANGE THESE: MAKE SURE YOU UPDATE THE SAME VALUES IN p_mobjc, "case MT_DRIFT:" - if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) - dsone = 26*4 + 2; - else - dsone = 26*4 + player->kartspeed*2 + (9 - player->kartweight); - - dstwo = dsone*2; + fixed_t dsone = 26*4 + player->kartspeed*2 + (9 - player->kartweight); + fixed_t dstwo = dsone*2; // Drifting is actually straffing + automatic turning. // Holding the Jump button will enable drifting. diff --git a/src/p_mobj.c b/src/p_mobj.c index a32f36e1..8c0b394b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6459,15 +6459,8 @@ void P_MobjThinker(mobj_t *mobj) //{ SRB2kart mobs case MT_DRIFT: { - fixed_t dsone; - fixed_t dstwo; - - if (gametype != GT_RACE && mobj->target->player->kartstuff[k_balloon] <= 0) - dsone = 26*4 + 2 + (9 - mobj->target->player->kartweight); - else - dsone = 26*4 + mobj->target->player->kartspeed*2 + (9 - mobj->target->player->kartweight); - - dstwo = dsone*2; + fixed_t dsone = 26*4 + mobj->target->player->kartspeed*2 + (9 - mobj->target->player->kartweight); + fixed_t dstwo = dsone*2; if ((mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) && (mobj->type == MT_DRIFT && mobj->target->player->kartstuff[k_driftcharge] >= dsone)) @@ -9449,7 +9442,7 @@ void P_SpawnPlayer(INT32 playernum) if (gametype != GT_RACE) { - INT32 i; + /*INT32 i; INT32 pcount = 0; for (i = 0; i < MAXPLAYERS; i++) @@ -9459,17 +9452,18 @@ void P_SpawnPlayer(INT32 playernum) if (players[i].jointime > 0) continue; pcount++; - } + }*/ - if (p->kartstuff[k_balloon] > 0 || leveltime < 1 || pcount <= 1) // srb2kart + if (p->kartstuff[k_balloon] > 0 || leveltime < 1/* || pcount <= 1*/) // srb2kart { + INT32 i; angle_t newangle; angle_t diff; fixed_t newx; fixed_t newy; mobj_t *mo; - if (leveltime < 1 || pcount <= 1) // Start of the map? + if (leveltime < 1 /*|| pcount <= 1*/) // Start of the map? p->kartstuff[k_balloon] = cv_kartballoons.value; // Reset those balloons! if (p->kartstuff[k_balloon] <= 1) diff --git a/src/p_user.c b/src/p_user.c index 5e2d1256..583a0547 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1650,6 +1650,8 @@ void P_DoPlayerExit(player_t *player) if (P_CheckRacers()) player->exiting = (14*TICRATE)/5 + 1; } + else if (gametype != GT_RACE) + player->exiting = 10*TICRATE + 2; // Accidental death safeguard??? else player->exiting = (14*TICRATE)/5 + 2; // Accidental death safeguard??? From ff667b7e45a92de0afe99a0563f845690b471cbf Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Fri, 17 Nov 2017 22:40:24 +0000 Subject: [PATCH 57/61] Fix the items hitting people you bump bug --- src/p_mobj.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index aa2d0ff3..6955677e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6582,9 +6582,11 @@ void P_MobjThinker(mobj_t *mobj) z = mobj->target->z + mobj->target->height - mobj->height; } + mobj->flags |= MF_NOCLIPTHING; // temporarily make them noclip other objects so they can't hit anyone while in the player P_TeleportMove(mobj, mobj->target->x, mobj->target->y, z); mobj->momx = FixedMul(FINECOSINE(mobj->angle>>ANGLETOFINESHIFT),radius); mobj->momy = FixedMul(FINESINE(mobj->angle>>ANGLETOFINESHIFT), radius); + mobj->flags &= ~MF_NOCLIPTHING; if (!P_TryMove(mobj, mobj->target->x + mobj->momx, mobj->target->y + mobj->momy, true)) P_SlideMove(mobj, true); if (P_IsObjectOnGround(mobj->target)) From 4af56c2fd67a8451261fec3363903b647c8122be Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 17 Nov 2017 22:00:10 -0500 Subject: [PATCH 58/61] Better Lua support(?) Now can retrieve kartstuff, haven't tested but should be fine? --- src/dehacked.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/src/dehacked.c b/src/dehacked.c index 2991286a..887466e2 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7313,6 +7313,80 @@ static const char *const POWERS_LIST[] = { "INGOOP" // In goop }; +static const char *const KARTSTUFF_LIST[] = { + "POSITION", + "OLDPOSITION", + "POSITIONDELAY", + "PREVCHECK", + "NEXTCHECK", + "WAYPOINT", + "STARPOSTWP", + "LAKITU", + + "THROWDIR", + "CAMSPIN", + "LAPANIMATION", + "SOUNDS", + + "BOOSTING", + "FLOORBOOST", + "SPINOUT", + "SPINOUTTYPE", + + "DRIFT", + "DRIFTEND", + "DRIFTCHARGE", + "DRIFTBOOST", + "BOOSTCHARGE", + "JMP", + "OFFROAD", + + "ITEMROULETTE", + "ITEMCLOSE", + + "MAGNETTIMER", + "BOOTIMER", + "BOOTAKETIMER", + "BOOSTOLENTIMER", + "MUSHROOMTIMER", + "GROWSHRINKTIMER", + "SQUISHEDTIMER", + "GOLDSHROOMTIMER", + "STARTIMER", + "SPINOUTTIMER", + "LASERWISPTIMER", + "JUSTBUMPED", + "POWERITEMTIMER", + "COMEBACKTIMER", + + "MAGNET", + "BOO", + "MUSHROOM", + "MEGASHROOM", + "GOLDSHROOM", + "STAR", + "TRIPLEBANANA", + "FAKEITEM", + "BANANA", + "GREENSHELL", + "REDSHELL", + "LASERWISP", + "TRIPLEGREENSHELL", + "BOBOMB", + "BLUESHELL", + "JAWS", + "FIREFLOWER", + "TRIPLEREDSHELL", + "LIGHTNING", + "FEATHER", + "KITCHENSINK", + + "BALLOON", + "COMEBACKPOINTS", + "COMEBACKMODE", + "COMEBACKSHOWNINFO" +}; + static const char *const HUDITEMS_LIST[] = { "LIVESNAME", "LIVESPIC", @@ -8183,6 +8257,7 @@ void FUNCMATH DEH_Check(void) const size_t dehstates = sizeof(STATE_LIST)/sizeof(const char*); const size_t dehmobjs = sizeof(MOBJTYPE_LIST)/sizeof(const char*); const size_t dehpowers = sizeof(POWERS_LIST)/sizeof(const char*); + const size_t dehkartstuff = sizeof(KARTSTUFF_LIST)/sizeof(const char*); const size_t dehcolors = sizeof(COLOR_ENUMS)/sizeof(const char*); if (dehstates != S_FIRSTFREESLOT) @@ -8194,6 +8269,9 @@ void FUNCMATH DEH_Check(void) if (dehpowers != NUMPOWERS) I_Error("You forgot to update the Dehacked powers list, you dolt!\n(%d powers defined, versus %s in the Dehacked list)\n", NUMPOWERS, sizeu1(dehpowers)); + if (dehkartstuff != NUMKARTSTUFF) + I_Error("You forgot to update the Dehacked powers list, you dolt!\n(%d kartstuff defined, versus %s in the Dehacked list)\n", NUMKARTSTUFF, sizeu1(dehkartstuff)); + if (dehcolors != MAXTRANSLATIONS) I_Error("You forgot to update the Dehacked colors list, you dolt!\n(%d colors defined, versus %s in the Dehacked list)\n", MAXTRANSLATIONS, sizeu1(dehcolors)); #endif @@ -8533,6 +8611,24 @@ static inline int lib_getenum(lua_State *L) } return luaL_error(L, "power '%s' could not be found.\n", word); } + else if (!mathlib && fastncmp("k_",word,3)) { + p = word+3; + for (i = 0; i < NUMKARTSTUFF; i++) + if (fasticmp(p, KARTSTUFF_LIST[i])) { + lua_pushinteger(L, i); + return 1; + } + return 0; + } + else if (mathlib && fastncmp("K_",word,3)) { // SOCs are ALL CAPS! + p = word+3; + for (i = 0; i < NUMKARTSTUFF; i++) + if (fastcmp(p, KARTSTUFF_LIST[i])) { + lua_pushinteger(L, i); + return 1; + } + return luaL_error(L, "kartstuff '%s' could not be found.\n", word); + } else if (fastncmp("HUD_",word,4)) { p = word+4; for (i = 0; i < NUMHUDITEMS; i++) From 81c723b9b569f40e80e3b5e436e3b08d167a9e0e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 19 Nov 2017 02:37:28 -0500 Subject: [PATCH 59/61] Bounce Pad stuff - K_DoBouncePad now uses mobj_t instead of player_t - Bounce pads can now bump thrown shells - Bounce pads now give heavier gravity to players - The suicide command now works in all gamemodes --- src/d_netcmd.c | 6 +++--- src/k_kart.c | 45 +++++++++++++++++++++++++++++++++++---------- src/k_kart.h | 2 +- src/lua_baselib.c | 8 ++++---- src/p_mobj.c | 24 ++++++++++++++++++++++++ src/p_spec.c | 5 +++-- 6 files changed, 70 insertions(+), 20 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index e4a23e24..80f88cdd 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1976,11 +1976,11 @@ static void Command_Suicide(void) return; } - if (!G_PlatformGametype()) + /*if (!G_PlatformGametype()) // srb2kart: not necessary, suiciding makes you lose a balloon in battle, so it's not desirable to use as a way to escape a hit { CONS_Printf(M_GetText("You may only use this in co-op, race, and competition!\n")); return; - } + }*/ // Retry is quicker. Probably should force people to use it. if (!(netgame || multiplayer)) @@ -1997,7 +1997,7 @@ static void Got_Suicide(UINT8 **cp, INT32 playernum) INT32 suicideplayer = READINT32(*cp); // You can't suicide someone else. Nice try, there. - if (suicideplayer != playernum || (!G_PlatformGametype())) + if (suicideplayer != playernum) // srb2kart: "|| (!G_PlatformGametype())" { CONS_Alert(CONS_WARNING, M_GetText("Illegal suicide command received from %s\n"), player_names[playernum]); if (server) diff --git a/src/k_kart.c b/src/k_kart.c index 7627afca..1b88724f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2506,24 +2506,49 @@ static void K_DoLightning(player_t *player, boolean bluelightning) player->kartstuff[k_sounds] = 50; } -void K_DoBouncePad(player_t *player, fixed_t vertispeed) +void K_DoBouncePad(mobj_t *mo, fixed_t vertispeed) { - if (player->spectator || !player->mo) + if (mo->player && mo->player->spectator) return; - if (player->mo->eflags & MFE_SPRUNG) + if (mo->eflags & MFE_SPRUNG) return; #ifdef ESLOPE - player->mo->standingslope = NULL; + mo->standingslope = NULL; #endif - player->mo->eflags |= MFE_SPRUNG; - if (player->mo->eflags & MFE_VERTICALFLIP) + mo->eflags |= MFE_SPRUNG; + + if (mo->eflags & MFE_VERTICALFLIP) vertispeed *= -1; - player->mo->momz = FixedMul(vertispeed, player->mo->scale); - S_StartSound(player->mo, sfx_boing); + if (vertispeed == 0) + { + fixed_t thrust; + + if (mo->player) + { + thrust = 3*mo->player->speed/2; + if (thrust < 48<momx,mo->momy); + if (thrust < 8< 72<momz = FixedMul(FINESINE(ANGLE_22h>>ANGLETOFINESHIFT), thrust); + } + else + mo->momz = FixedMul(vertispeed, mo->scale); + + S_StartSound(mo, sfx_boing); } // Returns false if this player being placed here causes them to collide with any other player @@ -3330,7 +3355,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_feather] & 1 && NO_BOO) { K_PlayTauntSound(player->mo); - K_DoBouncePad(player, 30<mo, 32<pflags |= PF_ATTACKDOWN; player->kartstuff[k_feather] |= 2; @@ -4470,7 +4495,7 @@ static void K_drawKartSpeedometer(void) else if (cv_speedometer.value == 3) { convSpeed = stplyr->speed/FRACUNIT; - V_DrawKartString(SPDM_X, STRINGY(SPDM_Y), flags, va("%3d Fracunits/s", convSpeed)); + V_DrawKartString(SPDM_X, STRINGY(SPDM_Y), flags, va("%3d fu/s", convSpeed)); } } diff --git a/src/k_kart.h b/src/k_kart.h index e329ce13..e99028b0 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -26,7 +26,7 @@ void K_StealBalloon(player_t *player, player_t *victim); 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 *source); void K_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); -void K_DoBouncePad(player_t *player, fixed_t vertispeed); +void K_DoBouncePad(mobj_t *mo, fixed_t vertispeed); boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y); INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue); void K_MomentumToFacing(player_t *player); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index dd4a1102..b04a3b8f 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2109,12 +2109,12 @@ static int lib_kDoMushroom(lua_State *L) static int lib_kDoBouncePad(lua_State *L) { - player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); fixed_t vertispeed = luaL_checkfixed(L, 2); NOHUD - if (!player) - return LUA_ErrInvalid(L, "player_t"); - K_DoBouncePad(player, vertispeed); + if (!mo) + return LUA_ErrInvalid(L, "mobj_t"); + K_DoBouncePad(mo, vertispeed); return 0; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 025d7131..cbaa7167 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7669,6 +7669,7 @@ void P_MobjThinker(mobj_t *mobj) break; case MT_GREENITEM: { + sector_t *sec2; fixed_t finalspeed = mobj->info->speed; P_SpawnGhostMobj(mobj); @@ -7696,14 +7697,21 @@ void P_MobjThinker(mobj_t *mobj) { P_InstaThrust(mobj, mobj->angle, finalspeed); } + + sec2 = P_ThingOnSpecial3DFloor(mobj); + if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) || (P_IsObjectOnGround(mobj) && GETSECSPECIAL(mobj->subsector->sector->special, 3) == 1)) + K_DoBouncePad(mobj, 0); + if (mobj->threshold > 0) mobj->threshold--; + if (leveltime % 6 == 0) S_StartSound(mobj, mobj->info->activesound); break; } case MT_REDITEM: { + sector_t *sec2; fixed_t topspeed = 64*FRACUNIT; fixed_t distbarrier = 512*FRACUNIT; fixed_t distaway; @@ -7740,17 +7748,33 @@ void P_MobjThinker(mobj_t *mobj) } P_InstaThrust(mobj, R_PointToAngle2(0, 0, mobj->momx, mobj->momy), topspeed); + + sec2 = P_ThingOnSpecial3DFloor(mobj); + if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) || (P_IsObjectOnGround(mobj) && GETSECSPECIAL(mobj->subsector->sector->special, 3) == 1)) + K_DoBouncePad(mobj, 0); + break; } case MT_REDITEMDUD: + { + sector_t *sec2; + P_SpawnGhostMobj(mobj); mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->x+mobj->momx, mobj->y+mobj->momy); P_InstaThrust(mobj, mobj->angle, mobj->info->speed); + + sec2 = P_ThingOnSpecial3DFloor(mobj); + if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) || (P_IsObjectOnGround(mobj) && GETSECSPECIAL(mobj->subsector->sector->special, 3) == 1)) + K_DoBouncePad(mobj, 0); + if (mobj->threshold > 0) mobj->threshold--; + if (leveltime % 7 == 0) S_StartSound(mobj, mobj->info->activesound); + break; + } case MT_BANANAITEM: case MT_FAKEITEM: if (mobj->momx || mobj->momy) diff --git a/src/p_spec.c b/src/p_spec.c index 0d429b8e..716cf576 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3734,8 +3734,9 @@ DoneSection2: if (player->speed < K_GetKartSpeed(player, true)/16 && !(player->mo->eflags & MFE_SPRUNG)) // Push forward to prevent getting stuck P_InstaThrust(player->mo, player->mo->angle, FixedMul(K_GetKartSpeed(player, true)/16, player->mo->scale)); - - K_DoBouncePad(player, 12<kartstuff[k_feather] |= 2; + K_DoBouncePad(player->mo, 0); break; From a2767fe34128c73eb2ab5f07681898fe24a873d5 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 19 Nov 2017 19:39:40 -0500 Subject: [PATCH 60/61] Some more minor comeback tweaks - Comeback players are now 1 speed with -20 friction - Bombing gives 2 karma now - Item players should no longer be able to be hit - Attempted to fix instances of trying to bomb someone while they can't be touched causing you to lose all your karma and start a console message saying you're back in the game, despite not rewarding a balloon - Fixed a few places where kartspeed & kartweight were being read as fixed point numbers, despite being UINT8's - Fixed up kartstuff Lua support more, functions properly now --- src/dehacked.c | 22 +++++++++--- src/k_kart.c | 86 +++++++++++++++++++++++++++++++++------------ src/k_kart.h | 2 +- src/lua_baselib.c | 3 +- src/lua_playerlib.c | 51 +++++++++++++++++++++++++-- src/lua_skinlib.c | 4 +-- src/p_inter.c | 6 +--- src/p_map.c | 28 +++++---------- src/p_mobj.c | 20 ++++++++--- src/r_things.h | 4 +-- 10 files changed, 162 insertions(+), 64 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 887466e2..c652b99e 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8021,6 +8021,20 @@ static powertype_t get_power(const char *word) return pw_invulnerability; } +static kartstufftype_t get_kartstuff(const char *word) +{ // Returns the vlaue of k_ enumerations + kartstufftype_t i; + if (*word >= '0' && *word <= '9') + return atoi(word); + if (fastncmp("K_",word,2)) + word += 2; // take off the k_ + for (i = 0; i < NUMKARTSTUFF; i++) + if (fastcmp(word, KARTSTUFF_LIST[i])) + return i; + deh_warning("Couldn't find power named 'k_%s'",word); + return k_position; +} + /// \todo Make ANY of this completely over-the-top math craziness obey the order of operations. static fixed_t op_mul(fixed_t a, fixed_t b) { return a*b; } static fixed_t op_div(fixed_t a, fixed_t b) { return a/b; } @@ -8611,8 +8625,8 @@ static inline int lib_getenum(lua_State *L) } return luaL_error(L, "power '%s' could not be found.\n", word); } - else if (!mathlib && fastncmp("k_",word,3)) { - p = word+3; + else if (!mathlib && fastncmp("k_",word,2)) { + p = word+2; for (i = 0; i < NUMKARTSTUFF; i++) if (fasticmp(p, KARTSTUFF_LIST[i])) { lua_pushinteger(L, i); @@ -8620,8 +8634,8 @@ static inline int lib_getenum(lua_State *L) } return 0; } - else if (mathlib && fastncmp("K_",word,3)) { // SOCs are ALL CAPS! - p = word+3; + else if (mathlib && fastncmp("K_",word,2)) { // SOCs are ALL CAPS! + p = word+2; for (i = 0; i < NUMKARTSTUFF; i++) if (fastcmp(p, KARTSTUFF_LIST[i])) { lua_pushinteger(L, i); diff --git a/src/k_kart.c b/src/k_kart.c index 1b88724f..8e576fb7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1629,7 +1629,9 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) fixed_t k_speed = 150; fixed_t g_cc = FRACUNIT; fixed_t xspd = 3072; // 4.6875 aka 3/64 + UINT8 kartspeed = player->kartspeed; fixed_t finalspeed; + switch (K_GetKartCC()) { case 50: @@ -1643,7 +1645,10 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) break; } - k_speed += player->kartspeed*3; // 153 - 177 + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + kartspeed = 1; + + k_speed += kartspeed*3; // 153 - 177 finalspeed = FixedMul(FixedMul(k_speed<<14, g_cc), player->mo->scale); @@ -1655,9 +1660,13 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) fixed_t K_GetKartAccel(player_t *player) { fixed_t k_accel = 32; // 36; + UINT8 kartspeed = player->kartspeed; - //k_accel += 3 * (9 - player->kartspeed); // 36 - 60 - k_accel += 4 * (9 - player->kartspeed); // 32 - 64 + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + kartspeed = 1; + + //k_accel += 3 * (9 - kartspeed); // 36 - 60 + k_accel += 4 * (9 - kartspeed); // 32 - 64 return FixedMul(k_accel, K_GetKartBoostPower(player, false)); } @@ -1714,7 +1723,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source) 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_bootimer] > 0 - || (gametype != GT_RACE && (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]))) + || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) return; if (source && source != player->mo && source->player && !source->player->kartstuff[k_sounds]) @@ -1777,8 +1786,8 @@ void K_SquishPlayer(player_t *player, mobj_t *source) return; if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_startimer] > 0 - || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 - || (gametype != GT_RACE && (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]))) + || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_bootimer] > 0 + || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) return; player->kartstuff[k_mushroomtimer] = 0; @@ -1822,7 +1831,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju 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_bootimer] > 0 - || (gametype != GT_RACE && (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]))) + || (gametype != GT_RACE && ((player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) return; player->mo->momz = 18*FRACUNIT; @@ -1870,7 +1879,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju return; } -void K_StealBalloon(player_t *player, player_t *victim) +void K_StealBalloon(player_t *player, player_t *victim, boolean force) { INT32 newballoon; angle_t newangle, diff; @@ -1883,17 +1892,25 @@ void K_StealBalloon(player_t *player, player_t *victim) if (player->health <= 0 || victim->health <= 0) return; - if (victim->kartstuff[k_balloon] <= 0) // || player->kartstuff[k_balloon] >= cv_kartballoons.value+2 - return; + if (force) + ; + else + { + if (victim->kartstuff[k_balloon] <= 0) // || player->kartstuff[k_balloon] >= cv_kartballoons.value+2 + return; - 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_bootimer] > 0 - || (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer])) - || (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinout] > 0) - || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootimer] > 0)) - return; + 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_bootimer] > 0 + || (player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer])) + || (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinout] > 0) + || victim->kartstuff[k_startimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_bootimer] > 0)) + return; + } - //CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); + if (player->kartstuff[k_balloon] <= 0) + CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[player-players]); + else + CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]); newballoon = player->kartstuff[k_balloon]; if (newballoon <= 1) @@ -1920,8 +1937,8 @@ void K_StealBalloon(player_t *player, player_t *victim) P_SetMobjState(newmo, S_BATTLEBALLOON1); player->kartstuff[k_balloon]++; + player->kartstuff[k_comebackpoints] = 0; player->powers[pw_flashing] = K_GetKartFlashing(player); - return; } @@ -2627,9 +2644,15 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) static void K_KartDrift(player_t *player, boolean onground) { + UINT8 kartspeed = player->kartspeed; + fixed_t dsone, dstwo; + + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + kartspeed = 1; + // IF YOU CHANGE THESE: MAKE SURE YOU UPDATE THE SAME VALUES IN p_mobjc, "case MT_DRIFT:" - fixed_t dsone = 26*4 + player->kartspeed*2 + (9 - player->kartweight); - fixed_t dstwo = dsone*2; + dsone = 26*4 + kartspeed*2 + (9 - player->kartweight); + dstwo = dsone*2; // Drifting is actually straffing + automatic turning. // Holding the Jump button will enable drifting. @@ -3461,9 +3484,28 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Friction if (player->speed > 0 && cmd->forwardmove == 0 && player->mo->friction == 59392) - player->mo->friction += 4608; + player->mo->friction += 4608; if (player->speed > 0 && cmd->forwardmove < 0 && player->mo->friction == 59392) - player->mo->friction += 1608; + player->mo->friction += 1608; + if (gametype != GT_RACE && player->kartstuff[k_balloon] <= 0) + { + player->mo->friction += 1228; + + if (player->mo->friction > FRACUNIT) + player->mo->friction = FRACUNIT; + if (player->mo->friction < 0) + player->mo->friction = 0; + + player->mo->movefactor = FixedDiv(ORIG_FRICTION, player->mo->friction); + + if (player->mo->movefactor < FRACUNIT) + player->mo->movefactor = 19*player->mo->movefactor - 18*FRACUNIT; + else + player->mo->movefactor = FRACUNIT; //player->mo->movefactor = ((player->mo->friction - 0xDB34)*(0xA))/0x80; + + if (player->mo->movefactor < 32) + player->mo->movefactor = 32; + } K_KartDrift(player, onground); diff --git a/src/k_kart.h b/src/k_kart.h index e99028b0..394e4d61 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -22,7 +22,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_SpinPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source); -void K_StealBalloon(player_t *player, player_t *victim); +void K_StealBalloon(player_t *player, player_t *victim, boolean force); 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 *source); void K_SpawnDriftTrail(player_t *player); void K_DoMushroom(player_t *player, boolean doPFlag, boolean startboost); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index b04a3b8f..f24cf27b 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2057,12 +2057,13 @@ static int lib_kStealBalloon(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *victim = *((player_t **)luaL_checkudata(L, 2, META_PLAYER)); + boolean force = luaL_checkboolean(L, 3); NOHUD if (!player) return LUA_ErrInvalid(L, "player_t"); if (!victim) return LUA_ErrInvalid(L, "player_t"); - K_StealBalloon(player, victim); + K_StealBalloon(player, victim, force); return 0; } diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index d6de2e24..66a41219 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -412,10 +412,14 @@ static int player_set(lua_State *L) else if (fastcmp(field,"dashtime")) plr->dashtime = (INT32)luaL_checkinteger(L, 3); // SRB2kart + else if (fastcmp(field,"kartstuff")) + return NOSET; + else if (fastcmp(field,"frameangle")) + plr->frameangle = luaL_checkangle(L, 3); else if (fastcmp(field,"kartspeed")) - plr->kartspeed = (UINT8)luaL_checkfixed(L, 3); + plr->kartspeed = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"kartweight")) - plr->kartweight = (UINT8)luaL_checkfixed(L, 3); + plr->kartweight = (UINT8)luaL_checkinteger(L, 3); // else if (fastcmp(field,"normalspeed")) plr->normalspeed = luaL_checkfixed(L, 3); @@ -670,6 +674,38 @@ static int power_len(lua_State *L) return 1; } +// kartstuff, ks -> kartstuff[ks] +static int kartstuff_get(lua_State *L) +{ + INT32 *kartstuff = *((INT32 **)luaL_checkudata(L, 1, META_KARTSTUFF)); + kartstufftype_t ks = luaL_checkinteger(L, 2); + if (ks >= NUMKARTSTUFF) + return luaL_error(L, LUA_QL("kartstufftype_t") " cannot be %u", ks); + lua_pushinteger(L, kartstuff[ks]); + return 1; +} + +// kartstuff, ks, value -> kartstuff[ks] = value +static int kartstuff_set(lua_State *L) +{ + INT32 *kartstuff = *((INT32 **)luaL_checkudata(L, 1, META_KARTSTUFF)); + kartstufftype_t ks = luaL_checkinteger(L, 2); + INT32 i = (INT32)luaL_checkinteger(L, 3); + if (ks >= NUMKARTSTUFF) + return luaL_error(L, LUA_QL("kartstufftype_t") " cannot be %u", ks); + if (hud_running) + return luaL_error(L, "Do not alter player_t in HUD rendering code!"); + kartstuff[ks] = i; + return 0; +} + +// #kartstuff -> NUMKARTSTUFF +static int kartstuff_len(lua_State *L) +{ + lua_pushinteger(L, NUMKARTSTUFF); + return 1; +} + #define NOFIELD luaL_error(L, LUA_QL("ticcmd_t") " has no field named " LUA_QS, field) static int ticcmd_get(lua_State *L) @@ -747,6 +783,17 @@ int LUA_PlayerLib(lua_State *L) lua_setfield(L, -2, "__len"); lua_pop(L,1); + luaL_newmetatable(L, META_KARTSTUFF); + lua_pushcfunction(L, kartstuff_get); + lua_setfield(L, -2, "__index"); + + lua_pushcfunction(L, kartstuff_set); + lua_setfield(L, -2, "__newindex"); + + lua_pushcfunction(L, kartstuff_len); + lua_setfield(L, -2, "__len"); + lua_pop(L,1); + luaL_newmetatable(L, META_TICCMD); lua_pushcfunction(L, ticcmd_get); lua_setfield(L, -2, "__index"); diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index 85e029e6..a267d998 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -165,10 +165,10 @@ static int skin_get(lua_State *L) break; // SRB2kart case skin_kartspeed: - lua_pushfixed(L, skin->kartspeed); + lua_pushinteger(L, skin->kartspeed); break; case skin_kartweight: - lua_pushfixed(L, skin->kartweight); + lua_pushinteger(L, skin->kartweight); break; // case skin_normalspeed: diff --git a/src/p_inter.c b/src/p_inter.c index ec0875fb..346c0be1 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -433,11 +433,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[special->tracer->player-players], player_names[player-players]); if (special->tracer->player->kartstuff[k_comebackpoints] >= 3) - { - K_StealBalloon(special->tracer->player, player); - special->tracer->player->kartstuff[k_comebackpoints] = 0; - CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[special->tracer->player-players]); - } + K_StealBalloon(special->tracer->player, player, true); special->tracer->player->kartstuff[k_comebacktimer] = comebacktime; } diff --git a/src/p_map.c b/src/p_map.c index 2006cc5b..982d544e 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1647,15 +1647,11 @@ static boolean PIT_CheckThing(mobj_t *thing) { if (tmthing->player->kartstuff[k_balloon] > 0) { - thing->player->kartstuff[k_comebackpoints]++; + thing->player->kartstuff[k_comebackpoints] += 2; CONS_Printf(M_GetText("%s bombed %s!\n"), player_names[thing->player-players], player_names[tmthing->player-players]); if (thing->player->kartstuff[k_comebackpoints] >= 3) - { - K_StealBalloon(thing->player, tmthing->player); - thing->player->kartstuff[k_comebackpoints] = 0; - CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[thing->player-players]); - } + K_StealBalloon(thing->player, tmthing->player, true); K_ExplodePlayer(tmthing->player, thing); @@ -1664,15 +1660,11 @@ static boolean PIT_CheckThing(mobj_t *thing) } else if (thing->player->kartstuff[k_balloon] > 0) { - tmthing->player->kartstuff[k_comebackpoints]++; + tmthing->player->kartstuff[k_comebackpoints] += 2; CONS_Printf(M_GetText("%s bombed %s!\n"), player_names[tmthing->player-players], player_names[thing->player-players]); if (tmthing->player->kartstuff[k_comebackpoints] >= 3) - { - K_StealBalloon(tmthing->player, thing->player); - thing->player->kartstuff[k_comebackpoints] = 0; - CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[tmthing->player-players]); - } + K_StealBalloon(tmthing->player, thing->player, true); K_ExplodePlayer(thing->player, tmthing); @@ -1687,9 +1679,8 @@ static boolean PIT_CheckThing(mobj_t *thing) K_KartBouncing(tmthing, thing, true); if (gametype != GT_RACE && tmthing->player->kartstuff[k_feather] & 2) { - K_StealBalloon(tmthing->player, thing->player); + K_StealBalloon(tmthing->player, thing->player, false); K_SpinPlayer(thing->player, tmthing); - CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[tmthing->player-players], player_names[thing->player-players]); } } else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) @@ -1697,9 +1688,8 @@ static boolean PIT_CheckThing(mobj_t *thing) K_KartBouncing(thing, tmthing, true); if (gametype != GT_RACE && thing->player->kartstuff[k_feather] & 2) { - K_StealBalloon(thing->player, tmthing->player); + K_StealBalloon(thing->player, tmthing->player, false); K_SpinPlayer(tmthing->player, thing); - CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[thing->player-players], player_names[tmthing->player-players]); } } else @@ -1709,15 +1699,13 @@ static boolean PIT_CheckThing(mobj_t *thing) { if (thing->player->kartstuff[k_mushroomtimer] && !(tmthing->player->kartstuff[k_mushroomtimer])) { - K_StealBalloon(thing->player, tmthing->player); + K_StealBalloon(thing->player, tmthing->player, false); K_SpinPlayer(tmthing->player, thing); - CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[thing->player-players], player_names[tmthing->player-players]); } else if (tmthing->player->kartstuff[k_mushroomtimer] && !(thing->player->kartstuff[k_mushroomtimer])) { - K_StealBalloon(tmthing->player, thing->player); + K_StealBalloon(tmthing->player, thing->player, false); K_SpinPlayer(thing->player, tmthing); - CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[tmthing->player-players], player_names[thing->player-players]); } } diff --git a/src/p_mobj.c b/src/p_mobj.c index cbaa7167..a0295f4d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6459,15 +6459,25 @@ void P_MobjThinker(mobj_t *mobj) //{ SRB2kart mobs case MT_DRIFT: { - fixed_t dsone = 26*4 + mobj->target->player->kartspeed*2 + (9 - mobj->target->player->kartweight); - fixed_t dstwo = dsone*2; - - if ((mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) - && (mobj->type == MT_DRIFT && mobj->target->player->kartstuff[k_driftcharge] >= dsone)) + if (mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { + UINT8 kartspeed = mobj->target->player->kartspeed; + fixed_t dsone, dstwo; INT32 HEIGHT; fixed_t radius; + if (gametype != GT_RACE && mobj->target->player->kartstuff[k_balloon] <= 0) + kartspeed = 1; + + dsone = 26*4 + kartspeed*2 + (9 - mobj->target->player->kartweight); + dstwo = dsone*2; + + if (mobj->target->player->kartstuff[k_driftcharge] < dsone) + { + P_RemoveMobj(mobj); + return; + } + if (mobj->target->player->kartstuff[k_bootimer] > 0) { if ((mobj->target->player == &players[displayplayer] || (splitscreen && mobj->target->player == &players[secondarydisplayplayer])) diff --git a/src/r_things.h b/src/r_things.h index 80c3d38c..6fd65c9b 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -91,8 +91,8 @@ typedef struct fixed_t maxdash; // SRB2kart - UINT8 kartspeed; // Normal ground - UINT8 kartweight; // Normal ground + UINT8 kartspeed; + UINT8 kartweight; // fixed_t normalspeed; // Normal ground From 888515331f06e4d3ee2cdb6b00c844cbd52530d0 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 20 Nov 2017 02:00:19 -0500 Subject: [PATCH 61/61] More lenient checkpoints Doesn't really belong in this branch but shut up! I'm lazy :p --- src/d_clisrv.c | 2 ++ src/d_clisrv.h | 1 + src/d_player.h | 1 + src/g_game.c | 6 ++++++ src/lua_playerlib.c | 4 ++++ src/p_inter.c | 5 +++-- src/p_spec.c | 5 +++-- 7 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index fafc92f3..7e1cfc38 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -575,6 +575,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->starposty = SHORT(players[i].starposty); rsp->starpostz = SHORT(players[i].starpostz); rsp->starpostnum = LONG(players[i].starpostnum); + rsp->starpostcount = LONG(players[i].starpostcount); rsp->starposttime = (tic_t)LONG(players[i].starposttime); rsp->starpostangle = (angle_t)LONG(players[i].starpostangle); @@ -706,6 +707,7 @@ static void resynch_read_player(resynch_pak *rsp) players[i].starposty = SHORT(rsp->starposty); players[i].starpostz = SHORT(rsp->starpostz); players[i].starpostnum = LONG(rsp->starpostnum); + players[i].starpostcount = LONG(rsp->starpostcount); players[i].starposttime = (tic_t)LONG(rsp->starposttime); players[i].starpostangle = (angle_t)LONG(rsp->starpostangle); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index f25203fb..06fa15fc 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -219,6 +219,7 @@ typedef struct INT16 starposty; INT16 starpostz; INT32 starpostnum; + INT32 starpostcount; tic_t starposttime; angle_t starpostangle; diff --git a/src/d_player.h b/src/d_player.h index db880ba5..4f043cf8 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -477,6 +477,7 @@ typedef struct player_s INT16 starposty; INT16 starpostz; INT32 starpostnum; // The number of the last starpost you hit + INT32 starpostcount; // SRB2kart: how many did you hit? tic_t starposttime; // Your time when you hit the starpost angle_t starpostangle; // Angle that the starpost is facing - you respawn facing this way diff --git a/src/g_game.c b/src/g_game.c index 49822076..b3c4ff69 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2142,6 +2142,7 @@ static inline void G_PlayerFinishLevel(INT32 player) p->starposty = 0; p->starpostz = 0; p->starpostnum = 0; + p->starpostcount = 0; if (rendermode == render_soft) V_SetPaletteLump(GetPalette()); // Reset the palette @@ -2182,6 +2183,7 @@ void G_PlayerReborn(INT32 player) INT16 starposty; INT16 starpostz; INT32 starpostnum; + INT32 starpostcount; INT32 starpostangle; fixed_t jumpfactor; INT32 exiting; @@ -2239,6 +2241,7 @@ void G_PlayerReborn(INT32 player) starposty = players[player].starposty; starpostz = players[player].starpostz; starpostnum = players[player].starpostnum; + starpostcount = players[player].starpostcount; starpostangle = players[player].starpostangle; jumpfactor = players[player].jumpfactor; thokitem = players[player].thokitem; @@ -2296,6 +2299,7 @@ void G_PlayerReborn(INT32 player) p->starposty = starposty; p->starpostz = starpostz; p->starpostnum = starpostnum; + p->starpostcount = starpostcount; p->starpostangle = starpostangle; p->jumpfactor = jumpfactor; p->exiting = exiting; @@ -2665,6 +2669,7 @@ void G_DoReborn(INT32 playernum) player->starposty = 0; player->starpostz = 0; player->starpostnum = 0; + player->starpostcount = 0; } if (!countdowntimeup && (mapheaderinfo[gamemap-1]->levelflags & LF_NORELOAD)) { @@ -3714,6 +3719,7 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean players[i].playerstate = PST_REBORN; players[i].starpostangle = players[i].starpostnum = players[i].starposttime = 0; players[i].starpostx = players[i].starposty = players[i].starpostz = 0; + players[i].starpostcount = 0; // srb2kart if (netgame || multiplayer) { diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 66a41219..a58892d3 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -246,6 +246,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->starpostz); else if (fastcmp(field,"starpostnum")) lua_pushinteger(L, plr->starpostnum); + else if (fastcmp(field,"starpostcount")) + lua_pushinteger(L, plr->starpostcount); else if (fastcmp(field,"starposttime")) lua_pushinteger(L, plr->starposttime); else if (fastcmp(field,"starpostangle")) @@ -513,6 +515,8 @@ static int player_set(lua_State *L) plr->starpostz = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"starpostnum")) plr->starpostnum = (INT32)luaL_checkinteger(L, 3); + else if (fastcmp(field,"starpostcount")) + plr->starpostcount = (INT32)luaL_checkinteger(L, 3); else if (fastcmp(field,"starposttime")) plr->starposttime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"starpostangle")) diff --git a/src/p_inter.c b/src/p_inter.c index 346c0be1..bff3a030 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1213,9 +1213,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; } // - // In circuit, player must have touched all previous starposts + // SRB2kart: make sure the player will have enough checkpoints to touch if (circuitmap - && special->health - player->starpostnum > 1) + && special->health >= (numstarposts/2 + player->starpostnum)) { // blatant reuse of a variable that's normally unused in circuit if (!player->tossdelay) @@ -1242,6 +1242,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) player->starpostz = special->z>>FRACBITS; player->starpostangle = special->angle; player->starpostnum = special->health; + player->starpostcount++; P_ClearStarPost(special->health); // Find all starposts in the level with this value. diff --git a/src/p_spec.c b/src/p_spec.c index 716cf576..6ebeb466 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4110,12 +4110,12 @@ DoneSection2: case 10: // Finish Line // SRB2kart - 150117 - if (gametype == GT_RACE && (player->starpostnum == numstarposts || player->exiting)) + if (gametype == GT_RACE && (player->starpostcount >= numstarposts/2 || player->exiting)) player->kartstuff[k_starpostwp] = player->kartstuff[k_waypoint] = 0; // if (gametype == GT_RACE && !player->exiting) { - if (player->starpostnum == numstarposts) // Must have touched all the starposts + if (player->starpostcount >= numstarposts/2) // srb2kart: must have touched *enough* starposts (was originally "(player->starpostnum == numstarposts)") { player->laps++; player->kartstuff[k_lapanimation] = 80; @@ -4134,6 +4134,7 @@ DoneSection2: // SRB2kart 200117 player->starpostangle = player->starpostnum = 0; player->starpostx = player->starposty = player->starpostz = 0; + player->starpostcount = 0; //except the time! player->starposttime = player->realtime;