From b9e3bdff94f5e248ae2222b59b81ea90766df046 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 25 May 2022 23:01:47 -0400 Subject: [PATCH 1/7] Better tripwire leniency vfx --- src/d_player.h | 2 + src/deh_tables.c | 18 ++++++ src/hardware/hw_main.c | 2 +- src/info.c | 45 +++++++++++++- src/info.h | 19 +++++- src/k_kart.c | 132 ++++++++++++----------------------------- src/lua_mobjlib.c | 10 +++- src/p_mobj.c | 41 +++++++++++++ src/p_mobj.h | 2 + src/p_saveg.c | 12 +++- src/r_things.c | 2 +- 11 files changed, 185 insertions(+), 100 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 33e7026e3..31154ea76 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -260,6 +260,8 @@ typedef enum #define TUMBLEBOUNCES 3 #define TUMBLEGRAVITY (4*FRACUNIT) +#define TRIPWIRETIME (TICRATE) + //} // for kickstartaccel diff --git a/src/deh_tables.c b/src/deh_tables.c index 2796b23dc..2be68bd1c 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3805,6 +3805,22 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BATTLEBUMPER_EXBLAST9", "S_BATTLEBUMPER_EXBLAST10", + // Tripwire + "S_TRIPWIREBOOST_TOP1", + "S_TRIPWIREBOOST_TOP2", + "S_TRIPWIREBOOST_TOP3", + "S_TRIPWIREBOOST_TOP4", + "S_TRIPWIREBOOST_TOP5", + "S_TRIPWIREBOOST_TOP6", + "S_TRIPWIREBOOST_TOP7", + "S_TRIPWIREBOOST_BOTTOM1", + "S_TRIPWIREBOOST_BOTTOM2", + "S_TRIPWIREBOOST_BOTTOM3", + "S_TRIPWIREBOOST_BOTTOM4", + "S_TRIPWIREBOOST_BOTTOM5", + "S_TRIPWIREBOOST_BOTTOM6", + "S_TRIPWIREBOOST_BOTTOM7", + // DEZ respawn laser "S_DEZLASER", "S_DEZLASER_TRAIL1", @@ -5338,6 +5354,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BATTLEBUMPER_DEBRIS", "MT_BATTLEBUMPER_BLAST", + "MT_TRIPWIREBOOST", + "MT_DEZLASER", "MT_WAYPOINT", diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 871ecf6ad..01e900c38 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5129,7 +5129,7 @@ static void HWR_ProjectSprite(mobj_t *thing) R_InterpolateMobjState(thing, FRACUNIT, &interp); } - dispoffset = thing->info->dispoffset; + dispoffset = thing->dispoffset; // hitlag vibrating (todo: interp somehow?) if (thing->hitlag > 0 && (thing->eflags & MFE_DAMAGEHITLAG)) diff --git a/src/info.c b/src/info.c index db656a3a7..afd2db52a 100644 --- a/src/info.c +++ b/src/info.c @@ -580,7 +580,7 @@ char sprnames[NUMSPRITES + 1][5] = "BEXS", // Battle Bumper Explosion: Shell "BDEB", // Battle Bumper Explosion: Debris "BEXB", // Battle Bumper Explosion: Blast - + "TWBT", // Tripwire Boost "DEZL", // DEZ Laser respawn // Additional Kart Objects @@ -4361,6 +4361,22 @@ state_t states[NUMSTATES] = {SPR_BEXB, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_TRANS80, 2, {NULL}, 0, 0, S_BATTLEBUMPER_EXBLAST10}, // S_BATTLEBUMPER_EXBLAST9 {SPR_BEXB, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_TRANS90, 2, {NULL}, 0, 0, S_NULL}, // S_BATTLEBUMPER_EXBLAST10 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP2}, // S_TRIPWIREBOOST_TOP1 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|1, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP3}, // S_TRIPWIREBOOST_TOP2 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|2, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP4}, // S_TRIPWIREBOOST_TOP3 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|3, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP5}, // S_TRIPWIREBOOST_TOP4 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|4, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP6}, // S_TRIPWIREBOOST_TOP5 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|5, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP7}, // S_TRIPWIREBOOST_TOP6 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|6, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP1}, // S_TRIPWIREBOOST_TOP7 + + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM2}, // S_TRIPWIREBOOST_BOTTOM1 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|1, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM3}, // S_TRIPWIREBOOST_BOTTOM2 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|2, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM4}, // S_TRIPWIREBOOST_BOTTOM3 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|3, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM5}, // S_TRIPWIREBOOST_BOTTOM4 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|4, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM6}, // S_TRIPWIREBOOST_BOTTOM5 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|5, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM7}, // S_TRIPWIREBOOST_BOTTOM6 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|6, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM1}, // S_TRIPWIREBOOST_BOTTOM7 + {SPR_DEZL, FF_FULLBRIGHT|FF_PAPERSPRITE, 8, {NULL}, 0, 0, S_NULL}, // S_DEZLASER {SPR_DEZL, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_DEZLASER_TRAIL2}, // S_DEZLASER_TRAIL1 {SPR_DEZL, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_DEZLASER_TRAIL3}, // S_DEZLASER_TRAIL2 @@ -24164,6 +24180,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_TRIPWIREBOOST + -1, // doomednum + S_TRIPWIREBOOST_TOP1, // spawnstate + 1000, // spawnhealth + S_TRIPWIREBOOST_BOTTOM1, // 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*FRACUNIT, // radius + 16*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_DEZLASER -1, // doomednum S_DEZLASER, // spawnstate diff --git a/src/info.h b/src/info.h index 4a490ba9f..32f44df12 100644 --- a/src/info.h +++ b/src/info.h @@ -1126,7 +1126,7 @@ typedef enum sprite SPR_BEXS, // Battle Bumper Explosion: Shell SPR_BDEB, // Battle Bumper Explosion: Debris SPR_BEXB, // Battle Bumper Explosion: Blast - + SPR_TWBT, // Tripwire Boost SPR_DEZL, // DEZ Laser respawn // Additional Kart Objects @@ -4794,6 +4794,21 @@ typedef enum state S_BATTLEBUMPER_EXBLAST9, S_BATTLEBUMPER_EXBLAST10, + S_TRIPWIREBOOST_TOP1, + S_TRIPWIREBOOST_TOP2, + S_TRIPWIREBOOST_TOP3, + S_TRIPWIREBOOST_TOP4, + S_TRIPWIREBOOST_TOP5, + S_TRIPWIREBOOST_TOP6, + S_TRIPWIREBOOST_TOP7, + S_TRIPWIREBOOST_BOTTOM1, + S_TRIPWIREBOOST_BOTTOM2, + S_TRIPWIREBOOST_BOTTOM3, + S_TRIPWIREBOOST_BOTTOM4, + S_TRIPWIREBOOST_BOTTOM5, + S_TRIPWIREBOOST_BOTTOM6, + S_TRIPWIREBOOST_BOTTOM7, + // DEZ Laser respawn S_DEZLASER, S_DEZLASER_TRAIL1, @@ -6364,6 +6379,8 @@ typedef enum mobj_type MT_BATTLEBUMPER_DEBRIS, MT_BATTLEBUMPER_BLAST, + MT_TRIPWIREBOOST, + MT_DEZLASER, MT_WAYPOINT, diff --git a/src/k_kart.c b/src/k_kart.c index f47bf3b17..ed4510534 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4939,90 +4939,6 @@ void K_DriftDustHandling(mobj_t *spawner) } } -static void K_SpawnTripwireVFX(mobj_t *mo) -{ - tic_t t = leveltime; - angle_t ang, aoff; - SINT8 sign = 1; - boolean altColor = false; - mobj_t *dust; - boolean drifting = false; - UINT8 i; - - I_Assert(mo != NULL); - I_Assert(!P_MobjWasRemoved(mo)); - - if (!P_IsObjectOnGround(mo)) - return; - - if (mo->player) - { - ang = mo->player->drawangle; - - if (mo->player->drift != 0) - { - drifting = true; - ang += (mo->player->drift * ((ANGLE_270 + ANGLE_22h) / 5)); // -112.5 doesn't work. I fucking HATE SRB2 angles - if (mo->player->drift < 0) - sign = 1; - else - sign = -1; - } - } - else - ang = mo->angle; - - if (drifting == false) - { - i = (t & 1); - - if (i & 1) - sign = -1; - else - sign = 1; - } - else - { - if (t & 1) - { - return; - } - - t /= 2; - i = (t & 1); - } - - aoff = (ang + ANGLE_180) + (ANGLE_45 * sign); - - dust = P_SpawnMobj(mo->x + FixedMul(24*mo->scale, FINECOSINE(aoff>>ANGLETOFINESHIFT)), - mo->y + FixedMul(24*mo->scale, FINESINE(aoff>>ANGLETOFINESHIFT)), - mo->z, MT_DRIFTDUST); - - P_SetTarget(&dust->target, mo); - P_InitAngle(dust, ang - (ANGLE_90 * sign)); // point completely perpendicular from the player - P_SetScale(dust, mo->scale); - dust->destscale = mo->scale * 6; - dust->scalespeed = mo->scale/12; - K_FlipFromObject(dust, mo); - - altColor = (sign > 0); - - if ((t / 2) & 1) - { - dust->tics++; // "randomize" animation - altColor = !altColor; - } - - dust->colorized = true; - dust->color = altColor ? SKINCOLOR_BLOSSOM : SKINCOLOR_JAWZ; - - dust->momx = (4*mo->momx)/5; - dust->momy = (4*mo->momy)/5; - dust->momz = (4*P_GetMobjZMovement(mo))/5; - - P_Thrust(dust, dust->angle, 4*mo->scale); -} - void K_Squish(mobj_t *mo) { const fixed_t maxstretch = 4*FRACUNIT; @@ -7289,6 +7205,43 @@ static void K_LookForRings(mobj_t *pmo) P_BlockThingsIterator(bx, by, PIT_AttractingRings); } +static void K_UpdateTripwire(player_t *player) +{ + fixed_t speedThreshold = K_GetKartSpeed(player, false) *3/4; + boolean goodSpeed = (player->speed >= speedThreshold); + + if (player->tripwireLeniency > 0) + { + player->tripwireLeniency--; + } + + if (goodSpeed == false && player->tripwireLeniency > 0) + { + // Decrease at double speed when your speed is bad. + player->tripwireLeniency--; + } + + if (K_TripwirePassConditions(player) == true) + { + if (player->tripwireLeniency == 0) + { + mobj_t *front = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_TRIPWIREBOOST); + mobj_t *back = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_TRIPWIREBOOST); + + P_SetTarget(&front->target, player->mo); + P_SetTarget(&back->target, player->mo); + + front->dispoffset = 1; + + back->dispoffset = -1; + back->extravalue1 = 1; + P_SetMobjState(back, S_TRIPWIREBOOST_BOTTOM1); + } + + player->tripwireLeniency = max(player->tripwireLeniency, TRIPWIRETIME); + } +} + /** \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 @@ -7644,16 +7597,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) K_HandleTumbleBounce(player); } - if (player->tripwireLeniency > 0) - { - player->tripwireLeniency--; - K_SpawnTripwireVFX(player->mo); - } - - if (K_TripwirePassConditions(player) == true) - { - player->tripwireLeniency = max(player->tripwireLeniency, TICRATE); - } + K_UpdateTripwire(player); K_KartPlayerHUDUpdate(player); diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 4fd02d9a1..418a43bf9 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -99,7 +99,8 @@ enum mobj_e { mobj_sprxoff, mobj_spryoff, mobj_sprzoff, - mobj_hitlag + mobj_hitlag, + mobj_dispoffset }; static const char *const mobj_opt[] = { @@ -180,6 +181,7 @@ static const char *const mobj_opt[] = { "spryoff", "sprzoff", "hitlag", + "dispoffset", NULL}; #define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field]) @@ -458,6 +460,9 @@ static int mobj_get(lua_State *L) case mobj_hitlag: lua_pushinteger(L, mo->hitlag); break; + case mobj_dispoffset: + lua_pushinteger(L, mo->dispoffset); + break; default: // extra custom variables in Lua memory lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); @@ -830,6 +835,9 @@ static int mobj_set(lua_State *L) case mobj_hitlag: mo->hitlag = luaL_checkinteger(L, 3); break; + case mobj_dispoffset: + mo->dispoffset = luaL_checkinteger(L, 3); + break; default: lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); diff --git a/src/p_mobj.c b/src/p_mobj.c index 4731094e1..6f7bb34b5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7163,6 +7163,47 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } } break; + case MT_TRIPWIREBOOST: + if (!mobj->target || !mobj->target->health + || !mobj->target->player || !mobj->target->player->tripwireLeniency) + { + P_RemoveMobj(mobj); + return false; + } + + mobj->angle = K_MomentumAngle(mobj->target); + P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z + (mobj->target->height >> 1)); + mobj->target->destscale = mobj->target->scale; + P_SetScale(mobj, mobj->target->scale); + + if (mobj->extravalue1) + { + mobj->angle += ANGLE_180; + } + + { + UINT8 trans = ((mobj->target->player->tripwireLeniency + 1) * (NUMTRANSMAPS+1)) / TRIPWIRETIME; + + if (trans > NUMTRANSMAPS) + trans = NUMTRANSMAPS; + + trans = NUMTRANSMAPS - trans; + + if (trans >= NUMTRANSMAPS) + { + mobj->renderflags |= RF_DONTDRAW; + } + else + { + mobj->renderflags &= ~(RF_TRANSMASK); + + if (trans != 0) + { + mobj->renderflags |= (trans << RF_TRANSSHIFT); + } + } + } + break; case MT_BOOSTFLAME: if (!mobj->target || !mobj->target->health) { diff --git a/src/p_mobj.h b/src/p_mobj.h index 0f05d7c90..3b947bec6 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -408,6 +408,8 @@ typedef struct mobj_s struct terrain_s *terrain; // Terrain definition of the floor this object last hit. NULL when in the air. INT32 hitlag; // Sal-style hit lag, straight from Captain Fetch's jowls + INT32 dispoffset; + // WARNING: New fields must be added separately to savegame and Lua. } mobj_t; diff --git a/src/p_saveg.c b/src/p_saveg.c index 81adeca60..4422eaf20 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1600,7 +1600,7 @@ typedef enum MD2_SPRITEXOFFSET = 1<<20, MD2_SPRITEYOFFSET = 1<<21, MD2_FLOORSPRITESLOPE = 1<<22, - // 1<<23 was taken out, maybe reuse later + MD2_DISPOFFSET = 1<<23, MD2_HITLAG = 1<<24, MD2_WAYPOINTCAP = 1<<25, MD2_KITEMCAP = 1<<26, @@ -1841,6 +1841,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) } if (mobj->hitlag) diff2 |= MD2_HITLAG; + if (mobj->dispoffset) + diff2 |= MD2_DISPOFFSET; if (mobj == waypointcap) diff2 |= MD2_WAYPOINTCAP; if (mobj == kitemcap) @@ -2049,6 +2051,10 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) { WRITEINT32(save_p, mobj->hitlag); } + if (diff2 & MD2_DISPOFFSET) + { + WRITEINT32(save_p, mobj->dispoffset); + } if (diff2 & MD2_LASTMOMZ) { WRITEINT32(save_p, mobj->lastmomz); @@ -3154,6 +3160,10 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) { mobj->hitlag = READINT32(save_p); } + if (diff2 & MD2_DISPOFFSET) + { + mobj->dispoffset = READINT32(save_p); + } if (diff2 & MD2_LASTMOMZ) { mobj->lastmomz = READINT32(save_p); diff --git a/src/r_things.c b/src/r_things.c index 4d5df9484..cc5694dff 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1503,7 +1503,7 @@ static void R_ProjectSprite(mobj_t *thing) fixed_t paperoffset = 0, paperdistance = 0; angle_t centerangle = 0; - INT32 dispoffset = thing->info->dispoffset; + INT32 dispoffset = thing->dispoffset; //SoM: 3/17/2000 fixed_t gz = 0, gzt = 0; From bdd786d8ab0c5554673f4424b5cf6149ec12e454 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 29 Aug 2022 18:35:38 +0100 Subject: [PATCH 2/7] BLASTER finalisation - BLASTER >= 180% speed, smaller boost otherwise - Flickers under 150% - Invinc-coloured when invincibility - Ketchup coloured when boosting, invisible otherwise --- src/info.c | 29 ++++++++++------------------- src/info.h | 21 ++++++--------------- src/k_kart.c | 22 +++++++++++----------- src/p_mobj.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 71 insertions(+), 47 deletions(-) diff --git a/src/info.c b/src/info.c index afd2db52a..8fd5f929c 100644 --- a/src/info.c +++ b/src/info.c @@ -580,7 +580,8 @@ char sprnames[NUMSPRITES + 1][5] = "BEXS", // Battle Bumper Explosion: Shell "BDEB", // Battle Bumper Explosion: Debris "BEXB", // Battle Bumper Explosion: Blast - "TWBT", // Tripwire Boost + "TWBS", // Tripwire Boost + "TWBT", // Tripwire BLASTER "DEZL", // DEZ Laser respawn // Additional Kart Objects @@ -4361,21 +4362,11 @@ state_t states[NUMSTATES] = {SPR_BEXB, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_TRANS80, 2, {NULL}, 0, 0, S_BATTLEBUMPER_EXBLAST10}, // S_BATTLEBUMPER_EXBLAST9 {SPR_BEXB, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_TRANS90, 2, {NULL}, 0, 0, S_NULL}, // S_BATTLEBUMPER_EXBLAST10 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP2}, // S_TRIPWIREBOOST_TOP1 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|1, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP3}, // S_TRIPWIREBOOST_TOP2 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|2, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP4}, // S_TRIPWIREBOOST_TOP3 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|3, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP5}, // S_TRIPWIREBOOST_TOP4 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|4, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP6}, // S_TRIPWIREBOOST_TOP5 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|5, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP7}, // S_TRIPWIREBOOST_TOP6 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|6, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP1}, // S_TRIPWIREBOOST_TOP7 + {SPR_TWBS, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_TOP + {SPR_TWBS, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE|FF_VERTICALFLIP|FF_HORIZONTALFLIP, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_BOTTOM - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM2}, // S_TRIPWIREBOOST_BOTTOM1 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|1, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM3}, // S_TRIPWIREBOOST_BOTTOM2 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|2, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM4}, // S_TRIPWIREBOOST_BOTTOM3 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|3, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM5}, // S_TRIPWIREBOOST_BOTTOM4 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|4, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM6}, // S_TRIPWIREBOOST_BOTTOM5 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|5, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM7}, // S_TRIPWIREBOOST_BOTTOM6 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|6, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM1}, // S_TRIPWIREBOOST_BOTTOM7 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_BLAST_TOP + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE|FF_VERTICALFLIP|FF_HORIZONTALFLIP, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_BLAST_BOTTOM {SPR_DEZL, FF_FULLBRIGHT|FF_PAPERSPRITE, 8, {NULL}, 0, 0, S_NULL}, // S_DEZLASER {SPR_DEZL, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_DEZLASER_TRAIL2}, // S_DEZLASER_TRAIL1 @@ -24182,17 +24173,17 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_TRIPWIREBOOST -1, // doomednum - S_TRIPWIREBOOST_TOP1, // spawnstate + S_TRIPWIREBOOST_TOP, // spawnstate 1000, // spawnhealth - S_TRIPWIREBOOST_BOTTOM1, // seestate + S_TRIPWIREBOOST_BOTTOM, // seestate sfx_None, // seesound 8, // reactiontime sfx_None, // attacksound S_NULL, // painstate 0, // painchance sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate + S_TRIPWIREBOOST_BLAST_TOP, // meleestate + S_TRIPWIREBOOST_BLAST_BOTTOM, // missilestate S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound diff --git a/src/info.h b/src/info.h index 32f44df12..175de9cab 100644 --- a/src/info.h +++ b/src/info.h @@ -1126,7 +1126,8 @@ typedef enum sprite SPR_BEXS, // Battle Bumper Explosion: Shell SPR_BDEB, // Battle Bumper Explosion: Debris SPR_BEXB, // Battle Bumper Explosion: Blast - SPR_TWBT, // Tripwire Boost + SPR_TWBS, // Tripwire Boost + SPR_TWBT, // Tripwire BLASTER SPR_DEZL, // DEZ Laser respawn // Additional Kart Objects @@ -4794,20 +4795,10 @@ typedef enum state S_BATTLEBUMPER_EXBLAST9, S_BATTLEBUMPER_EXBLAST10, - S_TRIPWIREBOOST_TOP1, - S_TRIPWIREBOOST_TOP2, - S_TRIPWIREBOOST_TOP3, - S_TRIPWIREBOOST_TOP4, - S_TRIPWIREBOOST_TOP5, - S_TRIPWIREBOOST_TOP6, - S_TRIPWIREBOOST_TOP7, - S_TRIPWIREBOOST_BOTTOM1, - S_TRIPWIREBOOST_BOTTOM2, - S_TRIPWIREBOOST_BOTTOM3, - S_TRIPWIREBOOST_BOTTOM4, - S_TRIPWIREBOOST_BOTTOM5, - S_TRIPWIREBOOST_BOTTOM6, - S_TRIPWIREBOOST_BOTTOM7, + S_TRIPWIREBOOST_TOP, + S_TRIPWIREBOOST_BOTTOM, + S_TRIPWIREBOOST_BLAST_TOP, + S_TRIPWIREBOOST_BLAST_BOTTOM, // DEZ Laser respawn S_DEZLASER, diff --git a/src/k_kart.c b/src/k_kart.c index ed4510534..e05eab0c4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7207,23 +7207,23 @@ static void K_LookForRings(mobj_t *pmo) static void K_UpdateTripwire(player_t *player) { - fixed_t speedThreshold = K_GetKartSpeed(player, false) *3/4; + fixed_t speedThreshold = (3*K_GetKartSpeed(player, false, true))/4; boolean goodSpeed = (player->speed >= speedThreshold); + boolean boostExists = (player->tripwireLeniency > 0); // can't be checked later because of subtractions... - if (player->tripwireLeniency > 0) + if (boostExists) { player->tripwireLeniency--; - } - - if (goodSpeed == false && player->tripwireLeniency > 0) - { - // Decrease at double speed when your speed is bad. - player->tripwireLeniency--; + if (goodSpeed == false && player->tripwireLeniency > 0) + { + // Decrease at double speed when your speed is bad. + player->tripwireLeniency--; + } } if (K_TripwirePassConditions(player) == true) { - if (player->tripwireLeniency == 0) + if (!boostExists) { mobj_t *front = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_TRIPWIREBOOST); mobj_t *back = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_TRIPWIREBOOST); @@ -7232,10 +7232,10 @@ static void K_UpdateTripwire(player_t *player) P_SetTarget(&back->target, player->mo); front->dispoffset = 1; - + front->old_angle = back->old_angle = K_MomentumAngle(player->mo); back->dispoffset = -1; back->extravalue1 = 1; - P_SetMobjState(back, S_TRIPWIREBOOST_BOTTOM1); + P_SetMobjState(back, S_TRIPWIREBOOST_BOTTOM); } player->tripwireLeniency = max(player->tripwireLeniency, TRIPWIRETIME); diff --git a/src/p_mobj.c b/src/p_mobj.c index 6f7bb34b5..ee4b85059 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7182,6 +7182,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } { + fixed_t convSpeed = (mobj->target->player->speed * 100) / K_GetKartSpeed(mobj->target->player, false, true); UINT8 trans = ((mobj->target->player->tripwireLeniency + 1) * (NUMTRANSMAPS+1)) / TRIPWIRETIME; if (trans > NUMTRANSMAPS) @@ -7189,18 +7190,58 @@ static boolean P_MobjRegularThink(mobj_t *mobj) trans = NUMTRANSMAPS - trans; - if (trans >= NUMTRANSMAPS) + if ((trans >= NUMTRANSMAPS) // not a valid visibility + || (convSpeed < 150 && !(mobj->target->player->tripwireLeniency & 1)) // < 150% flickering + || (mobj->target->player->curshield == KSHIELD_FLAME && mobj->target->player->flamedash <= 0)) // flame shield but NOT boosting { mobj->renderflags |= RF_DONTDRAW; } else { - mobj->renderflags &= ~(RF_TRANSMASK); + boolean blastermode = (convSpeed >= 180); + mobj->renderflags &= ~(RF_TRANSMASK|RF_DONTDRAW); if (trans != 0) { mobj->renderflags |= (trans << RF_TRANSSHIFT); } + mobj->renderflags |= (mobj->target->renderflags & RF_DONTDRAW); + + if (mobj->target->player->invincibilitytimer > 0) + { + if (mobj->target->player->invincibilitytimer > itemtime+(2*TICRATE)) + { + mobj->color = K_RainbowColor(leveltime / 2); + } + else + { + mobj->color = SKINCOLOR_INVINCFLASH; + } + mobj->colorized = true; + } + else if (mobj->target->player->curshield == KSHIELD_FLAME && mobj->target->player->flamedash > 0) + { + mobj->color = SKINCOLOR_KETCHUP; + mobj->colorized = true; + } + else + { + mobj->color = SKINCOLOR_NONE; + mobj->colorized = false; + } + + if (blastermode == !(mobj->flags2 & MF2_AMBUSH)) + { + mobj->flags2 ^= MF2_AMBUSH; + if (blastermode) + { + P_SetMobjState(mobj, (mobj->extravalue1) ? S_TRIPWIREBOOST_BLAST_BOTTOM : S_TRIPWIREBOOST_BLAST_TOP); + } + else + { + P_SetMobjState(mobj, (mobj->extravalue1) ? S_TRIPWIREBOOST_BOTTOM : S_TRIPWIREBOOST_TOP); + } + } } } break; @@ -9882,6 +9923,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) // Sprite rendering mobj->spritexscale = mobj->spriteyscale = mobj->scale; mobj->spritexoffset = mobj->spriteyoffset = 0; + mobj->dispoffset = info->dispoffset; mobj->floorspriteslope = NULL; // set subsector and/or block links From 31835b380b6c52e584634a3d584e1426b344a947 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 29 Aug 2022 17:02:34 -0700 Subject: [PATCH 3/7] Set tripwire blaster destscale instead of player's --- 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 ee4b85059..a09c9c3c6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7173,7 +7173,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->angle = K_MomentumAngle(mobj->target); P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z + (mobj->target->height >> 1)); - mobj->target->destscale = mobj->target->scale; + mobj->destscale = mobj->target->scale; P_SetScale(mobj, mobj->target->scale); if (mobj->extravalue1) From 97fab1ab20872b2750f6cb1bebb35a5327b54840 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 30 Aug 2022 18:16:51 +0100 Subject: [PATCH 4/7] Levels of tripwire pass conditions. - Invinc and sneaker can go up to BLASTER. - Flame shield and momentum make only the boost by themselves. - Hyuu and grow ignore tripwire so don't make ANY aura without any of the prior also occouring. --- src/k_bot.c | 2 +- src/k_kart.c | 25 +++++++++++++++++-------- src/k_kart.h | 8 +++++++- src/p_mobj.c | 5 +++-- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index 0ae14c50e..f784afcf6 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -279,7 +279,7 @@ boolean K_BotCanTakeCut(player_t *player) { if ( #if 1 - K_TripwirePassConditions(player) == true + K_TripwirePassConditions(player) != TRIPWIRE_NONE #else K_ApplyOffroad(player) == false #endif diff --git a/src/k_kart.c b/src/k_kart.c index e05eab0c4..246e1b777 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2944,23 +2944,32 @@ boolean K_SlopeResistance(player_t *player) return false; } -boolean K_TripwirePassConditions(player_t *player) +UINT8 K_TripwirePassConditions(player_t *player) { if ( player->invincibilitytimer || - player->sneakertimer || - player->growshrinktimer > 0 || + player->sneakertimer + ) + return TRIPWIRE_BLASTER; + + if ( player->flamedash || - player->hyudorotimer || player->speed > 2 * K_GetKartSpeed(player, false, true) ) - return true; - return false; + return TRIPWIRE_BOOST; + + if ( + player->growshrinktimer > 0 || + player->hyudorotimer + ) + return TRIPWIRE_IGNORE; + + return TRIPWIRE_NONE; } boolean K_TripwirePass(player_t *player) { - return (K_TripwirePassConditions(player) || (player->tripwireLeniency > 0)); + return ((K_TripwirePassConditions(player) != TRIPWIRE_NONE) || (player->tripwireLeniency > 0)); } boolean K_WaterRun(player_t *player) @@ -7221,7 +7230,7 @@ static void K_UpdateTripwire(player_t *player) } } - if (K_TripwirePassConditions(player) == true) + if (K_TripwirePassConditions(player) != TRIPWIRE_NONE) { if (!boostExists) { diff --git a/src/k_kart.h b/src/k_kart.h index 797899cea..271ce5ac3 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -121,7 +121,13 @@ void K_StripOther(player_t *player); void K_MomentumToFacing(player_t *player); boolean K_ApplyOffroad(player_t *player); boolean K_SlopeResistance(player_t *player); -boolean K_TripwirePassConditions(player_t *player); + +#define TRIPWIRE_BLASTER 0x03 +#define TRIPWIRE_BOOST 0x02 +#define TRIPWIRE_IGNORE 0x01 +#define TRIPWIRE_NONE 0x00 +UINT8 K_TripwirePassConditions(player_t *player); + boolean K_TripwirePass(player_t *player); boolean K_WaterRun(player_t *player); void K_ApplyTripWire(player_t *player, tripwirestate_t state); diff --git a/src/p_mobj.c b/src/p_mobj.c index a09c9c3c6..3e5b0768c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7184,6 +7184,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { fixed_t convSpeed = (mobj->target->player->speed * 100) / K_GetKartSpeed(mobj->target->player, false, true); UINT8 trans = ((mobj->target->player->tripwireLeniency + 1) * (NUMTRANSMAPS+1)) / TRIPWIRETIME; + UINT8 triplevel = K_TripwirePassConditions(mobj->target->player); if (trans > NUMTRANSMAPS) trans = NUMTRANSMAPS; @@ -7192,13 +7193,13 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if ((trans >= NUMTRANSMAPS) // not a valid visibility || (convSpeed < 150 && !(mobj->target->player->tripwireLeniency & 1)) // < 150% flickering - || (mobj->target->player->curshield == KSHIELD_FLAME && mobj->target->player->flamedash <= 0)) // flame shield but NOT boosting + || (triplevel < TRIPWIRE_BOOST)) // Not strong enough to make an aura { mobj->renderflags |= RF_DONTDRAW; } else { - boolean blastermode = (convSpeed >= 180); + boolean blastermode = (convSpeed >= 180) && (triplevel >= TRIPWIRE_BLASTER); mobj->renderflags &= ~(RF_TRANSMASK|RF_DONTDRAW); if (trans != 0) From 6b8d729b2ca3430fff0fa49648b81d938bc58369 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 30 Aug 2022 19:29:12 +0100 Subject: [PATCH 5/7] Blaster polish * Use leveltime instead of leniency for flicker, which makes it work as intended * Make the threshold for tripwire BLASTER 200% (from 180%) * Always colorize boost/BLASTER when you have a Flame Shield * Hide boost/BLASTER if you're using flamedash specifically --- src/p_mobj.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 3e5b0768c..441173a36 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7192,14 +7192,15 @@ static boolean P_MobjRegularThink(mobj_t *mobj) trans = NUMTRANSMAPS - trans; if ((trans >= NUMTRANSMAPS) // not a valid visibility - || (convSpeed < 150 && !(mobj->target->player->tripwireLeniency & 1)) // < 150% flickering - || (triplevel < TRIPWIRE_BOOST)) // Not strong enough to make an aura + || (convSpeed < 150 && (leveltime & 1)) // < 150% flickering + || (triplevel < TRIPWIRE_BOOST) // Not strong enough to make an aura + || mobj->target->player->flamedash) // Flameshield dash { mobj->renderflags |= RF_DONTDRAW; } else { - boolean blastermode = (convSpeed >= 180) && (triplevel >= TRIPWIRE_BLASTER); + boolean blastermode = (convSpeed >= 200) && (triplevel >= TRIPWIRE_BLASTER); mobj->renderflags &= ~(RF_TRANSMASK|RF_DONTDRAW); if (trans != 0) @@ -7220,7 +7221,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } mobj->colorized = true; } - else if (mobj->target->player->curshield == KSHIELD_FLAME && mobj->target->player->flamedash > 0) + else if (mobj->target->player->curshield == KSHIELD_FLAME) { mobj->color = SKINCOLOR_KETCHUP; mobj->colorized = true; From 2c91f83a025ad458eb1d65858c6cb11a674f531c Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 30 Aug 2022 21:22:26 +0100 Subject: [PATCH 6/7] Store tripwire pass level on the player Fixes tripwire leniency fadeout - previously broken two commits ago --- src/d_player.h | 18 ++++++++++----- src/g_game.c | 1 - src/k_kart.c | 53 ++++++++++++++++++++++++++------------------- src/k_kart.h | 8 +------ src/lua_playerlib.c | 8 +++++++ src/p_map.c | 2 +- src/p_mobj.c | 5 ++--- src/p_saveg.c | 6 +++-- src/p_spec.c | 2 +- 9 files changed, 61 insertions(+), 42 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 31154ea76..85eec2e3e 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -204,11 +204,19 @@ typedef enum typedef enum { - TRIP_NONE, - TRIP_PASSED, - TRIP_BLOCKED, + TRIPSTATE_NONE, + TRIPSTATE_PASSED, + TRIPSTATE_BLOCKED, } tripwirestate_t; +typedef enum +{ + TRIPWIRE_NONE, + TRIPWIRE_IGNORE, + TRIPWIRE_BOOST, + TRIPWIRE_BLASTER, +} tripwirepass_t; + typedef enum { // Unsynced, HUD or clientsided effects @@ -446,6 +454,8 @@ typedef struct player_s UINT16 draftleeway; // Leniency timer before removing draft power SINT8 lastdraft; // (-1 to 15) - Last player being drafted + UINT8 tripwireState; // see tripwirestate_t + UINT8 tripwirePass; // see tripwirepass_t UINT16 tripwireLeniency; // When reaching a state that lets you go thru tripwire, you get an extra second leniency after it ends to still go through it. UINT16 itemroulette; // Used for the roulette when deciding what item to give you (was "pw_kartitem") @@ -515,8 +525,6 @@ typedef struct player_s SINT8 glanceDir; // Direction the player is trying to look backwards in - UINT8 tripWireState; // see tripwirestate_t - // SINT8 lives; diff --git a/src/g_game.c b/src/g_game.c index 68286da99..155a62a0f 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2410,7 +2410,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->karthud[khud_fault] = khudfault; p->nocontrol = nocontrol; p->kickstartaccel = kickstartaccel; - p->tripWireState = TRIP_NONE; p->botvars.rubberband = FRACUNIT; p->botvars.controller = UINT16_MAX; diff --git a/src/k_kart.c b/src/k_kart.c index 246e1b777..189b946cd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2944,7 +2944,7 @@ boolean K_SlopeResistance(player_t *player) return false; } -UINT8 K_TripwirePassConditions(player_t *player) +tripwirepass_t K_TripwirePassConditions(player_t *player) { if ( player->invincibilitytimer || @@ -2969,7 +2969,7 @@ UINT8 K_TripwirePassConditions(player_t *player) boolean K_TripwirePass(player_t *player) { - return ((K_TripwirePassConditions(player) != TRIPWIRE_NONE) || (player->tripwireLeniency > 0)); + return (player->tripwirePass != TRIPWIRE_NONE); } boolean K_WaterRun(player_t *player) @@ -3676,7 +3676,7 @@ void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) player->tumbleBounces = 1; - if (player->tripWireState == TRIP_PASSED) + if (player->tripwireState == TRIPSTATE_PASSED) { player->tumbleHeight = 50; } @@ -3790,15 +3790,15 @@ void K_TumbleInterrupt(player_t *player) void K_ApplyTripWire(player_t *player, tripwirestate_t state) { - if (state == TRIP_PASSED) + if (state == TRIPSTATE_PASSED) S_StartSound(player->mo, sfx_ssa015); - else if (state == TRIP_BLOCKED) + else if (state == TRIPSTATE_BLOCKED) S_StartSound(player->mo, sfx_kc40); - player->tripWireState = state; + player->tripwireState = state; K_AddHitLag(player->mo, 10, false); - if (state == TRIP_PASSED && player->spinouttimer && + if (state == TRIPSTATE_PASSED && player->spinouttimer && player->speed > 2 * K_GetKartSpeed(player, false, true)) { K_TumblePlayer(player, NULL, NULL); @@ -7219,18 +7219,9 @@ static void K_UpdateTripwire(player_t *player) fixed_t speedThreshold = (3*K_GetKartSpeed(player, false, true))/4; boolean goodSpeed = (player->speed >= speedThreshold); boolean boostExists = (player->tripwireLeniency > 0); // can't be checked later because of subtractions... + tripwirepass_t triplevel = K_TripwirePassConditions(player); - if (boostExists) - { - player->tripwireLeniency--; - if (goodSpeed == false && player->tripwireLeniency > 0) - { - // Decrease at double speed when your speed is bad. - player->tripwireLeniency--; - } - } - - if (K_TripwirePassConditions(player) != TRIPWIRE_NONE) + if (triplevel != TRIPWIRE_NONE) { if (!boostExists) { @@ -7247,8 +7238,26 @@ static void K_UpdateTripwire(player_t *player) P_SetMobjState(back, S_TRIPWIREBOOST_BOTTOM); } + player->tripwirePass = triplevel; player->tripwireLeniency = max(player->tripwireLeniency, TRIPWIRETIME); } + else + { + if (boostExists) + { + player->tripwireLeniency--; + if (goodSpeed == false && player->tripwireLeniency > 0) + { + // Decrease at double speed when your speed is bad. + player->tripwireLeniency--; + } + } + + if (player->tripwireLeniency <= 0) + { + player->tripwirePass = TRIPWIRE_NONE; + } + } } /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c @@ -7718,14 +7727,14 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Handle invincibility sfx K_UpdateInvincibilitySounds(player); // Also thanks, VAda! - if (player->tripWireState != TRIP_NONE) + if (player->tripwireState != TRIPSTATE_NONE) { - if (player->tripWireState == TRIP_PASSED) + if (player->tripwireState == TRIPSTATE_PASSED) S_StartSound(player->mo, sfx_cdfm63); - else if (player->tripWireState == TRIP_BLOCKED) + else if (player->tripwireState == TRIPSTATE_BLOCKED) S_StartSound(player->mo, sfx_kc4c); - player->tripWireState = TRIP_NONE; + player->tripwireState = TRIPSTATE_NONE; } K_KartEbrakeVisuals(player); diff --git a/src/k_kart.h b/src/k_kart.h index 271ce5ac3..00c36ea76 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -121,13 +121,7 @@ void K_StripOther(player_t *player); void K_MomentumToFacing(player_t *player); boolean K_ApplyOffroad(player_t *player); boolean K_SlopeResistance(player_t *player); - -#define TRIPWIRE_BLASTER 0x03 -#define TRIPWIRE_BOOST 0x02 -#define TRIPWIRE_IGNORE 0x01 -#define TRIPWIRE_NONE 0x00 -UINT8 K_TripwirePassConditions(player_t *player); - +tripwirepass_t K_TripwirePassConditions(player_t *player); boolean K_TripwirePass(player_t *player); boolean K_WaterRun(player_t *player); void K_ApplyTripWire(player_t *player, tripwirestate_t state); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index c448a287a..1d5f6bee7 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -292,6 +292,10 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->draftleeway); else if (fastcmp(field,"lastdraft")) lua_pushinteger(L, plr->lastdraft); + else if (fastcmp(field,"tripwireState")) + lua_pushinteger(L, plr->tripwireState); + else if (fastcmp(field,"tripwirePass")) + lua_pushinteger(L, plr->tripwirePass); else if (fastcmp(field,"tripwireLeniency")) lua_pushinteger(L, plr->tripwireLeniency); else if (fastcmp(field,"itemroulette")) @@ -646,6 +650,10 @@ static int player_set(lua_State *L) plr->draftleeway = luaL_checkinteger(L, 3); else if (fastcmp(field,"lastdraft")) plr->lastdraft = luaL_checkinteger(L, 3); + else if (fastcmp(field,"tripwireState")) + plr->tripwireState = luaL_checkinteger(L, 3); + else if (fastcmp(field,"tripwirePass")) + plr->tripwirePass = luaL_checkinteger(L, 3); else if (fastcmp(field,"tripwireLeniency")) plr->tripwireLeniency = luaL_checkinteger(L, 3); else if (fastcmp(field,"itemroulette")) diff --git a/src/p_map.c b/src/p_map.c index 3d6938ed2..d667b0346 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3801,7 +3801,7 @@ void P_BouncePlayerMove(mobj_t *mo) if (P_IsLineTripWire(bestslideline)) { // TRIPWIRE CANNOT BE MADE NONBOUNCY - K_ApplyTripWire(mo->player, TRIP_BLOCKED); + K_ApplyTripWire(mo->player, TRIPSTATE_BLOCKED); } else { diff --git a/src/p_mobj.c b/src/p_mobj.c index 441173a36..8e6e0eb2a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7184,7 +7184,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { fixed_t convSpeed = (mobj->target->player->speed * 100) / K_GetKartSpeed(mobj->target->player, false, true); UINT8 trans = ((mobj->target->player->tripwireLeniency + 1) * (NUMTRANSMAPS+1)) / TRIPWIRETIME; - UINT8 triplevel = K_TripwirePassConditions(mobj->target->player); if (trans > NUMTRANSMAPS) trans = NUMTRANSMAPS; @@ -7193,14 +7192,14 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if ((trans >= NUMTRANSMAPS) // not a valid visibility || (convSpeed < 150 && (leveltime & 1)) // < 150% flickering - || (triplevel < TRIPWIRE_BOOST) // Not strong enough to make an aura + || (mobj->target->player->tripwirePass < TRIPWIRE_BOOST) // Not strong enough to make an aura || mobj->target->player->flamedash) // Flameshield dash { mobj->renderflags |= RF_DONTDRAW; } else { - boolean blastermode = (convSpeed >= 200) && (triplevel >= TRIPWIRE_BLASTER); + boolean blastermode = (convSpeed >= 200) && (mobj->target->player->tripwirePass >= TRIPWIRE_BLASTER); mobj->renderflags &= ~(RF_TRANSMASK|RF_DONTDRAW); if (trans != 0) diff --git a/src/p_saveg.c b/src/p_saveg.c index 4422eaf20..5569f24d5 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -291,6 +291,8 @@ static void P_NetArchivePlayers(void) WRITEUINT16(save_p, players[i].draftleeway); WRITESINT8(save_p, players[i].lastdraft); + WRITEUINT8(save_p, players[i].tripwireState); + WRITEUINT8(save_p, players[i].tripwirePass); WRITEUINT16(save_p, players[i].tripwireLeniency); WRITEUINT16(save_p, players[i].itemroulette); @@ -355,7 +357,6 @@ static void P_NetArchivePlayers(void) WRITEUINT32(save_p, players[i].spheredigestion); WRITESINT8(save_p, players[i].glanceDir); - WRITEUINT8(save_p, players[i].tripWireState); WRITEUINT8(save_p, players[i].typing_timer); WRITEUINT8(save_p, players[i].typing_duration); @@ -575,6 +576,8 @@ static void P_NetUnArchivePlayers(void) players[i].draftleeway = READUINT16(save_p); players[i].lastdraft = READSINT8(save_p); + players[i].tripwireState = READUINT8(save_p); + players[i].tripwirePass = READUINT8(save_p); players[i].tripwireLeniency = READUINT16(save_p); players[i].itemroulette = READUINT16(save_p); @@ -639,7 +642,6 @@ static void P_NetUnArchivePlayers(void) players[i].spheredigestion = READUINT32(save_p); players[i].glanceDir = READSINT8(save_p); - players[i].tripWireState = READUINT8(save_p); players[i].typing_timer = READUINT8(save_p); players[i].typing_duration = READUINT8(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index 6d437fa08..942e72fb6 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2070,7 +2070,7 @@ void P_CrossSpecialLine(line_t *line, INT32 side, mobj_t *thing) if (P_IsLineTripWire(line)) { - K_ApplyTripWire(player, TRIP_PASSED); + K_ApplyTripWire(player, TRIPSTATE_PASSED); } switch (line->special) From befda8b38e17c038ab3906400917606db898b83b Mon Sep 17 00:00:00 2001 From: VelocitOni Date: Tue, 30 Aug 2022 23:41:13 -0400 Subject: [PATCH 7/7] Made states in deh_tables.c match info.h Copy-pasted from info.h to deh_tables.c, fixes Opulence barrels problem. --- src/deh_tables.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 2be68bd1c..47a6ca515 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3806,20 +3806,10 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BATTLEBUMPER_EXBLAST10", // Tripwire - "S_TRIPWIREBOOST_TOP1", - "S_TRIPWIREBOOST_TOP2", - "S_TRIPWIREBOOST_TOP3", - "S_TRIPWIREBOOST_TOP4", - "S_TRIPWIREBOOST_TOP5", - "S_TRIPWIREBOOST_TOP6", - "S_TRIPWIREBOOST_TOP7", - "S_TRIPWIREBOOST_BOTTOM1", - "S_TRIPWIREBOOST_BOTTOM2", - "S_TRIPWIREBOOST_BOTTOM3", - "S_TRIPWIREBOOST_BOTTOM4", - "S_TRIPWIREBOOST_BOTTOM5", - "S_TRIPWIREBOOST_BOTTOM6", - "S_TRIPWIREBOOST_BOTTOM7", + "S_TRIPWIREBOOST_TOP", + "S_TRIPWIREBOOST_BOTTOM", + "S_TRIPWIREBOOST_BLAST_TOP", + "S_TRIPWIREBOOST_BLAST_BOTTOM", // DEZ respawn laser "S_DEZLASER",