From ecaf14a76b86ffcd6fb3ee96cdda917296ff36ef Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 10 May 2019 17:04:30 -0400 Subject: [PATCH 01/65] Grow no longer has a speed boost, but no longer holds the item box hostage It can now be moved over to "mid-tier" instead of the end. Flame Shield will be taking its place as the "situational but powerful speed-up/offense combo item" --- src/d_player.h | 1 - src/dehacked.c | 3 +- src/k_kart.c | 76 ++++++++++---------------------------------------- src/p_inter.c | 2 +- src/p_mobj.c | 11 -------- src/p_user.c | 12 ++++---- 6 files changed, 22 insertions(+), 83 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 4b08d111a..48faca92c 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -335,7 +335,6 @@ typedef enum k_getsparks, // Disable drift sparks at low speed, JUST enough to give acceleration the actual headstart above speed k_jawztargetdelay, // Delay for Jawz target switching, to make it less twitchy k_spectatewait, // How long have you been waiting as a spectator - k_growcancel, // Hold the item button down to cancel Grow NUMKARTSTUFF } kartstufftype_t; diff --git a/src/dehacked.c b/src/dehacked.c index 3db8962d2..7e4b94117 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8471,8 +8471,7 @@ static const char *const KARTSTUFF_LIST[] = { "ITEMBLINKMODE", "GETSPARKS", "JAWZTARGETDELAY", - "SPECTATEWAIT", - "GROWCANCEL" + "SPECTATEWAIT" }; #endif diff --git a/src/k_kart.c b/src/k_kart.c index 501ba6139..adce3c111 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1259,7 +1259,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) { - fixed_t weight = 5<scale; switch (mobj->type) { @@ -1270,7 +1270,7 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) weight = 0; // Do not bump else { - weight = (mobj->player->kartweight)<player->kartweight) * mobj->scale; if (mobj->player->speed > K_GetKartSpeed(mobj->player, false)) weight += (mobj->player->speed - K_GetKartSpeed(mobj->player, false))/8; } @@ -1282,21 +1282,21 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) || against->player->kartstuff[k_growshrinktimer] > 0) weight = 0; else - weight = (against->player->kartweight)<player->kartweight) * against->scale; } break; case MT_ORBINAUT: case MT_ORBINAUT_SHIELD: if (against->player) - weight = (against->player->kartweight)<player->kartweight) * against->scale; break; case MT_JAWZ: case MT_JAWZ_DUD: case MT_JAWZ_SHIELD: if (against->player) - weight = (against->player->kartweight+3)<player->kartweight+3) * against->scale; else - weight = 8<scale; break; default: break; @@ -2229,14 +2229,6 @@ static void K_GetKartBoostPower(player_t *player) if (player->kartstuff[k_ringboost]) // Ring Boost ADDBOOST(FRACUNIT/5, 4*FRACUNIT); // + 20% top speed, + 400% acceleration - if (player->kartstuff[k_growshrinktimer] > 0) // Grow - { - // Grow's design is weird with booster stacking. - // We'll see how to replace its design BEFORE v2 gets released. - speedboost += (FRACUNIT/5); // + 20% - //numboosts++; // Don't add any boost afterimages to Grow - } - if (player->kartstuff[k_draftpower] > 0) // Drafting { speedboost += (player->kartstuff[k_draftpower]) / 3; // + 0 to 33.3% top speed @@ -2545,7 +2537,6 @@ static void K_RemoveGrowShrink(player_t *player) } player->kartstuff[k_growshrinktimer] = 0; - player->kartstuff[k_growcancel] = -1; P_RestoreMusic(player); } @@ -4820,17 +4811,17 @@ static void K_UpdateInvincibilitySounds(player_t *player) { if (cv_kartinvinsfx.value) { - if (player->kartstuff[k_growshrinktimer] > 0) // Prioritize Grow - sfxnum = sfx_alarmg; - else if (player->kartstuff[k_invincibilitytimer] > 0) + if (player->kartstuff[k_invincibilitytimer] > 0) // Prioritize invincibility sfxnum = sfx_alarmi; + else if (player->kartstuff[k_growshrinktimer] > 0) + sfxnum = sfx_alarmg; } else { - if (player->kartstuff[k_growshrinktimer] > 0) - sfxnum = sfx_kgrow; - else if (player->kartstuff[k_invincibilitytimer] > 0) + if (player->kartstuff[k_invincibilitytimer] > 0) sfxnum = sfx_kinvnc; + else if (player->kartstuff[k_growshrinktimer] > 0) + sfxnum = sfx_kgrow; } } @@ -5855,7 +5846,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) && NO_HYUDORO && !(HOLDING_ITEM || player->kartstuff[k_itemamount] || player->kartstuff[k_itemroulette] - || player->kartstuff[k_growshrinktimer] // Being disabled during Shrink was unintended but people seemed to be okay with it sooo... + || player->kartstuff[k_growshrinktimer] < 0 // Being disabled during Shrink was unintended but people seemed to be okay with it sooo... || player->kartstuff[k_rocketsneakertimer] || player->kartstuff[k_eggmanexplode])) player->kartstuff[k_userings] = 1; @@ -5952,28 +5943,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_rocketsneakertimer] = 1; } } - // Grow Canceling - else if (player->kartstuff[k_growshrinktimer] > 0) - { - if (player->kartstuff[k_growcancel] >= 0) - { - if (cmd->buttons & BT_ATTACK) - { - player->kartstuff[k_growcancel]++; - if (player->kartstuff[k_growcancel] > 26) - K_RemoveGrowShrink(player); - } - else - player->kartstuff[k_growcancel] = 0; - } - else - { - if ((cmd->buttons & BT_ATTACK) || (player->pflags & PF_ATTACKDOWN)) - player->kartstuff[k_growcancel] = -1; - else - player->kartstuff[k_growcancel] = 0; - } - } else if (player->kartstuff[k_itemamount] <= 0) { player->kartstuff[k_itemamount] = player->kartstuff[k_itemheld] = 0; @@ -6225,8 +6194,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } break; case KITEM_GROW: - if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO - && player->kartstuff[k_growshrinktimer] <= 0) // Grow holds the item box hostage + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { if (player->kartstuff[k_growshrinktimer] < 0) // If you're shrunk, then "grow" will just make you normal again. K_RemoveGrowShrink(player); @@ -6353,9 +6321,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else player->kartstuff[k_curshield] = 0; - if (player->kartstuff[k_growshrinktimer] <= 0) - player->kartstuff[k_growcancel] = -1; - if (player->kartstuff[k_itemtype] == KITEM_SPB || player->kartstuff[k_itemtype] == KITEM_SHRINK || player->kartstuff[k_growshrinktimer] < 0) @@ -7581,19 +7546,6 @@ static void K_drawKartItem(void) else localpatch = kp_nodraw; } - else if (stplyr->kartstuff[k_growshrinktimer] > 0) - { - if (stplyr->kartstuff[k_growcancel] > 0) - { - itembar = stplyr->kartstuff[k_growcancel]; - maxl = 26; - } - - if (leveltime & 1) - localpatch = kp_grow[offset]; - else - localpatch = kp_nodraw; - } else if (stplyr->kartstuff[k_sadtimer] > 0) { if (leveltime & 2) diff --git a/src/p_inter.c b/src/p_inter.c index 9e6d64030..8d898f83d 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -132,7 +132,7 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon) { // Item-specific timer going off if (player->kartstuff[k_stealingtimer] || player->kartstuff[k_stolentimer] - || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_rocketsneakertimer] + || player->kartstuff[k_rocketsneakertimer] || player->kartstuff[k_eggmanexplode]) return false; diff --git a/src/p_mobj.c b/src/p_mobj.c index e5f8bc65f..be4bf0c1a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6805,17 +6805,6 @@ void P_MobjThinker(mobj_t *mobj) else mobj->tracer->flags2 |= MF2_DONTDRAW; } - else if (mobj->target->player->kartstuff[k_growshrinktimer] > 0) - { - P_SetMobjState(mobj, S_PLAYERARROW_BOX); - mobj->tracer->sprite = SPR_ITEM; - mobj->tracer->frame = FF_FULLBRIGHT|KITEM_GROW; - - if (leveltime & 1) - mobj->tracer->flags2 &= ~MF2_DONTDRAW; - else - mobj->tracer->flags2 |= MF2_DONTDRAW; - } else if (mobj->target->player->kartstuff[k_itemtype] && mobj->target->player->kartstuff[k_itemamount] > 0) { P_SetMobjState(mobj, S_PLAYERARROW_BOX); diff --git a/src/p_user.c b/src/p_user.c index ab14d1d49..bd2e8ee28 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1218,10 +1218,10 @@ void P_RestoreMusic(player_t *player) #define setbests(p) \ if (players[p].playerstate == PST_LIVE) \ { \ - if (players[p].kartstuff[k_growshrinktimer] > bestlocaltimer) \ - { wantedmus = 2; bestlocaltimer = players[p].kartstuff[k_growshrinktimer]; } \ - else if (players[p].kartstuff[k_invincibilitytimer] > bestlocaltimer) \ + if (players[p].kartstuff[k_invincibilitytimer] > bestlocaltimer) \ { wantedmus = 1; bestlocaltimer = players[p].kartstuff[k_invincibilitytimer]; } \ + else if (players[p].kartstuff[k_growshrinktimer] > bestlocaltimer) \ + { wantedmus = 2; bestlocaltimer = players[p].kartstuff[k_growshrinktimer]; } \ } setbests(displayplayers[0]); setbests(displayplayers[1]); @@ -1235,10 +1235,10 @@ void P_RestoreMusic(player_t *player) { if (player->playerstate == PST_LIVE) { - if (player->kartstuff[k_growshrinktimer] > 1) - wantedmus = 2; - else if (player->kartstuff[k_invincibilitytimer] > 1) + if (player->kartstuff[k_invincibilitytimer] > 1) wantedmus = 1; + else if (player->kartstuff[k_growshrinktimer] > 1) + wantedmus = 2; } } From c2a07b486b89a03ef626b20b235d23c0db905a36 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 11 May 2019 15:20:06 -0400 Subject: [PATCH 02/65] Add Flame Shield --- src/d_player.h | 16 +++ src/dehacked.c | 36 ++++++- src/info.c | 101 ++++++++++++++++--- src/info.h | 27 ++++- src/k_kart.c | 262 ++++++++++++++++++++++++++++++++++++++++--------- src/k_kart.h | 1 + src/p_enemy.c | 2 +- src/p_inter.c | 14 +-- src/p_map.c | 4 + src/p_mobj.c | 71 +++++++++++++- src/p_user.c | 2 +- 11 files changed, 464 insertions(+), 72 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 48faca92c..024c2e04f 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -214,6 +214,8 @@ typedef enum KITEM_GROW, KITEM_SHRINK, KITEM_THUNDERSHIELD, + KITEM_BUBBLESHIELD, + KITEM_FLAMESHIELD, KITEM_HYUDORO, KITEM_POGOSPRING, KITEM_SUPERRING, @@ -232,6 +234,15 @@ typedef enum NUMKARTRESULTS } kartitems_t; +typedef enum +{ + KSHIELD_NONE = 0, + KSHIELD_THUNDER = 1, + KSHIELD_BUBBLE = 2, + KSHIELD_FLAME = 3, + NUMKARTSHIELDS +} kartshields_t; + //{ SRB2kart - kartstuff typedef enum { @@ -311,6 +322,8 @@ typedef enum k_squishedtimer, // Squished frame timer k_rocketsneakertimer, // Rocket Sneaker duration timer k_invincibilitytimer, // Invincibility timer + k_flameready, // Flame Shield dash ready to activate + k_flamedash, // Flame Shield dash power k_eggmanheld, // Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items k_eggmanexplode, // Fake item recieved, explode in a few seconds k_eggmanblame, // Fake item recieved, who set this fake @@ -342,6 +355,9 @@ typedef enum // QUICKLY GET EITHER SNEAKER OR LEVEL BOOSTER SINCE THEY ARE FUNCTIONALLY IDENTICAL #define EITHERSNEAKER(p) (p->kartstuff[k_sneakertimer] || p->kartstuff[k_levelbooster]) +// QUICKLY GET RING TOTAL, INCLUDING RINGS CURRENTLY IN THE PICKUP ANIMATION +#define RINGTOTAL(p) (p->kartstuff[k_rings] + p->kartstuff[k_pickuprings]) + //} #define WEP_AUTO 1 diff --git a/src/dehacked.c b/src/dehacked.c index 7e4b94117..7ae32e384 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6623,6 +6623,27 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_THUNDERSHIELD23", "S_THUNDERSHIELD24", + // Flame Shield + "S_FLAMESHIELD1", + "S_FLAMESHIELD2", + "S_FLAMESHIELD3", + "S_FLAMESHIELD4", + "S_FLAMESHIELD5", + "S_FLAMESHIELD6", + "S_FLAMESHIELD7", + "S_FLAMESHIELD8", + "S_FLAMESHIELD9", + "S_FLAMESHIELD10", + "S_FLAMESHIELD11", + "S_FLAMESHIELD12", + "S_FLAMESHIELD13", + "S_FLAMESHIELD14", + "S_FLAMESHIELD15", + "S_FLAMESHIELD16", + "S_FLAMESHIELD17", + "S_FLAMESHIELD18", + "S_FLAMESHIELDDASH", + // The legend "S_SINK", "S_SINK_SHIELD", @@ -7757,7 +7778,9 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_SPB", // Self-Propelled Bomb "MT_SPBEXPLOSION", - "MT_THUNDERSHIELD", // Thunder Shield stuff + "MT_THUNDERSHIELD", // Shields + "MT_BUBBLESHIELD", + "MT_FLAMESHIELD", "MT_SINK", // Kitchen Sink Stuff "MT_SINK_SHIELD", @@ -8450,6 +8473,8 @@ static const char *const KARTSTUFF_LIST[] = { "SQUISHEDTIMER", "ROCKETSNEAKERTIMER", "INVINCIBILITYTIMER", + "FLAMEREADY", + "FLAMEDASH", "EGGMANHELD", "EGGMANEXPLODE", "EGGMANBLAME", @@ -8993,6 +9018,8 @@ struct { {"KITEM_GROW",KITEM_GROW}, {"KITEM_SHRINK",KITEM_SHRINK}, {"KITEM_THUNDERSHIELD",KITEM_THUNDERSHIELD}, + {"KITEM_BUBBLESHIELD",KITEM_BUBBLESHIELD}, + {"KITEM_FLAMESHIELD",KITEM_FLAMESHIELD}, {"KITEM_HYUDORO",KITEM_HYUDORO}, {"KITEM_POGOSPRING",KITEM_POGOSPRING}, {"KITEM_SUPERRING",KITEM_SUPERRING}, @@ -9006,6 +9033,13 @@ struct { {"KRITEM_DUALJAWZ",KRITEM_DUALJAWZ}, {"NUMKARTRESULTS",NUMKARTRESULTS}, + // kartshields_t + {"KSHIELD_NONE",KSHIELD_NONE}, + {"KSHIELD_THUNDER",KSHIELD_THUNDER}, + {"KSHIELD_BUBBLE",KSHIELD_BUBBLE}, + {"KSHIELD_FLAME",KSHIELD_FLAME}, + {"NUMKARTSHIELDS",NUMKARTSHIELDS}, + // translation colormaps {"TC_DEFAULT",TC_DEFAULT}, {"TC_BOSS",TC_BOSS}, diff --git a/src/info.c b/src/info.c index 31f2f8348..c87ac4866 100644 --- a/src/info.c +++ b/src/info.c @@ -57,19 +57,19 @@ char sprnames[NUMSPRITES + 1][5] = //SRB2kart Sprites "SPRG","BSPR","RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE", "KINV","KINF","WIPD","DRIF","BDRF","DUST","RSHE","FITM","BANA","ORBN", - "JAWZ","SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN", - "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", - "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", - "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1","HIT2","HIT3", - "RETI","AIDU","KSPK","LZI1","LZI2","KLIT","FZSM","FZBM","FPRT","SBUS", - "MARB","FUFO","RUST","BLON","VAPE","HTZA","HTZB","SGVA","SGVB","SGVC", - "PGTR","PGF1","PGF2","PGF3","PGBH","DPLR","SPTL","ENM1","GARU","MARR", - "REAP","JITB","CDMO","CDBU","PINE","PPLR","DPPT","AATR","COCO","BDST", - "FROG","CBRA","HOLE","BBRA","EGFG","SMKP","MTYM","THWP","SNOB","ICEB", - "CNDL","DOCH","DUCK","GTRE","CHES","CHIM","DRGN","LZMN","PGSS","ZTCH", - "MKMA","MKMP","RTCH","BOWL","BOWH","BRRL","BRRR","HRSE","TOAH","BFRT", - "OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF","WBLZ","WBLN","FWRK", - "MXCL","RGSP","DRAF","XMS4","XMS5","VIEW" + "JAWZ","SSMN","KRBM","BHOG","BHBM","SPBM","THNS","BUBS","FLMS","SINK", + "SITR","KBLN","DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS", + "BUZB","CHOM","SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW", + "ISTA","ISTB","ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1", + "HIT2","HIT3","RETI","AIDU","KSPK","LZI1","LZI2","KLIT","FZSM","FZBM", + "FPRT","SBUS","MARB","FUFO","RUST","BLON","VAPE","HTZA","HTZB","SGVA", + "SGVB","SGVC","PGTR","PGF1","PGF2","PGF3","PGBH","DPLR","SPTL","ENM1", + "GARU","MARR","REAP","JITB","CDMO","CDBU","PINE","PPLR","DPPT","AATR", + "COCO","BDST","FROG","CBRA","HOLE","BBRA","EGFG","SMKP","MTYM","THWP", + "SNOB","ICEB","CNDL","DOCH","DUCK","GTRE","CHES","CHIM","DRGN","LZMN", + "PGSS","ZTCH","MKMA","MKMP","RTCH","BOWL","BOWH","BRRL","BRRR","HRSE", + "TOAH","BFRT","OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF","WBLZ", + "WBLN","FWRK","MXCL","RGSP","DRAF","XMS4","XMS5","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2850,6 +2850,26 @@ state_t states[NUMSTATES] = {SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23 {SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24 + {SPR_FLMS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_FLAMESHIELD2}, // S_FLAMESHIELD1 + {SPR_FLMS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_FLAMESHIELD3}, // S_FLAMESHIELD2 + {SPR_FLMS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_FLAMESHIELD4}, // S_FLAMESHIELD3 + {SPR_FLMS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_FLAMESHIELD5}, // S_FLAMESHIELD4 + {SPR_FLMS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_FLAMESHIELD6}, // S_FLAMESHIELD5 + {SPR_FLMS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_FLAMESHIELD7}, // S_FLAMESHIELD6 + {SPR_FLMS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_FLAMESHIELD8}, // S_FLAMESHIELD7 + {SPR_FLMS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_FLAMESHIELD9}, // S_FLAMESHIELD8 + {SPR_FLMS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_FLAMESHIELD10}, // S_FLAMESHIELD9 + {SPR_FLMS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_FLAMESHIELD11}, // S_FLAMESHIELD10 + {SPR_FLMS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_FLAMESHIELD12}, // S_FLAMESHIELD11 + {SPR_FLMS, FF_FULLBRIGHT|14, 2, {NULL}, 0, 0, S_FLAMESHIELD13}, // S_FLAMESHIELD12 + {SPR_FLMS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_FLAMESHIELD14}, // S_FLAMESHIELD13 + {SPR_FLMS, FF_FULLBRIGHT|15, 2, {NULL}, 0, 0, S_FLAMESHIELD15}, // S_FLAMESHIELD14 + {SPR_FLMS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_FLAMESHIELD16}, // S_FLAMESHIELD15 + {SPR_FLMS, FF_FULLBRIGHT|16, 2, {NULL}, 0, 0, S_FLAMESHIELD17}, // S_FLAMESHIELD16 + {SPR_FLMS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_FLAMESHIELD18}, // S_FLAMESHIELD17 + {SPR_FLMS, FF_FULLBRIGHT|17, 2, {NULL}, 0, 0, S_FLAMESHIELD1}, // S_FLAMESHIELD18 + {SPR_FLMS, FF_FULLBRIGHT|18, -1, {NULL}, 0, 0, S_FLAMESHIELDDASH}, // S_FLAMESHIELDDASH + {SPR_SINK, 0, 1, {A_SmokeTrailer}, MT_SINKTRAIL, 0, S_SINK}, // S_SINK {SPR_SINK, 0|FF_TRANS80|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_SINK_SHIELD}, // S_SINK_SHIELD {SPR_SITR, 0, 1, {NULL}, 0, 0, S_SINKTRAIL2}, // S_SINKTRAIL1 @@ -15935,6 +15955,61 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BUBBLESHIELD + -1, // doomednum + S_THUNDERSHIELD1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 1, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + + { // MT_FLAMESHIELD + -1, // doomednum + S_FLAMESHIELD1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 1, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + + { // MT_SINK -1, // doomednum S_SINK, // spawnstate diff --git a/src/info.h b/src/info.h index e2a60e131..a302aa679 100644 --- a/src/info.h +++ b/src/info.h @@ -617,6 +617,8 @@ typedef enum sprite SPR_BHBM, // Ballhog BOOM SPR_SPBM, // Self-Propelled Bomb SPR_THNS, // Thunder Shield + SPR_BUBS, // Bubble Shield (not Bubs) + SPR_FLMS, // Flame Shield SPR_SINK, // Kitchen Sink SPR_SITR, // Kitchen Sink Trail SPR_KBLN, // Battle Mode Bumper @@ -3516,6 +3518,27 @@ typedef enum state S_THUNDERSHIELD23, S_THUNDERSHIELD24, + // Flame Shield + S_FLAMESHIELD1, + S_FLAMESHIELD2, + S_FLAMESHIELD3, + S_FLAMESHIELD4, + S_FLAMESHIELD5, + S_FLAMESHIELD6, + S_FLAMESHIELD7, + S_FLAMESHIELD8, + S_FLAMESHIELD9, + S_FLAMESHIELD10, + S_FLAMESHIELD11, + S_FLAMESHIELD12, + S_FLAMESHIELD13, + S_FLAMESHIELD14, + S_FLAMESHIELD15, + S_FLAMESHIELD16, + S_FLAMESHIELD17, + S_FLAMESHIELD18, + S_FLAMESHIELDDASH, + // The legend S_SINK, S_SINK_SHIELD, @@ -4682,7 +4705,9 @@ typedef enum mobj_type MT_SPB, // SPB stuff MT_SPBEXPLOSION, - MT_THUNDERSHIELD, // Thunder Shield stuff + MT_THUNDERSHIELD, // Shields + MT_BUBBLESHIELD, + MT_FLAMESHIELD, MT_SINK, // Kitchen Sink Stuff MT_SINK_SHIELD, diff --git a/src/k_kart.c b/src/k_kart.c index adce3c111..d0f777daf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -652,24 +652,26 @@ fixed_t K_GetKartGameSpeedScalar(SINT8 value) static INT32 K_KartItemOddsRace[NUMKARTRESULTS][8] = { //P-Odds 0 1 2 3 4 5 6 7 - /*Sneaker*/ { 0, 0, 4, 6, 7, 0, 0, 0 }, // Sneaker - /*Rocket Sneaker*/ { 0, 0, 0, 0, 1, 4, 5, 3 }, // Rocket Sneaker - /*Invincibility*/ { 0, 0, 0, 0, 1, 4, 6,10 }, // Invincibility - /*Banana*/ { 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana + /*Sneaker*/ { 0, 0, 3, 5, 6, 0, 0, 0 }, // Sneaker + /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 2, 4, 6 }, // Rocket Sneaker + /*Invincibility*/ { 0, 0, 0, 0, 1, 4, 8,12 }, // Invincibility + /*Banana*/ { 7, 4, 2, 1, 0, 0, 0, 0 }, // Banana /*Eggman Monitor*/ { 3, 2, 1, 0, 0, 0, 0, 0 }, // Eggman Monitor - /*Orbinaut*/ { 7, 6, 4, 2, 0, 0, 0, 0 }, // Orbinaut + /*Orbinaut*/ { 7, 5, 4, 2, 0, 0, 0, 0 }, // Orbinaut /*Jawz*/ { 0, 3, 2, 1, 1, 0, 0, 0 }, // Jawz /*Mine*/ { 0, 2, 2, 1, 0, 0, 0, 0 }, // Mine /*Ballhog*/ { 0, 0, 2, 1, 0, 0, 0, 0 }, // Ballhog /*Self-Propelled Bomb*/ { 0, 1, 2, 3, 4, 2, 2, 0 }, // Self-Propelled Bomb - /*Grow*/ { 0, 0, 0, 0, 0, 2, 5, 7 }, // Grow + /*Grow*/ { 0, 0, 0, 1, 1, 2, 0, 0 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink /*Thunder Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield + /*Bubble Shield*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Bubble Shield + /*Flame Shield*/ { 0, 0, 0, 0, 0, 0, 1, 2 }, // Flame Shield /*Hyudoro*/ { 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Super Ring*/ { 2, 1, 1, 0, 0, 0, 0, 0 }, // Super Ring /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink - /*Sneaker x3*/ { 0, 0, 0, 3, 7, 9, 2, 0 }, // Sneaker x3 + /*Sneaker x3*/ { 0, 0, 0, 2, 6,10, 5, 0 }, // Sneaker x3 /*Banana x3*/ { 0, 1, 1, 0, 0, 0, 0, 0 }, // Banana x3 /*Banana x10*/ { 0, 0, 0, 1, 0, 0, 0, 0 }, // Banana x10 /*Orbinaut x3*/ { 0, 0, 1, 0, 0, 0, 0, 0 }, // Orbinaut x3 @@ -693,6 +695,8 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][6] = /*Grow*/ { 0, 0, 1, 2, 4, 2 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0 }, // Shrink /*Thunder Shield*/ { 0, 0, 0, 0, 0, 0 }, // Thunder Shield + /*Bubble Shield*/ { 0, 0, 0, 0, 0, 0 }, // Bubble Shield + /*Flame Shield*/ { 0, 0, 0, 0, 0, 0 }, // Flame Shield /*Hyudoro*/ { 1, 1, 0, 0, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 1, 1, 0, 0, 0, 0 }, // Pogo Spring /*Super Ring*/ { 0, 0, 0, 0, 0, 0 }, // Super Ring @@ -707,6 +711,17 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][6] = #define DISTVAR (64*14) +INT32 K_GetShieldFromItem(INT32 item) +{ + switch (item) + { + case KITEM_THUNDERSHIELD: return KSHIELD_THUNDER; + case KITEM_BUBBLESHIELD: return KSHIELD_BUBBLE; + case KITEM_FLAMESHIELD: return KSHIELD_FLAME; + default: return KSHIELD_NONE; + } +} + /** \brief Item Roulette for Kart \param player player @@ -774,9 +789,10 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp INT32 newodds; INT32 i; UINT8 pingame = 0, pexiting = 0; - boolean thunderisout = false; + boolean shieldout[NUMKARTSHIELDS-1]; SINT8 first = -1, second = -1; INT32 secondist = 0; + INT32 shieldtype = KSHIELD_NONE; boolean itemenabled[NUMKARTRESULTS-1] = { cv_sneaker.value, cv_rocketsneaker.value, @@ -816,6 +832,8 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp // Base multiplication to ALL item odds to simulate fractional precision newodds *= 4; + memset(shieldout, false, sizeof(shieldout)); + for (i = 0; i < MAXPLAYERS; i++) { if (!playeringame[i] || players[i].spectator) @@ -827,18 +845,16 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp if (players[i].exiting) pexiting++; - if (players[i].mo) - { - if (players[i].kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) - thunderisout = true; + shieldtype = K_GetShieldFromItem(players[i].kartstuff[k_itemtype]); + if (shieldtype != KSHIELD_NONE) + shieldout[shieldtype-1] = true; - if (!G_BattleGametype()) - { - if (players[i].kartstuff[k_position] == 1 && first == -1) - first = i; - if (players[i].kartstuff[k_position] == 2 && second == -1) - second = i; - } + if (players[i].mo && G_RaceGametype()) + { + if (players[i].kartstuff[k_position] == 1 && first == -1) + first = i; + if (players[i].kartstuff[k_position] == 2 && second == -1) + second = i; } } @@ -852,6 +868,11 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp secondist = ((28 + (8-pingame)) * secondist) / 28; } + // Don't allow more than one of each shield type at a time + shieldtype = K_GetShieldFromItem(item); + if (shieldout[shieldtype-1]) + return 0; + // POWERITEMODDS handles all of the "frantic item" related functionality, for all of our powerful items. // First, it multiplies it by 2 if franticitems is true; easy-peasy. // Next, it multiplies it again if it's in SPB mode and 2nd needs to apply pressure to 1st. @@ -889,6 +910,8 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp case KITEM_INVINCIBILITY: case KITEM_MINE: case KITEM_GROW: + case KITEM_BUBBLESHIELD: + case KITEM_FLAMESHIELD: if (COOLDOWNONSTART) newodds = 0; else @@ -907,10 +930,11 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp POWERITEMODDS(newodds); break; case KITEM_THUNDERSHIELD: - if (thunderisout || spbplace != -1) + if (spbplace != -1 || COOLDOWNONSTART) newodds = 0; else POWERITEMODDS(newodds); + break; case KITEM_HYUDORO: if ((hyubgone > 0) || COOLDOWNONSTART) newodds = 0; @@ -1600,11 +1624,16 @@ static void K_DrawDraftCombiring(player_t *player, player_t *victim, fixed_t cur SKINCOLOR_CHERRY }; fixed_t minimumdist = FixedMul(RING_DIST>>1, player->mo->scale); - UINT8 c = FixedMul(CHAOTIXBANDCOLORS<> FRACBITS; UINT8 n = CHAOTIXBANDLEN; UINT8 offset = ((leveltime / 3) % 3); fixed_t stepx, stepy, stepz; fixed_t curx, cury, curz; + UINT8 c; + + if (maxdist == 0) + c = 0; + else + c = FixedMul(CHAOTIXBANDCOLORS<> FRACBITS; stepx = (victim->mo->x - player->mo->x) / CHAOTIXBANDLEN; stepy = (victim->mo->y - player->mo->y) / CHAOTIXBANDLEN; @@ -1656,13 +1685,21 @@ static void K_UpdateDraft(player_t *player) UINT8 leniency; UINT8 i; - // Distance you have to be to draft. If you're still accelerating, then this distance is lessened. - // This distance biases toward low weight! (min weight gets 4096 units, max weight gets 3072 units) - // This distance is also scaled based on game speed. - draftdistance = (3072 + (128 * (9 - player->kartweight))) * player->mo->scale; - if (player->speed < topspd) - draftdistance = FixedMul(draftdistance, FixedDiv(player->speed, topspd)); - draftdistance = FixedMul(draftdistance, K_GetKartGameSpeedScalar(gamespeed)); + if (player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + { + // Flame Shield gets infinite draft distance as its passive effect. + draftdistance = 0; + } + else + { + // Distance you have to be to draft. If you're still accelerating, then this distance is lessened. + // This distance biases toward low weight! (min weight gets 4096 units, max weight gets 3072 units) + // This distance is also scaled based on game speed. + draftdistance = (3072 + (128 * (9 - player->kartweight))) * player->mo->scale; + if (player->speed < topspd) + draftdistance = FixedMul(draftdistance, FixedDiv(player->speed, topspd)); + draftdistance = FixedMul(draftdistance, K_GetKartGameSpeedScalar(gamespeed)); + } // On the contrary, the leniency period biases toward high weight. // (See also: the leniency variable in K_SpawnDraftDust) @@ -1722,7 +1759,7 @@ static void K_UpdateDraft(player_t *player) continue; // Not close enough to draft. - if (dist > draftdistance) + if (dist > draftdistance && draftdistance > 0) continue; #endif @@ -2220,6 +2257,12 @@ static void K_GetKartBoostPower(player_t *player) if (player->kartstuff[k_invincibilitytimer]) // Invincibility ADDBOOST((3*FRACUNIT)/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration + if (player->kartstuff[k_flamedash]) // Flame Shield dash + { + fixed_t dashval = ((player->kartstuff[k_flamedash]<kartstuff[k_startboost]) // Startup Boost ADDBOOST(FRACUNIT/4, 6*FRACUNIT); // + 25% top speed, + 600% acceleration @@ -3842,6 +3885,29 @@ static void K_DoThunderShield(player_t *player) #undef THUNDERRADIUS +static void K_FlameShieldPop(mobj_t *src) +{ + mobj_t *smoke; + UINT8 i; + + //S_StartSound(src, sfx_zio3); + + // spawn vertical bolt + for (i = 0; i < 8; i++) + { + smoke = P_SpawnMobj(src->x, src->y, src->z, MT_SMOKE); + P_SetMobjState(smoke, S_OPAQUESMOKE1); + P_SetScale(smoke, 2*smoke->scale); + smoke->destscale = 8*smoke->scale; + smoke->angle = FixedAngle((i*45)<fuse = P_RandomRange(20, 50); + smoke->momx = src->momx; + smoke->momy = src->momy; + smoke->momz = src->momz + (P_RandomRange(1,4) * smoke->scale); + P_Thrust(smoke, smoke->angle, (P_RandomRange(1,2) * smoke->scale)); + } +} + static void K_DoHyudoroSteal(player_t *player) { INT32 i, numplayers = 0; @@ -3849,6 +3915,10 @@ static void K_DoHyudoroSteal(player_t *player) INT32 stealplayer = -1; // The player that's getting stolen from INT32 prandom = 0; boolean sink = P_RandomChance(FRACUNIT/64); + INT32 hyu = hyudorotime; + + if (G_RaceGametype()) + hyu = (hyu<<1); // double in race for (i = 0; i < MAXPLAYERS; i++) { @@ -4132,11 +4202,18 @@ void K_DropHnextList(player_t *player) flip = P_MobjFlip(player->mo); ponground = P_IsObjectOnGround(player->mo); - if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD && player->kartstuff[k_itemamount]) + if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) { K_DoThunderShield(player); - player->kartstuff[k_itemamount] = 0; player->kartstuff[k_itemtype] = KITEM_NONE; + player->kartstuff[k_itemamount] = 0; + player->kartstuff[k_curshield] = 0; + } + else if (player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + { + //K_PopFlameShield(player); + player->kartstuff[k_itemtype] = KITEM_NONE; + player->kartstuff[k_itemamount] = 0; player->kartstuff[k_curshield] = 0; } @@ -4258,9 +4335,12 @@ void K_DropHnextList(player_t *player) // For getting EXTRA hit! void K_DropItems(player_t *player) { - boolean thunderhack = (player->kartstuff[k_curshield] && player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD); + INT32 shieldhack = 0; - if (thunderhack) + if (player->kartstuff[k_curshield]) + shieldhack = K_GetShieldFromItem(player->kartstuff[k_itemtype]); + + if (shieldhack) player->kartstuff[k_itemtype] = KITEM_NONE; K_DropHnextList(player); @@ -4279,7 +4359,13 @@ void K_DropItems(player_t *player) if (drop->eflags & MFE_UNDERWATER) drop->momz = (117 * drop->momz) / 200; - drop->threshold = (thunderhack ? KITEM_THUNDERSHIELD : player->kartstuff[k_itemtype]); + switch (shieldhack) + { + case KSHIELD_THUNDER: drop->threshold = KITEM_THUNDERSHIELD; break; + case KSHIELD_BUBBLE: drop->threshold = KITEM_BUBBLESHIELD; break; + case KSHIELD_FLAME: drop->threshold = KITEM_FLAMESHIELD; break; + default: drop->threshold = player->kartstuff[k_itemtype]; break; + } drop->movecount = player->kartstuff[k_itemamount]; drop->flags |= MF_NOCLIPTHING; @@ -5384,6 +5470,14 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) if (player->spectator) return turnvalue; + if (player->kartstuff[k_flamedash]) // Reduce turning + { + fixed_t dashval = ((player->kartstuff[k_flamedash]< FRACUNIT) + return 0; // NO MORE TURNING! + turnvalue = FixedMul(turnvalue, FRACUNIT-dashval); + } + if (player->kartstuff[k_drift] != 0 && P_IsObjectOnGround(player->mo)) { // If we're drifting we have a completely different turning value @@ -5402,7 +5496,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) turnvalue = FixedMul(turnvalue, adjustangle); // Weight has a small effect on turning if (EITHERSNEAKER(player) || player->kartstuff[k_invincibilitytimer] || player->kartstuff[k_growshrinktimer] > 0) - turnvalue = FixedMul(turnvalue, FixedDiv(5*FRACUNIT, 4*FRACUNIT)); + turnvalue = FixedMul(turnvalue, (5*FRACUNIT)/4); return turnvalue; } @@ -6223,14 +6317,15 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } break; case KITEM_THUNDERSHIELD: - if (player->kartstuff[k_curshield] != 1) + if (player->kartstuff[k_curshield] != KSHIELD_THUNDER) { mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THUNDERSHIELD); P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); P_SetTarget(&shield->target, player->mo); - S_StartSound(shield, sfx_s3k41); - player->kartstuff[k_curshield] = 1; + S_StartSound(player->mo, sfx_s3k41); + player->kartstuff[k_curshield] = KSHIELD_THUNDER; } + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { K_DoThunderShield(player); @@ -6238,6 +6333,53 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_PlayAttackTaunt(player->mo); } break; + case KITEM_BUBBLESHIELD: + if (player->kartstuff[k_curshield] != KSHIELD_BUBBLE) + { + //mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELD); + //P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); + //P_SetTarget(&shield->target, player->mo); + S_StartSound(player->mo, sfx_s3k3f); + player->kartstuff[k_curshield] = KSHIELD_BUBBLE; + } + case KITEM_FLAMESHIELD: + if (player->kartstuff[k_curshield] != KSHIELD_FLAME) + { + mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FLAMESHIELD); + P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); + P_SetTarget(&shield->target, player->mo); + S_StartSound(player->mo, sfx_s3k3e); + player->kartstuff[k_curshield] = KSHIELD_FLAME; + } + + if (!HOLDING_ITEM && NO_HYUDORO) + { + if (cmd->buttons & BT_ATTACK) + { + if (player->kartstuff[k_flameready]) + { + if (player->kartstuff[k_flamedash] == 0) + K_PlayBoostTaunt(player->mo); + player->kartstuff[k_flamedash]++; + } + } + else + { + if (player->kartstuff[k_flamedash] > TICRATE) + { + K_FlameShieldPop(player->mo); + player->kartstuff[k_flamedash] = 0; + player->kartstuff[k_flameready] = 0; + player->kartstuff[k_itemamount]--; + } + else + { + player->kartstuff[k_flamedash] = 0; + player->kartstuff[k_flameready] = 1; + } + } + } + break; case KITEM_HYUDORO: if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { @@ -6315,11 +6457,21 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) { - if ((player->kartstuff[k_rings]+player->kartstuff[k_pickuprings]) < 20 && !player->kartstuff[k_ringlock]) + if (RINGTOTAL(player) < 20 && !player->kartstuff[k_ringlock]) K_LookForRings(player->mo); } - else - player->kartstuff[k_curshield] = 0; + + if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD + || player->exiting || player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer]) + { + if (player->kartstuff[k_flamedash]) + K_FlameShieldPop(player->mo); + player->kartstuff[k_flamedash] = 0; + player->kartstuff[k_flameready] = 0; + } + + if (K_GetShieldFromItem(player->kartstuff[k_itemtype]) == KSHIELD_NONE) + player->kartstuff[k_curshield] = KSHIELD_NONE; // RESET shield type if (player->kartstuff[k_itemtype] == KITEM_SPB || player->kartstuff[k_itemtype] == KITEM_SHRINK @@ -6335,7 +6487,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else player->mo->flags2 &= ~MF2_DONTDRAW; - if (player->kartstuff[k_hyudorotimer] >= (1*TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyudorotime-(1*TICRATE/2)) + if (player->kartstuff[k_hyudorotimer] >= (TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyudorotime-(TICRATE/2)) { if (player == &players[displayplayers[1]]) player->mo->eflags |= MFE_DRAWONLYFORP2; @@ -6354,7 +6506,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else { if (P_IsDisplayPlayer(player) - || (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (1*TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)))) + || (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyudorotime-(TICRATE/2)))) { if (leveltime & 1) player->mo->flags2 |= MF2_DONTDRAW; @@ -6877,6 +7029,8 @@ static patch_t *kp_selfpropelledbomb[2]; static patch_t *kp_grow[2]; static patch_t *kp_shrink[2]; static patch_t *kp_thundershield[2]; +static patch_t *kp_bubbleshield[2]; +static patch_t *kp_flameshield[2]; static patch_t *kp_hyudoro[2]; static patch_t *kp_pogospring[2]; static patch_t *kp_kitchensink[2]; @@ -7063,6 +7217,8 @@ void K_LoadKartHUDGraphics(void) kp_grow[0] = W_CachePatchName("K_ITGROW", PU_HUDGFX); kp_shrink[0] = W_CachePatchName("K_ITSHRK", PU_HUDGFX); kp_thundershield[0] = W_CachePatchName("K_ITTHNS", PU_HUDGFX); + kp_bubbleshield[0] = W_CachePatchName("K_ITBUBS", PU_HUDGFX); + kp_flameshield[0] = W_CachePatchName("K_ITFLMS", PU_HUDGFX); kp_hyudoro[0] = W_CachePatchName("K_ITHYUD", PU_HUDGFX); kp_pogospring[0] = W_CachePatchName("K_ITPOGO", PU_HUDGFX); kp_kitchensink[0] = W_CachePatchName("K_ITSINK", PU_HUDGFX); @@ -7093,6 +7249,8 @@ void K_LoadKartHUDGraphics(void) kp_grow[1] = W_CachePatchName("K_ISGROW", PU_HUDGFX); kp_shrink[1] = W_CachePatchName("K_ISSHRK", PU_HUDGFX); kp_thundershield[1] = W_CachePatchName("K_ISTHNS", PU_HUDGFX); + kp_bubbleshield[1] = W_CachePatchName("K_ISBUBS", PU_HUDGFX); + kp_flameshield[1] = W_CachePatchName("K_ISFLMS", PU_HUDGFX); kp_hyudoro[1] = W_CachePatchName("K_ISHYUD", PU_HUDGFX); kp_pogospring[1] = W_CachePatchName("K_ISPOGO", PU_HUDGFX); kp_kitchensink[1] = W_CachePatchName("K_ISSINK", PU_HUDGFX); @@ -7215,6 +7373,10 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny) return (tiny ? "K_ISSHRK" : "K_ITSHRK"); case KITEM_THUNDERSHIELD: return (tiny ? "K_ISTHNS" : "K_ITTHNS"); + case KITEM_BUBBLESHIELD: + return (tiny ? "K_ISBUBS" : "K_ITBUBS"); + case KITEM_FLAMESHIELD: + return (tiny ? "K_ISFLMS" : "K_ITFLMS"); case KITEM_HYUDORO: return (tiny ? "K_ISHYUD" : "K_ITHYUD"); case KITEM_POGOSPRING: @@ -7602,6 +7764,14 @@ static void K_drawKartItem(void) localpatch = kp_thundershield[offset]; localbg = kp_itembg[offset+1]; break; + case KITEM_BUBBLESHIELD: + localpatch = kp_bubbleshield[offset]; + localbg = kp_itembg[offset+1]; + break; + case KITEM_FLAMESHIELD: + localpatch = kp_flameshield[offset]; + localbg = kp_itembg[offset+1]; + break; case KITEM_HYUDORO: localpatch = kp_hyudoro[offset]; break; @@ -8885,8 +9055,8 @@ static void K_drawKartMinimap(void) if (players[i].kartstuff[k_hyudorotimer] > 0) { - if (!((players[i].kartstuff[k_hyudorotimer] < 1*TICRATE/2 - || players[i].kartstuff[k_hyudorotimer] > hyudorotime-(1*TICRATE/2)) + if (!((players[i].kartstuff[k_hyudorotimer] < TICRATE/2 + || players[i].kartstuff[k_hyudorotimer] > hyudorotime-(TICRATE/2)) && !(leveltime & 1))) continue; } @@ -9439,6 +9609,8 @@ static void K_drawDistributionDebugger(void) kp_grow[1], kp_shrink[1], kp_thundershield[1], + kp_bubbleshield[1], + kp_flameshield[1], kp_hyudoro[1], kp_pogospring[1], kp_superring[1], diff --git a/src/k_kart.h b/src/k_kart.h index b91e8c8a1..ccbb7b55a 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -23,6 +23,7 @@ void K_RegisterKartStuff(void); boolean K_IsPlayerLosing(player_t *player); boolean K_IsPlayerWanted(player_t *player); fixed_t K_GetKartGameSpeedScalar(SINT8 value); +INT32 K_GetShieldFromItem(INT32 item); void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid); void K_KartPainEnergyFling(player_t *player); void K_FlipFromObject(mobj_t *mo, mobj_t *master); diff --git a/src/p_enemy.c b/src/p_enemy.c index 91268b504..4ee97a59f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3676,7 +3676,7 @@ void A_AttractChase(mobj_t *actor) if (actor->tracer && actor->tracer->player && actor->tracer->health //&& P_CheckSight(actor, actor->tracer) && actor->tracer->player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD - && (actor->tracer->player->kartstuff[k_rings]+actor->tracer->player->kartstuff[k_pickuprings]) < 20 + && RINGTOTAL(actor->tracer->player) < 20 && !actor->tracer->player->kartstuff[k_ringlock]) { fixed_t dist; diff --git a/src/p_inter.c b/src/p_inter.c index 8d898f83d..e51fbb39f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -142,8 +142,8 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon) || player->kartstuff[k_itemheld]) return false; - if (weapon == 3 && player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) - return false; // No stacking thunder shields! + if (weapon == 3 && K_GetShieldFromItem(player->kartstuff[k_itemtype]) != KSHIELD_NONE) + return false; // No stacking shields! } } @@ -629,7 +629,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; // kill - if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0) + if (player->kartstuff[k_invincibilitytimer] > 0 + || player->kartstuff[k_growshrinktimer] > 0 + || player->kartstuff[k_flamedash] > 0) { P_KillMobj(special, toucher, toucher); return; @@ -704,7 +706,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; // Reached the cap, don't waste 'em! - if ((player->kartstuff[k_rings] + player->kartstuff[k_pickuprings]) >= 20) + if (RINGTOTAL(player) >= 20) return; special->momx = special->momy = special->momz = 0; @@ -3297,8 +3299,8 @@ void P_PlayerRingBurst(player_t *player, INT32 num_rings) if (!player) return; - // Has a shield? Don't lose your rings! - if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) + // Have a shield? You get hit, but don't lose your rings! + if (K_GetShieldFromItem(player->kartstuff[k_itemtype]) != KSHIELD_NONE) return; // 20 is the ring cap in kart diff --git a/src/p_map.c b/src/p_map.c index 3dd026ee4..025d84b02 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1452,6 +1452,10 @@ static boolean PIT_CheckThing(mobj_t *thing) P_DamageMobj(thing, tmthing, tmthing, 1); else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) P_DamageMobj(tmthing, thing, thing, 1); + else if (tmthing->player->kartstuff[k_flamedash] && !thing->player->kartstuff[k_flamedash]) // SRB2kart - Then flame shield! + P_DamageMobj(thing, tmthing, tmthing, 1); + else if (thing->player->kartstuff[k_flamedash] && !tmthing->player->kartstuff[k_flamedash]) + P_DamageMobj(tmthing, thing, thing, 1); /*if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam)) { diff --git a/src/p_mobj.c b/src/p_mobj.c index be4bf0c1a..96c442d64 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6232,7 +6232,9 @@ void P_RunShadows(void) dest = mobj->target; - if (dest->type == MT_THUNDERSHIELD) + if (dest->type == MT_THUNDERSHIELD + || dest->type == MT_BUBBLESHIELD + || dest->type == MT_FLAMESHIELD) dest = dest->target; P_TeleportMove(mobj, dest->x, dest->y, mobj->target->z); @@ -8362,7 +8364,8 @@ void P_MobjThinker(mobj_t *mobj) case MT_THUNDERSHIELD: { fixed_t destx, desty; - if (!mobj->target || !mobj->target->health || (mobj->target->player && mobj->target->player->kartstuff[k_curshield] != 1)) + if (!mobj->target || !mobj->target->health || !mobj->target->player + || mobj->target->player->kartstuff[k_curshield] != KSHIELD_THUNDER) { P_RemoveMobj(mobj); return; @@ -8381,8 +8384,9 @@ void P_MobjThinker(mobj_t *mobj) else viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y); - if (curstate > S_THUNDERSHIELD15) + if (curstate > S_THUNDERSHIELD15 && curstate <= S_THUNDERSHIELD24) viewingangle += ANGLE_180; + destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4); desty = mobj->target->y + P_ReturnThrustY(mobj->target, viewingangle, mobj->scale>>4); } @@ -8395,6 +8399,64 @@ void P_MobjThinker(mobj_t *mobj) P_TeleportMove(mobj, destx, desty, mobj->target->z); break; } + case MT_FLAMESHIELD: + { + fixed_t destx, desty; + statenum_t curstate; + + if (!mobj->target || !mobj->target->health || !mobj->target->player + || mobj->target->player->kartstuff[k_curshield] != KSHIELD_FLAME) + { + P_RemoveMobj(mobj); + return; + } + P_SetScale(mobj, (mobj->destscale = (5*mobj->target->destscale)>>2)); + + curstate = ((mobj->tics == 1) ? (mobj->state->nextstate) : ((statenum_t)(mobj->state-states))); + + if (mobj->target->player->kartstuff[k_flamedash]) + { + if (curstate != S_FLAMESHIELDDASH) + P_SetMobjState(mobj, S_FLAMESHIELDDASH); + mobj->flags2 ^= MF2_DONTDRAW; + } + else + { + if (curstate == S_FLAMESHIELDDASH) + P_SetMobjState(mobj, S_FLAMESHIELD1); + mobj->flags2 &= ~MF2_DONTDRAW; + } + + if (!splitscreen /*&& rendermode != render_soft*/) + { + angle_t viewingangle; + + if (players[displayplayers[0]].awayviewtics) + viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayviewmobj->x, players[displayplayers[0]].awayviewmobj->y); + else if (!camera[0].chase && players[displayplayers[0]].mo) + viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y); + else + viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y); + + if (curstate >= S_FLAMESHIELD1 && curstate < S_FLAMESHIELDDASH && ((curstate-S_FLAMESHIELD1) & 1)) + viewingangle += ANGLE_180; + + destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4); + desty = mobj->target->y + P_ReturnThrustY(mobj->target, viewingangle, mobj->scale>>4); + } + else + { + destx = mobj->target->x; + desty = mobj->target->y; + } + + P_TeleportMove(mobj, destx, desty, mobj->target->z); + if (mobj->target->momx || mobj->target->momy) + mobj->angle = R_PointToAngle2(0, 0, mobj->target->momx, mobj->target->momy); + else + mobj->angle = mobj->target->angle; + break; + } case MT_ROCKETSNEAKER: if (!mobj->target || !mobj->target->health) { @@ -10116,7 +10178,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_JAWZ: case MT_JAWZ_DUD: case MT_JAWZ_SHIELD: case MT_SSMINE: case MT_SSMINE_SHIELD: case MT_BALLHOG: case MT_SINK: - case MT_THUNDERSHIELD: case MT_ROCKETSNEAKER: + case MT_THUNDERSHIELD: case MT_BUBBLESHIELD: case MT_FLAMESHIELD: + case MT_ROCKETSNEAKER: case MT_SPB: P_SpawnShadowMobj(mobj); default: diff --git a/src/p_user.c b/src/p_user.c index bd2e8ee28..7e2b13023 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1083,7 +1083,7 @@ void P_PlayLivesJingle(player_t *player) void P_PlayRinglossSound(mobj_t *source) { - if (source->player && source->player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) + if (source->player && K_GetShieldFromItem(source->player->kartstuff[k_itemtype]) != KSHIELD_NONE) S_StartSound(source, sfx_s1a3); // Shield hit (no ring loss) else if (source->player && source->player->kartstuff[k_rings] <= 0) S_StartSound(source, sfx_s1a6); // Ring debt (lessened ring loss) From 480d56838f9e853c625597e31918682ed0a7d955 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 20 May 2019 00:50:44 -0400 Subject: [PATCH 03/65] Add cvars to prevent issues --- src/d_netcmd.c | 2 ++ src/d_netcmd.h | 3 ++- src/k_kart.c | 4 ++++ src/m_menu.c | 2 ++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index c4d99e840..9d7708dd8 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -342,6 +342,8 @@ consvar_t cv_selfpropelledbomb = {"selfpropelledbomb", "On", CV_NETVAR|CV_CHEAT consvar_t cv_grow = {"grow", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_shrink = {"shrink", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_thundershield = {"thundershield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_bubbleshield = {"bubbleshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_flameshield = {"flameshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_hyudoro = {"hyudoro", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_pogospring = {"pogospring", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kitchensink = {"kitchensink", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 73930c172..1d360a254 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -104,7 +104,8 @@ extern consvar_t cv_recycler;*/ extern consvar_t cv_superring, cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana; extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine; extern consvar_t cv_ballhog, cv_selfpropelledbomb, cv_grow, cv_shrink; -extern consvar_t cv_thundershield, cv_hyudoro, cv_pogospring, cv_kitchensink; +extern consvar_t cv_thundershield, cv_bubbleshield, cv_flameshield; +extern consvar_t cv_hyudoro, cv_pogospring, cv_kitchensink; extern consvar_t cv_triplesneaker, cv_triplebanana, cv_decabanana; extern consvar_t cv_tripleorbinaut, cv_quadorbinaut, cv_dualjawz; diff --git a/src/k_kart.c b/src/k_kart.c index da3ad8c7b..c23d45d11 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -556,6 +556,8 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_grow); CV_RegisterVar(&cv_shrink); CV_RegisterVar(&cv_thundershield); + CV_RegisterVar(&cv_bubbleshield); + CV_RegisterVar(&cv_flameshield); CV_RegisterVar(&cv_hyudoro); CV_RegisterVar(&cv_pogospring); CV_RegisterVar(&cv_superring); @@ -808,6 +810,8 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp cv_grow.value, cv_shrink.value, cv_thundershield.value, + cv_bubbleshield.value, + cv_flameshield.value, cv_hyudoro.value, cv_pogospring.value, cv_superring.value, diff --git a/src/m_menu.c b/src/m_menu.c index b367fc9a4..258c149eb 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -10622,6 +10622,8 @@ static consvar_t *kartitemcvs[NUMKARTRESULTS-1] = { &cv_grow, &cv_shrink, &cv_thundershield, + &cv_bubbleshield, + &cv_flameshield, &cv_hyudoro, &cv_pogospring, &cv_superring, From 1e7b79144d3c457d5dc94cb3f1a105225cd0f2a1 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 20 May 2019 14:17:16 -0400 Subject: [PATCH 04/65] Nice things - Fix off-by-one error in shieldout code - Added KartItemCVars array for anything to use - More I_Asserts in item logic --- src/k_kart.c | 71 +++++++++++++++++++++++++++++----------------------- src/k_kart.h | 3 +++ src/m_menu.c | 37 ++++----------------------- 3 files changed, 48 insertions(+), 63 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index c23d45d11..78e3a7057 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -649,10 +649,39 @@ fixed_t K_GetKartGameSpeedScalar(SINT8 value) //{ SRB2kart Roulette Code - Position Based +consvar_t *KartItemCVars[NUMKARTRESULTS-1] = +{ + &cv_sneaker, + &cv_rocketsneaker, + &cv_invincibility, + &cv_banana, + &cv_eggmanmonitor, + &cv_orbinaut, + &cv_jawz, + &cv_mine, + &cv_ballhog, + &cv_selfpropelledbomb, + &cv_grow, + &cv_shrink, + &cv_thundershield, + &cv_bubbleshield, + &cv_flameshield, + &cv_hyudoro, + &cv_pogospring, + &cv_superring, + &cv_kitchensink, + &cv_triplesneaker, + &cv_triplebanana, + &cv_decabanana, + &cv_tripleorbinaut, + &cv_quadorbinaut, + &cv_dualjawz +}; + #define NUMKARTODDS 80 // Less ugly 2D arrays -static INT32 K_KartItemOddsRace[NUMKARTRESULTS][8] = +static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = { //P-Odds 0 1 2 3 4 5 6 7 /*Sneaker*/ { 0, 0, 3, 5, 6, 0, 0, 0 }, // Sneaker @@ -682,7 +711,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS][8] = /*Jawz x2*/ { 0, 0, 1, 2, 0, 0, 0, 0 } // Jawz x2 }; -static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][6] = +static INT32 K_KartItemOddsBattle[NUMKARTRESULTS-1][6] = { //P-Odds 0 1 2 3 4 5 /*Sneaker*/ { 3, 2, 2, 2, 0, 2 }, // Sneaker @@ -796,43 +825,23 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp SINT8 first = -1, second = -1; INT32 secondist = 0; INT32 shieldtype = KSHIELD_NONE; - boolean itemenabled[NUMKARTRESULTS-1] = { - cv_sneaker.value, - cv_rocketsneaker.value, - cv_invincibility.value, - cv_banana.value, - cv_eggmanmonitor.value, - cv_orbinaut.value, - cv_jawz.value, - cv_mine.value, - cv_ballhog.value, - cv_selfpropelledbomb.value, - cv_grow.value, - cv_shrink.value, - cv_thundershield.value, - cv_bubbleshield.value, - cv_flameshield.value, - cv_hyudoro.value, - cv_pogospring.value, - cv_superring.value, - cv_kitchensink.value, - cv_triplesneaker.value, - cv_triplebanana.value, - cv_decabanana.value, - cv_tripleorbinaut.value, - cv_quadorbinaut.value, - cv_dualjawz.value - }; I_Assert(item > KITEM_NONE); // too many off by one scenarioes. + I_Assert(KartItemCVars[NUMKARTRESULTS-2] != NULL); // Make sure this exists - if (!itemenabled[item-1] && !modeattacking) + if (!KartItemCVars[item-1]->value && !modeattacking) return 0; if (G_BattleGametype()) + { + I_Assert(pos < 6); // DO NOT allow positions past the bounds of the table newodds = K_KartItemOddsBattle[item-1][pos]; + } else + { + I_Assert(pos < 8); // Ditto newodds = K_KartItemOddsRace[item-1][pos]; + } // Base multiplication to ALL item odds to simulate fractional precision newodds *= 4; @@ -875,7 +884,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp // Don't allow more than one of each shield type at a time shieldtype = K_GetShieldFromItem(item); - if (shieldout[shieldtype-1]) + if (shieldtype != KSHIELD_NONE && shieldout[shieldtype-1]) return 0; // POWERITEMODDS handles all of the "frantic item" related functionality, for all of our powerful items. diff --git a/src/k_kart.h b/src/k_kart.h index ccbb7b55a..b72928165 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -23,6 +23,9 @@ void K_RegisterKartStuff(void); boolean K_IsPlayerLosing(player_t *player); boolean K_IsPlayerWanted(player_t *player); fixed_t K_GetKartGameSpeedScalar(SINT8 value); + +consvar_t *KartItemCVars[NUMKARTRESULTS-1]; + INT32 K_GetShieldFromItem(INT32 item); void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid); void K_KartPainEnergyFling(player_t *player); diff --git a/src/m_menu.c b/src/m_menu.c index 258c149eb..94502d8bf 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -10608,33 +10608,6 @@ static void M_HandleVideoMode(INT32 ch) // =============== // Monitor Toggles // =============== -static consvar_t *kartitemcvs[NUMKARTRESULTS-1] = { - &cv_sneaker, - &cv_rocketsneaker, - &cv_invincibility, - &cv_banana, - &cv_eggmanmonitor, - &cv_orbinaut, - &cv_jawz, - &cv_mine, - &cv_ballhog, - &cv_selfpropelledbomb, - &cv_grow, - &cv_shrink, - &cv_thundershield, - &cv_bubbleshield, - &cv_flameshield, - &cv_hyudoro, - &cv_pogospring, - &cv_superring, - &cv_kitchensink, - &cv_triplesneaker, - &cv_triplebanana, - &cv_decabanana, - &cv_tripleorbinaut, - &cv_quadorbinaut, - &cv_dualjawz -}; static tic_t shitsfree = 0; @@ -10703,7 +10676,7 @@ static void M_DrawMonitorToggles(void) continue; } - cv = kartitemcvs[currentMenu->menuitems[thisitem].alphaKey-1]; + cv = KartItemCVars[currentMenu->menuitems[thisitem].alphaKey-1]; translucent = (cv->value ? 0 : V_TRANSLUCENT); switch (currentMenu->menuitems[thisitem].alphaKey) @@ -10772,7 +10745,7 @@ static void M_DrawMonitorToggles(void) } else { - cv = kartitemcvs[currentMenu->menuitems[itemOn].alphaKey-1]; + cv = KartItemCVars[currentMenu->menuitems[itemOn].alphaKey-1]; translucent = (cv->value ? 0 : V_TRANSLUCENT); switch (currentMenu->menuitems[itemOn].alphaKey) @@ -10888,14 +10861,14 @@ static void M_HandleMonitorToggles(INT32 choice) S_StartSound(NULL, sfx_s1b4); for (i = 0; i < NUMKARTRESULTS-1; i++) { - if (kartitemcvs[i]->value == v) - CV_AddValue(kartitemcvs[i], 1); + if (KartItemCVars[i]->value == v) + CV_AddValue(KartItemCVars[i], 1); } } else { S_StartSound(NULL, sfx_s1ba); - CV_AddValue(kartitemcvs[currentMenu->menuitems[itemOn].alphaKey-1], 1); + CV_AddValue(KartItemCVars[currentMenu->menuitems[itemOn].alphaKey-1], 1); } break; From 52bd194c69cbded96175f2b23e286300180aa4ec Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 20 May 2019 15:39:33 -0400 Subject: [PATCH 05/65] Flame Shield updatin's --- src/k_kart.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 78e3a7057..904b562fa 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2274,7 +2274,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->kartstuff[k_flamedash]) // Flame Shield dash { fixed_t dashval = ((player->kartstuff[k_flamedash]<kartstuff[k_startboost]) // Startup Boost @@ -5544,7 +5544,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) if (player->kartstuff[k_flamedash]) // Reduce turning { - fixed_t dashval = ((player->kartstuff[k_flamedash]<kartstuff[k_flamedash]< FRACUNIT) return 0; // NO MORE TURNING! turnvalue = FixedMul(turnvalue, FRACUNIT-dashval); @@ -6414,6 +6414,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) S_StartSound(player->mo, sfx_s3k3f); player->kartstuff[k_curshield] = KSHIELD_BUBBLE; } + break; case KITEM_FLAMESHIELD: if (player->kartstuff[k_curshield] != KSHIELD_FLAME) { @@ -6433,11 +6434,18 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_flamedash] == 0) K_PlayBoostTaunt(player->mo); player->kartstuff[k_flamedash]++; + if (player->kartstuff[k_flamedash] > 10*TICRATE) + { + K_FlameShieldPop(player->mo); + player->kartstuff[k_flamedash] = 0; + player->kartstuff[k_flameready] = 0; + player->kartstuff[k_itemamount]--; + } } } else { - if (player->kartstuff[k_flamedash] > TICRATE) + if (player->kartstuff[k_flamedash] > (TICRATE*2)) { K_FlameShieldPop(player->mo); player->kartstuff[k_flamedash] = 0; @@ -7861,11 +7869,15 @@ static void K_drawKartItem(void) localbg = kp_itembg[offset+1]; break; case KITEM_BUBBLESHIELD: + localpatch = kp_bubbleshield[offset]; localbg = kp_itembg[offset+1]; break; case KITEM_FLAMESHIELD: - localpatch = kp_flameshield[offset]; + if (stplyr->kartstuff[k_flamedash] > (TICRATE*2) && (leveltime & 1)) + localpatch = kp_nodraw; + else + localpatch = kp_flameshield[offset]; localbg = kp_itembg[offset+1]; break; case KITEM_HYUDORO: From 99ed66ac4659e77ac5abb9e85d9785882dce008d Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 01:01:29 -0400 Subject: [PATCH 06/65] Bubble Shield, Flame Shield changes --- src/d_player.h | 7 +- src/dehacked.c | 34 ++++++- src/doomstat.h | 1 + src/g_game.c | 1 + src/info.c | 58 +++++++++++- src/info.h | 30 +++++++ src/k_kart.c | 238 ++++++++++++++++++++++++++++++------------------- src/p_inter.c | 60 ++++++++++++- src/p_map.c | 112 +++++++++++++++++++++++ src/p_mobj.c | 159 ++++++++++++++++++++++++++++++++- 10 files changed, 597 insertions(+), 103 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index c51b12769..d4dc44ea4 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -300,21 +300,22 @@ typedef enum k_itemtype, // KITEM_ constant for item number k_itemamount, // Amount of said item k_itemheld, // Are you holding an item? + k_holdready, // Hold button-style item is ready to activate // Some items use timers for their duration or effects - //k_thunderanim, // Duration of Thunder Shield's use animation k_curshield, // 0 = no shield, 1 = thunder shield k_hyudorotimer, // Duration of the Hyudoro offroad effect itself k_stealingtimer, // You are stealing an item, this is your timer k_stolentimer, // You are being stolen from, this is your timer k_superring, // Spawn rings on top of you every tic! k_sneakertimer, // Duration of the Sneaker Boost itself - k_levelbooster, // Duration of a level booster's boost (same as sneaker, but separated for ) + k_levelbooster, // Duration of a level booster's boost (same as sneaker, but separated for boost stacking) k_growshrinktimer, // > 0 = Big, < 0 = small k_squishedtimer, // Squished frame timer k_rocketsneakertimer, // Rocket Sneaker duration timer k_invincibilitytimer, // Invincibility timer - k_flameready, // Flame Shield dash ready to activate + k_bubblecool, // Bubble Shield use cooldown + k_bubbleblowup, // Bubble Shield usage blowup k_flamedash, // Flame Shield dash power k_eggmanheld, // Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items k_eggmanexplode, // Fake item recieved, explode in a few seconds diff --git a/src/dehacked.c b/src/dehacked.c index d7d428bab..5de479c9e 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6634,6 +6634,35 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_THUNDERSHIELD23", "S_THUNDERSHIELD24", + // Bubble Shield + "S_BUBBLESHIELD1", + "S_BUBBLESHIELD2", + "S_BUBBLESHIELD3", + "S_BUBBLESHIELD4", + "S_BUBBLESHIELD5", + "S_BUBBLESHIELD6", + "S_BUBBLESHIELD7", + "S_BUBBLESHIELD8", + "S_BUBBLESHIELD9", + "S_BUBBLESHIELD10", + "S_BUBBLESHIELD11", + "S_BUBBLESHIELD12", + "S_BUBBLESHIELD13", + "S_BUBBLESHIELD14", + "S_BUBBLESHIELD15", + "S_BUBBLESHIELD16", + "S_BUBBLESHIELD17", + "S_BUBBLESHIELD18", + "S_BUBBLESHIELDBLOWUP", + "S_BUBBLESHIELDTRAP1", + "S_BUBBLESHIELDTRAP2", + "S_BUBBLESHIELDTRAP3", + "S_BUBBLESHIELDTRAP4", + "S_BUBBLESHIELDTRAP5", + "S_BUBBLESHIELDTRAP6", + "S_BUBBLESHIELDTRAP7", + "S_BUBBLESHIELDTRAP8", + // Flame Shield "S_FLAMESHIELD1", "S_FLAMESHIELD2", @@ -7792,6 +7821,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_THUNDERSHIELD", // Shields "MT_BUBBLESHIELD", "MT_FLAMESHIELD", + "MT_BUBBLESHIELDTRAP", "MT_SINK", // Kitchen Sink Stuff "MT_SINK_SHIELD", @@ -8463,6 +8493,7 @@ static const char *const KARTSTUFF_LIST[] = { "ITEMTYPE", "ITEMAMOUNT", "ITEMHELD", + "HOLDREADY", "CURSHIELD", "HYUDOROTIMER", @@ -8475,7 +8506,8 @@ static const char *const KARTSTUFF_LIST[] = { "SQUISHEDTIMER", "ROCKETSNEAKERTIMER", "INVINCIBILITYTIMER", - "FLAMEREADY", + "BUBBLECOOL", + "BUBBLEBLOWUP", "FLAMEDASH", "EGGMANHELD", "EGGMANEXPLODE", diff --git a/src/doomstat.h b/src/doomstat.h index 1f855da27..b12e535ee 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -433,6 +433,7 @@ extern INT32 hyudorotime; extern INT32 stealtime; extern INT32 sneakertime; extern INT32 itemtime; +extern INT32 bubbletime; extern INT32 comebacktime; extern INT32 bumptime; extern INT32 wipeoutslowtime; diff --git a/src/g_game.c b/src/g_game.c index 6f08eb7c6..3a5e3d6e9 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -214,6 +214,7 @@ INT32 hyudorotime = 7*TICRATE; INT32 stealtime = TICRATE/2; INT32 sneakertime = TICRATE + (TICRATE/3); INT32 itemtime = 8*TICRATE; +INT32 bubbletime = TICRATE/2; INT32 comebacktime = 10*TICRATE; INT32 bumptime = 6; INT32 wipeoutslowtime = 20; diff --git a/src/info.c b/src/info.c index c87ac4866..f7d60dff3 100644 --- a/src/info.c +++ b/src/info.c @@ -2850,6 +2850,34 @@ state_t states[NUMSTATES] = {SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23 {SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24 + {SPR_BUBS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_BUBBLESHIELD2}, // S_BUBBLESHIELD1 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD3}, // S_BUBBLESHIELD2 + {SPR_BUBS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_BUBBLESHIELD4}, // S_BUBBLESHIELD3 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD5}, // S_BUBBLESHIELD4 + {SPR_BUBS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_BUBBLESHIELD6}, // S_BUBBLESHIELD5 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD7}, // S_BUBBLESHIELD6 + {SPR_BUBS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_BUBBLESHIELD8}, // S_BUBBLESHIELD7 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD9}, // S_BUBBLESHIELD8 + {SPR_BUBS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_BUBBLESHIELD10}, // S_BUBBLESHIELD9 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD11}, // S_BUBBLESHIELD10 + {SPR_BUBS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_BUBBLESHIELD12}, // S_BUBBLESHIELD11 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD13}, // S_BUBBLESHIELD12 + {SPR_BUBS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_BUBBLESHIELD14}, // S_BUBBLESHIELD13 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD15}, // S_BUBBLESHIELD14 + {SPR_BUBS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_BUBBLESHIELD16}, // S_BUBBLESHIELD15 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD17}, // S_BUBBLESHIELD16 + {SPR_BUBS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_BUBBLESHIELD18}, // S_BUBBLESHIELD17 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD1}, // S_BUBBLESHIELD18 + {SPR_BUBS, FF_FULLBRIGHT|13, -1, {NULL}, 0, 0, S_BUBBLESHIELDBLOWUP}, // S_BUBBLESHIELDBLOWUP + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP2}, // S_BUBBLESHIELDTRAP1 + {SPR_BUBS, FF_FULLBRIGHT|14, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP3}, // S_BUBBLESHIELDTRAP2 + {SPR_BUBS, FF_FULLBRIGHT|15, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP4}, // S_BUBBLESHIELDTRAP3 + {SPR_BUBS, FF_FULLBRIGHT|14, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP5}, // S_BUBBLESHIELDTRAP4 + {SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP6}, // S_BUBBLESHIELDTRAP5 + {SPR_BUBS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP7}, // S_BUBBLESHIELDTRAP6 + {SPR_BUBS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP8}, // S_BUBBLESHIELDTRAP7 + {SPR_BUBS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP1}, // S_BUBBLESHIELDTRAP8 + {SPR_FLMS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_FLAMESHIELD2}, // S_FLAMESHIELD1 {SPR_FLMS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_FLAMESHIELD3}, // S_FLAMESHIELD2 {SPR_FLMS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_FLAMESHIELD4}, // S_FLAMESHIELD3 @@ -15957,7 +15985,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_BUBBLESHIELD -1, // doomednum - S_THUNDERSHIELD1, // spawnstate + S_BUBBLESHIELD1, // spawnstate 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound @@ -15978,7 +16006,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 16, // mass 0, // damage sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + MF_SPECIAL|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, @@ -16009,6 +16037,32 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BUBBLESHIELDTRAP + -1, // doomednum + S_BUBBLESHIELDTRAP1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 1, // display offset + 16, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, { // MT_SINK -1, // doomednum diff --git a/src/info.h b/src/info.h index a302aa679..000d2fb93 100644 --- a/src/info.h +++ b/src/info.h @@ -3518,6 +3518,35 @@ typedef enum state S_THUNDERSHIELD23, S_THUNDERSHIELD24, + // Bubble Shield + S_BUBBLESHIELD1, + S_BUBBLESHIELD2, + S_BUBBLESHIELD3, + S_BUBBLESHIELD4, + S_BUBBLESHIELD5, + S_BUBBLESHIELD6, + S_BUBBLESHIELD7, + S_BUBBLESHIELD8, + S_BUBBLESHIELD9, + S_BUBBLESHIELD10, + S_BUBBLESHIELD11, + S_BUBBLESHIELD12, + S_BUBBLESHIELD13, + S_BUBBLESHIELD14, + S_BUBBLESHIELD15, + S_BUBBLESHIELD16, + S_BUBBLESHIELD17, + S_BUBBLESHIELD18, + S_BUBBLESHIELDBLOWUP, + S_BUBBLESHIELDTRAP1, + S_BUBBLESHIELDTRAP2, + S_BUBBLESHIELDTRAP3, + S_BUBBLESHIELDTRAP4, + S_BUBBLESHIELDTRAP5, + S_BUBBLESHIELDTRAP6, + S_BUBBLESHIELDTRAP7, + S_BUBBLESHIELDTRAP8, + // Flame Shield S_FLAMESHIELD1, S_FLAMESHIELD2, @@ -4708,6 +4737,7 @@ typedef enum mobj_type MT_THUNDERSHIELD, // Shields MT_BUBBLESHIELD, MT_FLAMESHIELD, + MT_BUBBLESHIELDTRAP, MT_SINK, // Kitchen Sink Stuff MT_SINK_SHIELD, diff --git a/src/k_kart.c b/src/k_kart.c index 904b562fa..72158e807 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -697,7 +697,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = /*Grow*/ { 0, 0, 0, 1, 1, 2, 0, 0 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink /*Thunder Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield - /*Bubble Shield*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Bubble Shield + /*Bubble Shield*/ { 0, 0, 0, 1, 2, 0, 0, 0 }, // Bubble Shield /*Flame Shield*/ { 0, 0, 0, 0, 0, 0, 1, 2 }, // Flame Shield /*Hyudoro*/ { 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring @@ -1304,8 +1304,11 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) case MT_PLAYER: if (!mobj->player) break; - if (against->player && !against->player->kartstuff[k_spinouttimer] && mobj->player->kartstuff[k_spinouttimer]) - weight = 0; // Do not bump + if (against->player + && ((!against->player->kartstuff[k_spinouttimer] && mobj->player->kartstuff[k_spinouttimer]) + || (against->player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD && mobj->player->kartstuff[k_itemtype] != KITEM_BUBBLESHIELD) + || (against->type == MT_BUBBLESHIELD))) + weight = 0; // This player does not cause any bump action else { weight = (mobj->player->kartweight) * mobj->scale; @@ -3856,7 +3859,6 @@ static void K_DoThunderShield(player_t *player) angle_t an; S_StartSound(player->mo, sfx_zio3); - //player->kartstuff[k_thunderanim] = 35; P_NukeEnemies(player->mo, player->mo, RING_DIST/4); // spawn vertical bolt @@ -4221,14 +4223,20 @@ void K_DropHnextList(player_t *player) K_DoThunderShield(player); player->kartstuff[k_itemtype] = KITEM_NONE; player->kartstuff[k_itemamount] = 0; - player->kartstuff[k_curshield] = 0; + player->kartstuff[k_curshield] = KSHIELD_NONE; + } + else if (player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD) + { + player->kartstuff[k_itemtype] = KITEM_NONE; + player->kartstuff[k_itemamount] = 0; + player->kartstuff[k_curshield] = KSHIELD_NONE; } else if (player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) { - //K_PopFlameShield(player); + K_FlameShieldPop(player->mo); player->kartstuff[k_itemtype] = KITEM_NONE; player->kartstuff[k_itemamount] = 0; - player->kartstuff[k_curshield] = 0; + player->kartstuff[k_curshield] = KSHIELD_NONE; } nextwork = work->hnext; @@ -5043,6 +5051,68 @@ void K_KartPlayerHUDUpdate(player_t *player) #undef RINGANIM_DELAYMAX +// SRB2Kart: blockmap iterate for attraction shield users +static mobj_t *attractmo; +static fixed_t attractdist; +static inline boolean PIT_AttractingRings(mobj_t *thing) +{ + if (!attractmo || P_MobjWasRemoved(attractmo)) + return false; + + if (!attractmo->player) + return false; // not a player + + if (thing->health <= 0 || !thing) + return true; // dead + + if (thing->type != MT_RING && thing->type != MT_FLINGRING) + return true; // not a ring + + if (thing->extravalue1) + return true; // in special ring animation + + if (thing->cusval) + return true; // already attracted + + // see if it went over / under + if (attractmo->z - (attractdist>>2) > thing->z + thing->height) + return true; // overhead + if (attractmo->z + attractmo->height + (attractdist>>2) < thing->z) + return true; // underneath + + if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) < attractdist) + return true; // Too far away + + // set target + P_SetTarget(&thing->tracer, attractmo); + // flag to show it's been attracted once before + thing->cusval = 1; + return true; // find other rings +} + +/** Looks for rings near a player in the blockmap. + * + * \param pmo Player object looking for rings to attract + * \sa A_AttractChase + */ +static void K_LookForRings(mobj_t *pmo) +{ + INT32 bx, by, xl, xh, yl, yh; + attractdist = FixedMul(RING_DIST, pmo->scale)>>2; + + // Use blockmap to check for nearby rings + yh = (unsigned)(pmo->y + attractdist - bmaporgy)>>MAPBLOCKSHIFT; + yl = (unsigned)(pmo->y - attractdist - bmaporgy)>>MAPBLOCKSHIFT; + xh = (unsigned)(pmo->x + attractdist - bmaporgx)>>MAPBLOCKSHIFT; + xl = (unsigned)(pmo->x - attractdist - bmaporgx)>>MAPBLOCKSHIFT; + + attractmo = pmo; + + for (by = yl; by <= yh; by++) + for (bx = xl; bx <= xh; bx++) + P_BlockThingsIterator(bx, by, PIT_AttractingRings); +} + /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c \param player player object passed from P_PlayerThink @@ -5192,6 +5262,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->mo->colorized = false; } + if (player->kartstuff[k_itemtype] == KITEM_NONE) + player->kartstuff[k_holdready] = 0; + // DKR style camera for boosting if (player->karthud[khud_boostcam] != 0 || player->karthud[khud_destboostcam] != 0) { @@ -5382,6 +5455,31 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } + if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) + { + if (RINGTOTAL(player) < 20 && !player->kartstuff[k_ringlock]) + K_LookForRings(player->mo); + } + + if (player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD) + { + if (player->kartstuff[k_bubblecool]) + player->kartstuff[k_bubblecool]--; + } + else + { + player->kartstuff[k_bubbleblowup] = 0; + player->kartstuff[k_bubblecool] = 0; + } + + if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD + || player->exiting || player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer]) + { + if (player->kartstuff[k_flamedash]) + K_FlameShieldPop(player->mo); + player->kartstuff[k_flamedash] = 0; + } + // ??? /* if (player->kartstuff[k_jmp] > 1 && onground) @@ -5890,8 +5988,7 @@ void K_StripItems(player_t *player) player->kartstuff[k_stealingtimer] = 0; player->kartstuff[k_stolentimer] = 0; - player->kartstuff[k_curshield] = 0; - //player->kartstuff[k_thunderanim] = 0; + player->kartstuff[k_curshield] = KSHIELD_NONE; player->kartstuff[k_bananadrag] = 0; player->kartstuff[k_sadtimer] = 0; @@ -5914,68 +6011,6 @@ void K_StripOther(player_t *player) } } -// SRB2Kart: blockmap iterate for attraction shield users -static mobj_t *attractmo; -static fixed_t attractdist; -static inline boolean PIT_AttractingRings(mobj_t *thing) -{ - if (!attractmo || P_MobjWasRemoved(attractmo)) - return false; - - if (!attractmo->player) - return false; // not a player - - if (thing->health <= 0 || !thing) - return true; // dead - - if (thing->type != MT_RING && thing->type != MT_FLINGRING) - return true; // not a ring - - if (thing->extravalue1) - return true; // in special ring animation - - if (thing->cusval) - return true; // already attracted - - // see if it went over / under - if (attractmo->z - (attractdist>>2) > thing->z + thing->height) - return true; // overhead - if (attractmo->z + attractmo->height + (attractdist>>2) < thing->z) - return true; // underneath - - if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) < attractdist) - return true; // Too far away - - // set target - P_SetTarget(&thing->tracer, attractmo); - // flag to show it's been attracted once before - thing->cusval = 1; - return true; // find other rings -} - -/** Looks for rings near a player in the blockmap. - * - * \param pmo Player object looking for rings to attract - * \sa A_AttractChase - */ -static void K_LookForRings(mobj_t *pmo) -{ - INT32 bx, by, xl, xh, yl, yh; - attractdist = FixedMul(RING_DIST, pmo->scale)>>2; - - // Use blockmap to check for nearby rings - yh = (unsigned)(pmo->y + attractdist - bmaporgy)>>MAPBLOCKSHIFT; - yl = (unsigned)(pmo->y - attractdist - bmaporgy)>>MAPBLOCKSHIFT; - xh = (unsigned)(pmo->x + attractdist - bmaporgx)>>MAPBLOCKSHIFT; - xl = (unsigned)(pmo->x - attractdist - bmaporgx)>>MAPBLOCKSHIFT; - - attractmo = pmo; - - for (by = yl; by <= yh; by++) - for (bx = xl; bx <= xh; bx++) - P_BlockThingsIterator(bx, by, PIT_AttractingRings); -} - // // K_MoveKartPlayer // @@ -6408,12 +6443,44 @@ void K_MoveKartPlayer(player_t *player, boolean onground) case KITEM_BUBBLESHIELD: if (player->kartstuff[k_curshield] != KSHIELD_BUBBLE) { - //mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELD); - //P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); - //P_SetTarget(&shield->target, player->mo); + mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELD); + P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); + P_SetTarget(&shield->target, player->mo); S_StartSound(player->mo, sfx_s3k3f); player->kartstuff[k_curshield] = KSHIELD_BUBBLE; } + + if (!HOLDING_ITEM && NO_HYUDORO) + { + if (cmd->buttons & BT_ATTACK) + { + if (player->kartstuff[k_holdready]) + { + if (player->kartstuff[k_bubbleblowup] == 0) + K_PlayAttackTaunt(player->mo); + player->kartstuff[k_bubbleblowup]++; + player->kartstuff[k_bubblecool] = TICRATE+bubbletime; + if (player->kartstuff[k_bubbleblowup] > bubbletime) + { + mobj_t *trap = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELDTRAP); + P_SetScale(trap, (5*trap->destscale)>>1); + trap->destscale = (5*trap->destscale)>>2; + P_SetTarget(&trap->target, player->mo); + trap->threshold = 10; + S_StartSound(player->mo, sfx_s3k44); + + player->kartstuff[k_bubbleblowup] = 0; + player->kartstuff[k_itemamount]--; + } + } + } + else + { + if (player->kartstuff[k_bubbleblowup]) + player->kartstuff[k_bubbleblowup]--; + player->kartstuff[k_holdready] = (player->kartstuff[k_bubblecool] ? 0 : 1); + } + } break; case KITEM_FLAMESHIELD: if (player->kartstuff[k_curshield] != KSHIELD_FLAME) @@ -6429,7 +6496,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { if (cmd->buttons & BT_ATTACK) { - if (player->kartstuff[k_flameready]) + if (player->kartstuff[k_holdready]) { if (player->kartstuff[k_flamedash] == 0) K_PlayBoostTaunt(player->mo); @@ -6438,7 +6505,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { K_FlameShieldPop(player->mo); player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_flameready] = 0; + player->kartstuff[k_holdready] = 0; player->kartstuff[k_itemamount]--; } } @@ -6449,13 +6516,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { K_FlameShieldPop(player->mo); player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_flameready] = 0; + player->kartstuff[k_holdready] = 0; player->kartstuff[k_itemamount]--; } else { player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_flameready] = 1; + player->kartstuff[k_holdready] = 1; } } } @@ -6535,21 +6602,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (spbplace == -1 || player->kartstuff[k_position] != spbplace) player->kartstuff[k_ringlock] = 0; // reset ring lock - if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) - { - if (RINGTOTAL(player) < 20 && !player->kartstuff[k_ringlock]) - K_LookForRings(player->mo); - } - - if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD - || player->exiting || player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer]) - { - if (player->kartstuff[k_flamedash]) - K_FlameShieldPop(player->mo); - player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_flameready] = 0; - } - if (K_GetShieldFromItem(player->kartstuff[k_itemtype]) == KSHIELD_NONE) player->kartstuff[k_curshield] = KSHIELD_NONE; // RESET shield type diff --git a/src/p_inter.c b/src/p_inter.c index 406644a1b..760026944 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -595,11 +595,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) { mobj_t *spbexplode; - if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0) + if (player->kartstuff[k_bubbleblowup] > 0) { - //player->powers[pw_flashing] = 0; K_DropHnextList(player); - K_StripItems(player); + special->extravalue1 = 2; // WAIT... + special->extravalue2 = 52; // Slightly over the respawn timer length + return; } S_StopSound(special); // Don't continue playing the gurgle or the siren @@ -675,6 +676,59 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) case MT_BALLOON: // SRB2kart P_SetObjectMomZ(toucher, 20<target == toucher) + return; + + if (special->health <= 0 || toucher->health <= 0) + return; + + if (player->spectator) + return; + + if (special->target->player && special->target->player->kartstuff[k_bubbleblowup] + && !player->kartstuff[k_spinouttimer]) + { + K_SpinPlayer(player, special->target, 0, special, false); + if (player->kartstuff[k_spinouttimer]) // Successfully spun out + K_KartBouncing(toucher, special, false, true); + } + return; + case MT_BUBBLESHIELDTRAP: + if ((special->target == toucher || special->target == toucher->target) && (special->threshold > 0)) + return; + + if (special->tracer && !P_MobjWasRemoved(special->tracer)) + return; + + if (special->health <= 0 || toucher->health <= 0) + return; + + if (!player->mo || player->spectator) + return; + + // kill + /*if (player->kartstuff[k_invincibilitytimer] > 0 + || player->kartstuff[k_growshrinktimer] > 0 + || player->kartstuff[k_flamedash] > 0) + { + P_KillMobj(special, toucher, toucher); + return; + }*/ + + // no interaction + if (player->powers[pw_flashing] > 0 || player->kartstuff[k_hyudorotimer] > 0 + || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0) + return; + + // attach to player! + P_SetTarget(&special->tracer, toucher); + toucher->flags |= MF_NOGRAVITY; + toucher->momx = (4*toucher->momx)/5; // Huge initial speed cut + toucher->momy = (4*toucher->momy)/5; + toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher); + //S_StartSound(special, sfx_s1a2); + return; // ***************************************** // // Rings, coins, spheres, weapon panels, etc // diff --git a/src/p_map.c b/src/p_map.c index 025d84b02..4f0edfae0 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -750,6 +750,29 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player && thing->player->kartstuff[k_hyudorotimer]) return true; // no interaction + if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) + || (thing->player && thing->player->kartstuff[k_bubbleblowup])) + { + if (!tmthing->threshold) + { + if (!tmthing->momx && !tmthing->momy) + { + tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing); + } + else + { + tmthing->momx = -tmthing->momx; + tmthing->momy = -tmthing->momy; + tmthing->momz = -tmthing->momz; + } + if (tmthing->type == MT_JAWZ) + P_SetTarget(&tmthing->tracer, tmthing->target); // Back to the source! + tmthing->threshold = 10; + S_StartSound(tmthing, sfx_s3k44); + } + return true; + } + if (thing->type == MT_PLAYER) { // Player Damage @@ -851,6 +874,27 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player && thing->player->powers[pw_flashing]) return true; + if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) + || (thing->player && thing->player->kartstuff[k_bubbleblowup])) + { + if (!tmthing->threshold) + { + if (!tmthing->momx && !tmthing->momy) + { + tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing); + } + else + { + tmthing->momx = -tmthing->momx; + tmthing->momy = -tmthing->momy; + tmthing->momz = -tmthing->momz; + } + tmthing->threshold = 10; + S_StartSound(tmthing, sfx_s3k44); + } + return true; + } + if (thing->type == MT_PLAYER) { S_StartSound(NULL, sfx_bsnipe); //let all players hear it. @@ -913,6 +957,27 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player && thing->player->powers[pw_flashing]) return true; + if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) + || (thing->player && thing->player->kartstuff[k_bubbleblowup])) + { + if (!tmthing->threshold) + { + if (!tmthing->momx && !tmthing->momy) + { + tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing); + } + else + { + tmthing->momx = -tmthing->momx; + tmthing->momy = -tmthing->momy; + tmthing->momz = -tmthing->momz; + } + tmthing->threshold = 10; + S_StartSound(tmthing, sfx_s3k44); + } + return true; + } + if (thing->type == MT_PLAYER) { // Banana snipe! @@ -985,6 +1050,28 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player && thing->player->powers[pw_flashing]) return true; + // Bubble Shield reflect + if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) + || (thing->player && thing->player->kartstuff[k_bubbleblowup])) + { + if (!tmthing->threshold) + { + if (!tmthing->momx && !tmthing->momy) + { + tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing); + } + else + { + tmthing->momx = -tmthing->momx; + tmthing->momy = -tmthing->momy; + tmthing->momz = -tmthing->momz; + } + tmthing->threshold = 10; + S_StartSound(tmthing, sfx_s3k44); + } + return true; + } + if (thing->type == MT_PLAYER) { // Bomb punting @@ -1036,6 +1123,31 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->player && tmthing->player->kartstuff[k_hyudorotimer]) // I thought about doing this for just the objects below but figured it should apply to everything. return true; // no interaction + // Bubble Shield reflect + if (((tmthing->type == MT_BUBBLESHIELD && tmthing->target->player && tmthing->target->player->kartstuff[k_bubbleblowup]) + || (tmthing->player && tmthing->player->kartstuff[k_bubbleblowup])) + && (thing->type != MT_MINEEXPLOSION)) + { + if (!thing->threshold) + { + if (!thing->momx && !thing->momy) + { + thing->momz = (32*thing->scale) * P_MobjFlip(thing); + } + else + { + thing->momx = -thing->momx; + thing->momy = -thing->momy; + thing->momz = -thing->momz; + } + if (thing->type == MT_JAWZ) + P_SetTarget(&thing->tracer, thing->target); // Back to the source! + thing->threshold = 10; + S_StartSound(thing, sfx_s3k44); + } + return true; + } + if (thing->type == MT_ORBINAUT_SHIELD || thing->type == MT_JAWZ_SHIELD || thing->type == MT_ORBINAUT || thing->type == MT_JAWZ || thing->type == MT_JAWZ_DUD) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 7892f3414..775af90e1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8399,6 +8399,100 @@ void P_MobjThinker(mobj_t *mobj) P_TeleportMove(mobj, destx, desty, mobj->target->z); break; } + case MT_BUBBLESHIELD: + { + fixed_t destx, desty; + fixed_t scale; + statenum_t curstate; + + if (!mobj->target || !mobj->target->health || !mobj->target->player + || mobj->target->player->kartstuff[k_curshield] != KSHIELD_BUBBLE) + { + P_RemoveMobj(mobj); + return; + } + + scale = (5*mobj->target->destscale)>>2; + curstate = ((mobj->tics == 1) ? (mobj->state->nextstate) : ((statenum_t)(mobj->state-states))); + + if (mobj->target->player->kartstuff[k_bubbleblowup]) + { + INT32 blow = mobj->target->player->kartstuff[k_bubbleblowup]; + + if (curstate != S_BUBBLESHIELDBLOWUP) + P_SetMobjState(mobj, S_BUBBLESHIELDBLOWUP); + + mobj->flags2 &= ~MF2_SHADOW; + scale += (blow * (scale<<1)) / bubbletime; + + mobj->frame = (states[S_BUBBLESHIELDBLOWUP].frame + mobj->extravalue1); + + if (mobj->extravalue1 < 4 && mobj->extravalue2 < blow && !mobj->cvmem && (leveltime & 1)) // Growing + { + mobj->extravalue1++; + if (mobj->extravalue1 >= 4) + mobj->cvmem = 1; // shrink back down + } + else if ((mobj->extravalue1 > -4 && mobj->extravalue2 > blow) + || (mobj->cvmem && mobj->extravalue1 > 0)) // Shrinking + mobj->extravalue1--; + } + else + { + mobj->cvmem = 0; + + if (curstate == S_BUBBLESHIELDBLOWUP) + { + if (mobj->extravalue1 != 0) + { + mobj->frame = (states[S_BUBBLESHIELDBLOWUP].frame + mobj->extravalue1); + + if (mobj->extravalue1 < 0 && (leveltime & 1)) + mobj->extravalue1++; + else if (mobj->extravalue1 > 0) + mobj->extravalue1--; + } + else + { + P_SetMobjState(mobj, S_BUBBLESHIELD1); + mobj->extravalue1 = 0; + } + } + else + { + if (mobj->target->player->kartstuff[k_bubblecool] && ((curstate-S_BUBBLESHIELD1) & 1)) + mobj->flags2 |= MF2_SHADOW; + else + mobj->flags2 &= ~MF2_SHADOW; + } + } + + mobj->extravalue2 = mobj->target->player->kartstuff[k_bubbleblowup]; + P_SetScale(mobj, (mobj->destscale = scale)); + + if (!splitscreen /*&& rendermode != render_soft*/) + { + angle_t viewingangle; + + if (players[displayplayers[0]].awayviewtics) + viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayviewmobj->x, players[displayplayers[0]].awayviewmobj->y); + else if (!camera[0].chase && players[displayplayers[0]].mo) + viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y); + else + viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y); + + destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4); + desty = mobj->target->y + P_ReturnThrustY(mobj->target, viewingangle, mobj->scale>>4); + } + else + { + destx = mobj->target->x; + desty = mobj->target->y; + } + + P_TeleportMove(mobj, destx, desty, mobj->target->z); + break; + } case MT_FLAMESHIELD: { fixed_t destx, desty; @@ -9122,6 +9216,69 @@ void P_MobjThinker(mobj_t *mobj) } } break; + case MT_BUBBLESHIELDTRAP: + if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->player) + { + player_t *player = mobj->tracer->player; + + mobj->extravalue1 = 1; + + P_TeleportMove(mobj, + mobj->tracer->x + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<cvmem /= 2; + mobj->momz = 0; + mobj->destscale = (5*mobj->tracer->scale)>>2; + + mobj->tracer->momx = (31*mobj->tracer->momx)/32; + mobj->tracer->momy = (31*mobj->tracer->momy)/32; + mobj->tracer->momz = (8*mobj->tracer->scale) * P_MobjFlip(mobj->tracer); + + if (mobj->movecount > 8*TICRATE) + { + S_StartSound(mobj->tracer, sfx_s3k77); + mobj->tracer->flags &= ~MF_NOGRAVITY; + P_KillMobj(mobj, mobj->tracer, mobj->tracer); + break; + } + + if (abs(player->cmd.driftturn) > 100) + { + INT32 lastsign = 0; + if (mobj->lastlook > 0) + lastsign = 1; + else if (mobj->lastlook < 0) + lastsign = -1; + + if ((player->cmd.driftturn > 0 && lastsign < 0) + || (player->cmd.driftturn < 0 && lastsign > 0)) + { + mobj->movecount += (TICRATE/2); + mobj->cvmem = 8*lastsign; + S_StartSound(mobj, sfx_s3k7a); + } + + mobj->lastlook = player->cmd.driftturn; + } + + mobj->movecount++; + } + else if (mobj->extravalue1) // lost your player somehow, DIE + { + mobj->tracer->flags &= ~MF_NOGRAVITY; + P_KillMobj(mobj, NULL, NULL); + break; + } + else + { + mobj->momz = 0; + mobj->destscale = (5*mapobjectscale)>>2; + if (mobj->threshold > 0) + mobj->threshold--; + } + break; case MT_KARMAFIREWORK: if (mobj->momz == 0) { @@ -10179,7 +10336,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_SSMINE: case MT_SSMINE_SHIELD: case MT_BALLHOG: case MT_SINK: case MT_THUNDERSHIELD: case MT_BUBBLESHIELD: case MT_FLAMESHIELD: - case MT_ROCKETSNEAKER: + case MT_ROCKETSNEAKER: case MT_BUBBLESHIELDTRAP: case MT_SPB: P_SpawnShadowMobj(mobj); default: From 1fc9009bd353056d2917ff3ce435ce2db7216106 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 01:10:54 -0400 Subject: [PATCH 07/65] Put these special cases behind RaceGametype --- src/k_kart.c | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 72158e807..85c3e4cab 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1222,16 +1222,35 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) return; } - // SPECIAL CASE No. 4: - // Being in ring debt occasionally forces Super Ring on you if you mashed - if (mashed && player->kartstuff[k_rings] < 0 && cv_superring.value) + if (G_RaceGametype()) { - INT32 debtamount = min(20, abs(player->kartstuff[k_rings])); - if (P_RandomChance((debtamount*FRACUNIT)/20)) + // SPECIAL CASE No. 4: + // Being in ring debt occasionally forces Super Ring on you if you mashed + if (mashed && player->kartstuff[k_rings] < 0 && cv_superring.value) { - K_KartGetItemResult(player, KITEM_SUPERRING); + INT32 debtamount = min(20, abs(player->kartstuff[k_rings])); + if (P_RandomChance((debtamount*FRACUNIT)/20)) + { + K_KartGetItemResult(player, KITEM_SUPERRING); + player->karthud[khud_itemblink] = TICRATE; + player->karthud[khud_itemblinkmode] = 1; + player->kartstuff[k_itemroulette] = 0; + player->kartstuff[k_roulettetype] = 0; + if (P_IsDisplayPlayer(player)) + S_StartSound(NULL, (mashed ? sfx_itrolm : sfx_itrolf)); + return; + } + } + + // SPECIAL CASE No. 5: + // Force SPB onto 2nd if they get too far behind + if (player->kartstuff[k_position] == 2 && pdis > (DISTVAR*6) + && spbplace == -1 && !indirectitemcooldown && !dontforcespb + && cv_selfpropelledbomb.value) + { + K_KartGetItemResult(player, KITEM_SPB); player->karthud[khud_itemblink] = TICRATE; - player->karthud[khud_itemblinkmode] = 1; + player->karthud[khud_itemblinkmode] = (mashed ? 1 : 0); player->kartstuff[k_itemroulette] = 0; player->kartstuff[k_roulettetype] = 0; if (P_IsDisplayPlayer(player)) @@ -1240,22 +1259,6 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) } } - // SPECIAL CASE No. 5: - // Force SPB onto 2nd if they get too far behind - if (player->kartstuff[k_position] == 2 && pdis > (DISTVAR*6) - && spbplace == -1 && !indirectitemcooldown && !dontforcespb - && cv_selfpropelledbomb.value) - { - K_KartGetItemResult(player, KITEM_SPB); - player->karthud[khud_itemblink] = TICRATE; - player->karthud[khud_itemblinkmode] = (mashed ? 1 : 0); - player->kartstuff[k_itemroulette] = 0; - player->kartstuff[k_roulettetype] = 0; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, (mashed ? sfx_itrolm : sfx_itrolf)); - return; - } - // NOW that we're done with all of those specialized cases, we can move onto the REAL item roulette tables. // Initializes existing spawnchance values for (i = 0; i < NUMKARTRESULTS; i++) From 8abfee5dd04dc5518059158f243850763c8bd1fd Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 01:18:08 -0400 Subject: [PATCH 08/65] Increase SPB force distance --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 85c3e4cab..4f96710d9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1244,7 +1244,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) // SPECIAL CASE No. 5: // Force SPB onto 2nd if they get too far behind - if (player->kartstuff[k_position] == 2 && pdis > (DISTVAR*6) + if (player->kartstuff[k_position] == 2 && pdis > (DISTVAR*9) && spbplace == -1 && !indirectitemcooldown && !dontforcespb && cv_selfpropelledbomb.value) { From f26deae97c522f3f7a630317392407b8ce498498 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 01:20:08 -0400 Subject: [PATCH 09/65] Update item table to make Shields more common --- src/k_kart.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4f96710d9..c1c59986a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -684,21 +684,21 @@ consvar_t *KartItemCVars[NUMKARTRESULTS-1] = static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = { //P-Odds 0 1 2 3 4 5 6 7 - /*Sneaker*/ { 0, 0, 3, 5, 6, 0, 0, 0 }, // Sneaker + /*Sneaker*/ { 0, 0, 2, 4, 6, 0, 0, 0 }, // Sneaker /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 2, 4, 6 }, // Rocket Sneaker - /*Invincibility*/ { 0, 0, 0, 0, 1, 4, 8,12 }, // Invincibility + /*Invincibility*/ { 0, 0, 0, 0, 1, 4, 8, 9 }, // Invincibility /*Banana*/ { 7, 4, 2, 1, 0, 0, 0, 0 }, // Banana /*Eggman Monitor*/ { 3, 2, 1, 0, 0, 0, 0, 0 }, // Eggman Monitor - /*Orbinaut*/ { 7, 5, 4, 2, 0, 0, 0, 0 }, // Orbinaut + /*Orbinaut*/ { 7, 5, 3, 2, 0, 0, 0, 0 }, // Orbinaut /*Jawz*/ { 0, 3, 2, 1, 1, 0, 0, 0 }, // Jawz /*Mine*/ { 0, 2, 2, 1, 0, 0, 0, 0 }, // Mine /*Ballhog*/ { 0, 0, 2, 1, 0, 0, 0, 0 }, // Ballhog /*Self-Propelled Bomb*/ { 0, 1, 2, 3, 4, 2, 2, 0 }, // Self-Propelled Bomb - /*Grow*/ { 0, 0, 0, 1, 1, 2, 0, 0 }, // Grow + /*Grow*/ { 0, 0, 0, 1, 1, 3, 0, 0 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink /*Thunder Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield - /*Bubble Shield*/ { 0, 0, 0, 1, 2, 0, 0, 0 }, // Bubble Shield - /*Flame Shield*/ { 0, 0, 0, 0, 0, 0, 1, 2 }, // Flame Shield + /*Bubble Shield*/ { 0, 0, 2, 2, 2, 0, 0, 0 }, // Bubble Shield + /*Flame Shield*/ { 0, 0, 0, 0, 0, 0, 1, 5 }, // Flame Shield /*Hyudoro*/ { 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Super Ring*/ { 2, 1, 1, 0, 0, 0, 0, 0 }, // Super Ring From 02bd05ff2bb547f8a8dffc0a2b9a454481479f50 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 15:46:42 -0400 Subject: [PATCH 10/65] Bubble Shield waves --- src/dehacked.c | 6 ++++++ src/info.c | 38 +++++++++++++++++++++---------------- src/info.h | 7 +++++++ src/k_kart.c | 2 +- src/p_inter.c | 7 +------ src/p_mobj.c | 51 +++++++++++++++++++++++++++++++++++++++++++++----- 6 files changed, 83 insertions(+), 28 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 5de479c9e..2ed7a45c7 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6662,6 +6662,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_BUBBLESHIELDTRAP6", "S_BUBBLESHIELDTRAP7", "S_BUBBLESHIELDTRAP8", + "S_BUBBLESHIELDWAVE1", + "S_BUBBLESHIELDWAVE2", + "S_BUBBLESHIELDWAVE3", + "S_BUBBLESHIELDWAVE4", + "S_BUBBLESHIELDWAVE5", + "S_BUBBLESHIELDWAVE6", // Flame Shield "S_FLAMESHIELD1", diff --git a/src/info.c b/src/info.c index f7d60dff3..deae2828a 100644 --- a/src/info.c +++ b/src/info.c @@ -57,19 +57,19 @@ char sprnames[NUMSPRITES + 1][5] = //SRB2kart Sprites "SPRG","BSPR","RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE", "KINV","KINF","WIPD","DRIF","BDRF","DUST","RSHE","FITM","BANA","ORBN", - "JAWZ","SSMN","KRBM","BHOG","BHBM","SPBM","THNS","BUBS","FLMS","SINK", - "SITR","KBLN","DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS", - "BUZB","CHOM","SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW", - "ISTA","ISTB","ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1", - "HIT2","HIT3","RETI","AIDU","KSPK","LZI1","LZI2","KLIT","FZSM","FZBM", - "FPRT","SBUS","MARB","FUFO","RUST","BLON","VAPE","HTZA","HTZB","SGVA", - "SGVB","SGVC","PGTR","PGF1","PGF2","PGF3","PGBH","DPLR","SPTL","ENM1", - "GARU","MARR","REAP","JITB","CDMO","CDBU","PINE","PPLR","DPPT","AATR", - "COCO","BDST","FROG","CBRA","HOLE","BBRA","EGFG","SMKP","MTYM","THWP", - "SNOB","ICEB","CNDL","DOCH","DUCK","GTRE","CHES","CHIM","DRGN","LZMN", - "PGSS","ZTCH","MKMA","MKMP","RTCH","BOWL","BOWH","BRRL","BRRR","HRSE", - "TOAH","BFRT","OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF","WBLZ", - "WBLN","FWRK","MXCL","RGSP","DRAF","XMS4","XMS5","VIEW" + "JAWZ","SSMN","KRBM","BHOG","BHBM","SPBM","THNS","BUBS","BWVE","FLMS", + "SINK","SITR","KBLN","DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS", + "SPRS","BUZB","CHOM","SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS", + "PSHW","ISTA","ISTB","ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM", + "HIT1","HIT2","HIT3","RETI","AIDU","KSPK","LZI1","LZI2","KLIT","FZSM", + "FZBM","FPRT","SBUS","MARB","FUFO","RUST","BLON","VAPE","HTZA","HTZB", + "SGVA","SGVB","SGVC","PGTR","PGF1","PGF2","PGF3","PGBH","DPLR","SPTL", + "ENM1","GARU","MARR","REAP","JITB","CDMO","CDBU","PINE","PPLR","DPPT", + "AATR","COCO","BDST","FROG","CBRA","HOLE","BBRA","EGFG","SMKP","MTYM", + "THWP","SNOB","ICEB","CNDL","DOCH","DUCK","GTRE","CHES","CHIM","DRGN", + "LZMN","PGSS","ZTCH","MKMA","MKMP","RTCH","BOWL","BOWH","BRRL","BRRR", + "HRSE","TOAH","BFRT","OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF", + "WBLZ","WBLN","FWRK","MXCL","RGSP","DRAF","XMS4","XMS5","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2877,6 +2877,12 @@ state_t states[NUMSTATES] = {SPR_BUBS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP7}, // S_BUBBLESHIELDTRAP6 {SPR_BUBS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP8}, // S_BUBBLESHIELDTRAP7 {SPR_BUBS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP1}, // S_BUBBLESHIELDTRAP8 + {SPR_BWVE, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE2}, // S_BUBBLESHIELDWAVE1 + {SPR_BWVE, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE3}, // S_BUBBLESHIELDWAVE2 + {SPR_BWVE, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE4}, // S_BUBBLESHIELDWAVE3 + {SPR_BWVE, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE5}, // S_BUBBLESHIELDWAVE4 + {SPR_BWVE, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE6}, // S_BUBBLESHIELDWAVE5 + {SPR_BWVE, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_NULL}, // S_BUBBLESHIELDWAVE6 {SPR_FLMS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_FLAMESHIELD2}, // S_FLAMESHIELD1 {SPR_FLMS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_FLAMESHIELD3}, // S_FLAMESHIELD2 @@ -15973,7 +15979,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 8, // speed - 20*FRACUNIT, // radius + 28*FRACUNIT, // radius 56*FRACUNIT, // height 1, // display offset 16, // mass @@ -16000,7 +16006,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 8, // speed - 20*FRACUNIT, // radius + 28*FRACUNIT, // radius 56*FRACUNIT, // height 1, // display offset 16, // mass @@ -16027,7 +16033,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 8, // speed - 20*FRACUNIT, // radius + 28*FRACUNIT, // radius 56*FRACUNIT, // height 1, // display offset 16, // mass diff --git a/src/info.h b/src/info.h index 000d2fb93..f6324c1d9 100644 --- a/src/info.h +++ b/src/info.h @@ -618,6 +618,7 @@ typedef enum sprite SPR_SPBM, // Self-Propelled Bomb SPR_THNS, // Thunder Shield SPR_BUBS, // Bubble Shield (not Bubs) + SPR_BWVE, // Bubble Shield waves SPR_FLMS, // Flame Shield SPR_SINK, // Kitchen Sink SPR_SITR, // Kitchen Sink Trail @@ -3546,6 +3547,12 @@ typedef enum state S_BUBBLESHIELDTRAP6, S_BUBBLESHIELDTRAP7, S_BUBBLESHIELDTRAP8, + S_BUBBLESHIELDWAVE1, + S_BUBBLESHIELDWAVE2, + S_BUBBLESHIELDWAVE3, + S_BUBBLESHIELDWAVE4, + S_BUBBLESHIELDWAVE5, + S_BUBBLESHIELDWAVE6, // Flame Shield S_FLAMESHIELD1, diff --git a/src/k_kart.c b/src/k_kart.c index c1c59986a..9e123e16c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6465,7 +6465,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_bubblecool] = TICRATE+bubbletime; if (player->kartstuff[k_bubbleblowup] > bubbletime) { - mobj_t *trap = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELDTRAP); + mobj_t *trap = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, player->mo->z + player->mo->momz, MT_BUBBLESHIELDTRAP); P_SetScale(trap, (5*trap->destscale)>>1); trap->destscale = (5*trap->destscale)>>2; P_SetTarget(&trap->target, player->mo); diff --git a/src/p_inter.c b/src/p_inter.c index 760026944..941899c16 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -686,13 +686,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->spectator) return; - if (special->target->player && special->target->player->kartstuff[k_bubbleblowup] - && !player->kartstuff[k_spinouttimer]) - { + if (special->target->player && special->target->player->kartstuff[k_bubbleblowup]) K_SpinPlayer(player, special->target, 0, special, false); - if (player->kartstuff[k_spinouttimer]) // Successfully spun out - K_KartBouncing(toucher, special, false, true); - } return; case MT_BUBBLESHIELDTRAP: if ((special->target == toucher || special->target == toucher->target) && (special->threshold > 0)) diff --git a/src/p_mobj.c b/src/p_mobj.c index 775af90e1..7b4bcc212 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6205,7 +6205,7 @@ void P_RunShadows(void) for (mobj = shadowcap; mobj; mobj = next) { - fixed_t floorz; + fixed_t floorz, rad; next = mobj->hnext; P_SetTarget(&mobj->hnext, NULL); @@ -6227,8 +6227,24 @@ void P_RunShadows(void) || (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < floorz)) mobj->flags2 |= MF2_DONTDRAW; + rad = mobj->info->radius; + + switch (mobj->type) + { + case MT_FLOATINGITEM: + rad /= 3; + break; + case MT_THUNDERSHIELD: + case MT_BUBBLESHIELD: + case MT_FLAMESHIELD: + rad = 10<target->radius, mobj->info->radius)); + P_SetScale(mobj, FixedDiv(mobj->target->radius, rad)); dest = mobj->target; @@ -6263,9 +6279,6 @@ void P_RunShadows(void) break; } } - - if (mobj->target->type == MT_FLOATINGITEM) - P_SetScale(mobj, mobj->scale/3); } P_SetTarget(&shadowcap, NULL); } @@ -8422,6 +8435,7 @@ void P_MobjThinker(mobj_t *mobj) if (curstate != S_BUBBLESHIELDBLOWUP) P_SetMobjState(mobj, S_BUBBLESHIELDBLOWUP); + mobj->angle += ANGLE_22h; mobj->flags2 &= ~MF2_SHADOW; scale += (blow * (scale<<1)) / bubbletime; @@ -8436,10 +8450,37 @@ void P_MobjThinker(mobj_t *mobj) else if ((mobj->extravalue1 > -4 && mobj->extravalue2 > blow) || (mobj->cvmem && mobj->extravalue1 > 0)) // Shrinking mobj->extravalue1--; + + if (P_IsObjectOnGround(mobj->target)) + { + mobj_t *wave; + + wave = P_SpawnMobj( + mobj->target->x + P_ReturnThrustX(NULL, mobj->angle, mobj->radius), + mobj->target->y + P_ReturnThrustY(NULL, mobj->angle, mobj->radius), + mobj->target->z, MT_THOK); + wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY); + wave->momx = mobj->target->momx; + wave->momy = mobj->target->momy; + wave->momz = mobj->target->momz; + P_SetMobjState(wave, S_BUBBLESHIELDWAVE1); + + // same thing, but + ANGLE_180 + wave = P_SpawnMobj( + mobj->target->x + P_ReturnThrustX(NULL, mobj->angle + ANGLE_180, mobj->radius), + mobj->target->y + P_ReturnThrustY(NULL, mobj->angle + ANGLE_180, mobj->radius), + mobj->target->z, MT_THOK); + wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY); + wave->momx = mobj->target->momx; + wave->momy = mobj->target->momy; + wave->momz = mobj->target->momz; + P_SetMobjState(wave, S_BUBBLESHIELDWAVE1); + } } else { mobj->cvmem = 0; + mobj->angle = mobj->target->angle; if (curstate == S_BUBBLESHIELDBLOWUP) { From 26065e99830e09e51a59d598536b83af0041e820 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 18:02:21 -0400 Subject: [PATCH 11/65] Bubble Shield updatin's - Bigger hitbox - Waves start smaller, grow up the old size near the end of the inflation - Waves follow the shield slightly better - Bubble Shield gives more base weight (this may not actually impact anything) - Reduced slowdown from bubble trap - Recoded bubble reflecting to ignore player held shield items - Added more sound effects - Increased Bubble max size --- src/info.c | 4 +- src/k_kart.c | 60 +++++++++----- src/p_inter.c | 19 +---- src/p_map.c | 216 ++++++++++++++++++++++++-------------------------- src/p_mobj.c | 70 ++++++++-------- src/sounds.c | 10 +-- 6 files changed, 191 insertions(+), 188 deletions(-) diff --git a/src/info.c b/src/info.c index deae2828a..3ddd217b6 100644 --- a/src/info.c +++ b/src/info.c @@ -16012,7 +16012,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 16, // mass 0, // damage sfx_None, // activesound - MF_SPECIAL|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + MF_SOLID|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, @@ -16060,7 +16060,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 8, // speed - 20*FRACUNIT, // radius + 28*FRACUNIT, // radius 56*FRACUNIT, // height 1, // display offset 16, // mass diff --git a/src/k_kart.c b/src/k_kart.c index 9e123e16c..85f06be67 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1298,6 +1298,31 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) //{ SRB2kart p_user.c Stuff +static fixed_t K_PlayerWeight(mobj_t *mobj, mobj_t *against) +{ + fixed_t weight = 5*mobj->scale; + + if (!mobj->player) + return weight; + + if (against && !P_MobjWasRemoved(against) && against->player + && ((!against->player->kartstuff[k_spinouttimer] && mobj->player->kartstuff[k_spinouttimer]) // You're in spinout + || (against->player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD && mobj->player->kartstuff[k_itemtype] != KITEM_BUBBLESHIELD))) // They have a Bubble Shield + { + weight = 0; // This player does not cause any bump action + } + else + { + weight = (mobj->player->kartweight) * mobj->scale; + if (mobj->player->speed > K_GetKartSpeed(mobj->player, false)) + weight += (mobj->player->speed - K_GetKartSpeed(mobj->player, false))/8; + if (mobj->player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD) + weight += 9*mobj->scale; + } + + return weight; +} + static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) { fixed_t weight = 5*mobj->scale; @@ -1307,40 +1332,32 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) case MT_PLAYER: if (!mobj->player) break; - if (against->player - && ((!against->player->kartstuff[k_spinouttimer] && mobj->player->kartstuff[k_spinouttimer]) - || (against->player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD && mobj->player->kartstuff[k_itemtype] != KITEM_BUBBLESHIELD) - || (against->type == MT_BUBBLESHIELD))) - weight = 0; // This player does not cause any bump action - else - { - weight = (mobj->player->kartweight) * mobj->scale; - if (mobj->player->speed > K_GetKartSpeed(mobj->player, false)) - weight += (mobj->player->speed - K_GetKartSpeed(mobj->player, false))/8; - } + weight = K_PlayerWeight(mobj, against); + break; + case MT_BUBBLESHIELD: + weight = K_PlayerWeight(mobj->target, against); break; case MT_FALLINGROCK: if (against->player) { - if (against->player->kartstuff[k_invincibilitytimer] - || against->player->kartstuff[k_growshrinktimer] > 0) + if (against->player->kartstuff[k_invincibilitytimer] || against->player->kartstuff[k_growshrinktimer] > 0) weight = 0; else - weight = (against->player->kartweight) * against->scale; + weight = K_PlayerWeight(against, NULL); } break; case MT_ORBINAUT: case MT_ORBINAUT_SHIELD: if (against->player) - weight = (against->player->kartweight) * against->scale; + weight = K_PlayerWeight(against, NULL); break; case MT_JAWZ: case MT_JAWZ_DUD: case MT_JAWZ_SHIELD: if (against->player) - weight = (against->player->kartweight+3) * against->scale; + weight = K_PlayerWeight(against, NULL) + (3*against->scale); else - weight = 8*mobj->scale; + weight += 3*mobj->scale; break; default: break; @@ -6460,18 +6477,19 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_holdready]) { if (player->kartstuff[k_bubbleblowup] == 0) - K_PlayAttackTaunt(player->mo); + S_StartSound(player->mo, sfx_s3k75); player->kartstuff[k_bubbleblowup]++; player->kartstuff[k_bubblecool] = TICRATE+bubbletime; if (player->kartstuff[k_bubbleblowup] > bubbletime) { mobj_t *trap = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, player->mo->z + player->mo->momz, MT_BUBBLESHIELDTRAP); - P_SetScale(trap, (5*trap->destscale)>>1); + P_SetScale(trap, ((5*trap->destscale)>>2)*4); trap->destscale = (5*trap->destscale)>>2; P_SetTarget(&trap->target, player->mo); - trap->threshold = 10; - S_StartSound(player->mo, sfx_s3k44); + trap->threshold = TICRATE; + S_StartSound(trap, sfx_s3kbfl); + K_PlayAttackTaunt(player->mo); player->kartstuff[k_bubbleblowup] = 0; player->kartstuff[k_itemamount]--; } diff --git a/src/p_inter.c b/src/p_inter.c index 941899c16..74688a810 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -676,19 +676,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) case MT_BALLOON: // SRB2kart P_SetObjectMomZ(toucher, 20<target == toucher) - return; - - if (special->health <= 0 || toucher->health <= 0) - return; - - if (player->spectator) - return; - - if (special->target->player && special->target->player->kartstuff[k_bubbleblowup]) - K_SpinPlayer(player, special->target, 0, special, false); - return; case MT_BUBBLESHIELDTRAP: if ((special->target == toucher || special->target == toucher->target) && (special->threshold > 0)) return; @@ -719,10 +706,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) // attach to player! P_SetTarget(&special->tracer, toucher); toucher->flags |= MF_NOGRAVITY; - toucher->momx = (4*toucher->momx)/5; // Huge initial speed cut - toucher->momy = (4*toucher->momy)/5; + toucher->momx = (15*toucher->momx)/16; // Huge initial speed cut + toucher->momy = (15*toucher->momy)/16; toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher); - //S_StartSound(special, sfx_s1a2); + S_StartSound(toucher, sfx_s1b2); return; // ***************************************** // diff --git a/src/p_map.c b/src/p_map.c index 4f0edfae0..053ec6e83 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -723,6 +723,110 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->type == MT_RANDOMITEM) return true; + // Bubble Shield reflect + if (((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) + || (thing->player && thing->player->kartstuff[k_bubbleblowup])) + && (tmthing->type == MT_ORBINAUT || tmthing->type == MT_JAWZ || tmthing->type == MT_JAWZ_DUD + || tmthing->type == MT_BANANA || tmthing->type == MT_EGGMANITEM || tmthing->type == MT_BALLHOG + || tmthing->type == MT_SSMINE || tmthing->type == MT_SINK + || (tmthing->type == MT_PLAYER && thing->target != tmthing))) + { + // 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 (tmthing->type == MT_PLAYER) + { + if (tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_squishedtimer] + || tmthing->player->powers[pw_flashing] || tmthing->player->kartstuff[k_hyudorotimer] + || tmthing->player->kartstuff[k_justbumped] || tmthing->scale > thing->scale + (mapobjectscale/8)) + return true; + + // Player Damage + P_DamageMobj(tmthing, thing, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), 1); + K_KartBouncing(tmthing, thing, false, true); + S_StartSound(thing, sfx_s3k44); + } + else + { + if (!tmthing->threshold) + { + if (!tmthing->momx && !tmthing->momy) + { + tmthing->momz += (24*tmthing->scale) * P_MobjFlip(tmthing); + } + else + { + tmthing->momx = -tmthing->momx; + tmthing->momy = -tmthing->momy; + tmthing->momz = -tmthing->momz; + } + if (tmthing->type == MT_JAWZ) + P_SetTarget(&tmthing->tracer, tmthing->target); // Back to the source! + tmthing->threshold = 10; + S_StartSound(thing, sfx_s3k44); + } + } + + // no interaction + return true; + } + else if (((tmthing->type == MT_BUBBLESHIELD && tmthing->target->player && tmthing->target->player->kartstuff[k_bubbleblowup]) + || (tmthing->player && tmthing->player->kartstuff[k_bubbleblowup])) + && (thing->type == MT_ORBINAUT || thing->type == MT_JAWZ || thing->type == MT_JAWZ_DUD + || thing->type == MT_BANANA || thing->type == MT_EGGMANITEM || thing->type == MT_BALLHOG + || thing->type == MT_SSMINE || thing->type == MT_SINK + || (thing->type == MT_PLAYER && tmthing->target != thing))) + { + // 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->type == MT_PLAYER) + { + if (thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_squishedtimer] + || thing->player->powers[pw_flashing] || thing->player->kartstuff[k_hyudorotimer] + || thing->player->kartstuff[k_justbumped] || thing->scale > tmthing->scale + (mapobjectscale/8)) + return true; + + // Player Damage + P_DamageMobj(thing, tmthing, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), 1); + K_KartBouncing(thing, tmthing, false, true); + S_StartSound(tmthing, sfx_s3k44); + } + else + { + if (!thing->threshold) + { + if (!thing->momx && !thing->momy) + { + thing->momz += (24*thing->scale) * P_MobjFlip(thing); + } + else + { + thing->momx = -thing->momx; + thing->momy = -thing->momy; + thing->momz = -thing->momz; + } + if (thing->type == MT_JAWZ) + P_SetTarget(&thing->tracer, thing->target); // Back to the source! + thing->threshold = 10; + S_StartSound(tmthing, sfx_s3k44); + } + } + + // no interaction + return true; + } + + // double make sure bubbles won't collide with anything else + if (thing->type == MT_BUBBLESHIELD || tmthing->type == MT_BUBBLESHIELD) + return true; + if (tmthing->type == MT_ORBINAUT || tmthing->type == MT_JAWZ || tmthing->type == MT_JAWZ_DUD || tmthing->type == MT_ORBINAUT_SHIELD || tmthing->type == MT_JAWZ_SHIELD) { @@ -750,29 +854,6 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player && thing->player->kartstuff[k_hyudorotimer]) return true; // no interaction - if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) - || (thing->player && thing->player->kartstuff[k_bubbleblowup])) - { - if (!tmthing->threshold) - { - if (!tmthing->momx && !tmthing->momy) - { - tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing); - } - else - { - tmthing->momx = -tmthing->momx; - tmthing->momy = -tmthing->momy; - tmthing->momz = -tmthing->momz; - } - if (tmthing->type == MT_JAWZ) - P_SetTarget(&tmthing->tracer, tmthing->target); // Back to the source! - tmthing->threshold = 10; - S_StartSound(tmthing, sfx_s3k44); - } - return true; - } - if (thing->type == MT_PLAYER) { // Player Damage @@ -874,27 +955,6 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player && thing->player->powers[pw_flashing]) return true; - if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) - || (thing->player && thing->player->kartstuff[k_bubbleblowup])) - { - if (!tmthing->threshold) - { - if (!tmthing->momx && !tmthing->momy) - { - tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing); - } - else - { - tmthing->momx = -tmthing->momx; - tmthing->momy = -tmthing->momy; - tmthing->momz = -tmthing->momz; - } - tmthing->threshold = 10; - S_StartSound(tmthing, sfx_s3k44); - } - return true; - } - if (thing->type == MT_PLAYER) { S_StartSound(NULL, sfx_bsnipe); //let all players hear it. @@ -957,27 +1017,6 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player && thing->player->powers[pw_flashing]) return true; - if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) - || (thing->player && thing->player->kartstuff[k_bubbleblowup])) - { - if (!tmthing->threshold) - { - if (!tmthing->momx && !tmthing->momy) - { - tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing); - } - else - { - tmthing->momx = -tmthing->momx; - tmthing->momy = -tmthing->momy; - tmthing->momz = -tmthing->momz; - } - tmthing->threshold = 10; - S_StartSound(tmthing, sfx_s3k44); - } - return true; - } - if (thing->type == MT_PLAYER) { // Banana snipe! @@ -1050,28 +1089,6 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player && thing->player->powers[pw_flashing]) return true; - // Bubble Shield reflect - if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup]) - || (thing->player && thing->player->kartstuff[k_bubbleblowup])) - { - if (!tmthing->threshold) - { - if (!tmthing->momx && !tmthing->momy) - { - tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing); - } - else - { - tmthing->momx = -tmthing->momx; - tmthing->momy = -tmthing->momy; - tmthing->momz = -tmthing->momz; - } - tmthing->threshold = 10; - S_StartSound(tmthing, sfx_s3k44); - } - return true; - } - if (thing->type == MT_PLAYER) { // Bomb punting @@ -1123,31 +1140,6 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->player && tmthing->player->kartstuff[k_hyudorotimer]) // I thought about doing this for just the objects below but figured it should apply to everything. return true; // no interaction - // Bubble Shield reflect - if (((tmthing->type == MT_BUBBLESHIELD && tmthing->target->player && tmthing->target->player->kartstuff[k_bubbleblowup]) - || (tmthing->player && tmthing->player->kartstuff[k_bubbleblowup])) - && (thing->type != MT_MINEEXPLOSION)) - { - if (!thing->threshold) - { - if (!thing->momx && !thing->momy) - { - thing->momz = (32*thing->scale) * P_MobjFlip(thing); - } - else - { - thing->momx = -thing->momx; - thing->momy = -thing->momy; - thing->momz = -thing->momz; - } - if (thing->type == MT_JAWZ) - P_SetTarget(&thing->tracer, thing->target); // Back to the source! - thing->threshold = 10; - S_StartSound(thing, sfx_s3k44); - } - return true; - } - if (thing->type == MT_ORBINAUT_SHIELD || thing->type == MT_JAWZ_SHIELD || thing->type == MT_ORBINAUT || thing->type == MT_JAWZ || thing->type == MT_JAWZ_DUD) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 7b4bcc212..20c7abb04 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6227,24 +6227,25 @@ void P_RunShadows(void) || (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < floorz)) mobj->flags2 |= MF2_DONTDRAW; - rad = mobj->info->radius; + rad = mobj->target->radius; - switch (mobj->type) + switch (mobj->target->type) { case MT_FLOATINGITEM: rad /= 3; break; case MT_THUNDERSHIELD: case MT_BUBBLESHIELD: + case MT_BUBBLESHIELDTRAP: case MT_FLAMESHIELD: - rad = 10<target->scale; break; default: break; } // First scale to the same radius - P_SetScale(mobj, FixedDiv(mobj->target->radius, rad)); + P_SetScale(mobj, FixedDiv(rad, mobj->info->radius)); dest = mobj->target; @@ -8383,7 +8384,7 @@ void P_MobjThinker(mobj_t *mobj) P_RemoveMobj(mobj); return; } - P_SetScale(mobj, (mobj->destscale = (5*mobj->target->destscale)>>2)); + P_SetScale(mobj, (mobj->destscale = (5*mobj->target->scale)>>2)); if (!splitscreen /*&& rendermode != render_soft*/) { @@ -8425,7 +8426,7 @@ void P_MobjThinker(mobj_t *mobj) return; } - scale = (5*mobj->target->destscale)>>2; + scale = (5*mobj->target->scale)>>2; curstate = ((mobj->tics == 1) ? (mobj->state->nextstate) : ((statenum_t)(mobj->state-states))); if (mobj->target->player->kartstuff[k_bubbleblowup]) @@ -8437,7 +8438,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->angle += ANGLE_22h; mobj->flags2 &= ~MF2_SHADOW; - scale += (blow * (scale<<1)) / bubbletime; + scale += (blow * (3*scale)) / bubbletime; mobj->frame = (states[S_BUBBLESHIELDBLOWUP].frame + mobj->extravalue1); @@ -8453,28 +8454,30 @@ void P_MobjThinker(mobj_t *mobj) if (P_IsObjectOnGround(mobj->target)) { - mobj_t *wave; + UINT8 i; - wave = P_SpawnMobj( - mobj->target->x + P_ReturnThrustX(NULL, mobj->angle, mobj->radius), - mobj->target->y + P_ReturnThrustY(NULL, mobj->angle, mobj->radius), - mobj->target->z, MT_THOK); - wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY); - wave->momx = mobj->target->momx; - wave->momy = mobj->target->momy; - wave->momz = mobj->target->momz; - P_SetMobjState(wave, S_BUBBLESHIELDWAVE1); + for (i = 0; i < 2; i++) + { + angle_t a = mobj->angle + ((i & 1) ? ANGLE_180 : 0); + fixed_t ws = (mobj->target->scale>>1); + mobj_t *wave; - // same thing, but + ANGLE_180 - wave = P_SpawnMobj( - mobj->target->x + P_ReturnThrustX(NULL, mobj->angle + ANGLE_180, mobj->radius), - mobj->target->y + P_ReturnThrustY(NULL, mobj->angle + ANGLE_180, mobj->radius), - mobj->target->z, MT_THOK); - wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY); - wave->momx = mobj->target->momx; - wave->momy = mobj->target->momy; - wave->momz = mobj->target->momz; - P_SetMobjState(wave, S_BUBBLESHIELDWAVE1); + ws += (blow * ws) / bubbletime; + + wave = P_SpawnMobj( + (mobj->target->x - mobj->target->momx) + P_ReturnThrustX(NULL, a, mobj->radius - (21*ws)), + (mobj->target->y - mobj->target->momy) + P_ReturnThrustY(NULL, a, mobj->radius - (21*ws)), + (mobj->target->z - mobj->target->momz), MT_THOK); + + wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY); + P_SetScale(wave, (wave->destscale = ws)); + + wave->momx = mobj->target->momx; + wave->momy = mobj->target->momy; + wave->momz = mobj->target->momz; + + P_SetMobjState(wave, S_BUBBLESHIELDWAVE1); + } } } else @@ -8545,7 +8548,7 @@ void P_MobjThinker(mobj_t *mobj) P_RemoveMobj(mobj); return; } - P_SetScale(mobj, (mobj->destscale = (5*mobj->target->destscale)>>2)); + P_SetScale(mobj, (mobj->destscale = (5*mobj->target->scale)>>2)); curstate = ((mobj->tics == 1) ? (mobj->state->nextstate) : ((statenum_t)(mobj->state-states))); @@ -9258,6 +9261,9 @@ void P_MobjThinker(mobj_t *mobj) } break; case MT_BUBBLESHIELDTRAP: + if (leveltime % 180 == 0) + S_StartSound(mobj, sfx_s3kbfl); + if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->player) { player_t *player = mobj->tracer->player; @@ -9267,14 +9273,14 @@ void P_MobjThinker(mobj_t *mobj) P_TeleportMove(mobj, mobj->tracer->x + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<tracer->z - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<cvmem /= 2; mobj->momz = 0; - mobj->destscale = (5*mobj->tracer->scale)>>2; + mobj->destscale = ((5*mobj->tracer->scale)>>2) + (mobj->tracer->scale>>3); - mobj->tracer->momx = (31*mobj->tracer->momx)/32; - mobj->tracer->momy = (31*mobj->tracer->momy)/32; + mobj->tracer->momx = (127*mobj->tracer->momx)/128; + mobj->tracer->momy = (127*mobj->tracer->momy)/128; mobj->tracer->momz = (8*mobj->tracer->scale) * P_MobjFlip(mobj->tracer); if (mobj->movecount > 8*TICRATE) diff --git a/src/sounds.c b/src/sounds.c index 61fddb76f..85d6137ba 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -408,13 +408,13 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3k3b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k3c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k3d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s3k3e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s3k3f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s3k3e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Flame Shield spawned + {"s3k3f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Bubble Shield spawned {"s3k40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s3k41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s3k42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Thunder Shield spawned + {"s3k41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Thunder Shield spawned + {"s3k42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s3k44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s3k44", false, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Bubble Shield reflect {"s3k45", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart AIZ dust From ea3d6227e4966155abdc4075e72d6ce60576bcfc Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 18:13:39 -0400 Subject: [PATCH 12/65] Add small bit of gravity for Bubble trap --- 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 20c7abb04..5d40940b9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9320,7 +9320,7 @@ void P_MobjThinker(mobj_t *mobj) } else { - mobj->momz = 0; + mobj->momz = -(FRACUNIT * P_MobjFlip(mobj)); mobj->destscale = (5*mapobjectscale)>>2; if (mobj->threshold > 0) mobj->threshold--; From 75d7bf675e4eb3b81e99f054707ebecc1eb401a9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 18:13:46 -0400 Subject: [PATCH 13/65] Update item table --- src/k_kart.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 85f06be67..f4d915238 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -686,20 +686,20 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = //P-Odds 0 1 2 3 4 5 6 7 /*Sneaker*/ { 0, 0, 2, 4, 6, 0, 0, 0 }, // Sneaker /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 2, 4, 6 }, // Rocket Sneaker - /*Invincibility*/ { 0, 0, 0, 0, 1, 4, 8, 9 }, // Invincibility - /*Banana*/ { 7, 4, 2, 1, 0, 0, 0, 0 }, // Banana - /*Eggman Monitor*/ { 3, 2, 1, 0, 0, 0, 0, 0 }, // Eggman Monitor - /*Orbinaut*/ { 7, 5, 3, 2, 0, 0, 0, 0 }, // Orbinaut + /*Invincibility*/ { 0, 0, 0, 0, 1, 4, 7, 9 }, // Invincibility + /*Banana*/ { 7, 3, 2, 0, 0, 0, 0, 0 }, // Banana + /*Eggman Monitor*/ { 3, 2, 0, 0, 0, 0, 0, 0 }, // Eggman Monitor + /*Orbinaut*/ { 7, 4, 3, 2, 0, 0, 0, 0 }, // Orbinaut /*Jawz*/ { 0, 3, 2, 1, 1, 0, 0, 0 }, // Jawz /*Mine*/ { 0, 2, 2, 1, 0, 0, 0, 0 }, // Mine /*Ballhog*/ { 0, 0, 2, 1, 0, 0, 0, 0 }, // Ballhog /*Self-Propelled Bomb*/ { 0, 1, 2, 3, 4, 2, 2, 0 }, // Self-Propelled Bomb - /*Grow*/ { 0, 0, 0, 1, 1, 3, 0, 0 }, // Grow + /*Grow*/ { 0, 0, 0, 1, 2, 3, 0, 0 }, // Grow /*Shrink*/ { 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink /*Thunder Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield - /*Bubble Shield*/ { 0, 0, 2, 2, 2, 0, 0, 0 }, // Bubble Shield - /*Flame Shield*/ { 0, 0, 0, 0, 0, 0, 1, 5 }, // Flame Shield - /*Hyudoro*/ { 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro + /*Bubble Shield*/ { 0, 2, 3, 3, 1, 0, 0, 0 }, // Bubble Shield + /*Flame Shield*/ { 0, 0, 0, 0, 0, 1, 3, 5 }, // Flame Shield + /*Hyudoro*/ { 0, 0, 0, 1, 2, 0, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Super Ring*/ { 2, 1, 1, 0, 0, 0, 0, 0 }, // Super Ring /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink From a2f61c8f2b318ed19abffca9ac199df69e03e96a Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 18:15:08 -0400 Subject: [PATCH 14/65] Reel force SPB distance back in a bit --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index f4d915238..7308f048b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1244,7 +1244,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) // SPECIAL CASE No. 5: // Force SPB onto 2nd if they get too far behind - if (player->kartstuff[k_position] == 2 && pdis > (DISTVAR*9) + if (player->kartstuff[k_position] == 2 && pdis > (DISTVAR*8) && spbplace == -1 && !indirectitemcooldown && !dontforcespb && cv_selfpropelledbomb.value) { From e96cf41fabdae32c8aa659a20f35d5fd2a3a11a2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 21 May 2019 20:40:20 -0400 Subject: [PATCH 15/65] Bubble attacks no longer bump Causes desync --- src/p_map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 053ec6e83..52a483d3c 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -746,7 +746,7 @@ static boolean PIT_CheckThing(mobj_t *thing) // Player Damage P_DamageMobj(tmthing, thing, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), 1); - K_KartBouncing(tmthing, thing, false, true); + //K_KartBouncing(tmthing, thing, false, true); // Causes desync S_StartSound(thing, sfx_s3k44); } else @@ -795,7 +795,7 @@ static boolean PIT_CheckThing(mobj_t *thing) // Player Damage P_DamageMobj(thing, tmthing, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), 1); - K_KartBouncing(thing, tmthing, false, true); + //K_KartBouncing(thing, tmthing, false, true); S_StartSound(tmthing, sfx_s3k44); } else From 5ed356ea46d20e955868cf7ac29d13a8926e7e34 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 22 May 2019 13:40:35 -0400 Subject: [PATCH 16/65] Flip angle when reflecting --- src/p_map.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_map.c b/src/p_map.c index 52a483d3c..c0286263b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -762,6 +762,7 @@ static boolean PIT_CheckThing(mobj_t *thing) tmthing->momx = -tmthing->momx; tmthing->momy = -tmthing->momy; tmthing->momz = -tmthing->momz; + tmthing->angle += ANGLE_180; } if (tmthing->type == MT_JAWZ) P_SetTarget(&tmthing->tracer, tmthing->target); // Back to the source! @@ -811,6 +812,7 @@ static boolean PIT_CheckThing(mobj_t *thing) thing->momx = -thing->momx; thing->momy = -thing->momy; thing->momz = -thing->momz; + thing->angle += ANGLE_180; } if (thing->type == MT_JAWZ) P_SetTarget(&thing->tracer, thing->target); // Back to the source! From 414c2d4fb03410481272b0d4dea66bc325509b34 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 22 May 2019 13:50:31 -0400 Subject: [PATCH 17/65] Add thrust to Bubble Shield --- src/p_map.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/p_map.c b/src/p_map.c index c0286263b..48a790aa2 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -739,6 +739,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->type == MT_PLAYER) { + // K_KartBouncing causes desync, so we'll have to use a janky thrust instead + P_Thrust(tmthing, R_PointToAngle2(thing->x, thing->y, tmthing->x, tmthing->y), 4*thing->scale); + if (tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_squishedtimer] || tmthing->player->powers[pw_flashing] || tmthing->player->kartstuff[k_hyudorotimer] || tmthing->player->kartstuff[k_justbumped] || tmthing->scale > thing->scale + (mapobjectscale/8)) @@ -746,7 +749,7 @@ static boolean PIT_CheckThing(mobj_t *thing) // Player Damage P_DamageMobj(tmthing, thing, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), 1); - //K_KartBouncing(tmthing, thing, false, true); // Causes desync + //K_KartBouncing(tmthing, thing, false, true); S_StartSound(thing, sfx_s3k44); } else @@ -789,6 +792,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->type == MT_PLAYER) { + // K_KartBouncing causes desync, so we'll have to use a janky thrust instead + P_Thrust(thing, R_PointToAngle2(tmthing->x, tmthing->y, thing->x, thing->y), 4*tmthing->scale); + if (thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_squishedtimer] || thing->player->powers[pw_flashing] || thing->player->kartstuff[k_hyudorotimer] || thing->player->kartstuff[k_justbumped] || thing->scale > tmthing->scale + (mapobjectscale/8)) From f615ff3b6b7f503efaf39aaac31af9e40300095e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 22 May 2019 13:54:32 -0400 Subject: [PATCH 18/65] Ignore bumping ring effects for shielded players --- src/k_kart.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7308f048b..4d97353b0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1550,7 +1550,8 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) mobj1->player->kartstuff[k_spinouttimer] = max(wipeoutslowtime+1, mobj1->player->kartstuff[k_spinouttimer]); //mobj1->player->kartstuff[k_spinouttype] = 1; // Enforce type } - else if (mobj2->player) // Player VS player bumping only + else if (mobj2->player // Player VS player bumping only + && (K_GetShieldFromItem(mobj1->player->kartstuff[k_itemtype]) == KITEM_NONE)) // Ignore for shields { if (mobj1->player->kartstuff[k_rings] <= 0) { @@ -1574,7 +1575,8 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) mobj2->player->kartstuff[k_spinouttimer] = max(wipeoutslowtime+1, mobj2->player->kartstuff[k_spinouttimer]); //mobj2->player->kartstuff[k_spinouttype] = 1; // Enforce type } - else if (mobj1->player) // Player VS player bumping only + else if (mobj1->player // Player VS player bumping only + && (K_GetShieldFromItem(mobj2->player->kartstuff[k_itemtype]) == KITEM_NONE)) // Ignore for shields { if (mobj2->player->kartstuff[k_rings] <= 0) { From bb794ffac988fa3383e17a9c0dedf7a161541440 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 22 May 2019 19:26:43 -0400 Subject: [PATCH 19/65] SHOOT bubbles forward --- src/info.c | 6 ++-- src/k_kart.c | 52 +++++++++++++++++++++++----------- src/p_inter.c | 14 --------- src/p_mobj.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 110 insertions(+), 40 deletions(-) diff --git a/src/info.c b/src/info.c index 3ddd217b6..81fa4484f 100644 --- a/src/info.c +++ b/src/info.c @@ -16059,14 +16059,14 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound - 8, // speed + 128*FRACUNIT, // speed 28*FRACUNIT, // radius 56*FRACUNIT, // height - 1, // display offset + 2, // display offset 16, // mass 0, // damage sfx_None, // activesound - MF_SPECIAL|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + MF_SPECIAL|MF_BOUNCE|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, diff --git a/src/k_kart.c b/src/k_kart.c index 4d97353b0..c5b7b1640 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1526,7 +1526,10 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) } // Do the bump fx when we've CONFIRMED we can bump. - S_StartSound(mobj1, sfx_s3k49); + if ((mobj1->player && mobj1->player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD) || (mobj2->player && mobj2->player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD)) + S_StartSound(mobj1, sfx_s3k44); + else + S_StartSound(mobj1, sfx_s3k49); fx = P_SpawnMobj(mobj1->x/2 + mobj2->x/2, mobj1->y/2 + mobj2->y/2, mobj1->z/2 + mobj2->z/2, MT_BUMP); if (mobj1->eflags & MFE_VERTICALFLIP) @@ -3201,16 +3204,25 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I case MT_SPB: th->movefactor = finalspeed; break; + case MT_BUBBLESHIELDTRAP: + P_SetScale(th, ((5*th->destscale)>>2)*4); + th->destscale = (5*th->destscale)>>2; + S_StartSound(th, sfx_s3kbfl); + S_StartSound(th, sfx_cdfm35); + break; default: break; } - x = x + P_ReturnThrustX(source, an, source->radius + th->radius); - y = y + P_ReturnThrustY(source, an, source->radius + th->radius); - throwmo = P_SpawnMobj(x, y, z, MT_FIREDITEM); - throwmo->movecount = 1; - throwmo->movedir = source->angle - an; - P_SetTarget(&throwmo->target, source); + if (type != MT_BUBBLESHIELDTRAP) + { + x = x + P_ReturnThrustX(source, an, source->radius + th->radius); + y = y + P_ReturnThrustY(source, an, source->radius + th->radius); + throwmo = P_SpawnMobj(x, y, z, MT_FIREDITEM); + throwmo->movecount = 1; + throwmo->movedir = source->angle - an; + P_SetTarget(&throwmo->target, source); + } return NULL; } @@ -3769,8 +3781,16 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map { mobj_t *lasttrail = K_FindLastTrailMobj(player); - if (lasttrail) + if (mapthing == MT_BUBBLESHIELDTRAP) // Drop directly on top of you. { + newangle = player->mo->angle; + newx = player->mo->x + player->mo->momx; + newy = player->mo->y + player->mo->momy; + newz = player->mo->z; + } + else if (lasttrail) + { + newangle = lasttrail->angle; newx = lasttrail->x; newy = lasttrail->y; newz = lasttrail->z; @@ -3822,6 +3842,12 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map if (mapthing == MT_SSMINE) mo->extravalue1 = 49; // Pads the start-up length from 21 frames to a full 2 seconds + else if (mapthing == MT_BUBBLESHIELDTRAP) + { + P_SetScale(mo, ((5*mo->destscale)>>2)*4); + mo->destscale = (5*mo->destscale)>>2; + S_StartSound(mo, sfx_s3kbfl); + } } } @@ -6481,16 +6507,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_bubbleblowup] == 0) S_StartSound(player->mo, sfx_s3k75); player->kartstuff[k_bubbleblowup]++; - player->kartstuff[k_bubblecool] = TICRATE+bubbletime; + player->kartstuff[k_bubblecool] = player->kartstuff[k_bubbleblowup]*3; if (player->kartstuff[k_bubbleblowup] > bubbletime) { - mobj_t *trap = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, player->mo->z + player->mo->momz, MT_BUBBLESHIELDTRAP); - P_SetScale(trap, ((5*trap->destscale)>>2)*4); - trap->destscale = (5*trap->destscale)>>2; - P_SetTarget(&trap->target, player->mo); - trap->threshold = TICRATE; - S_StartSound(trap, sfx_s3kbfl); - + K_ThrowKartItem(player, (player->kartstuff[k_throwdir] > 0), MT_BUBBLESHIELDTRAP, -1, 0); K_PlayAttackTaunt(player->mo); player->kartstuff[k_bubbleblowup] = 0; player->kartstuff[k_itemamount]--; diff --git a/src/p_inter.c b/src/p_inter.c index 74688a810..bee9fc9cf 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -689,20 +689,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (!player->mo || player->spectator) return; - // kill - /*if (player->kartstuff[k_invincibilitytimer] > 0 - || player->kartstuff[k_growshrinktimer] > 0 - || player->kartstuff[k_flamedash] > 0) - { - P_KillMobj(special, toucher, toucher); - return; - }*/ - - // no interaction - if (player->powers[pw_flashing] > 0 || player->kartstuff[k_hyudorotimer] > 0 - || player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0) - return; - // attach to player! P_SetTarget(&special->tracer, toucher); toucher->flags |= MF_NOGRAVITY; diff --git a/src/p_mobj.c b/src/p_mobj.c index 5d40940b9..c0e5b76e2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1729,6 +1729,10 @@ void P_XYMovement(mobj_t *mo) P_InstaThrust(mo, R_PointToAngle2(mo->x, mo->y, mo->x + xmove, mo->y + ymove)+ANGLE_90, 16*FRACUNIT); } } + + // Bubble bounce + if (mo->type == MT_BUBBLESHIELDTRAP) + S_StartSound(mo, sfx_s3k44); //} // Bounce ring algorithm @@ -1937,7 +1941,9 @@ void P_XYMovement(mobj_t *mo) #endif //{ SRB2kart stuff - if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ_DUD || mo->type == MT_JAWZ || mo->type == MT_BALLHOG || mo->type == MT_FLINGRING) //(mo->type == MT_JAWZ && !mo->tracer)) + if (mo->type == MT_FLINGRING + || mo->type == MT_ORBINAUT || mo->type == MT_JAWZ || mo->type == MT_JAWZ_DUD + || mo->type == MT_BALLHOG || mo->type == MT_BUBBLESHIELDTRAP) return; if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= K_GetKartSpeed(mo->player, false)/2) @@ -2274,6 +2280,7 @@ static boolean P_ZMovement(mobj_t *mo) case MT_JAWZ_DUD: case MT_BALLHOG: case MT_SSMINE: + case MT_BUBBLESHIELDTRAP: // Remove stuff from death pits. if (P_CheckDeathPitCollide(mo)) { @@ -8472,11 +8479,11 @@ void P_MobjThinker(mobj_t *mobj) wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY); P_SetScale(wave, (wave->destscale = ws)); + P_SetMobjState(wave, S_BUBBLESHIELDWAVE1); + wave->momx = mobj->target->momx; wave->momy = mobj->target->momy; wave->momz = mobj->target->momz; - - P_SetMobjState(wave, S_BUBBLESHIELDWAVE1); } } } @@ -9279,8 +9286,8 @@ void P_MobjThinker(mobj_t *mobj) mobj->momz = 0; mobj->destscale = ((5*mobj->tracer->scale)>>2) + (mobj->tracer->scale>>3); - mobj->tracer->momx = (127*mobj->tracer->momx)/128; - mobj->tracer->momy = (127*mobj->tracer->momy)/128; + mobj->tracer->momx = (63*mobj->tracer->momx)/64; + mobj->tracer->momy = (63*mobj->tracer->momy)/64; mobj->tracer->momz = (8*mobj->tracer->scale) * P_MobjFlip(mobj->tracer); if (mobj->movecount > 8*TICRATE) @@ -9314,16 +9321,73 @@ void P_MobjThinker(mobj_t *mobj) } else if (mobj->extravalue1) // lost your player somehow, DIE { - mobj->tracer->flags &= ~MF_NOGRAVITY; P_KillMobj(mobj, NULL, NULL); break; } else { - mobj->momz = -(FRACUNIT * P_MobjFlip(mobj)); mobj->destscale = (5*mapobjectscale)>>2; + if (mobj->threshold > 0) mobj->threshold--; + + if (abs(mobj->momx) < 8*mobj->destscale && abs(mobj->momy) < 8*mobj->destscale) + { + // Stop, give light gravity + mobj->momx = mobj->momy = 0; + mobj->momz = -(mobj->scale * P_MobjFlip(mobj)); + } + else + { + UINT8 i; + mobj_t *ghost = P_SpawnGhostMobj(mobj); + + if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player) + { + ghost->color = mobj->target->player->skincolor; + ghost->colorized = true; + } + + mobj->momx = (23*mobj->momx)/24; + mobj->momy = (23*mobj->momy)/24; + + mobj->angle = R_PointToAngle2(0,0,mobj->momx,mobj->momy); + + if ((mobj->z - mobj->floorz) < (24*mobj->scale) && (leveltime % 3 != 0)) + { + // Cool wave effects! + for (i = 0; i < 2; i++) + { + angle_t aoff; + SINT8 sign = 1; + mobj_t *wave; + + if (i & 1) + sign = -1; + else + sign = 1; + + aoff = (mobj->angle + ANGLE_180) + (ANGLE_45 * sign); + + wave = P_SpawnMobj(mobj->x + FixedMul(mobj->radius, FINECOSINE(aoff>>ANGLETOFINESHIFT)), + mobj->y + FixedMul(mobj->radius, FINESINE(aoff>>ANGLETOFINESHIFT)), + mobj->z, MT_THOK); + + wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY); + P_SetScale(wave, (wave->destscale = mobj->scale/2)); + + P_SetMobjState(wave, S_BUBBLESHIELDWAVE1); + if (leveltime & 1) + wave->tics++; + + P_SetTarget(&wave->target, mobj); + wave->angle = mobj->angle - (ANGLE_90 * sign); // point completely perpendicular from the bubble + K_FlipFromObject(wave, mobj); + + P_Thrust(wave, wave->angle, 4*mobj->scale); + } + } + } } break; case MT_KARMAFIREWORK: From 5caacfd91d98ae826c89258a6a547869ff5af92b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 22 May 2019 20:12:16 -0400 Subject: [PATCH 20/65] Enable patch again --- src/doomdef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/doomdef.h b/src/doomdef.h index 4d3934773..7730a4df0 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -163,7 +163,7 @@ extern FILE *logstream; // Does this version require an added patch file? // Comment or uncomment this as necessary. -//#define USE_PATCH_FILE +#define USE_PATCH_FILE // Use .kart extension addons #define USE_KART From ed316ff4bd76d42bfdea9a6404d9a62939ad7602 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 22 May 2019 20:12:36 -0400 Subject: [PATCH 21/65] Remove thrust again --- src/p_map.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 48a790aa2..7e0b842a1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -739,17 +739,22 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->type == MT_PLAYER) { - // K_KartBouncing causes desync, so we'll have to use a janky thrust instead + // Counter desyncs + /*mobj_t *oldthing = thing; + mobj_t *oldtmthing = tmthing; + P_Thrust(tmthing, R_PointToAngle2(thing->x, thing->y, tmthing->x, tmthing->y), 4*thing->scale); + thing = oldthing; + P_SetTarget(&tmthing, oldtmthing);*/ + if (tmthing->player->kartstuff[k_spinouttimer] || tmthing->player->kartstuff[k_squishedtimer] || tmthing->player->powers[pw_flashing] || tmthing->player->kartstuff[k_hyudorotimer] || tmthing->player->kartstuff[k_justbumped] || tmthing->scale > thing->scale + (mapobjectscale/8)) return true; // Player Damage - P_DamageMobj(tmthing, thing, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), 1); - //K_KartBouncing(tmthing, thing, false, true); + K_SpinPlayer(tmthing->player, thing, 0, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), false); S_StartSound(thing, sfx_s3k44); } else @@ -792,17 +797,22 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->type == MT_PLAYER) { - // K_KartBouncing causes desync, so we'll have to use a janky thrust instead + // Counter desyncs + /*mobj_t *oldthing = thing; + mobj_t *oldtmthing = tmthing; + P_Thrust(thing, R_PointToAngle2(tmthing->x, tmthing->y, thing->x, thing->y), 4*tmthing->scale); + thing = oldthing; + P_SetTarget(&tmthing, oldtmthing);*/ + if (thing->player->kartstuff[k_spinouttimer] || thing->player->kartstuff[k_squishedtimer] || thing->player->powers[pw_flashing] || thing->player->kartstuff[k_hyudorotimer] || thing->player->kartstuff[k_justbumped] || thing->scale > tmthing->scale + (mapobjectscale/8)) return true; // Player Damage - P_DamageMobj(thing, tmthing, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), 1); - //K_KartBouncing(thing, tmthing, false, true); + K_SpinPlayer(thing->player, tmthing, 0, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), false); S_StartSound(tmthing, sfx_s3k44); } else From 068db363685646dbb0dbafdb003d33e2fc5974f1 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 26 May 2019 21:14:26 -0400 Subject: [PATCH 22/65] Bubble blowup has a brief mercy period before it shoots --- src/k_kart.c | 2 +- src/p_mobj.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index c5b7b1640..5a209ab1b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6508,7 +6508,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) S_StartSound(player->mo, sfx_s3k75); player->kartstuff[k_bubbleblowup]++; player->kartstuff[k_bubblecool] = player->kartstuff[k_bubbleblowup]*3; - if (player->kartstuff[k_bubbleblowup] > bubbletime) + if (player->kartstuff[k_bubbleblowup] > bubbletime+10) { K_ThrowKartItem(player, (player->kartstuff[k_throwdir] > 0), MT_BUBBLESHIELDTRAP, -1, 0); K_PlayAttackTaunt(player->mo); diff --git a/src/p_mobj.c b/src/p_mobj.c index c0e5b76e2..267e55365 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8439,6 +8439,8 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_bubbleblowup]) { INT32 blow = mobj->target->player->kartstuff[k_bubbleblowup]; + if (blow > bubbletime) + blow = bubbletime; if (curstate != S_BUBBLESHIELDBLOWUP) P_SetMobjState(mobj, S_BUBBLESHIELDBLOWUP); @@ -8448,6 +8450,8 @@ void P_MobjThinker(mobj_t *mobj) scale += (blow * (3*scale)) / bubbletime; mobj->frame = (states[S_BUBBLESHIELDBLOWUP].frame + mobj->extravalue1); + if ((mobj->target->player->kartstuff[k_bubbleblowup] > bubbletime) && (leveltime & 1)) + mobj->frame = (states[S_BUBBLESHIELDBLOWUP].frame + 5); if (mobj->extravalue1 < 4 && mobj->extravalue2 < blow && !mobj->cvmem && (leveltime & 1)) // Growing { From c90bdc1c37e750af9c0e78d36c90b6fd0b9faded Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 26 May 2019 21:54:35 -0400 Subject: [PATCH 23/65] Longer flash period, but quicker deflate --- src/k_kart.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5a209ab1b..a9bfe62df 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6508,7 +6508,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) S_StartSound(player->mo, sfx_s3k75); player->kartstuff[k_bubbleblowup]++; player->kartstuff[k_bubblecool] = player->kartstuff[k_bubbleblowup]*3; - if (player->kartstuff[k_bubbleblowup] > bubbletime+10) + if (player->kartstuff[k_bubbleblowup] > bubbletime*2) { K_ThrowKartItem(player, (player->kartstuff[k_throwdir] > 0), MT_BUBBLESHIELDTRAP, -1, 0); K_PlayAttackTaunt(player->mo); @@ -6519,6 +6519,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else { + if (player->kartstuff[k_bubbleblowup] > bubbletime) + player->kartstuff[k_bubbleblowup] = bubbletime; if (player->kartstuff[k_bubbleblowup]) player->kartstuff[k_bubbleblowup]--; player->kartstuff[k_holdready] = (player->kartstuff[k_bubblecool] ? 0 : 1); From 3151805f6b4ba5da045cf483f8d4637f8e95348f Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 24 Oct 2019 10:25:13 -0400 Subject: [PATCH 24/65] Eggman monitor gives you a very tiny speed boost --- src/k_kart.c | 17 +++++++++++++++-- src/k_kart.h | 3 ++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 991d510f9..ef392bd48 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2302,7 +2302,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->kartstuff[k_flamedash]) // Flame Shield dash { fixed_t dashval = ((player->kartstuff[k_flamedash]<kartstuff[k_startboost]) // Startup Boost @@ -2314,6 +2314,9 @@ static void K_GetKartBoostPower(player_t *player) if (player->kartstuff[k_ringboost]) // Ring Boost ADDBOOST(FRACUNIT/5, 4*FRACUNIT); // + 20% top speed, + 400% acceleration + if (player->kartstuff[k_eggmanexplode]) // Ready-to-explode + ADDBOOST(FRACUNIT/5, 2*FRACUNIT); // + 20% top speed, + 200% acceleration + if (player->kartstuff[k_draftpower] > 0) // Drafting { fixed_t draftspeed = ((3*FRACUNIT)/10) + ((player->kartspeed-1) * (FRACUNIT/50)); // min is 30%, max is 46% @@ -5216,17 +5219,27 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { // Speed lines if (EITHERSNEAKER(player) || player->kartstuff[k_ringboost] - || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost]) + || player->kartstuff[k_driftboost] || player->kartstuff[k_startboost] + || player->kartstuff[k_eggmanexplode]) { mobj_t *fast = P_SpawnMobj(player->mo->x + (P_RandomRange(-36,36) * player->mo->scale), player->mo->y + (P_RandomRange(-36,36) * player->mo->scale), player->mo->z + (player->mo->height/2) + (P_RandomRange(-20,20) * player->mo->scale), MT_FASTLINE); + fast->angle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; fast->momz = 3*player->mo->momz/4; + K_MatchGenericExtraFlags(fast, player->mo); + + // Make it red when you have the eggman speed boost + if (player->kartstuff[k_eggmanexplode]) + { + fast->color = SKINCOLOR_RED; + fast->colorized = true; + } } if (player->kartstuff[k_numboosts] > 0) // Boosting after images diff --git a/src/k_kart.h b/src/k_kart.h index b72928165..731078479 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -8,6 +8,7 @@ #include "doomdef.h" #include "d_player.h" // Need for player_t +#include "command.h" // Need for player_t #define KART_FULLTURN 800 @@ -24,7 +25,7 @@ boolean K_IsPlayerLosing(player_t *player); boolean K_IsPlayerWanted(player_t *player); fixed_t K_GetKartGameSpeedScalar(SINT8 value); -consvar_t *KartItemCVars[NUMKARTRESULTS-1]; +extern consvar_t *KartItemCVars[NUMKARTRESULTS-1]; INT32 K_GetShieldFromItem(INT32 item); void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid); From 985b2ba8dd5f2a29c7a767b546fd1626311f7d69 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 24 Oct 2019 10:26:44 -0400 Subject: [PATCH 25/65] Wrong var here (although the result is the same) --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ef392bd48..1a4e5ebe4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1554,7 +1554,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) //mobj1->player->kartstuff[k_spinouttype] = 1; // Enforce type } else if (mobj2->player // Player VS player bumping only - && (K_GetShieldFromItem(mobj1->player->kartstuff[k_itemtype]) == KITEM_NONE)) // Ignore for shields + && (K_GetShieldFromItem(mobj1->player->kartstuff[k_itemtype]) == KSHIELD_NONE)) // Ignore for shields { if (mobj1->player->kartstuff[k_rings] <= 0) { @@ -1579,7 +1579,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) //mobj2->player->kartstuff[k_spinouttype] = 1; // Enforce type } else if (mobj1->player // Player VS player bumping only - && (K_GetShieldFromItem(mobj2->player->kartstuff[k_itemtype]) == KITEM_NONE)) // Ignore for shields + && (K_GetShieldFromItem(mobj2->player->kartstuff[k_itemtype]) == KSHIELD_NONE)) // Ignore for shields { if (mobj2->player->kartstuff[k_rings] <= 0) { From e8c327e5bb00143193e19652ae047fcca8d0f1cb Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 24 Oct 2019 10:33:06 -0400 Subject: [PATCH 26/65] Return earlier for multiple shields --- src/k_kart.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1a4e5ebe4..8079b2c63 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -821,7 +821,6 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp INT32 newodds; INT32 i; UINT8 pingame = 0, pexiting = 0; - boolean shieldout[NUMKARTSHIELDS-1]; SINT8 first = -1, second = -1; INT32 secondist = 0; INT32 shieldtype = KSHIELD_NONE; @@ -846,7 +845,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp // Base multiplication to ALL item odds to simulate fractional precision newodds *= 4; - memset(shieldout, false, sizeof(shieldout)); + shieldtype = K_GetShieldFromItem(item); for (i = 0; i < MAXPLAYERS; i++) { @@ -859,9 +858,11 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp if (players[i].exiting) pexiting++; - shieldtype = K_GetShieldFromItem(players[i].kartstuff[k_itemtype]); - if (shieldtype != KSHIELD_NONE) - shieldout[shieldtype-1] = true; + if (shieldtype != KSHIELD_NONE && shieldtype == K_GetShieldFromItem(players[i].kartstuff[k_itemtype])) + { + // Don't allow more than one of each shield type at a time + return 0; + } if (players[i].mo && G_RaceGametype()) { @@ -882,11 +883,6 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp secondist = ((28 + (8-pingame)) * secondist) / 28; } - // Don't allow more than one of each shield type at a time - shieldtype = K_GetShieldFromItem(item); - if (shieldtype != KSHIELD_NONE && shieldout[shieldtype-1]) - return 0; - // POWERITEMODDS handles all of the "frantic item" related functionality, for all of our powerful items. // First, it multiplies it by 2 if franticitems is true; easy-peasy. // Next, it multiplies it again if it's in SPB mode and 2nd needs to apply pressure to 1st. From 32d1abeb2b4ae29155696c9688dabf66073b3c35 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 17 Mar 2020 19:22:13 -0400 Subject: [PATCH 27/65] Bubble cooldown is longer It was meant to be the same length as inflate & deflate AFTER you were done, but it was only half of that -- now you're vulnerable for the same amount of time as you held it down. --- src/k_kart.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8079b2c63..d52afa2eb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6592,8 +6592,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { if (player->kartstuff[k_bubbleblowup] == 0) S_StartSound(player->mo, sfx_s3k75); + player->kartstuff[k_bubbleblowup]++; - player->kartstuff[k_bubblecool] = player->kartstuff[k_bubbleblowup]*3; + player->kartstuff[k_bubblecool] = player->kartstuff[k_bubbleblowup]*4; + if (player->kartstuff[k_bubbleblowup] > bubbletime*2) { K_ThrowKartItem(player, (player->kartstuff[k_throwdir] > 0), MT_BUBBLESHIELDTRAP, -1, 0); From eb2c36348ebd432e88d1b8b83bb7da45f7bb4783 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 17 Mar 2020 19:27:09 -0400 Subject: [PATCH 28/65] Bubble Shield trap overlay fixes - Add player momentum to it, so that it lines up better - Set noclip so it doesn't stop against walls --- src/p_mobj.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 0bcb1695d..58e25f334 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9709,12 +9709,13 @@ void P_MobjThinker(mobj_t *mobj) { player_t *player = mobj->tracer->player; + mobj->flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOGRAVITY|MF_DONTENCOREMAP; mobj->extravalue1 = 1; P_TeleportMove(mobj, - mobj->tracer->x + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<tracer->x + mobj->tracer->momx + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + mobj->tracer->momy + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z + mobj->tracer->momz - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<cvmem /= 2; mobj->momz = 0; From 54e144485266c8aeeb6c606ccab762f3b60979aa Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 17 Mar 2020 19:41:53 -0400 Subject: [PATCH 29/65] Reset bubble cooldown & holdready when used --- src/k_kart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index a1c4d534b..b8238f3f5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6749,6 +6749,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_ThrowKartItem(player, (player->kartstuff[k_throwdir] > 0), MT_BUBBLESHIELDTRAP, -1, 0); K_PlayAttackTaunt(player->mo); player->kartstuff[k_bubbleblowup] = 0; + player->kartstuff[k_bubblecool] = 0; + player->kartstuff[k_holdready] = 0; player->kartstuff[k_itemamount]--; } } @@ -6757,8 +6759,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { if (player->kartstuff[k_bubbleblowup] > bubbletime) player->kartstuff[k_bubbleblowup] = bubbletime; + if (player->kartstuff[k_bubbleblowup]) player->kartstuff[k_bubbleblowup]--; + player->kartstuff[k_holdready] = (player->kartstuff[k_bubblecool] ? 0 : 1); } } From 1886115e54a58eb1639e1b90db247add621eb3bb Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 17 Mar 2020 20:30:30 -0400 Subject: [PATCH 30/65] Allow Eggman items to be picked up by players using invulerability items --- src/p_inter.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 165cfae84..37b7ff36f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -108,7 +108,7 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon) return false; /*if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) // No bumpers in Match - return false;*/ + return false;*/ if (weapon) { @@ -118,10 +118,7 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon) // Invulnerable if (player->powers[pw_flashing] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2) - || player->kartstuff[k_squishedtimer] > 0 - || player->kartstuff[k_invincibilitytimer] > 0 - || player->kartstuff[k_growshrinktimer] > 0 - || player->kartstuff[k_hyudorotimer] > 0) + || player->kartstuff[k_squishedtimer] > 0) return false; // Already have fake From e5fb55df8369818673a5ee89d54300610985b89e Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 17 Mar 2020 20:36:23 -0400 Subject: [PATCH 31/65] Fix infinite bubble bug --- src/k_kart.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b8238f3f5..980104301 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6734,25 +6734,22 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (!HOLDING_ITEM && NO_HYUDORO) { - if (cmd->buttons & BT_ATTACK) + if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { - if (player->kartstuff[k_holdready]) + if (player->kartstuff[k_bubbleblowup] == 0) + S_StartSound(player->mo, sfx_s3k75); + + player->kartstuff[k_bubbleblowup]++; + player->kartstuff[k_bubblecool] = player->kartstuff[k_bubbleblowup]*4; + + if (player->kartstuff[k_bubbleblowup] > bubbletime*2) { - if (player->kartstuff[k_bubbleblowup] == 0) - S_StartSound(player->mo, sfx_s3k75); - - player->kartstuff[k_bubbleblowup]++; - player->kartstuff[k_bubblecool] = player->kartstuff[k_bubbleblowup]*4; - - if (player->kartstuff[k_bubbleblowup] > bubbletime*2) - { - K_ThrowKartItem(player, (player->kartstuff[k_throwdir] > 0), MT_BUBBLESHIELDTRAP, -1, 0); - K_PlayAttackTaunt(player->mo); - player->kartstuff[k_bubbleblowup] = 0; - player->kartstuff[k_bubblecool] = 0; - player->kartstuff[k_holdready] = 0; - player->kartstuff[k_itemamount]--; - } + K_ThrowKartItem(player, (player->kartstuff[k_throwdir] > 0), MT_BUBBLESHIELDTRAP, -1, 0); + K_PlayAttackTaunt(player->mo); + player->kartstuff[k_bubbleblowup] = 0; + player->kartstuff[k_bubblecool] = 0; + player->kartstuff[k_holdready] = 0; + player->kartstuff[k_itemamount]--; } } else From dad1d7b610381e6ab7fa8798ac44121ee0b17eea Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 17 Mar 2020 20:37:36 -0400 Subject: [PATCH 32/65] Apply to flame shield as well (although it didn't need it) --- src/k_kart.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 980104301..0574a15ce 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6776,20 +6776,19 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (!HOLDING_ITEM && NO_HYUDORO) { - if (cmd->buttons & BT_ATTACK) + if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { - if (player->kartstuff[k_holdready]) + if (player->kartstuff[k_flamedash] == 0) + K_PlayBoostTaunt(player->mo); + + player->kartstuff[k_flamedash]++; + + if (player->kartstuff[k_flamedash] > 10*TICRATE) { - if (player->kartstuff[k_flamedash] == 0) - K_PlayBoostTaunt(player->mo); - player->kartstuff[k_flamedash]++; - if (player->kartstuff[k_flamedash] > 10*TICRATE) - { - K_FlameShieldPop(player->mo); - player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_holdready] = 0; - player->kartstuff[k_itemamount]--; - } + K_FlameShieldPop(player->mo); + player->kartstuff[k_flamedash] = 0; + player->kartstuff[k_holdready] = 0; + player->kartstuff[k_itemamount]--; } } else From c313de326ed9cba3cbd1dc5d185c1bee563f0a23 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 17 Mar 2020 20:47:05 -0400 Subject: [PATCH 33/65] Teleport bubble trap overlay after slowing down rather than before --- src/p_mobj.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 70b97f851..d8baad638 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9467,11 +9467,6 @@ void P_MobjThinker(mobj_t *mobj) mobj->flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOGRAVITY|MF_DONTENCOREMAP; mobj->extravalue1 = 1; - P_TeleportMove(mobj, - mobj->tracer->x + mobj->tracer->momx + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + mobj->tracer->momy + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z + mobj->tracer->momz - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<cvmem /= 2; mobj->momz = 0; mobj->destscale = ((5*mobj->tracer->scale)>>2) + (mobj->tracer->scale>>3); @@ -9480,6 +9475,11 @@ void P_MobjThinker(mobj_t *mobj) mobj->tracer->momy = (63*mobj->tracer->momy)/64; mobj->tracer->momz = (8*mobj->tracer->scale) * P_MobjFlip(mobj->tracer); + P_TeleportMove(mobj, + mobj->tracer->x + mobj->tracer->momx + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + mobj->tracer->momy + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z + mobj->tracer->momz - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<movecount > 8*TICRATE) { S_StartSound(mobj->tracer, sfx_s3k77); From bb516042a8fd0dae97252bedbd2fc25f89a8cad0 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 17 Mar 2020 21:02:44 -0400 Subject: [PATCH 34/65] Correct shadow size --- 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 d8baad638..d9df21eaf 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10318,7 +10318,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_BUBBLESHIELD: case MT_BUBBLESHIELDTRAP: case MT_FLAMESHIELD: - thing->shadowscale = 2*FRACUNIT; + thing->shadowscale = FRACUNIT; break; case MT_RING: case MT_FLOATINGITEM: From 10c625b42ebdf2736a27d54d89bbe05bae0f8f2a Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 18 Mar 2020 02:38:02 -0400 Subject: [PATCH 35/65] Start on flame shield rework --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 94 ++++++++++++++++++++++++++++++-------------------- 3 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 63e6dd397..8414cd81d 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -319,6 +319,7 @@ typedef enum k_bubblecool, // Bubble Shield use cooldown k_bubbleblowup, // Bubble Shield usage blowup k_flamedash, // Flame Shield dash power + k_flamemeter, // Flame Shield dash meter left k_eggmanheld, // Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items k_eggmanexplode, // Fake item recieved, explode in a few seconds k_eggmanblame, // Fake item recieved, who set this fake diff --git a/src/dehacked.c b/src/dehacked.c index fdf2ddd3a..39744f7a0 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8529,6 +8529,7 @@ static const char *const KARTSTUFF_LIST[] = { "BUBBLECOOL", "BUBBLEBLOWUP", "FLAMEDASH", + "FLAMEMETER", "EGGMANHELD", "EGGMANEXPLODE", "EGGMANBLAME", diff --git a/src/k_kart.c b/src/k_kart.c index 0574a15ce..adbdf6836 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2283,10 +2283,7 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST((3*FRACUNIT)/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration if (player->kartstuff[k_flamedash]) // Flame Shield dash - { - fixed_t dashval = ((player->kartstuff[k_flamedash]<kartstuff[k_startboost]) // Startup Boost ADDBOOST(FRACUNIT/4, 6*FRACUNIT); // + 25% top speed, + 600% acceleration @@ -2298,7 +2295,7 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST(FRACUNIT/5, 4*FRACUNIT); // + 20% top speed, + 400% acceleration if (player->kartstuff[k_eggmanexplode]) // Ready-to-explode - ADDBOOST(FRACUNIT/5, 2*FRACUNIT); // + 20% top speed, + 200% acceleration + ADDBOOST(FRACUNIT/5, FRACUNIT); // + 20% top speed, + 100% acceleration if (player->kartstuff[k_draftpower] > 0) // Drafting { @@ -5620,6 +5617,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_levelbooster]) player->kartstuff[k_levelbooster]--; + if (player->kartstuff[k_flamedash]) + player->kartstuff[k_flamedash]--; + if (EITHERSNEAKER(player) && player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1) player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1; @@ -5764,12 +5764,10 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->kartstuff[k_bubblecool] = 0; } - if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD - || player->exiting || player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer]) + if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD || player->exiting) { if (player->kartstuff[k_flamedash]) K_FlameShieldPop(player->mo); - player->kartstuff[k_flamedash] = 0; } if (player->kartstuff[k_comebacktimer]) @@ -5922,14 +5920,6 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) if (player->spectator) return turnvalue; - if (player->kartstuff[k_flamedash]) // Reduce turning - { - fixed_t dashval = ((player->kartstuff[k_flamedash]< FRACUNIT) - return 0; // NO MORE TURNING! - turnvalue = FixedMul(turnvalue, FRACUNIT-dashval); - } - if (player->kartstuff[k_drift] != 0 && P_IsObjectOnGround(player->mo)) { // If we're drifting we have a completely different turning value @@ -6776,35 +6766,36 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (!HOLDING_ITEM && NO_HYUDORO) { + INT32 flamemax = 16 * (TICRATE/4); + if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { + if (player->kartstuff[k_flamemeter] > flamemax) + player->kartstuff[k_flamemeter] = flamemax; + if (player->kartstuff[k_flamedash] == 0) K_PlayBoostTaunt(player->mo); - player->kartstuff[k_flamedash]++; + player->kartstuff[k_flamedash] += 2; - if (player->kartstuff[k_flamedash] > 10*TICRATE) + if (player->kartstuff[k_flamemeter] <= 0) { K_FlameShieldPop(player->mo); - player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_holdready] = 0; - player->kartstuff[k_itemamount]--; - } - } - else - { - if (player->kartstuff[k_flamedash] > (TICRATE*2)) - { - K_FlameShieldPop(player->mo); - player->kartstuff[k_flamedash] = 0; + player->kartstuff[k_flamemeter] = flamemax; player->kartstuff[k_holdready] = 0; player->kartstuff[k_itemamount]--; } else - { - player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_holdready] = 1; - } + player->kartstuff[k_flamemeter] -= 2; + } + else + { + player->kartstuff[k_holdready] = 1; + + if (player->kartstuff[k_flamemeter] > flamemax || player->kartstuff[k_flamemeter] == 0) + player->kartstuff[k_flamemeter] = flamemax; + else if (player->kartstuff[k_flamemeter] < flamemax) + player->kartstuff[k_flamemeter]++; } } break; @@ -7466,6 +7457,9 @@ static patch_t *kp_check[6]; static patch_t *kp_eggnum[4]; +static patch_t *kp_flameshieldmeter[104]; +static patch_t *kp_flameshieldmeter_bg; + static patch_t *kp_fpview[3]; static patch_t *kp_inputwheel[5]; @@ -7674,6 +7668,17 @@ void K_LoadKartHUDGraphics(void) kp_kitchensink[0] = W_CachePatchName("K_ITSINK", PU_HUDGFX); kp_sadface[0] = W_CachePatchName("K_ITSAD", PU_HUDGFX); + kp_flameshieldmeter_bg = W_CachePatchName("FSMBG001", PU_HUDGFX); + + sprintf(buffer, "FSMFGxxx"); + for (i = 0; i < 104; i++) + { + buffer[5] = '0'+((i+1)/100); + buffer[6] = '0'+(((i+1)/10)%10); + buffer[7] = '0'+((i+1)%10); + kp_flameshieldmeter[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } + // Splitscreen kp_itembg[2] = W_CachePatchName("K_ISBG", PU_HUDGFX); kp_itembg[3] = W_CachePatchName("K_ISBGD", PU_HUDGFX); @@ -8230,15 +8235,11 @@ static void K_drawKartItem(void) localbg = kp_itembg[offset+1]; break; case KITEM_BUBBLESHIELD: - localpatch = kp_bubbleshield[offset]; localbg = kp_itembg[offset+1]; break; case KITEM_FLAMESHIELD: - if (stplyr->kartstuff[k_flamedash] > (TICRATE*2) && (leveltime & 1)) - localpatch = kp_nodraw; - else - localpatch = kp_flameshield[offset]; + localpatch = kp_flameshield[offset]; localbg = kp_itembg[offset+1]; break; case KITEM_HYUDORO: @@ -8355,6 +8356,23 @@ static void K_drawKartItem(void) // Quick Eggman numbers if (stplyr->kartstuff[k_eggmanexplode] > 1 /*&& stplyr->kartstuff[k_eggmanexplode] <= 3*TICRATE*/) V_DrawScaledPatch(fx+17, fy+13-offset, V_HUDTRANS|fflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]); + + if (stplyr->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + { + INT32 flamemax = 16 * (TICRATE/4); + INT32 numframes = 104; + INT32 f = (stplyr->kartstuff[k_flamemeter] * numframes) / flamemax; + + if (f < 1) + f = 1; + if (f > numframes) + f = numframes; + + V_DrawScaledPatch(fx-6, fy-4, V_HUDTRANS|fflags, kp_flameshieldmeter_bg); + + if (stplyr->kartstuff[k_flamemeter] < flamemax) + V_DrawScaledPatch(fx-6, fy-4, V_HUDTRANS|fflags, kp_flameshieldmeter[f-1]); + } } void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UINT8 mode) From 9de1e535f2dbb6b1d95374f16311ab6415e3fc36 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 19 Mar 2020 01:35:31 -0400 Subject: [PATCH 36/65] More complete flame shield rework --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 130 +++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 106 insertions(+), 26 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 8414cd81d..c72c5df12 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -320,6 +320,7 @@ typedef enum k_bubbleblowup, // Bubble Shield usage blowup k_flamedash, // Flame Shield dash power k_flamemeter, // Flame Shield dash meter left + k_flamelength, // Flame Shield dash meter, number of segments k_eggmanheld, // Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items k_eggmanexplode, // Fake item recieved, explode in a few seconds k_eggmanblame, // Fake item recieved, who set this fake diff --git a/src/dehacked.c b/src/dehacked.c index 39744f7a0..3933a4207 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8530,6 +8530,7 @@ static const char *const KARTSTUFF_LIST[] = { "BUBBLEBLOWUP", "FLAMEDASH", "FLAMEMETER", + "FLAMELENGTH", "EGGMANHELD", "EGGMANEXPLODE", "EGGMANBLAME", diff --git a/src/k_kart.c b/src/k_kart.c index adbdf6836..ccce760fb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2283,7 +2283,10 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST((3*FRACUNIT)/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration if (player->kartstuff[k_flamedash]) // Flame Shield dash - ADDBOOST((3*FRACUNIT)/4, 6*FRACUNIT); // + 75% top speed, + 600% acceleration + { + fixed_t dashval = ((player->kartstuff[k_flamedash]<kartstuff[k_startboost]) // Startup Boost ADDBOOST(FRACUNIT/4, 6*FRACUNIT); // + 25% top speed, + 600% acceleration @@ -6283,6 +6286,23 @@ void K_StripOther(player_t *player) } } +static INT32 K_FlameShieldMax(player_t *player) +{ + UINT8 numplayers = 0; + UINT8 i; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (playeringame[i] && !players[i].spectator) + numplayers++; + } + + if (numplayers > 1) + return player->kartstuff[k_position] + 8; + else + return 16; // max when alone, for testing +} + // // K_MoveKartPlayer // @@ -6766,36 +6786,34 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (!HOLDING_ITEM && NO_HYUDORO) { - INT32 flamemax = 16 * (TICRATE/4); + INT32 flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { - if (player->kartstuff[k_flamemeter] > flamemax) - player->kartstuff[k_flamemeter] = flamemax; + if (player->kartstuff[k_flamemeter] < 0) + player->kartstuff[k_flamemeter] = 0; if (player->kartstuff[k_flamedash] == 0) K_PlayBoostTaunt(player->mo); player->kartstuff[k_flamedash] += 2; + player->kartstuff[k_flamemeter] += 2; - if (player->kartstuff[k_flamemeter] <= 0) + if (player->kartstuff[k_flamemeter] > flamemax) { K_FlameShieldPop(player->mo); - player->kartstuff[k_flamemeter] = flamemax; + player->kartstuff[k_flamemeter] = 0; + player->kartstuff[k_flamelength] = 0; player->kartstuff[k_holdready] = 0; player->kartstuff[k_itemamount]--; } - else - player->kartstuff[k_flamemeter] -= 2; } else { player->kartstuff[k_holdready] = 1; - if (player->kartstuff[k_flamemeter] > flamemax || player->kartstuff[k_flamemeter] == 0) - player->kartstuff[k_flamemeter] = flamemax; - else if (player->kartstuff[k_flamemeter] < flamemax) - player->kartstuff[k_flamemeter]++; + if (player->kartstuff[k_flamemeter] > 0) + player->kartstuff[k_flamemeter]--; } } break; @@ -6882,6 +6900,19 @@ void K_MoveKartPlayer(player_t *player, boolean onground) || player->kartstuff[k_growshrinktimer] < 0) indirectitemcooldown = 20*TICRATE; + if (player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + { + INT32 destlen = K_FlameShieldMax(player); + if (player->kartstuff[k_flamelength] > destlen) + player->kartstuff[k_flamelength]--; + else if (player->kartstuff[k_flamelength] < destlen) + player->kartstuff[k_flamelength]++; + } + else + { + player->kartstuff[k_flamelength] = 0; + } + if (player->kartstuff[k_hyudorotimer] > 0) { if (splitscreen) @@ -7457,8 +7488,8 @@ static patch_t *kp_check[6]; static patch_t *kp_eggnum[4]; -static patch_t *kp_flameshieldmeter[104]; -static patch_t *kp_flameshieldmeter_bg; +static patch_t *kp_flameshieldmeter[104][2]; +static patch_t *kp_flameshieldmeter_bg[16][2]; static patch_t *kp_fpview[3]; static patch_t *kp_inputwheel[5]; @@ -7668,15 +7699,21 @@ void K_LoadKartHUDGraphics(void) kp_kitchensink[0] = W_CachePatchName("K_ITSINK", PU_HUDGFX); kp_sadface[0] = W_CachePatchName("K_ITSAD", PU_HUDGFX); - kp_flameshieldmeter_bg = W_CachePatchName("FSMBG001", PU_HUDGFX); - sprintf(buffer, "FSMFGxxx"); for (i = 0; i < 104; i++) { buffer[5] = '0'+((i+1)/100); buffer[6] = '0'+(((i+1)/10)%10); buffer[7] = '0'+((i+1)%10); - kp_flameshieldmeter[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + kp_flameshieldmeter[i][0] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } + + sprintf(buffer, "FSMBG0xx"); + for (i = 0; i < 16; i++) + { + buffer[6] = '0'+((i+1)/10); + buffer[7] = '0'+((i+1)%10); + kp_flameshieldmeter_bg[i][0] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); } // Splitscreen @@ -7711,6 +7748,23 @@ void K_LoadKartHUDGraphics(void) kp_kitchensink[1] = W_CachePatchName("K_ISSINK", PU_HUDGFX); kp_sadface[1] = W_CachePatchName("K_ISSAD", PU_HUDGFX); + sprintf(buffer, "FSMFSxxx"); + for (i = 0; i < 104; i++) + { + buffer[5] = '0'+((i+1)/100); + buffer[6] = '0'+(((i+1)/10)%10); + buffer[7] = '0'+((i+1)%10); + kp_flameshieldmeter[i][1] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } + + sprintf(buffer, "FSMBS0xx"); + for (i = 0; i < 16; i++) + { + buffer[6] = '0'+((i+1)/10); + buffer[7] = '0'+((i+1)%10); + kp_flameshieldmeter_bg[i][1] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } + // CHECK indicators sprintf(buffer, "K_CHECKx"); for (i = 0; i < 6; i++) @@ -8359,19 +8413,43 @@ static void K_drawKartItem(void) if (stplyr->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) { - INT32 flamemax = 16 * (TICRATE/4); INT32 numframes = 104; - INT32 f = (stplyr->kartstuff[k_flamemeter] * numframes) / flamemax; + INT32 absolutemax = 16 * (TICRATE/4); + INT32 flamemax = stplyr->kartstuff[k_flamelength] * (TICRATE/4); + INT32 bf = 16 - (flamemax / (TICRATE/4)); + INT32 ff = numframes - ((stplyr->kartstuff[k_flamemeter] * numframes) / absolutemax); + INT32 xo = 6, yo = 4; + INT32 flip = 0; - if (f < 1) - f = 1; - if (f > numframes) - f = numframes; + if (offset) + { + xo++; - V_DrawScaledPatch(fx-6, fy-4, V_HUDTRANS|fflags, kp_flameshieldmeter_bg); + if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // Flip for P1 and P3 (yes, that's correct) + { + xo -= 62; + flip = V_FLIP; + } + } - if (stplyr->kartstuff[k_flamemeter] < flamemax) - V_DrawScaledPatch(fx-6, fy-4, V_HUDTRANS|fflags, kp_flameshieldmeter[f-1]); + if (ff < 0) {ff = 0;} + if (ff > numframes-1) {ff = numframes-1;} + + if (flamemax > 0) + V_DrawScaledPatch(fx-xo, fy-yo, V_HUDTRANS|fflags|flip, kp_flameshieldmeter_bg[bf][offset]); + + if (stplyr->kartstuff[k_flamemeter] > 0) + { + if (stplyr->kartstuff[k_flamemeter] > (flamemax - (TICRATE/2)) && (leveltime & 1)) + { + UINT8 *fsflash = R_GetTranslationColormap(TC_BLINK, SKINCOLOR_WHITE, GTC_CACHE); + V_DrawMappedPatch(fx-xo, fy-yo, V_HUDTRANS|fflags|flip, kp_flameshieldmeter[ff][offset], fsflash); + } + else + { + V_DrawScaledPatch(fx-xo, fy-yo, V_HUDTRANS|fflags|flip, kp_flameshieldmeter[ff][offset]); + } + } } } From f8d5a5bdf1b926dfc0eeb9ad069643f4d084090c Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 19 Mar 2020 02:12:09 -0400 Subject: [PATCH 37/65] Copy boost smoke effect but bigger --- src/k_kart.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ccce760fb..bae1e6717 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3940,24 +3940,21 @@ static void K_DoThunderShield(player_t *player) static void K_FlameShieldPop(mobj_t *src) { - mobj_t *smoke; UINT8 i; - //S_StartSound(src, sfx_zio3); - - // spawn vertical bolt - for (i = 0; i < 8; i++) + for (i = 0; i < 2; i++) { - smoke = P_SpawnMobj(src->x, src->y, src->z, MT_SMOKE); - P_SetMobjState(smoke, S_OPAQUESMOKE1); - P_SetScale(smoke, 2*smoke->scale); - smoke->destscale = 8*smoke->scale; - smoke->angle = FixedAngle((i*45)<fuse = P_RandomRange(20, 50); - smoke->momx = src->momx; - smoke->momy = src->momy; - smoke->momz = src->momz + (P_RandomRange(1,4) * smoke->scale); - P_Thrust(smoke, smoke->angle, (P_RandomRange(1,2) * smoke->scale)); + mobj_t *smoke = P_SpawnMobj(src->x, src->y, src->z+(8<scale); + smoke->destscale = 3*src->scale/2; + smoke->scalespeed = src->scale/12; + + smoke->momx = src->momx/2; + smoke->momy = src->momy/2; + smoke->momz = src->momz/2; + + P_Thrust(smoke, src->angle + FixedAngle(P_RandomRange(135, 225)<scale); } } From 6969c833c2a53cf9658a7f0c283eaca4ca4891f9 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 19 Mar 2020 02:17:12 -0400 Subject: [PATCH 38/65] Add more momentum variation --- src/k_kart.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index bae1e6717..d3b213524 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3950,11 +3950,12 @@ static void K_FlameShieldPop(mobj_t *src) smoke->destscale = 3*src->scale/2; smoke->scalespeed = src->scale/12; - smoke->momx = src->momx/2; - smoke->momy = src->momy/2; - smoke->momz = src->momz/2; + smoke->momx = 3*src->momx/4; + smoke->momy = 3*src->momy/4; + smoke->momz = 3*src->momz/4; P_Thrust(smoke, src->angle + FixedAngle(P_RandomRange(135, 225)<scale); + smoke->momz += P_RandomRange(0, 4) * src->scale; } } From ac8717b981bcf436d5ac76faa5cef48b49daf9cf Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 19 Mar 2020 20:17:25 -0400 Subject: [PATCH 39/65] Make flame gauge placeholder behavior proportional to player count --- src/k_kart.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index d3b213524..bd93dcd3e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6295,10 +6295,12 @@ static INT32 K_FlameShieldMax(player_t *player) numplayers++; } - if (numplayers > 1) - return player->kartstuff[k_position] + 8; - else + if (numplayers <= 1) return 16; // max when alone, for testing + else if (player->kartstuff[k_position] == 1) + return 1; // minimum for first + else + return (player->kartstuff[k_position] * 16) / numplayers; } // From 9a1c013cfc2c3134df583634273ce3cbcc9fda2d Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 19 Mar 2020 20:23:00 -0400 Subject: [PATCH 40/65] Add basic sound effect --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index bd93dcd3e..aa2511ad0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6794,7 +6794,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_flamemeter] = 0; if (player->kartstuff[k_flamedash] == 0) + { + S_StartSound(player->mo, sfx_s3k43); K_PlayBoostTaunt(player->mo); + } player->kartstuff[k_flamedash] += 2; player->kartstuff[k_flamemeter] += 2; From 86edea91d47408b462205da35538ef0abf1333db Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Fri, 20 Mar 2020 00:27:31 -0400 Subject: [PATCH 41/65] Scale thrown items with grow/shrink --- src/k_kart.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index aa2511ad0..a81aaf4ed 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3135,7 +3135,6 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I th = P_SpawnMobj(x, y, z, type); th->flags2 |= flags2; - th->threshold = 10; if (th->info->seesound) @@ -3143,6 +3142,9 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I P_SetTarget(&th->target, source); + P_SetScale(th, source->scale); + th->destscale = source->destscale; + if (P_IsObjectOnGround(source)) { // floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn @@ -3802,6 +3804,9 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map mo->threshold = 10; P_SetTarget(&mo->target, player->mo); + P_SetScale(mo, player->mo->scale); + mo->destscale = player->mo->destscale; + if (P_IsObjectOnGround(player->mo)) { // floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn From e83e162463600fd51bf97519101a75729182113c Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Fri, 20 Mar 2020 00:30:50 -0400 Subject: [PATCH 42/65] Thrust when you extinguish flame shield --- src/k_kart.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/k_kart.c b/src/k_kart.c index a81aaf4ed..74c41d5a9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6810,6 +6810,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_flamemeter] > flamemax) { K_FlameShieldPop(player->mo); + P_Thrust(player->mo, R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), player->speed); player->kartstuff[k_flamemeter] = 0; player->kartstuff[k_flamelength] = 0; player->kartstuff[k_holdready] = 0; From 2ccc3894e24ad62e87dfabf6446bd67c7f8b2d72 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Fri, 20 Mar 2020 00:35:18 -0400 Subject: [PATCH 43/65] Make size differences impact bump knockback more --- 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 74c41d5a9..d5bffd9b4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1296,7 +1296,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) static fixed_t K_PlayerWeight(mobj_t *mobj, mobj_t *against) { - fixed_t weight = 5*mobj->scale; + fixed_t weight = 5*FRACUNIT; if (!mobj->player) return weight; @@ -1309,11 +1309,11 @@ static fixed_t K_PlayerWeight(mobj_t *mobj, mobj_t *against) } else { - weight = (mobj->player->kartweight) * mobj->scale; + weight = (mobj->player->kartweight) * FRACUNIT; if (mobj->player->speed > K_GetKartSpeed(mobj->player, false)) weight += (mobj->player->speed - K_GetKartSpeed(mobj->player, false))/8; if (mobj->player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD) - weight += 9*mobj->scale; + weight += 9*FRACUNIT; } return weight; @@ -1321,7 +1321,7 @@ static fixed_t K_PlayerWeight(mobj_t *mobj, mobj_t *against) static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) { - fixed_t weight = 5*mobj->scale; + fixed_t weight = 5*FRACUNIT; switch (mobj->type) { @@ -1351,15 +1351,15 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) case MT_JAWZ_DUD: case MT_JAWZ_SHIELD: if (against->player) - weight = K_PlayerWeight(against, NULL) + (3*against->scale); + weight = K_PlayerWeight(against, NULL) + (3*FRACUNIT); else - weight += 3*mobj->scale; + weight += 3*FRACUNIT; break; default: break; } - return weight; + return FixedMul(weight, mobj->scale); } // This kind of wipeout happens with no rings -- doesn't remove a bumper, has no invulnerability, and is much shorter. From 46364422d99c5299a86a3b0b934e71737bdc0212 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 21 Mar 2020 05:58:42 -0400 Subject: [PATCH 44/65] Real dumb bug --- 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 d5bffd9b4..d412b89cb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3974,7 +3974,7 @@ static void K_DoHyudoroSteal(player_t *player) INT32 hyu = hyudorotime; if (G_RaceGametype()) - hyu = (hyu<<1); // double in race + hyu *= 2; // double in race for (i = 0; i < MAXPLAYERS; i++) { @@ -4001,7 +4001,7 @@ static void K_DoHyudoroSteal(player_t *player) if (sink && numplayers > 0 && cv_kitchensink.value) // BEHOLD THE KITCHEN SINK { - player->kartstuff[k_hyudorotimer] = hyudorotime; + player->kartstuff[k_hyudorotimer] = hyu; player->kartstuff[k_stealingtimer] = stealtime; player->kartstuff[k_itemtype] = KITEM_KITCHENSINK; @@ -4011,7 +4011,7 @@ static void K_DoHyudoroSteal(player_t *player) } else if ((G_RaceGametype() && player->kartstuff[k_position] == 1) || numplayers == 0) // No-one can be stolen from? Oh well... { - player->kartstuff[k_hyudorotimer] = hyudorotime; + player->kartstuff[k_hyudorotimer] = hyu; player->kartstuff[k_stealingtimer] = stealtime; return; } @@ -4026,7 +4026,7 @@ static void K_DoHyudoroSteal(player_t *player) if (stealplayer > -1) // Now here's where we do the stealing, has to be done here because we still know the player we're stealing from { - player->kartstuff[k_hyudorotimer] = hyudorotime; + player->kartstuff[k_hyudorotimer] = hyu; player->kartstuff[k_stealingtimer] = stealtime; players[stealplayer].kartstuff[k_stolentimer] = stealtime; From 013aa22c16e15257de533f28e58531657b141d67 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 22 Mar 2020 17:53:11 -0400 Subject: [PATCH 45/65] Minor item calculation fixes --- src/k_kart.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 93bfe32e6..3a416161e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -930,14 +930,25 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp POWERITEMODDS(newodds); break; case KITEM_SPB: - if ((indirectitemcooldown > 0) || (secondist/DISTVAR < 3) - || (first != -1 && players[first].distancetofinish > 8*DISTVAR)) // No SPB near the end of the race + if ((indirectitemcooldown > 0) || COOLDOWNONSTART + || (first != -1 && players[first].distancetofinish < 8*DISTVAR)) // No SPB near the end of the race + { newodds = 0; + } else - newodds *= min((secondist/DISTVAR)-4, 3); // POWERITEMODDS(newodds); + { + INT32 multiplier = (secondist - (4*DISTVAR)) / DISTVAR; + + if (multiplier < 0) + multiplier = 0; + if (multiplier > 3) + multiplier = 3; + + newodds *= multiplier; + } break; case KITEM_SHRINK: - if ((indirectitemcooldown > 0) || (pingame-1 <= pexiting) || COOLDOWNONSTART) + if ((indirectitemcooldown > 0) || COOLDOWNONSTART || (pingame-1 <= pexiting)) newodds = 0; else POWERITEMODDS(newodds); @@ -1135,7 +1146,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) } if (mapobjectscale != FRACUNIT) - pdis = FixedDiv(pdis, mapobjectscale); + pdis = FixedDiv(pdis * FRACUNIT, mapobjectscale); if (franticitems) // Frantic items make the distances between everyone artifically higher, for crazier items pdis = (15 * pdis) / 14; From 9379202dc4c603d76fcb0ce4f6b8f98801530881 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 22 Mar 2020 20:52:20 -0400 Subject: [PATCH 46/65] Dumb mistake --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 75440a28b..57a308e58 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1135,7 +1135,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) } if (mapobjectscale != FRACUNIT) - pdis = FixedDiv(pdis * FRACUNIT, mapobjectscale); + pdis = FixedDiv(pdis * FRACUNIT, mapobjectscale) / FRACUNIT; if (franticitems) // Frantic items make the distances between everyone artifically higher, for crazier items pdis = (15 * pdis) / 14; From 8a5d00d1c7a511396af89fe28db43114d3892023 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 22 Mar 2020 20:52:54 -0400 Subject: [PATCH 47/65] Increase distance for natural spb --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 57a308e58..f799634d7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -926,7 +926,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean sp } else { - INT32 multiplier = (secondist - (4*DISTVAR)) / DISTVAR; + INT32 multiplier = (secondist - (5*DISTVAR)) / DISTVAR; if (multiplier < 0) multiplier = 0; From 227a4dcbd3fb26ba2e1f39101f936e89b8f785bb Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 22 Mar 2020 22:01:40 -0400 Subject: [PATCH 48/65] Flame Shield improvin's --- src/k_kart.c | 21 +++++++++++++++++---- src/sounds.c | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index f799634d7..ba81fd80a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7068,6 +7068,7 @@ void K_StripOther(player_t *player) static INT32 K_FlameShieldMax(player_t *player) { + UINT32 disttofinish = 0; UINT8 numplayers = 0; UINT8 i; @@ -7075,14 +7076,22 @@ static INT32 K_FlameShieldMax(player_t *player) { if (playeringame[i] && !players[i].spectator) numplayers++; + if (players[i].kartstuff[k_position] == 1) + disttofinish = players[i].distancetofinish; } if (numplayers <= 1) + { return 16; // max when alone, for testing + } else if (player->kartstuff[k_position] == 1) - return 1; // minimum for first - else - return (player->kartstuff[k_position] * 16) / numplayers; + { + return 0; // minimum for first + } + + disttofinish = player->distancetofinish - disttofinish; + + return 1 + (disttofinish / (DISTVAR*2)); } // @@ -7588,7 +7597,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_flamemeter] > flamemax) { K_FlameShieldPop(player->mo); - P_Thrust(player->mo, R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), player->speed); + P_Thrust( + player->mo, + R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), + 20 * K_GetKartGameSpeedScalar(gamespeed) + ); player->kartstuff[k_flamemeter] = 0; player->kartstuff[k_flamelength] = 0; player->kartstuff[k_holdready] = 0; diff --git a/src/sounds.c b/src/sounds.c index f5fd3cb6d..b64dda5cb 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -413,7 +413,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3k40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Thunder Shield spawned {"s3k42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s3k43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s3k43", false, 96, 48, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k44", false, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Bubble Shield reflect {"s3k45", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, From e5a59c28d1ce677ee46dc2c113b77319c6ee4aa0 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 22 Mar 2020 22:09:32 -0400 Subject: [PATCH 49/65] Use smaller value --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index ba81fd80a..1c39f3a39 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7091,7 +7091,7 @@ static INT32 K_FlameShieldMax(player_t *player) disttofinish = player->distancetofinish - disttofinish; - return 1 + (disttofinish / (DISTVAR*2)); + return min(16, 1 + (disttofinish / DISTVAR)); } // From 4e63b39ccb74172de4887fccd4966140b38b5005 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 22 Mar 2020 23:27:27 -0400 Subject: [PATCH 50/65] Firery shield --- src/k_kart.c | 55 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1c39f3a39..c4b66f721 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4324,7 +4324,7 @@ static void K_DoThunderShield(player_t *player) #undef THUNDERRADIUS -static void K_FlameShieldPop(mobj_t *src) +static void K_FlameDashLeftoverSmoke(mobj_t *src) { UINT8 i; @@ -4682,7 +4682,6 @@ void K_DropHnextList(player_t *player) } else if (player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) { - K_FlameShieldPop(player->mo); player->kartstuff[k_itemtype] = KITEM_NONE; player->kartstuff[k_itemamount] = 0; player->kartstuff[k_curshield] = KSHIELD_NONE; @@ -6187,7 +6186,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD || player->exiting) { if (player->kartstuff[k_flamedash]) - K_FlameShieldPop(player->mo); + K_FlameDashLeftoverSmoke(player->mo); } if (player->kartstuff[k_comebacktimer]) @@ -7578,7 +7577,16 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (!HOLDING_ITEM && NO_HYUDORO) { - INT32 flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); + INT32 destlen = K_FlameShieldMax(player); + INT32 flamemax = 0; + + if (player->kartstuff[k_flamelength] < destlen) + player->kartstuff[k_flamelength]++; // Can always go up! + + flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); + + if (flamemax > 0) + flamemax += (TICRATE/4); if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { @@ -7596,12 +7604,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_flamemeter] > flamemax) { - K_FlameShieldPop(player->mo); P_Thrust( - player->mo, - R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), - 20 * K_GetKartGameSpeedScalar(gamespeed) + player->mo, player->mo->angle, + FixedMul((50*mapobjectscale), K_GetKartGameSpeedScalar(gamespeed)) ); + player->kartstuff[k_flamemeter] = 0; player->kartstuff[k_flamelength] = 0; player->kartstuff[k_holdready] = 0; @@ -7614,6 +7621,18 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_flamemeter] > 0) player->kartstuff[k_flamemeter]--; + + if (player->kartstuff[k_flamelength] > destlen) + { + player->kartstuff[k_flamelength]--; // Can ONLY go down if you're not using it + + flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); + if (flamemax > 0) + flamemax += (TICRATE/4); + } + + if (player->kartstuff[k_flamemeter] > flamemax) + player->kartstuff[k_flamemeter] = flamemax; } } break; @@ -7700,15 +7719,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) || player->kartstuff[k_growshrinktimer] < 0) indirectitemcooldown = 20*TICRATE; - if (player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) - { - INT32 destlen = K_FlameShieldMax(player); - if (player->kartstuff[k_flamelength] > destlen) - player->kartstuff[k_flamelength]--; - else if (player->kartstuff[k_flamelength] < destlen) - player->kartstuff[k_flamelength]++; - } - else + if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD) { player->kartstuff[k_flamelength] = 0; } @@ -9047,6 +9058,7 @@ static void K_drawKartItem(void) INT32 numframes = 104; INT32 absolutemax = 16 * (TICRATE/4); INT32 flamemax = stplyr->kartstuff[k_flamelength] * (TICRATE/4); + INT32 flen = 1; INT32 bf = 16 - (flamemax / (TICRATE/4)); INT32 ff = numframes - ((stplyr->kartstuff[k_flamemeter] * numframes) / absolutemax); INT32 xo = 6, yo = 4; @@ -9063,15 +9075,20 @@ static void K_drawKartItem(void) } } + if (stplyr->kartstuff[k_flamelength] > 0) + { + flen = (numframes * 16) / stplyr->kartstuff[k_flamelength]; + } + if (ff < 0) {ff = 0;} - if (ff > numframes-1) {ff = numframes-1;} + if (ff > flen-1) {ff = flen-1;} if (flamemax > 0) V_DrawScaledPatch(fx-xo, fy-yo, V_HUDTRANS|fflags|flip, kp_flameshieldmeter_bg[bf][offset]); if (stplyr->kartstuff[k_flamemeter] > 0) { - if (stplyr->kartstuff[k_flamemeter] > (flamemax - (TICRATE/2)) && (leveltime & 1)) + if (stplyr->kartstuff[k_flamemeter] > (flamemax - (TICRATE/4)) && (leveltime & 1)) { UINT8 *fsflash = R_GetTranslationColormap(TC_BLINK, SKINCOLOR_WHITE, GTC_CACHE); V_DrawMappedPatch(fx-xo, fy-yo, V_HUDTRANS|fflags|flip, kp_flameshieldmeter[ff][offset], fsflash); From 88709aafaa2ba7080021e90e3ae25ba9fb608c5a Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Tue, 24 Mar 2020 12:55:48 -0400 Subject: [PATCH 51/65] Fix eggman items having no collision --- src/k_collide.c | 4 +++- src/p_inter.c | 4 +--- src/p_map.c | 10 ++++------ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 7edbe3e87..bbd5c2974 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -183,7 +183,9 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2) if (t2->type == MT_RANDOMITEM || t2->type == MT_EGGMANITEM) P_InstaThrust(t1, R_PointToAngle2(t2->x, t2->y, t1->x, t1->y), t2->radius/4); - // Player collision is handled by TouchSpecial + if (t1->type == MT_EGGMANITEM && t2->player) + P_TouchSpecialThing(t1, t2, false); + return true; } diff --git a/src/p_inter.c b/src/p_inter.c index b729fde8d..6d1051e82 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -117,9 +117,7 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon) if (weapon == 2) { // Invulnerable - if (player->powers[pw_flashing] > 0 - || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2) - || player->kartstuff[k_squishedtimer] > 0) + if (player->powers[pw_flashing] > 0) return false; // Already have fake diff --git a/src/p_map.c b/src/p_map.c index a57c4da31..262017570 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -841,7 +841,7 @@ static boolean PIT_CheckThing(mobj_t *thing) return K_SMKIceBlockCollide(thing, tmthing); } - if (tmthing->type == MT_EGGMANITEM) + if (tmthing->type == MT_EGGMANITEM || tmthing->type == MT_EGGMANITEM_SHIELD) { // see if it went over / under if (tmthing->z > thing->z + thing->height) @@ -849,10 +849,9 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->z + tmthing->height < thing->z) return true; // underneath - K_EggItemCollide(tmthing, thing); - return true; + return K_EggItemCollide(tmthing, thing); } - else if (thing->type == MT_EGGMANITEM) + else if (thing->type == MT_EGGMANITEM || thing->type == MT_EGGMANITEM_SHIELD) { // see if it went over / under if (tmthing->z > thing->z + thing->height) @@ -860,8 +859,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (tmthing->z + tmthing->height < thing->z) return true; // underneath - K_EggItemCollide(thing, tmthing); - return true; + return K_EggItemCollide(thing, tmthing); } if (tmthing->type == MT_RANDOMITEM) From 505b0176c0bb67412a9e4afb250f9fd8738ce1e7 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 25 Mar 2020 22:30:52 -0400 Subject: [PATCH 52/65] Horizon line apply to FOFs backport --- src/hardware/hw_main.c | 2 +- src/r_defs.h | 2 ++ src/r_segs.c | 23 +++++++++++++++++------ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b7675a21b..01cc9b01f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -2023,7 +2023,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) // Single sided line... Deal only with the middletexture (if one exists) gr_midtexture = R_GetTextureNum(gr_sidedef->midtexture); if (gr_midtexture - && gr_linedef->special != 41) // Ignore horizon line for OGL + && gr_linedef->special != HORIZONSPECIAL) // Ignore horizon line for OGL { { fixed_t texturevpeg; diff --git a/src/r_defs.h b/src/r_defs.h index 52a3be80e..c8a72044d 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -406,6 +406,8 @@ typedef enum ST_NEGATIVE } slopetype_t; +#define HORIZONSPECIAL 41 + typedef struct line_s { // Vertices, from v1 to v2. diff --git a/src/r_segs.c b/src/r_segs.c index 399f514bc..2304540fe 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -2687,7 +2687,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) worldbottomslope >>= 4; #endif - if (linedef->special == 41) { // HORIZON LINES + if (linedef->special == HORIZONSPECIAL) { // HORIZON LINES topstep = bottomstep = 0; topfrac = bottomfrac = (centeryfrac>>4); topfrac++; // Prevent 1px HOM @@ -2817,12 +2817,23 @@ void R_StoreWallRange(INT32 start, INT32 stop) ffloor[i].f_pos >>= 4; #ifdef ESLOPE ffloor[i].f_pos_slope >>= 4; - ffloor[i].f_frac = (centeryfrac>>4) - FixedMul(ffloor[i].f_pos, rw_scale); - ffloor[i].f_step = ((centeryfrac>>4) - FixedMul(ffloor[i].f_pos_slope, ds_p->scale2) - ffloor[i].f_frac)/(range); -#else - ffloor[i].f_step = FixedMul(-rw_scalestep, ffloor[i].f_pos); - ffloor[i].f_frac = (centeryfrac>>4) - FixedMul(ffloor[i].f_pos, rw_scale); #endif + if (linedef->special == HORIZONSPECIAL) // Horizon lines extend FOFs in contact with them too. + { + ffloor[i].f_step = 0; + ffloor[i].f_frac = (centeryfrac>>4); + topfrac++; // Prevent 1px HOM + } + else + { +#ifdef ESLOPE + ffloor[i].f_frac = (centeryfrac>>4) - FixedMul(ffloor[i].f_pos, rw_scale); + ffloor[i].f_step = ((centeryfrac>>4) - FixedMul(ffloor[i].f_pos_slope, ds_p->scale2) - ffloor[i].f_frac)/(range); +#else + ffloor[i].f_step = FixedMul(-rw_scalestep, ffloor[i].f_pos); + ffloor[i].f_frac = (centeryfrac>>4) - FixedMul(ffloor[i].f_pos, rw_scale); +#endif + } } } From 81fa5d7f513c0b52cc5f792563ab834cdf79922e Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 25 Mar 2020 23:49:39 -0400 Subject: [PATCH 53/65] Start on new flame shield dash visuals --- src/dehacked.c | 13 ++++++++++++- src/info.c | 14 ++++++++++++-- src/info.h | 15 ++++++++++++++- src/p_enemy.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/p_mobj.c | 10 ++++------ 5 files changed, 86 insertions(+), 10 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index e6508721e..da740a7a9 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1887,6 +1887,7 @@ static actionpointer_t actionpointers[] = {{A_ReaperThinker}, "A_REAPERTHINKER"}, //SRB2kart {{A_MementosTPParticles}, "A_MEMENTOSTPPARTICLES"}, //SRB2kart {{A_FlameParticle}, "A_FLAMEPARTICLE"}, // SRB2kart + {{A_FlameShieldPaper}, "A_FLAMESHIELDPAPER"}, // SRB2kart {{A_OrbitNights}, "A_ORBITNIGHTS"}, {{A_GhostMe}, "A_GHOSTME"}, {{A_SetObjectState}, "A_SETOBJECTSTATE"}, @@ -6700,7 +6701,17 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_FLAMESHIELD16", "S_FLAMESHIELD17", "S_FLAMESHIELD18", - "S_FLAMESHIELDDASH", + + "S_FLAMESHIELDDASH1", + "S_FLAMESHIELDDASH2", + "S_FLAMESHIELDDASH3", + "S_FLAMESHIELDDASH4", + "S_FLAMESHIELDDASH5", + "S_FLAMESHIELDDASH6", + "S_FLAMESHIELDDASH7", + "S_FLAMESHIELDDASH8", + + "S_FLAMESHIELDPAPER", // The legend "S_SINK", diff --git a/src/info.c b/src/info.c index 11f669535..2c3399608 100644 --- a/src/info.c +++ b/src/info.c @@ -58,7 +58,7 @@ char sprnames[NUMSPRITES + 1][5] = //SRB2kart Sprites "RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE","KINV","KINF", "WIPD","DRIF","BDRF","DUST","DRWS","RSHE","FITM","BANA","ORBN","JAWZ","SSMN", - "KRBM","BHOG","BHBM","SPBM","THNS","BUBS","BWVE","FLMS","SINK","SITR", + "KRBM","BHOG","BHBM","SPBM","THNS","BUBS","BWVE","FLMS","FLMD","FLMP","SINK","SITR", "KBLN","DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB", "CHOM","SACO","CRAB","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA", "ISTB","ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1","HIT2", @@ -2918,7 +2918,17 @@ state_t states[NUMSTATES] = {SPR_FLMS, FF_FULLBRIGHT|16, 2, {NULL}, 0, 0, S_FLAMESHIELD17}, // S_FLAMESHIELD16 {SPR_FLMS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_FLAMESHIELD18}, // S_FLAMESHIELD17 {SPR_FLMS, FF_FULLBRIGHT|17, 2, {NULL}, 0, 0, S_FLAMESHIELD1}, // S_FLAMESHIELD18 - {SPR_FLMS, FF_FULLBRIGHT|18, -1, {NULL}, 0, 0, S_FLAMESHIELDDASH}, // S_FLAMESHIELDDASH + + {SPR_FLMD, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH2}, // S_FLAMESHIELDDASH1 + {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 0, 2, S_FLAMESHIELDDASH3}, // S_FLAMESHIELDDASH2 + {SPR_FLMD, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH4}, // S_FLAMESHIELDDASH3 + {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 1, 3, S_FLAMESHIELDDASH5}, // S_FLAMESHIELDDASH4 + {SPR_FLMD, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH6}, // S_FLAMESHIELDDASH5 + {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 2, 0, S_FLAMESHIELDDASH7}, // S_FLAMESHIELDDASH6 + {SPR_FLMD, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH8}, // S_FLAMESHIELDDASH7 + {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 3, 1, S_FLAMESHIELDDASH1}, // S_FLAMESHIELDDASH8 + + {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER {SPR_SINK, 0, 1, {A_SmokeTrailer}, MT_SINKTRAIL, 0, S_SINK}, // S_SINK {SPR_SINK, 0|FF_TRANS80|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_SINK_SHIELD}, // S_SINK_SHIELD diff --git a/src/info.h b/src/info.h index a51984ad2..5c9a3de51 100644 --- a/src/info.h +++ b/src/info.h @@ -177,6 +177,7 @@ void A_MayonakaArrow(); //SRB2kart: midnight channel arrow sign void A_ReaperThinker(); //SRB2kart: mementos reaper void A_MementosTPParticles(); //SRB2kart: mementos teleporter particles. Man that's a lot of actions for my shite. void A_FlameParticle(); // SRB2kart +void A_FlameShieldPaper(); void A_OrbitNights(); void A_GhostMe(); void A_SetObjectState(); @@ -625,6 +626,8 @@ typedef enum sprite SPR_BUBS, // Bubble Shield (not Bubs) SPR_BWVE, // Bubble Shield waves SPR_FLMS, // Flame Shield + SPR_FLMD, // Flame Shield dash + SPR_FLMP, // Flame Shield paper sprites SPR_SINK, // Kitchen Sink SPR_SITR, // Kitchen Sink Trail SPR_KBLN, // Battle Mode Bumper @@ -3595,7 +3598,17 @@ typedef enum state S_FLAMESHIELD16, S_FLAMESHIELD17, S_FLAMESHIELD18, - S_FLAMESHIELDDASH, + + S_FLAMESHIELDDASH1, + S_FLAMESHIELDDASH2, + S_FLAMESHIELDDASH3, + S_FLAMESHIELDDASH4, + S_FLAMESHIELDDASH5, + S_FLAMESHIELDDASH6, + S_FLAMESHIELDDASH7, + S_FLAMESHIELDDASH8, + + S_FLAMESHIELDPAPER, // The legend S_SINK, diff --git a/src/p_enemy.c b/src/p_enemy.c index 444840e79..d2931d17e 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -203,6 +203,7 @@ void A_MayonakaArrow(mobj_t *actor); //SRB2kart void A_ReaperThinker(mobj_t *actor); //SRB2kart void A_MementosTPParticles(mobj_t *actor); //SRB2kart void A_FlameParticle(mobj_t *actor); // SRB2kart +void A_FlameShieldPaper(mobj_t *actor); // SRB2kart void A_OrbitNights(mobj_t *actor); void A_GhostMe(mobj_t *actor); void A_SetObjectState(mobj_t *actor); @@ -9328,6 +9329,49 @@ void A_FlameParticle(mobj_t *actor) par->momz = actor->scale<<1; } +void A_FlameShieldPaper(mobj_t *actor) +{ + INT32 framea = 0; + INT32 frameb = 0; + INT32 locvar1 = var1; + INT32 locvar2 = var2; + UINT8 i; + +#ifdef HAVE_BLUA + if (LUA_CallAction("A_FlameShieldPaper", actor)) + return; +#endif + + framea = (locvar1 & FF_FRAMEMASK); + frameb = (locvar2 & FF_FRAMEMASK); + + for (i = 0; i < 2; i++) + { + INT32 perpendicular = ((i & 1) ? -ANGLE_90 : ANGLE_90); + fixed_t newx = actor->x + P_ReturnThrustX(NULL, actor->angle + perpendicular, 8*actor->scale); + fixed_t newy = actor->y + P_ReturnThrustY(NULL, actor->angle + perpendicular, 8*actor->scale); + mobj_t *paper = P_SpawnMobj(newx + actor->momx, newy + actor->momy, actor->z + actor->momz, MT_THOK); + + P_SetScale(paper, actor->scale); + paper->destscale = actor->destscale; + + P_SetMobjState(paper, S_FLAMESHIELDPAPER); + paper->frame &= ~FF_FRAMEMASK; + + paper->angle = actor->angle + ANGLE_45; + + if (i & 1) + { + paper->angle -= ANGLE_90; + paper->frame |= frameb; + } + else + { + paper->frame |= framea; + } + } +} + //} // Function: A_OrbitNights diff --git a/src/p_mobj.c b/src/p_mobj.c index 25acd0c89..773ed3709 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8603,15 +8603,13 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_flamedash]) { - if (curstate != S_FLAMESHIELDDASH) - P_SetMobjState(mobj, S_FLAMESHIELDDASH); - mobj->flags2 ^= MF2_DONTDRAW; + if (!(curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH8)) + P_SetMobjState(mobj, S_FLAMESHIELDDASH1); } else { - if (curstate == S_FLAMESHIELDDASH) + if (curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH8) P_SetMobjState(mobj, S_FLAMESHIELD1); - mobj->flags2 &= ~MF2_DONTDRAW; } if (!splitscreen /*&& rendermode != render_soft*/) @@ -8625,7 +8623,7 @@ void P_MobjThinker(mobj_t *mobj) else viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y); - if (curstate >= S_FLAMESHIELD1 && curstate < S_FLAMESHIELDDASH && ((curstate-S_FLAMESHIELD1) & 1)) + if (curstate >= S_FLAMESHIELD1 && curstate < S_FLAMESHIELDDASH1 && ((curstate-S_FLAMESHIELD1) & 1)) viewingangle += ANGLE_180; destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4); From 46209a96cfeb76c00b4c56ad10b0613266775b5c Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 25 Mar 2020 23:52:45 -0400 Subject: [PATCH 54/65] Double leniency period --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index c4b66f721..8cb2a472e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7586,7 +7586,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); if (flamemax > 0) - flamemax += (TICRATE/4); + flamemax += (TICRATE/2); if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { @@ -7628,7 +7628,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); if (flamemax > 0) - flamemax += (TICRATE/4); + flamemax += (TICRATE/2); } if (player->kartstuff[k_flamemeter] > flamemax) From 6333dc47370641268bb852a4d891e06f3f95903a Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 26 Mar 2020 00:07:03 -0400 Subject: [PATCH 55/65] Thrust slightly when used in the air --- src/k_kart.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8cb2a472e..0ce0276e3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7602,11 +7602,19 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_flamedash] += 2; player->kartstuff[k_flamemeter] += 2; + if (!onground) + { + P_Thrust( + player->mo, R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), + FixedMul(player->mo->scale, K_GetKartGameSpeedScalar(gamespeed)) + ); + } + if (player->kartstuff[k_flamemeter] > flamemax) { P_Thrust( player->mo, player->mo->angle, - FixedMul((50*mapobjectscale), K_GetKartGameSpeedScalar(gamespeed)) + FixedMul((50*player->mo->scale), K_GetKartGameSpeedScalar(gamespeed)) ); player->kartstuff[k_flamemeter] = 0; From 985aa44c95caffdfc02b322618fa01f9882f9dd3 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 26 Mar 2020 00:47:03 -0400 Subject: [PATCH 56/65] Flame shield destroys items while being used --- src/k_collide.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index bbd5c2974..8cdbe14f4 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -36,10 +36,18 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) if (t2->player->kartstuff[k_hyudorotimer]) return true; // no interaction - // Player Damage - P_DamageMobj(t2, t1, t1->target, 1); - K_KartBouncing(t2, t1, false, false); - S_StartSound(t2, sfx_s3k7b); + if (t2->player->kartstuff[k_flamedash] && t2->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + { + // Melt item + S_StartSound(t2, sfx_s3k43); + } + else + { + // Player Damage + P_DamageMobj(t2, t1, t1->target, 1); + K_KartBouncing(t2, t1, false, false); + S_StartSound(t2, sfx_s3k7b); + } damageitem = true; } @@ -126,8 +134,16 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2) if (t1->type == MT_BANANA && t1->health > 1) S_StartSound(t2, sfx_bsnipe); - // Player Damage - K_SpinPlayer(t2->player, t1->target, 0, t1, (t1->type == MT_BANANA || t1->type == MT_BANANA_SHIELD)); + if (t2->player->kartstuff[k_flamedash] && t2->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + { + // Melt item + S_StartSound(t2, sfx_s3k43); + } + else + { + // Player Damage + K_SpinPlayer(t2->player, t1->target, 0, t1, (t1->type == MT_BANANA || t1->type == MT_BANANA_SHIELD)); + } damageitem = true; } From b6c282ec12f005d28e4a140523e701b1adabe273 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 26 Mar 2020 00:47:30 -0400 Subject: [PATCH 57/65] Move Eggman item code to k_collide --- src/info.c | 4 +-- src/k_collide.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++-- src/p_inter.c | 52 -------------------------------------- 3 files changed, 66 insertions(+), 56 deletions(-) diff --git a/src/info.c b/src/info.c index 2c3399608..264fd8778 100644 --- a/src/info.c +++ b/src/info.c @@ -15646,7 +15646,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_cdfm28, // activesound - MF_SPECIAL|MF_BOUNCE|MF_SHOOTABLE|MF_DONTENCOREMAP, // flags + MF_BOUNCE|MF_SHOOTABLE|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, @@ -15673,7 +15673,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_SPECIAL|MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, diff --git a/src/k_collide.c b/src/k_collide.c index 8cdbe14f4..f13ba3423 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -197,10 +197,72 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2) { // Push fakes out of other item boxes if (t2->type == MT_RANDOMITEM || t2->type == MT_EGGMANITEM) + { P_InstaThrust(t1, R_PointToAngle2(t2->x, t2->y, t1->x, t1->y), t2->radius/4); + return true; + } - if (t1->type == MT_EGGMANITEM && t2->player) - P_TouchSpecialThing(t1, t2, false); + if (t2->player) + { + if ((t1->target == t2 || t1->target == t2->target) && (t1->threshold > 0)) + return true; + + if (t1->health <= 0 || t2->health <= 0) + return true; + + if (!P_CanPickupItem(t2->player, 2)) + return true; + + if (G_BattleGametype() && t2->player->kartstuff[k_bumper] <= 0) + { + if (t2->player->kartstuff[k_comebackmode] || t2->player->kartstuff[k_comebacktimer]) + return true; + t2->player->kartstuff[k_comebackmode] = 2; + } + else + { + K_DropItems(t2->player); //K_StripItems(t2->player); + //K_StripOther(t2->player); + t2->player->kartstuff[k_itemroulette] = 1; + t2->player->kartstuff[k_roulettetype] = 2; + } + + if (t2->player->kartstuff[k_flamedash] && t2->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + { + // Melt item + S_StartSound(t2, sfx_s3k43); + P_KillMobj(t1, t2, t2); + return true; + } + else + { + mobj_t *poof = P_SpawnMobj(t1->x, t1->y, t1->z, MT_EXPLODE); + S_StartSound(poof, t1->info->deathsound); + +#if 0 + // Eggbox snipe! + if (t1->type == MT_EGGMANITEM && t1->health > 1) + S_StartSound(t2, sfx_bsnipe); +#endif + + if (t1->target && t1->target->player) + { + if (G_RaceGametype() || t1->target->player->kartstuff[k_bumper] > 0) + t2->player->kartstuff[k_eggmanblame] = t1->target->player-players; + else + t2->player->kartstuff[k_eggmanblame] = t2->player-players; + + if (t1->target->hnext == t1) + { + P_SetTarget(&t1->target->hnext, NULL); + t1->target->player->kartstuff[k_eggmanheld] = 0; + } + } + + P_RemoveMobj(t1); + return true; + } + } return true; } diff --git a/src/p_inter.c b/src/p_inter.c index 6d1051e82..2c8324972 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -386,58 +386,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_SetTarget(&special->target, toucher); P_KillMobj(special, toucher, toucher); break; - case MT_EGGMANITEM_SHIELD: // SRB2kart - case MT_EGGMANITEM: - if ((special->target == toucher || special->target == toucher->target) && (special->threshold > 0)) - return; - - if (special->health <= 0 || toucher->health <= 0) - return; - - if (!P_CanPickupItem(player, 2)) - return; - - if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) - { - if (player->kartstuff[k_comebackmode] || player->kartstuff[k_comebacktimer]) - return; - player->kartstuff[k_comebackmode] = 2; - } - else - { - K_DropItems(player); //K_StripItems(player); - //K_StripOther(player); - player->kartstuff[k_itemroulette] = 1; - player->kartstuff[k_roulettetype] = 2; - } - -#if 0 - // Eggbox snipe! - if (special->type == MT_EGGMANITEM && special->health > 1) - S_StartSound(toucher, sfx_bsnipe); -#endif - - { - mobj_t *poof = P_SpawnMobj(special->x, special->y, special->z, MT_EXPLODE); - S_StartSound(poof, special->info->deathsound); - } - - if (special->target && special->target->player) - { - if (G_RaceGametype() || special->target->player->kartstuff[k_bumper] > 0) - player->kartstuff[k_eggmanblame] = special->target->player-players; - else - player->kartstuff[k_eggmanblame] = player-players; - - if (special->target->hnext == special) - { - P_SetTarget(&special->target->hnext, NULL); - special->target->player->kartstuff[k_eggmanheld] = 0; - } - } - - P_RemoveMobj(special); - return; case MT_KARMAHITBOX: if (!special->target->player) return; From 4ddf1e4280ae3f8942d40d47bb5ba69f4dc41816 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 26 Mar 2020 01:14:57 -0400 Subject: [PATCH 58/65] Don't allow k_flamedash to damage without flame shield --- src/k_kart.c | 17 +++++++++-------- src/p_map.c | 7 ++++--- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 0ce0276e3..ddc6121ed 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7716,22 +7716,23 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_itemtype] = KITEM_NONE; } + if (K_GetShieldFromItem(player->kartstuff[k_itemtype]) == KSHIELD_NONE) + { + player->kartstuff[k_curshield] = KSHIELD_NONE; // RESET shield type + player->kartstuff[k_bubbleblowup] = 0; + player->kartstuff[k_bubblecool] = 0; + player->kartstuff[k_flamelength] = 0; + player->kartstuff[k_flamemeter] = 0; + } + if (spbplace == -1 || player->kartstuff[k_position] != spbplace) player->kartstuff[k_ringlock] = 0; // reset ring lock - if (K_GetShieldFromItem(player->kartstuff[k_itemtype]) == KSHIELD_NONE) - player->kartstuff[k_curshield] = KSHIELD_NONE; // RESET shield type - if (player->kartstuff[k_itemtype] == KITEM_SPB || player->kartstuff[k_itemtype] == KITEM_SHRINK || player->kartstuff[k_growshrinktimer] < 0) indirectitemcooldown = 20*TICRATE; - if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD) - { - player->kartstuff[k_flamelength] = 0; - } - if (player->kartstuff[k_hyudorotimer] > 0) { if (splitscreen) diff --git a/src/p_map.c b/src/p_map.c index 262017570..6b54f956d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1416,7 +1416,6 @@ static boolean PIT_CheckThing(mobj_t *thing) // Make sure they aren't able to damage you ANYWHERE along the Z axis, you have to be TOUCHING the person. && !(thing->z + thing->height < tmthing->z || thing->z > tmthing->z + tmthing->height)) { - if (tmthing->scale > thing->scale + (mapobjectscale/8)) // SRB2kart - Handle squishes first! K_SquishPlayer(thing->player, tmthing, tmthing); else if (thing->scale > tmthing->scale + (mapobjectscale/8)) @@ -1425,9 +1424,11 @@ static boolean PIT_CheckThing(mobj_t *thing) P_DamageMobj(thing, tmthing, tmthing, 1); else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) P_DamageMobj(tmthing, thing, thing, 1); - else if (tmthing->player->kartstuff[k_flamedash] && !thing->player->kartstuff[k_flamedash]) // SRB2kart - Then flame shield! + else if ((tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + && !(thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! P_DamageMobj(thing, tmthing, tmthing, 1); - else if (thing->player->kartstuff[k_flamedash] && !tmthing->player->kartstuff[k_flamedash]) + else if ((thing->player->kartstuff[k_flamedash] && thing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + && !(tmthing->player->kartstuff[k_flamedash] && tmthing->player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)) // SRB2kart - Then flame shield! P_DamageMobj(tmthing, thing, thing, 1); /*if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam)) From bf221c7afa575a0c089dde0d859a12b374df6fde Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 26 Mar 2020 01:16:04 -0400 Subject: [PATCH 59/65] Another bugfix for hyu stuff --- src/k_kart.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ddc6121ed..8d15067f1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7735,6 +7735,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_hyudorotimer] > 0) { + INT32 hyu = hyudorotime; + + if (G_RaceGametype()) + hyu *= 2; // double in race + if (splitscreen) { if (leveltime & 1) @@ -7742,7 +7747,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else player->mo->flags2 &= ~MF2_DONTDRAW; - if (player->kartstuff[k_hyudorotimer] >= (TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyudorotime-(TICRATE/2)) + if (player->kartstuff[k_hyudorotimer] >= (TICRATE/2) && player->kartstuff[k_hyudorotimer] <= hyu-(TICRATE/2)) { if (player == &players[displayplayers[1]]) player->mo->eflags |= MFE_DRAWONLYFORP2; @@ -7761,7 +7766,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else { if (P_IsDisplayPlayer(player) - || (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyudorotime-(TICRATE/2)))) + || (!P_IsDisplayPlayer(player) && (player->kartstuff[k_hyudorotimer] < (TICRATE/2) || player->kartstuff[k_hyudorotimer] > hyu-(TICRATE/2)))) { if (leveltime & 1) player->mo->flags2 |= MF2_DONTDRAW; From 7ec398e579cde8d729c7fb6095f416cf10f7c77d Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 26 Mar 2020 03:13:10 -0400 Subject: [PATCH 60/65] Slow down animation speed, fix meter bugs --- src/dehacked.c | 1 + src/info.c | 45 ++++++++++++++++++++++++++++++++++++--------- src/info.h | 1 + src/k_kart.c | 28 +++++++++++++--------------- src/p_enemy.c | 5 ++++- src/p_mobj.c | 24 ++++++++++++++++++++++++ 6 files changed, 79 insertions(+), 25 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index da740a7a9..bf12bcb86 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7872,6 +7872,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_THUNDERSHIELD", // Shields "MT_BUBBLESHIELD", "MT_FLAMESHIELD", + "MT_FLAMESHIELDPAPER", "MT_BUBBLESHIELDTRAP", "MT_SINK", // Kitchen Sink Stuff diff --git a/src/info.c b/src/info.c index 264fd8778..179d6e584 100644 --- a/src/info.c +++ b/src/info.c @@ -2919,16 +2919,16 @@ state_t states[NUMSTATES] = {SPR_FLMS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_FLAMESHIELD18}, // S_FLAMESHIELD17 {SPR_FLMS, FF_FULLBRIGHT|17, 2, {NULL}, 0, 0, S_FLAMESHIELD1}, // S_FLAMESHIELD18 - {SPR_FLMD, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH2}, // S_FLAMESHIELDDASH1 - {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 0, 2, S_FLAMESHIELDDASH3}, // S_FLAMESHIELDDASH2 - {SPR_FLMD, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH4}, // S_FLAMESHIELDDASH3 - {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 1, 3, S_FLAMESHIELDDASH5}, // S_FLAMESHIELDDASH4 - {SPR_FLMD, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH6}, // S_FLAMESHIELDDASH5 - {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 2, 0, S_FLAMESHIELDDASH7}, // S_FLAMESHIELDDASH6 - {SPR_FLMD, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH8}, // S_FLAMESHIELDDASH7 - {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 3, 1, S_FLAMESHIELDDASH1}, // S_FLAMESHIELDDASH8 + {SPR_FLMD, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH2}, // S_FLAMESHIELDDASH1 + {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 0, 2, S_FLAMESHIELDDASH3}, // S_FLAMESHIELDDASH2 + {SPR_FLMD, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH4}, // S_FLAMESHIELDDASH3 + {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 1, 3, S_FLAMESHIELDDASH5}, // S_FLAMESHIELDDASH4 + {SPR_FLMD, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH6}, // S_FLAMESHIELDDASH5 + {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 2, 0, S_FLAMESHIELDDASH7}, // S_FLAMESHIELDDASH6 + {SPR_FLMD, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH8}, // S_FLAMESHIELDDASH7 + {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 3, 1, S_FLAMESHIELDDASH1}, // S_FLAMESHIELDDASH8 - {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER + {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 3, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER {SPR_SINK, 0, 1, {A_SmokeTrailer}, MT_SINKTRAIL, 0, S_SINK}, // S_SINK {SPR_SINK, 0|FF_TRANS80|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_SINK_SHIELD}, // S_SINK_SHIELD @@ -16271,6 +16271,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_FLAMESHIELDPAPER + -1, // doomednum + S_FLAMESHIELDPAPER, // 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 + 0, // speed + 8<kartstuff[k_flamelength] * (TICRATE/4); if (flamemax > 0) - flamemax += (TICRATE/2); + flamemax += 3*(TICRATE/4); if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { @@ -7636,7 +7636,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); if (flamemax > 0) - flamemax += (TICRATE/2); + flamemax += 3*(TICRATE/4); } if (player->kartstuff[k_flamemeter] > flamemax) @@ -9067,14 +9067,17 @@ static void K_drawKartItem(void) if (stplyr->kartstuff[k_eggmanexplode] > 1 /*&& stplyr->kartstuff[k_eggmanexplode] <= 3*TICRATE*/) V_DrawScaledPatch(fx+17, fy+13-offset, V_HUDTRANS|fflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]); - if (stplyr->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + if (stplyr->kartstuff[k_itemtype] == KITEM_FLAMESHIELD && stplyr->kartstuff[k_flamelength] > 0) { INT32 numframes = 104; INT32 absolutemax = 16 * (TICRATE/4); INT32 flamemax = stplyr->kartstuff[k_flamelength] * (TICRATE/4); - INT32 flen = 1; - INT32 bf = 16 - (flamemax / (TICRATE/4)); - INT32 ff = numframes - ((stplyr->kartstuff[k_flamemeter] * numframes) / absolutemax); + INT32 flamemeter = min(stplyr->kartstuff[k_flamemeter], flamemax); + + INT32 bf = 16 - stplyr->kartstuff[k_flamelength]; + INT32 ff = numframes - ((flamemeter * numframes) / absolutemax); + INT32 fmin = (8 * (bf-1)); + INT32 xo = 6, yo = 4; INT32 flip = 0; @@ -9089,18 +9092,13 @@ static void K_drawKartItem(void) } } - if (stplyr->kartstuff[k_flamelength] > 0) - { - flen = (numframes * 16) / stplyr->kartstuff[k_flamelength]; - } + if (ff < fmin) + ff = fmin; - if (ff < 0) {ff = 0;} - if (ff > flen-1) {ff = flen-1;} - - if (flamemax > 0) + if (bf >= 0 && bf < 16) V_DrawScaledPatch(fx-xo, fy-yo, V_HUDTRANS|fflags|flip, kp_flameshieldmeter_bg[bf][offset]); - if (stplyr->kartstuff[k_flamemeter] > 0) + if (ff >= 0 && ff < numframes && stplyr->kartstuff[k_flamemeter] > 0) { if (stplyr->kartstuff[k_flamemeter] > (flamemax - (TICRATE/4)) && (leveltime & 1)) { diff --git a/src/p_enemy.c b/src/p_enemy.c index d2931d17e..290b49c52 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -9350,8 +9350,9 @@ void A_FlameShieldPaper(mobj_t *actor) INT32 perpendicular = ((i & 1) ? -ANGLE_90 : ANGLE_90); fixed_t newx = actor->x + P_ReturnThrustX(NULL, actor->angle + perpendicular, 8*actor->scale); fixed_t newy = actor->y + P_ReturnThrustY(NULL, actor->angle + perpendicular, 8*actor->scale); - mobj_t *paper = P_SpawnMobj(newx + actor->momx, newy + actor->momy, actor->z + actor->momz, MT_THOK); + mobj_t *paper = P_SpawnMobj(newx, newy, actor->z, MT_FLAMESHIELDPAPER); + P_SetTarget(&paper->target, actor); P_SetScale(paper, actor->scale); paper->destscale = actor->destscale; @@ -9369,6 +9370,8 @@ void A_FlameShieldPaper(mobj_t *actor) { paper->frame |= framea; } + + paper->extravalue1 = i; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 773ed3709..d1134257a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8370,6 +8370,30 @@ void P_MobjThinker(mobj_t *mobj) mobj->target->y + FINESINE(mobj->angle >> ANGLETOFINESHIFT), mobj->z + mobj->target->height * P_MobjFlip(mobj)); break; + case MT_FLAMESHIELDPAPER: + if (!mobj->target || P_MobjWasRemoved(mobj->target)) + { + P_RemoveMobj(mobj); + return; + } + + mobj->z = mobj->target->z; + + K_MatchGenericExtraFlags(mobj, mobj->target); + + { + INT32 perpendicular = ((mobj->extravalue1 & 1) ? -ANGLE_90 : ANGLE_90); + fixed_t newx = mobj->target->x + P_ReturnThrustX(NULL, mobj->target->angle + perpendicular, 8*mobj->target->scale); + fixed_t newy = mobj->target->y + P_ReturnThrustY(NULL, mobj->target->angle + perpendicular, 8*mobj->target->scale); + + P_TeleportMove(mobj, newx, newy, mobj->target->z); + + if (mobj->extravalue1 & 1) + mobj->angle = mobj->target->angle - ANGLE_45; + else + mobj->angle = mobj->target->angle + ANGLE_45; + } + break; case MT_TIREGREASE: if (!mobj->target || P_MobjWasRemoved(mobj->target) || !mobj->target->player || !mobj->target->player->kartstuff[k_tiregrease]) From 8a3c7ad2fbba7c7781a6a9944422a798dfe1b83c Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 26 Mar 2020 03:13:49 -0400 Subject: [PATCH 61/65] Add fire trail to flame shield --- src/p_user.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 846baee8f..5d2b4fe0c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6134,7 +6134,8 @@ static void P_MovePlayer(player_t *player) //////////////////////////// // SRB2kart - Drifting smoke and fire - if (EITHERSNEAKER(player) && onground && (leveltime & 1)) + if ((EITHERSNEAKER(player) || player->kartstuff[k_flamedash]) + && onground && (leveltime & 1)) K_SpawnBoostTrail(player); if (player->kartstuff[k_invincibilitytimer] > 0) From d1580a5b421583bba3df699b6bf045d0de87495c Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 26 Mar 2020 08:48:02 -0400 Subject: [PATCH 62/65] More Flame Shield visuals --- src/dehacked.c | 4 ++++ src/doomstat.h | 1 + src/g_game.c | 1 + src/info.c | 10 ++++++++-- src/info.h | 6 ++++++ src/k_kart.c | 15 +++++++-------- src/p_mobj.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 70 insertions(+), 10 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index bf12bcb86..7d4aa6c73 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6712,6 +6712,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_FLAMESHIELDDASH8", "S_FLAMESHIELDPAPER", + "S_FLAMESHIELDLINE1", + "S_FLAMESHIELDLINE2", + "S_FLAMESHIELDLINE3", + "S_FLAMESHIELDFLASH", // The legend "S_SINK", diff --git a/src/doomstat.h b/src/doomstat.h index 62b63dad5..194de85cf 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -458,6 +458,7 @@ extern INT32 greasetics; extern INT32 wipeoutslowtime; extern INT32 wantedreduce; extern INT32 wantedfrequency; +extern INT32 flameseg; extern UINT8 introtoplay; extern UINT8 creditscutscene; diff --git a/src/g_game.c b/src/g_game.c index 0eb457a6a..811063c90 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -232,6 +232,7 @@ INT32 greasetics = 3*TICRATE; INT32 wipeoutslowtime = 20; INT32 wantedreduce = 5*TICRATE; INT32 wantedfrequency = 10*TICRATE; +INT32 flameseg = TICRATE/4; INT32 gameovertics = 15*TICRATE; diff --git a/src/info.c b/src/info.c index 179d6e584..934f509fc 100644 --- a/src/info.c +++ b/src/info.c @@ -58,7 +58,9 @@ char sprnames[NUMSPRITES + 1][5] = //SRB2kart Sprites "RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE","KINV","KINF", "WIPD","DRIF","BDRF","DUST","DRWS","RSHE","FITM","BANA","ORBN","JAWZ","SSMN", - "KRBM","BHOG","BHBM","SPBM","THNS","BUBS","BWVE","FLMS","FLMD","FLMP","SINK","SITR", + "KRBM","BHOG","BHBM","SPBM","THNS","BUBS","BWVE", + "FLMS","FLMD","FLMP","FLML","FLMF", + "SINK","SITR", "KBLN","DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB", "CHOM","SACO","CRAB","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA", "ISTB","ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1","HIT2", @@ -2928,7 +2930,11 @@ state_t states[NUMSTATES] = {SPR_FLMD, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH8}, // S_FLAMESHIELDDASH7 {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 3, 1, S_FLAMESHIELDDASH1}, // S_FLAMESHIELDDASH8 - {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 3, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER + {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 3, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER + {SPR_FLML, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, 7, {NULL}, 6, 1, S_NULL}, // S_FLAMESHIELDLINE1 + {SPR_FLML, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE|7, 7, {NULL}, 6, 1, S_NULL}, // S_FLAMESHIELDLINE2 + {SPR_FLML, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE|14, 7, {NULL}, 6, 1, S_NULL}, // S_FLAMESHIELDLINE3 + {SPR_FLMF, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDFLASH {SPR_SINK, 0, 1, {A_SmokeTrailer}, MT_SINKTRAIL, 0, S_SINK}, // S_SINK {SPR_SINK, 0|FF_TRANS80|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_SINK_SHIELD}, // S_SINK_SHIELD diff --git a/src/info.h b/src/info.h index 79d89fd2e..c1ab2528b 100644 --- a/src/info.h +++ b/src/info.h @@ -628,6 +628,8 @@ typedef enum sprite SPR_FLMS, // Flame Shield SPR_FLMD, // Flame Shield dash SPR_FLMP, // Flame Shield paper sprites + SPR_FLML, // Flame Shield speed lines + SPR_FLMF, // Flame Shield flash SPR_SINK, // Kitchen Sink SPR_SITR, // Kitchen Sink Trail SPR_KBLN, // Battle Mode Bumper @@ -3609,6 +3611,10 @@ typedef enum state S_FLAMESHIELDDASH8, S_FLAMESHIELDPAPER, + S_FLAMESHIELDLINE1, + S_FLAMESHIELDLINE2, + S_FLAMESHIELDLINE3, + S_FLAMESHIELDFLASH, // The legend S_SINK, diff --git a/src/k_kart.c b/src/k_kart.c index 88c94a333..81c139ce6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7583,10 +7583,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_flamelength] < destlen) player->kartstuff[k_flamelength]++; // Can always go up! - flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); - + flamemax = player->kartstuff[k_flamelength] * flameseg; if (flamemax > 0) - flamemax += 3*(TICRATE/4); + flamemax += TICRATE; // leniency period if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { @@ -7634,9 +7633,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { player->kartstuff[k_flamelength]--; // Can ONLY go down if you're not using it - flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); + flamemax = player->kartstuff[k_flamelength] * flameseg; if (flamemax > 0) - flamemax += 3*(TICRATE/4); + flamemax += TICRATE; // leniency period } if (player->kartstuff[k_flamemeter] > flamemax) @@ -9070,8 +9069,8 @@ static void K_drawKartItem(void) if (stplyr->kartstuff[k_itemtype] == KITEM_FLAMESHIELD && stplyr->kartstuff[k_flamelength] > 0) { INT32 numframes = 104; - INT32 absolutemax = 16 * (TICRATE/4); - INT32 flamemax = stplyr->kartstuff[k_flamelength] * (TICRATE/4); + INT32 absolutemax = 16 * flameseg; + INT32 flamemax = stplyr->kartstuff[k_flamelength] * flameseg; INT32 flamemeter = min(stplyr->kartstuff[k_flamemeter], flamemax); INT32 bf = 16 - stplyr->kartstuff[k_flamelength]; @@ -9100,7 +9099,7 @@ static void K_drawKartItem(void) if (ff >= 0 && ff < numframes && stplyr->kartstuff[k_flamemeter] > 0) { - if (stplyr->kartstuff[k_flamemeter] > (flamemax - (TICRATE/4)) && (leveltime & 1)) + if ((stplyr->kartstuff[k_flamemeter] > flamemax) && (leveltime & 1)) { UINT8 *fsflash = R_GetTranslationColormap(TC_BLINK, SKINCOLOR_WHITE, GTC_CACHE); V_DrawMappedPatch(fx-xo, fy-yo, V_HUDTRANS|fflags|flip, kp_flameshieldmeter[ff][offset], fsflash); diff --git a/src/p_mobj.c b/src/p_mobj.c index d1134257a..06cdfa4b8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8614,6 +8614,7 @@ void P_MobjThinker(mobj_t *mobj) { fixed_t destx, desty; statenum_t curstate; + INT32 flamemax = mobj->target->player->kartstuff[k_flamelength] * flameseg; if (!mobj->target || !mobj->target->health || !mobj->target->player || mobj->target->player->kartstuff[k_curshield] != KSHIELD_FLAME) @@ -8629,6 +8630,31 @@ void P_MobjThinker(mobj_t *mobj) { if (!(curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH8)) P_SetMobjState(mobj, S_FLAMESHIELDDASH1); + + if (leveltime & 1) + { + UINT8 i; + UINT8 nl = 2; + + if (mobj->target->player->kartstuff[k_flamedash] > mobj->extravalue1) + nl = 3; + + for (i = 0; i < nl; i++) + { + mobj_t *fast = P_SpawnMobj(mobj->x + (P_RandomRange(-36,36) * mobj->scale), + mobj->y + (P_RandomRange(-36,36) * mobj->scale), + mobj->z + (mobj->height/2) + (P_RandomRange(-20,20) * mobj->scale), + MT_FASTLINE); + + fast->angle = mobj->angle; + fast->momx = 3*mobj->target->momx/4; + fast->momy = 3*mobj->target->momy/4; + fast->momz = 3*mobj->target->momz/4; + + K_MatchGenericExtraFlags(fast, mobj); + P_SetMobjState(fast, S_FLAMESHIELDLINE1 + i); + } + } } else { @@ -8636,6 +8662,23 @@ void P_MobjThinker(mobj_t *mobj) P_SetMobjState(mobj, S_FLAMESHIELD1); } + mobj->extravalue1 = mobj->target->player->kartstuff[k_flamedash]; + + if (mobj->target->player->kartstuff[k_flamemeter] > flamemax) + { + mobj_t *flash = P_SpawnMobj(mobj->x + mobj->target->momx, mobj->y + mobj->target->momy, mobj->z + mobj->target->momz, MT_THOK); + P_SetMobjState(flash, S_FLAMESHIELDFLASH); + + if (leveltime & 1) + { + flash->frame |= 2 + ((leveltime / 2) % 4); + } + else + { + flash->frame |= ((leveltime / 2) % 2); + } + } + if (!splitscreen /*&& rendermode != render_soft*/) { angle_t viewingangle; From 2ca00cf2e96c3f964cdf5f50e624734c4d75d746 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 28 Mar 2020 00:21:41 -0400 Subject: [PATCH 63/65] Try to prevent bubble from going out of bounds --- src/p_inter.c | 2 -- src/p_mobj.c | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 2c8324972..43544447e 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -637,8 +637,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) // attach to player! P_SetTarget(&special->tracer, toucher); toucher->flags |= MF_NOGRAVITY; - toucher->momx = (15*toucher->momx)/16; // Huge initial speed cut - toucher->momy = (15*toucher->momy)/16; toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher); S_StartSound(toucher, sfx_s1b2); return; diff --git a/src/p_mobj.c b/src/p_mobj.c index 06cdfa4b8..a3b526b7c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9454,6 +9454,8 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->player) { player_t *player = mobj->tracer->player; + fixed_t destx, desty, curfz, destfz; + boolean blockmove = false; mobj->flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOGRAVITY|MF_DONTENCOREMAP; mobj->extravalue1 = 1; @@ -9462,16 +9464,38 @@ void P_MobjThinker(mobj_t *mobj) mobj->momz = 0; mobj->destscale = ((5*mobj->tracer->scale)>>2) + (mobj->tracer->scale>>3); - mobj->tracer->momx = (63*mobj->tracer->momx)/64; - mobj->tracer->momy = (63*mobj->tracer->momy)/64; mobj->tracer->momz = (8*mobj->tracer->scale) * P_MobjFlip(mobj->tracer); - P_TeleportMove(mobj, - mobj->tracer->x + mobj->tracer->momx + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + mobj->tracer->momy + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z + mobj->tracer->momz - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<tracer->momx = (31*mobj->tracer->momx)/32; + mobj->tracer->momy = (31*mobj->tracer->momy)/32; - if (mobj->movecount > 8*TICRATE) + destx = mobj->x + mobj->tracer->momx; + desty = mobj->y + mobj->tracer->momy; + + if (mobj->tracer->eflags & MFE_VERTICALFLIP) + { + curfz = P_GetCeilingZ(mobj->tracer, mobj->tracer->subsector->sector, mobj->tracer->x, mobj->tracer->y, NULL); + destfz = P_GetCeilingZ(mobj->tracer, R_PointInSubsector(destx, desty)->sector, destx, desty, NULL); + blockmove = (curfz - destfz >= 24*mobj->scale); + } + else + { + curfz = P_GetFloorZ(mobj->tracer, mobj->tracer->subsector->sector, mobj->tracer->x, mobj->tracer->y, NULL); + destfz = P_GetFloorZ(mobj->tracer, R_PointInSubsector(destx, desty)->sector, destx, desty, NULL); + blockmove = (destfz - curfz >= 24*mobj->scale); + } + + if (blockmove) + { + mobj->tracer->momx = mobj->tracer->momy = 0; + } + + P_TeleportMove(mobj, + mobj->tracer->x + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<movecount > 4*TICRATE) { S_StartSound(mobj->tracer, sfx_s3k77); mobj->tracer->flags &= ~MF_NOGRAVITY; From bee6bbf619de1f725184d23a4522f8cc80135274 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 28 Mar 2020 03:56:39 -0400 Subject: [PATCH 64/65] Firework frames for fire shield --- src/dehacked.c | 10 ++++++++++ src/info.c | 54 +++++++++++++++++++++++++++++++++++++++++--------- src/info.h | 10 ++++++++++ src/p_mobj.c | 21 ++++++++++++++++++-- 4 files changed, 84 insertions(+), 11 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 247101a80..e2a95eb83 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6710,6 +6710,15 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_FLAMESHIELDDASH6", "S_FLAMESHIELDDASH7", "S_FLAMESHIELDDASH8", + "S_FLAMESHIELDDASH9", + "S_FLAMESHIELDDASH10", + "S_FLAMESHIELDDASH11", + "S_FLAMESHIELDDASH12", + + "S_FLAMESHIELDDASH2_UNDERLAY", + "S_FLAMESHIELDDASH5_UNDERLAY", + "S_FLAMESHIELDDASH8_UNDERLAY", + "S_FLAMESHIELDDASH11_UNDERLAY", "S_FLAMESHIELDPAPER", "S_FLAMESHIELDLINE1", @@ -7876,6 +7885,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_THUNDERSHIELD", // Shields "MT_BUBBLESHIELD", "MT_FLAMESHIELD", + "MT_FLAMESHIELDUNDERLAY", "MT_FLAMESHIELDPAPER", "MT_BUBBLESHIELDTRAP", diff --git a/src/info.c b/src/info.c index 934f509fc..33e1622b2 100644 --- a/src/info.c +++ b/src/info.c @@ -2921,14 +2921,23 @@ state_t states[NUMSTATES] = {SPR_FLMS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_FLAMESHIELD18}, // S_FLAMESHIELD17 {SPR_FLMS, FF_FULLBRIGHT|17, 2, {NULL}, 0, 0, S_FLAMESHIELD1}, // S_FLAMESHIELD18 - {SPR_FLMD, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH2}, // S_FLAMESHIELDDASH1 - {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 0, 2, S_FLAMESHIELDDASH3}, // S_FLAMESHIELDDASH2 - {SPR_FLMD, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH4}, // S_FLAMESHIELDDASH3 - {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 1, 3, S_FLAMESHIELDDASH5}, // S_FLAMESHIELDDASH4 - {SPR_FLMD, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH6}, // S_FLAMESHIELDDASH5 - {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 2, 0, S_FLAMESHIELDDASH7}, // S_FLAMESHIELDDASH6 - {SPR_FLMD, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH8}, // S_FLAMESHIELDDASH7 - {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 3, 1, S_FLAMESHIELDDASH1}, // S_FLAMESHIELDDASH8 + {SPR_FLMD, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH2}, // S_FLAMESHIELDDASH1 + {SPR_FLMD, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH3}, // S_FLAMESHIELDDASH2 + {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 0, 2, S_FLAMESHIELDDASH4}, // S_FLAMESHIELDDASH3 + {SPR_FLMD, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH5}, // S_FLAMESHIELDDASH4 + {SPR_FLMD, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH6}, // S_FLAMESHIELDDASH5 + {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 1, 3, S_FLAMESHIELDDASH7}, // S_FLAMESHIELDDASH6 + {SPR_FLMD, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH8}, // S_FLAMESHIELDDASH7 + {SPR_FLMD, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH9}, // S_FLAMESHIELDDASH8 + {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 2, 0, S_FLAMESHIELDDASH10}, // S_FLAMESHIELDDASH9 + {SPR_FLMD, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH11}, // S_FLAMESHIELDDASH10 + {SPR_FLMD, FF_FULLBRIGHT|8, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH12}, // S_FLAMESHIELDDASH11 + {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 3, 1, S_FLAMESHIELDDASH1}, // S_FLAMESHIELDDASH12 + + {SPR_FLMD, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDDASH2_UNDERLAY + {SPR_FLMD, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDDASH5_UNDERLAY + {SPR_FLMD, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDDASH8_UNDERLAY + {SPR_FLMD, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDDASH11_UNDERLAY {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 3, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER {SPR_FLML, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, 7, {NULL}, 6, 1, S_NULL}, // S_FLAMESHIELDLINE1 @@ -16277,6 +16286,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_FLAMESHIELDUNDERLAY + -1, // doomednum + S_FLAMESHIELDDASH2_UNDERLAY, // 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 + 0, // speed + 8<target->player->kartstuff[k_flamelength] * flameseg; if (!mobj->target || !mobj->target->health || !mobj->target->player @@ -8666,9 +8667,18 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_flamedash]) { - if (!(curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH8)) + if (!(curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH12)) P_SetMobjState(mobj, S_FLAMESHIELDDASH1); + if (curstate == S_FLAMESHIELDDASH2) + underlayst = S_FLAMESHIELDDASH2_UNDERLAY; + else if (curstate == S_FLAMESHIELDDASH5) + underlayst = S_FLAMESHIELDDASH5_UNDERLAY; + else if (curstate == S_FLAMESHIELDDASH8) + underlayst = S_FLAMESHIELDDASH8_UNDERLAY; + else if (curstate == S_FLAMESHIELDDASH11) + underlayst = S_FLAMESHIELDDASH11_UNDERLAY; + if (leveltime & 1) { UINT8 i; @@ -8696,7 +8706,7 @@ void P_MobjThinker(mobj_t *mobj) } else { - if (curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH8) + if (curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH12) P_SetMobjState(mobj, S_FLAMESHIELD1); } @@ -8745,6 +8755,13 @@ void P_MobjThinker(mobj_t *mobj) mobj->angle = R_PointToAngle2(0, 0, mobj->target->momx, mobj->target->momy); else mobj->angle = mobj->target->angle; + + if (underlayst != S_NULL) + { + mobj_t *underlay = P_SpawnMobj(mobj->target->x, mobj->target->y, mobj->target->z, MT_FLAMESHIELDUNDERLAY); + underlay->angle = mobj->angle; + P_SetMobjState(underlay, underlayst); + } break; } case MT_ROCKETSNEAKER: From 9a8e3aecd9fa4482ffb201bd4e3ec0e17681f2c0 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 28 Mar 2020 06:19:25 -0400 Subject: [PATCH 65/65] Fix papersprite appearing on wrong frames --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 33e1622b2..981773387 100644 --- a/src/info.c +++ b/src/info.c @@ -2939,7 +2939,7 @@ state_t states[NUMSTATES] = {SPR_FLMD, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDDASH8_UNDERLAY {SPR_FLMD, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDDASH11_UNDERLAY - {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 3, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER + {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER {SPR_FLML, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, 7, {NULL}, 6, 1, S_NULL}, // S_FLAMESHIELDLINE1 {SPR_FLML, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE|7, 7, {NULL}, 6, 1, S_NULL}, // S_FLAMESHIELDLINE2 {SPR_FLML, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE|14, 7, {NULL}, 6, 1, S_NULL}, // S_FLAMESHIELDLINE3