From 199a92ebb2e3a9e7049a6b765f00864997b8bd20 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Mon, 22 Jul 2024 02:14:11 -0700 Subject: [PATCH 1/7] WIP: Overdrive --- src/d_player.h | 7 ++ src/deh_tables.c | 4 + src/info.c | 30 ++++++++ src/info.h | 6 ++ src/k_collide.cpp | 6 ++ src/k_hud.cpp | 66 +++++++++++++++- src/k_kart.c | 151 ++++++++++++++++++++++++++++++++++++- src/k_kart.h | 5 ++ src/k_objects.h | 4 +- src/lua_playerlib.c | 20 +++++ src/objects/CMakeLists.txt | 1 + src/objects/amps.c | 80 ++++++++++++++++++++ src/p_inter.c | 11 +++ src/p_mobj.c | 5 ++ src/p_saveg.c | 12 +++ 15 files changed, 404 insertions(+), 4 deletions(-) create mode 100644 src/objects/amps.c diff --git a/src/d_player.h b/src/d_player.h index 69a4207c9..5513a6043 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -1029,6 +1029,13 @@ struct player_t UINT8 ringboxdelay; // Delay until Ring Box auto-activates UINT8 ringboxaward; // Where did we stop? + UINT8 amps; + UINT8 ampsounds; + UINT8 ampspending; + + UINT16 overdriveboost; + fixed_t overdrivepower; + UINT8 itemflags; // holds IF_ flags (see itemflags_t) fixed_t outrun; // Milky Way road effect diff --git a/src/deh_tables.c b/src/deh_tables.c index df818c094..c40d56be3 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -2636,6 +2636,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_WAYPOINTSPLAT", "S_EGOORB", + "S_AMPS", + "S_WATERTRAIL1", "S_WATERTRAIL2", "S_WATERTRAIL3", @@ -3937,6 +3939,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_IPULLUP", "MT_PULLUPHOOK", + + "MT_AMPS", }; const char *const MOBJFLAG_LIST[] = { diff --git a/src/info.c b/src/info.c index c639c7c35..d4366ed19 100644 --- a/src/info.c +++ b/src/info.c @@ -577,6 +577,8 @@ char sprnames[NUMSPRITES + 1][5] = "WAYP", "EGOO", + "AMPA", + "WTRL", // Water Trail "GCHA", // follower: generic chao @@ -3168,6 +3170,8 @@ state_t states[NUMSTATES] = {SPR_WAYP, 1|FF_FLOORSPRITE, 1, {NULL}, 0, 0, S_NULL}, // S_WAYPOINTSPLAT {SPR_EGOO, 0, 1, {NULL}, 0, 0, S_NULL}, // S_EGOORB + {SPR_AMPA, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_AMPS + // Water Trail {SPR_WTRL, FF_PAPERSPRITE , 2, {NULL}, 0, 0, S_NULL}, // S_WATERTRAIL1 {SPR_WTRL, FF_PAPERSPRITE|1, 2, {NULL}, 0, 0, S_NULL}, // S_WATERTRAIL2 @@ -22073,6 +22077,32 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MF_NOCLIPHEIGHT|MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIP, // flags S_NULL // raisestate }, + { // MT_AMPS + 3444, // doomednum + S_AMPS, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 32*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // dispoffset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP|MF_NOCLIPTHING, // flags + S_NULL // raisestate + }, }; diff --git a/src/info.h b/src/info.h index dc9006856..fa8e3fc1b 100644 --- a/src/info.h +++ b/src/info.h @@ -1116,6 +1116,8 @@ typedef enum sprite SPR_WAYP, SPR_EGOO, + SPR_AMPA, + SPR_WTRL, // Water Trail SPR_GCHA, // follower: generic chao @@ -3662,6 +3664,8 @@ typedef enum state S_WAYPOINTSPLAT, S_EGOORB, + S_AMPS, + S_WATERTRAIL1, S_WATERTRAIL2, S_WATERTRAIL3, @@ -4990,6 +4994,8 @@ typedef enum mobj_type MT_IPULLUP, MT_PULLUPHOOK, + MT_AMPS, + MT_FIRSTFREESLOT, MT_LASTFREESLOT = MT_FIRSTFREESLOT + NUMMOBJFREESLOTS - 1, NUMMOBJTYPES diff --git a/src/k_collide.cpp b/src/k_collide.cpp index eb9c788e0..67fcfdfa9 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -29,6 +29,7 @@ #include "m_random.h" #include "k_hud.h" // K_AddMessage #include "m_easing.h" +#include "r_skins.h" angle_t K_GetCollideAngle(mobj_t *t1, mobj_t *t2) { @@ -694,6 +695,11 @@ boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2) S_StartSound(t2, sfx_kdtrg1); } + if (t1->tracer && t1->tracer->player) + { + K_SpawnAmps(t1->tracer->player, 20, t1); + } + if (draggeddroptarget && !P_MobjWasRemoved(draggeddroptarget) && draggeddroptarget->player) { // The following removes t1, be warned diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 6f74c996b..d91ef4368 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -107,6 +107,9 @@ static patch_t *kp_ringdebtminus; static patch_t *kp_ringdebtminussmall; static patch_t *kp_ringspblock[16]; static patch_t *kp_ringspblocksmall[16]; +static patch_t *kp_amps[7][12]; +static patch_t *kp_amps_underlay[12]; +static patch_t *kp_overdrive[32]; static patch_t *kp_speedometersticker; static patch_t *kp_speedometerlabel[4]; @@ -417,6 +420,47 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_ring[i], "%s", buffer); } + // Amps + { + // Levels 1-6 + sprintf(buffer, "b_xAMPxx"); + for (i = 0; i < 6; i++) + { + buffer[2] = '0'+i+1; + for (j = 0; j < 12; j++) + { + buffer[6] = '0'+((j) / 10); + buffer[7] = '0'+((j) % 10); + HU_UpdatePatch(&kp_amps[i][j], "%s", buffer); + } + } + + // Level 7 + buffer[2] = '7'; + buffer[1] = 'A'; + for (j = 0; j < 12; j++) + { + buffer[6] = '0'+((j) / 10); + buffer[7] = '0'+((j) % 10); + HU_UpdatePatch(&kp_amps[i][j], "%s", buffer); + } + buffer[1] = 'B'; + for (j = 0; j < 12; j++) + { + buffer[6] = '0'+((j) / 10); + buffer[7] = '0'+((j) % 10); + HU_UpdatePatch(&kp_amps_underlay[j], "%s", buffer); + } + } + + sprintf(buffer, "b_OVRDxx"); + for (i = 0; i < 32; i++) + { + buffer[6] = '0'+((i) / 10); + buffer[7] = '0'+((i) % 10); + HU_UpdatePatch(&kp_overdrive[i], "%s", buffer); + } + HU_UpdatePatch(&kp_ringdebtminus, "RDEBTMIN"); sprintf(buffer, "SPBRNGxx"); @@ -3125,8 +3169,28 @@ static void K_drawRingCounter(boolean gametypeinfoshown) .align(Draw::Align::kCenter) .width(uselives ? (stplyr->lives >= 10 ? 70 : 64) : 33) .small_sticker(); + + if (stplyr->overdriveboost) + { + V_DrawMappedPatch(LAPS_X+7-8, fy-5-8, V_HUDTRANS|V_SLIDEIN|splitflags, kp_overdrive[leveltime%32], R_GetTranslationColormap(TC_RAINBOW, static_cast(stplyr->skincolor), GTC_CACHE)); + } + else + { + V_DrawMappedPatch(LAPS_X+ringx+7, fy-5, V_HUDTRANS|V_SLIDEIN|splitflags|ringflip, kp_ring[ringanim_realframe], (colorring ? ringmap : NULL)); + + if (stplyr->amps) + { + UINT8 amplevel = std::min(stplyr->amps / AMPLEVEL, 6); + + V_DrawMappedPatch(LAPS_X+7-7, fy-5-8, V_HUDTRANS|V_SLIDEIN|splitflags, kp_amps[amplevel][leveltime%12], R_GetTranslationColormap(TC_RAINBOW, static_cast(stplyr->skincolor), GTC_CACHE)); + if (amplevel == 6) + { + V_DrawMappedPatch(LAPS_X+7-7, fy-5-8, V_ADD|V_HUDTRANS|V_SLIDEIN|splitflags, kp_amps_underlay[leveltime%12], R_GetTranslationColormap(TC_RAINBOW, static_cast(stplyr->skincolor), GTC_CACHE)); + } + } + } + - V_DrawMappedPatch(LAPS_X+ringx+7, fy-5, V_HUDTRANS|V_SLIDEIN|splitflags|ringflip, kp_ring[ringanim_realframe], (colorring ? ringmap : NULL)); // "Why fy-4? Why LAPS_X+29+1?" // "use magic numbers" - jartha 2024-03-05 diff --git a/src/k_kart.c b/src/k_kart.c index 7d6bba2fe..b55d7a8be 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2012,6 +2012,12 @@ static void K_SpawnGenericSpeedLines(player_t *player, boolean top) fast->color = SKINCOLOR_WHITE; fast->colorized = true; } + else if (player->overdriveboost) + { + fast->color = player->skincolor; + fast->renderflags |= RF_ADD; + fast->scale *= 2; + } else if (player->ringboost) { UINT8 ringboostcolors[] = {SKINCOLOR_AQUAMARINE, SKINCOLOR_EMERALD, SKINCOLOR_GARDEN, SKINCOLOR_CROCODILE, SKINCOLOR_BANANA}; @@ -3512,6 +3518,23 @@ static void K_GetKartBoostPower(player_t *player) ); // + 80% top speed (peak), +400% acceleration (peak), +20% handling } + if (player->overdriveboost) + { + ADDBOOST( + Easing_InCubic( + player->overdrivepower, + 0, + 5*FRACUNIT/10 + ), + Easing_InSine( + player->overdrivepower, + 0, + 3*FRACUNIT + ), + 1*SLIPTIDEHANDLING/5 + ); // + 80% top speed (peak), +400% acceleration (peak), +20% handling + } + if (player->spindashboost) // Spindash boost { const fixed_t MAXCHARGESPEED = K_GetSpindashChargeSpeed(player); @@ -3575,11 +3598,14 @@ static void K_GetKartBoostPower(player_t *player) if (player->ringboost) // Ring Boost { + fixed_t ringboost_base = FRACUNIT/4; + if (player->overdriveboost) + ringboost_base += FRACUNIT/2; // This one's a little special: we add extra top speed per tic of ringboost stored up, to allow for Ring Box to really rocket away. // (We compensate when decrementing ringboost to avoid runaway exponential scaling hell.) fixed_t rb = FixedDiv(player->ringboost * FRACUNIT, max(FRACUNIT, K_RingDurationBoost(player))); ADDBOOST( - FRACUNIT/4 + FixedMul(FRACUNIT / 1750, rb), + ringboost_base + FixedMul(FRACUNIT / 1750, rb), 4*FRACUNIT, Easing_InCubic(min(FRACUNIT, rb / (TICRATE*12)), 0, 2*SLIPTIDEHANDLING/5) ); // + 20% + ???% top speed, + 400% acceleration, +???% handling @@ -3969,6 +3995,44 @@ angle_t K_MomentumAngleReal(const mobj_t *mo) } } +void K_SpawnAmps(player_t *player, UINT8 amps, mobj_t *impact) +{ + if (gametyperules & GTR_SPHERES) + return; + + // Give that Sonic guy some help. + UINT16 scaledamps = min(amps, amps * (10 + player->kartspeed - player->kartweight) / 10); + + for (int i = 0; i < (scaledamps/2); i++) + { + mobj_t *pickup = P_SpawnMobj(impact->x, impact->y, impact->z, MT_AMPS); + pickup->momx = P_RandomRange(PR_ITEM_DEBRIS, -40*mapobjectscale, 40*mapobjectscale); + pickup->momy = P_RandomRange(PR_ITEM_DEBRIS, -40*mapobjectscale, 40*mapobjectscale); + pickup->momz = P_RandomRange(PR_ITEM_DEBRIS, -40*mapobjectscale, 40*mapobjectscale); + pickup->color = player->skincolor; + P_SetTarget(&pickup->target, player->mo); + player->ampspending++; + } +} + +void K_AwardPlayerAmps(player_t *player, UINT8 amps) +{ + UINT16 getamped = player->amps + amps; + + if (getamped > 200) + player->amps = 200; + else + player->amps = getamped; + + player->ampsounds++; + player->ampspending--; + + if (player->rings <= 0 && player->ampspending == 0) + { + K_Overdrive(player); + } +} + void K_AwardPlayerRings(player_t *player, UINT16 rings, boolean overload) { UINT16 superring; @@ -3994,6 +4058,24 @@ void K_AwardPlayerRings(player_t *player, UINT16 rings, boolean overload) player->superring = superring; } +boolean K_Overdrive(player_t *player) +{ + if (player->amps == 0) + return false; + + K_SpawnDriftBoostExplosion(player, 3); + K_SpawnDriftElectricSparks(player, player->skincolor, true); + S_StartSound(player->mo, sfx_cdfm35); + S_StartSound(player->mo, sfx_cdfm13); + + player->overdriveboost += (player->amps)*6; + player->overdrivepower = FRACUNIT; + + player->amps = 0; + + return true; +} + void K_DoInstashield(player_t *player) { mobj_t *layera; @@ -7246,6 +7328,7 @@ void K_DropHnextList(player_t *player) dropwork->momy = work->momy; dropwork->momz = work->momz; dropwork->reactiontime = work->reactiontime; + dropwork->tracer = work->tracer; P_SetMobjState(dropwork, mobjinfo[type].painstate); } } @@ -8987,6 +9070,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->wavedashboost--; } + if (player->overdriveboost > 0 && onground == true) + { + player->overdriveboost--; + } + if (player->wavedashboost == 0 || player->wavedashpower > FRACUNIT) { player->wavedashpower = FRACUNIT; // Safety @@ -9038,6 +9126,36 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) K_DoIngameRespawn(player); } + if (player->ampsounds && (leveltime%2)) + { + if (P_IsDisplayPlayer(player)) + { + S_StartSoundAtVolume(NULL, sfx_mbs43, 255); + S_StartSoundAtVolume(NULL, sfx_mbs43, 255); + } + else + { + S_StartSoundAtVolume(NULL, sfx_mbs43, 127); + } + player->ampsounds--; + + if (player->ampsounds == 0) + { + UINT8 amplevel = player->amps / AMPLEVEL; + static sfxenum_t bwips[7] = {sfx_mbs4c, + sfx_mbs4d, sfx_mbs4e, sfx_mbs4f, sfx_mbs50, + sfx_mbs51, sfx_mbs52}; + amplevel = min(amplevel, 6); + + if (P_IsDisplayPlayer(player)) + { + S_StartSound(NULL, bwips[amplevel]); + S_StartSound(NULL, bwips[amplevel]); + } + } + } + + // Don't tick down while in damage state. // There may be some maps where the timer activates for // a moment during normal play, but would quickly correct @@ -9698,6 +9816,22 @@ void K_KartResetPlayerColor(player_t *player) goto finalise; } + if (player->overdriveboost && (leveltime & 1)) + { + player->mo->colorized = true; + fullbright = true; + player->mo->color = player->skincolor; + goto finalise; + + } + else if (player->overdriveboost) + { + player->mo->colorized = true; + fullbright = true; + player->mo->color = SKINCOLOR_WHITE; + goto finalise; + } + if (player->ringboost && (leveltime & 1)) // ring boosting { player->mo->colorized = true; @@ -11821,6 +11955,9 @@ static void K_KartSpindashWind(mobj_t *parent) if (parent->player && parent->player->wavedashboost) P_SetScale(wind, wind->scale * 2); + if (parent->player && parent->player->overdriveboost) + P_SetScale(wind, wind->scale * 2); + if (parent->momx || parent->momy) wind->angle = R_PointToAngle2(0, 0, parent->momx, parent->momy); else @@ -11888,6 +12025,11 @@ static void K_KartSpindash(player_t *player) K_KartSpindashWind(player->mo); } + if ((player->overdriveboost > 0) && (spawnWind == true)) + { + K_KartSpindashWind(player->mo); + } + if (player->spindashboost > (TICRATE/2)) { K_KartSpindashDust(player->mo); @@ -12735,6 +12877,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->ringdelay = tiereddelay; else player->ringdelay = 3; + + if (player->rings == 0) + K_Overdrive(player); } } @@ -13043,6 +13188,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mo->movecount = 1; mo->movedir = 1; mo->cusval = player->itemscale; + P_SetTarget(&mo->tracer, player->mo); P_SetTarget(&mo->target, player->mo); P_SetTarget(&player->mo->hnext, mo); } @@ -13051,7 +13197,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (ATTACK_IS_DOWN && (player->itemflags & IF_ITEMOUT)) { player->itemamount--; - K_ThrowKartItem(player, (player->throwdir > 0), MT_DROPTARGET, -1, 0, 0); + mobj_t *drop = K_ThrowKartItem(player, (player->throwdir > 0), MT_DROPTARGET, -1, 0, 0); + P_SetTarget(&drop->tracer, player->mo); K_PlayAttackTaunt(player->mo); player->itemflags &= ~IF_ITEMOUT; K_UpdateHnextList(player, true); diff --git a/src/k_kart.h b/src/k_kart.h index 4c67b23df..9dd5ae478 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -50,6 +50,8 @@ Make sure this matches the actual number of states #define MINCOMBOFLOAT (mapobjectscale*1) #define MAXCOMBOTIME (TICRATE*4) +#define AMPLEVEL (30) + #define FLAMESHIELD_MAX (120) #define RR_PROJECTILE_FUSE (8*TICRATE) @@ -129,7 +131,10 @@ void K_KartPlayerAfterThink(player_t *player); angle_t K_MomentumAngleEx(const mobj_t *mo, const fixed_t threshold); angle_t K_MomentumAngleReal(const mobj_t *mo); #define K_MomentumAngle(mo) K_MomentumAngleEx(mo, 6 * mo->scale) +void K_SpawnAmps(player_t *player, UINT8 amps, mobj_t *impact); +void K_AwardPlayerAmps(player_t *player, UINT8 amps); void K_AwardPlayerRings(player_t *player, UINT16 rings, boolean overload); +boolean K_Overdrive(player_t *player); void K_DoInstashield(player_t *player); void K_DoPowerClash(mobj_t *t1, mobj_t *t2); void K_DoGuardBreak(mobj_t *t1, mobj_t *t2); diff --git a/src/k_objects.h b/src/k_objects.h index 6ab2ccaa3..c336956c2 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -139,6 +139,8 @@ void Obj_BlockRingThink(mobj_t *ring); void Obj_BlockBodyThink(mobj_t *body); void Obj_GuardBreakThink(mobj_t *fx); +void Obj_AmpsThink(mobj_t *amps); + void Obj_ChargeAuraThink(mobj_t *aura); void Obj_ChargeFallThink(mobj_t *charge); void Obj_ChargeReleaseThink(mobj_t *release); @@ -161,7 +163,7 @@ void Obj_RandomItemVisuals(mobj_t *mobj); boolean Obj_RandomItemSpawnIn(mobj_t *mobj); fixed_t Obj_RandomItemScale(fixed_t oldScale); void Obj_RandomItemSpawn(mobj_t *mobj); -#define RINGBOX_TIME (105) +#define RINGBOX_TIME (70) /* Gachabom Rebound */ void Obj_GachaBomReboundThink(mobj_t *mobj); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 8bd5821db..a0129a42f 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -280,6 +280,12 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->ringboxdelay); else if (fastcmp(field,"ringboxaward")) lua_pushinteger(L, plr->ringboxaward); + else if (fastcmp(field,"amps")) + lua_pushinteger(L, plr->amps); + else if (fastcmp(field,"ampsounds")) + lua_pushinteger(L, plr->ampsounds); + else if (fastcmp(field,"ampspending")) + lua_pushinteger(L, plr->ampspending); else if (fastcmp(field,"itemflags")) lua_pushinteger(L, plr->itemflags); else if (fastcmp(field,"drift")) @@ -358,8 +364,12 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->wavedashdelay); else if (fastcmp(field,"wavedashboost")) lua_pushinteger(L, plr->wavedashboost); + else if (fastcmp(field,"overdriveboost")) + lua_pushinteger(L, plr->overdriveboost); else if (fastcmp(field,"wavedashpower")) lua_pushinteger(L, plr->wavedashpower); + else if (fastcmp(field,"overdrivepower")) + lua_pushinteger(L, plr->overdrivepower); else if (fastcmp(field,"speedpunt")) lua_pushinteger(L, plr->speedpunt); else if (fastcmp(field,"trickcharge")) @@ -842,6 +852,12 @@ static int player_set(lua_State *L) plr->ringboxdelay = luaL_checkinteger(L, 3); else if (fastcmp(field,"ringboxaward")) plr->ringboxaward = luaL_checkinteger(L, 3); + else if (fastcmp(field,"amps")) + plr->amps = luaL_checkinteger(L, 3); + else if (fastcmp(field,"ampsounds")) + plr->ampsounds = luaL_checkinteger(L, 3); + else if (fastcmp(field,"ampspending")) + plr->ampspending = luaL_checkinteger(L, 3); else if (fastcmp(field,"itemflags")) plr->itemflags = luaL_checkinteger(L, 3); else if (fastcmp(field,"drift")) @@ -918,8 +934,12 @@ static int player_set(lua_State *L) plr->wavedashdelay = luaL_checkinteger(L, 3); else if (fastcmp(field,"wavedashboost")) plr->wavedashboost = luaL_checkinteger(L, 3); + else if (fastcmp(field,"overdriveboost")) + plr->overdriveboost = luaL_checkinteger(L, 3); else if (fastcmp(field,"wavedashpower")) plr->wavedashpower = luaL_checkinteger(L, 3); + else if (fastcmp(field,"overdrivepower")) + plr->overdrivepower = luaL_checkinteger(L, 3); else if (fastcmp(field,"speedpunt")) plr->speedpunt = luaL_checkinteger(L, 3); else if (fastcmp(field,"trickcharge")) diff --git a/src/objects/CMakeLists.txt b/src/objects/CMakeLists.txt index ddc96ef41..487ce232f 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -58,6 +58,7 @@ target_sources(SRB2SDL2 PRIVATE adventure-air-booster.c destroyed-kart.cpp pulley.cpp + amps.c ) add_subdirectory(versus) diff --git a/src/objects/amps.c b/src/objects/amps.c new file mode 100644 index 000000000..eca0a2a29 --- /dev/null +++ b/src/objects/amps.c @@ -0,0 +1,80 @@ +// DR. ROBOTNIK'S RING RACERS +//----------------------------------------------------------------------------- +// Copyright (C) 2024 by AJ "Tyron" Martinez. +// Copyright (C) 2024 by Kart Krew +// +// This program is free software distributed under the +// terms of the GNU General Public License, version 2. +// See the 'LICENSE' file for more details. +//----------------------------------------------------------------------------- +/// \file amps.c +/// \brief Amps VFX code. + +#include "../doomdef.h" +#include "../info.h" +#include "../k_objects.h" +#include "../p_local.h" +#include "../k_kart.h" +#include "../k_powerup.h" +#include "../m_random.h" +#include "../r_main.h" +#include "../m_easing.h" + +#define AMP_ARCTIME (8) + +void Obj_AmpsThink (mobj_t *amps) +{ + if (P_MobjWasRemoved(amps->target) + || amps->target->health == 0 + || amps->target->destscale <= 1 // sealed star fall out + || !amps->target->player) + { + P_RemoveMobj(amps); + } + else + { + mobj_t *mo = amps->target; + player_t *player = mo->player; + + fixed_t dist, fakez; + angle_t hang, vang; + + UINT8 damper = 3; + + dist = P_AproxDistance(P_AproxDistance(amps->x - mo->x, amps->y - mo->y), amps->z - mo->z); + + fixed_t vert = dist/3; + fixed_t speed = 45*amps->scale; + + if (amps->extravalue2) + { + if (amps->extravalue1) + amps->extravalue1--; + + fakez = mo->z + (vert * amps->extravalue1 / AMP_ARCTIME); + damper = 1; + } + else + { + amps->extravalue1++; + if (amps->extravalue1 >= AMP_ARCTIME) + amps->extravalue2 = 1; + + fakez = mo->z + vert; + } + + hang = R_PointToAngle2(amps->x, amps->y, mo->x, mo->y); + vang = R_PointToAngle2(amps->z, 0, fakez, dist); + + amps->momx -= amps->momx>>(damper), amps->momy -= amps->momy>>(damper), amps->momz -= amps->momz>>(damper); + amps->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), speed)); + amps->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), speed)); + amps->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), speed); + + if (dist < (120 * amps->scale) && amps->extravalue2) + { + K_AwardPlayerAmps(player, 2); + P_RemoveMobj(amps); + } + } +} \ No newline at end of file diff --git a/src/p_inter.c b/src/p_inter.c index 884091c2d..ac7f41929 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3006,6 +3006,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da sfx = sfx_s3k3a; clash = true; } + else if (player->overdriveboost) + { + clash = true; + } else if (player->hyudorotimer > 0) ; else @@ -3069,6 +3073,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { K_DoPowerClash(target, inflictor); + if (inflictor->type != MT_PLAYER) + { + K_SpawnAmps(player, 5, inflictor); + } + if (inflictor->type == MT_SUPER_FLICKY) { Obj_BlockSuperFlicky(inflictor); @@ -3158,6 +3167,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (source && source != player->mo && source->player) { + K_SpawnAmps(source->player, 20, target); + // Extend the invincibility if the hit was a direct hit. if (inflictor == source && source->player->invincibilitytimer && !K_PowerUpRemaining(source->player, POWERUP_SMONITOR)) diff --git a/src/p_mobj.c b/src/p_mobj.c index e6effb1fc..13fb1b0f5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8580,6 +8580,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } break; } + case MT_AMPS: + { + Obj_AmpsThink(mobj); + break; + } case MT_BLOCKRING: { Obj_BlockRingThink(mobj); diff --git a/src/p_saveg.c b/src/p_saveg.c index 268fc953b..b7df7f1ea 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -581,7 +581,9 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT16(save->p, players[i].wavedash); WRITEUINT8(save->p, players[i].wavedashdelay); WRITEUINT16(save->p, players[i].wavedashboost); + WRITEUINT16(save->p, players[i].overdriveboost); WRITEFIXED(save->p, players[i].wavedashpower); + WRITEFIXED(save->p, players[i].overdrivepower); WRITEUINT16(save->p, players[i].speedpunt); WRITEUINT16(save->p, players[i].trickcharge); @@ -627,6 +629,10 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].ringboxdelay); WRITEUINT8(save->p, players[i].ringboxaward); + WRITEUINT8(save->p, players[i].amps); + WRITEUINT8(save->p, players[i].ampsounds); + WRITEUINT8(save->p, players[i].ampspending); + WRITEUINT8(save->p, players[i].itemflags); WRITEFIXED(save->p, players[i].outrun); @@ -1185,7 +1191,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].wavedash = READUINT16(save->p); players[i].wavedashdelay = READUINT8(save->p); players[i].wavedashboost = READUINT16(save->p); + players[i].overdriveboost = READUINT16(save->p); players[i].wavedashpower = READFIXED(save->p); + players[i].overdrivepower = READFIXED(save->p); players[i].speedpunt = READUINT16(save->p); players[i].trickcharge = READUINT16(save->p); @@ -1231,6 +1239,10 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].ringboxdelay = READUINT8(save->p); players[i].ringboxaward = READUINT8(save->p); + players[i].amps =READUINT8(save->p); + players[i].ampsounds =READUINT8(save->p); + players[i].ampspending =READUINT8(save->p); + players[i].itemflags = READUINT8(save->p); players[i].outrun = READFIXED(save->p); From 2b61497536c5167d65b06e0a74cce9086fb3166e Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Mon, 22 Jul 2024 20:35:28 -0700 Subject: [PATCH 2/7] WIP - Overdrive polish --- src/d_player.h | 2 +- src/info.c | 2 +- src/k_collide.cpp | 1 + src/k_hud.cpp | 2 +- src/k_kart.c | 53 ++++++++++++++++++++++--------------------- src/lua_playerlib.c | 8 +++---- src/objects/amps.c | 11 ++++++++- src/objects/block.c | 8 +++++-- src/objects/hyudoro.c | 2 ++ src/p_inter.c | 3 ++- src/p_saveg.c | 4 ++-- src/p_spec.c | 1 + 12 files changed, 58 insertions(+), 39 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 5513a6043..56e39028b 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -1033,7 +1033,7 @@ struct player_t UINT8 ampsounds; UINT8 ampspending; - UINT16 overdriveboost; + UINT16 overdrive; fixed_t overdrivepower; UINT8 itemflags; // holds IF_ flags (see itemflags_t) diff --git a/src/info.c b/src/info.c index d4366ed19..9d7b91e82 100644 --- a/src/info.c +++ b/src/info.c @@ -22093,7 +22093,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound - 0, // speed + 1, // speed 32*FRACUNIT, // radius 32*FRACUNIT, // height 0, // dispoffset diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 67fcfdfa9..be57d0542 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1194,6 +1194,7 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) auto doStumble = [](mobj_t *t1, mobj_t *t2) { K_StumblePlayer(t2->player); + K_SpawnAmps(t1->player, 20, t2); }; if (forEither(shouldStumble, doStumble)) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index d91ef4368..58629650f 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -3170,7 +3170,7 @@ static void K_drawRingCounter(boolean gametypeinfoshown) .width(uselives ? (stplyr->lives >= 10 ? 70 : 64) : 33) .small_sticker(); - if (stplyr->overdriveboost) + if (stplyr->overdrive) { V_DrawMappedPatch(LAPS_X+7-8, fy-5-8, V_HUDTRANS|V_SLIDEIN|splitflags, kp_overdrive[leveltime%32], R_GetTranslationColormap(TC_RAINBOW, static_cast(stplyr->skincolor), GTC_CACHE)); } diff --git a/src/k_kart.c b/src/k_kart.c index b55d7a8be..28eacac7c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2012,7 +2012,7 @@ static void K_SpawnGenericSpeedLines(player_t *player, boolean top) fast->color = SKINCOLOR_WHITE; fast->colorized = true; } - else if (player->overdriveboost) + else if (player->overdrive) { fast->color = player->skincolor; fast->renderflags |= RF_ADD; @@ -3518,7 +3518,7 @@ static void K_GetKartBoostPower(player_t *player) ); // + 80% top speed (peak), +400% acceleration (peak), +20% handling } - if (player->overdriveboost) + if (player->overdrive) { ADDBOOST( Easing_InCubic( @@ -3599,7 +3599,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->ringboost) // Ring Boost { fixed_t ringboost_base = FRACUNIT/4; - if (player->overdriveboost) + if (player->overdrive) ringboost_base += FRACUNIT/2; // This one's a little special: we add extra top speed per tic of ringboost stored up, to allow for Ring Box to really rocket away. // (We compensate when decrementing ringboost to avoid runaway exponential scaling hell.) @@ -4018,15 +4018,31 @@ void K_SpawnAmps(player_t *player, UINT8 amps, mobj_t *impact) void K_AwardPlayerAmps(player_t *player, UINT8 amps) { UINT16 getamped = player->amps + amps; + UINT8 oldamps = player->amps; if (getamped > 200) player->amps = 200; else player->amps = getamped; - player->ampsounds++; + player->ampsounds = 1; player->ampspending--; + if (oldamps/AMPLEVEL != player->amps/AMPLEVEL) + { + UINT8 amplevel = player->amps / AMPLEVEL; + static sfxenum_t bwips[7] = {sfx_mbs4c, + sfx_mbs4d, sfx_mbs4e, sfx_mbs4f, sfx_mbs50, + sfx_mbs51, sfx_mbs52}; + amplevel = min(amplevel, 6); + + if (P_IsDisplayPlayer(player)) + { + S_StartSound(NULL, bwips[amplevel]); + S_StartSound(NULL, bwips[amplevel]); + } + } + if (player->rings <= 0 && player->ampspending == 0) { K_Overdrive(player); @@ -4068,7 +4084,7 @@ boolean K_Overdrive(player_t *player) S_StartSound(player->mo, sfx_cdfm35); S_StartSound(player->mo, sfx_cdfm13); - player->overdriveboost += (player->amps)*6; + player->overdrive += (player->amps)*6; player->overdrivepower = FRACUNIT; player->amps = 0; @@ -9070,9 +9086,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->wavedashboost--; } - if (player->overdriveboost > 0 && onground == true) + if (player->overdrive > 0 && onground == true) { - player->overdriveboost--; + player->overdrive--; } if (player->wavedashboost == 0 || player->wavedashpower > FRACUNIT) @@ -9138,21 +9154,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StartSoundAtVolume(NULL, sfx_mbs43, 127); } player->ampsounds--; - - if (player->ampsounds == 0) - { - UINT8 amplevel = player->amps / AMPLEVEL; - static sfxenum_t bwips[7] = {sfx_mbs4c, - sfx_mbs4d, sfx_mbs4e, sfx_mbs4f, sfx_mbs50, - sfx_mbs51, sfx_mbs52}; - amplevel = min(amplevel, 6); - - if (P_IsDisplayPlayer(player)) - { - S_StartSound(NULL, bwips[amplevel]); - S_StartSound(NULL, bwips[amplevel]); - } - } } @@ -9816,7 +9817,7 @@ void K_KartResetPlayerColor(player_t *player) goto finalise; } - if (player->overdriveboost && (leveltime & 1)) + if (player->overdrive && (leveltime & 1)) { player->mo->colorized = true; fullbright = true; @@ -9824,7 +9825,7 @@ void K_KartResetPlayerColor(player_t *player) goto finalise; } - else if (player->overdriveboost) + else if (player->overdrive) { player->mo->colorized = true; fullbright = true; @@ -11955,7 +11956,7 @@ static void K_KartSpindashWind(mobj_t *parent) if (parent->player && parent->player->wavedashboost) P_SetScale(wind, wind->scale * 2); - if (parent->player && parent->player->overdriveboost) + if (parent->player && parent->player->overdrive) P_SetScale(wind, wind->scale * 2); if (parent->momx || parent->momy) @@ -12025,7 +12026,7 @@ static void K_KartSpindash(player_t *player) K_KartSpindashWind(player->mo); } - if ((player->overdriveboost > 0) && (spawnWind == true)) + if ((player->overdrive > 0) && (spawnWind == true)) { K_KartSpindashWind(player->mo); } diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index a0129a42f..dc0ac7ef7 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -364,8 +364,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->wavedashdelay); else if (fastcmp(field,"wavedashboost")) lua_pushinteger(L, plr->wavedashboost); - else if (fastcmp(field,"overdriveboost")) - lua_pushinteger(L, plr->overdriveboost); + else if (fastcmp(field,"overdrive")) + lua_pushinteger(L, plr->overdrive); else if (fastcmp(field,"wavedashpower")) lua_pushinteger(L, plr->wavedashpower); else if (fastcmp(field,"overdrivepower")) @@ -934,8 +934,8 @@ static int player_set(lua_State *L) plr->wavedashdelay = luaL_checkinteger(L, 3); else if (fastcmp(field,"wavedashboost")) plr->wavedashboost = luaL_checkinteger(L, 3); - else if (fastcmp(field,"overdriveboost")) - plr->overdriveboost = luaL_checkinteger(L, 3); + else if (fastcmp(field,"overdrive")) + plr->overdrive = luaL_checkinteger(L, 3); else if (fastcmp(field,"wavedashpower")) plr->wavedashpower = luaL_checkinteger(L, 3); else if (fastcmp(field,"overdrivepower")) diff --git a/src/objects/amps.c b/src/objects/amps.c index eca0a2a29..8f250874c 100644 --- a/src/objects/amps.c +++ b/src/objects/amps.c @@ -51,6 +51,10 @@ void Obj_AmpsThink (mobj_t *amps) if (amps->extravalue1) amps->extravalue1--; + amps->extravalue2++; + + speed += amps->extravalue1 * amps->scale/2; + fakez = mo->z + (vert * amps->extravalue1 / AMP_ARCTIME); damper = 1; } @@ -63,6 +67,11 @@ void Obj_AmpsThink (mobj_t *amps) fakez = mo->z + vert; } + if (mo->flags & MFE_VERTICALFLIP) + fakez -= mo->height/2; + else + fakez += mo->height/2; + hang = R_PointToAngle2(amps->x, amps->y, mo->x, mo->y); vang = R_PointToAngle2(amps->z, 0, fakez, dist); @@ -71,7 +80,7 @@ void Obj_AmpsThink (mobj_t *amps) amps->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), speed)); amps->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), speed); - if (dist < (120 * amps->scale) && amps->extravalue2) + if (dist < (120 * amps->scale) && amps->extravalue2 && !player->ampsounds) { K_AwardPlayerAmps(player, 2); P_RemoveMobj(amps); diff --git a/src/objects/block.c b/src/objects/block.c index 4effebe89..91f542525 100644 --- a/src/objects/block.c +++ b/src/objects/block.c @@ -36,6 +36,8 @@ void Obj_BlockRingThink (mobj_t *ring) fixed_t baseScale = mo->scale / 2; baseScale += (mo->scale / 30) * player->spheres; + if (player->overdrive) + baseScale += mo->scale; P_SetScale(ring, baseScale); // Twirl @@ -48,7 +50,7 @@ void Obj_BlockRingThink (mobj_t *ring) else ring->renderflags |= RF_DONTDRAW; - if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !K_PlayerGuard(player)) + if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !(K_PlayerGuard(player) || player->overdrive)) ring->renderflags |= RF_DONTDRAW; } } @@ -69,6 +71,8 @@ void Obj_BlockBodyThink (mobj_t *body) fixed_t baseScale = mo->scale / 2; baseScale += (mo->scale / 30) * player->spheres; + if (player->overdrive) + baseScale += mo->scale; P_SetScale(body, baseScale); P_MoveOrigin(body, mo->x, mo->y, mo->z + mo->height/2); @@ -83,7 +87,7 @@ void Obj_BlockBodyThink (mobj_t *body) else body->renderflags |= RF_DONTDRAW; - if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !K_PlayerGuard(player)) + if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !(K_PlayerGuard(player) || player->overdrive)) body->renderflags |= RF_DONTDRAW; } } diff --git a/src/objects/hyudoro.c b/src/objects/hyudoro.c index 1f3b3521a..33d2db18f 100644 --- a/src/objects/hyudoro.c +++ b/src/objects/hyudoro.c @@ -601,6 +601,8 @@ hyudoro_patrol_hit_player P_SetTarget(&hyudoro_target(hyu), master); + K_SpawnAmps(master->player, 20, toucher); + if (center) P_RemoveMobj(center); diff --git a/src/p_inter.c b/src/p_inter.c index ac7f41929..dc30a26ca 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3006,7 +3006,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da sfx = sfx_s3k3a; clash = true; } - else if (player->overdriveboost) + else if (player->overdrive && + (type != DMG_EXPLODE || inflictor->type != MT_SPBEXPLOSION || !inflictor->movefactor)) { clash = true; } diff --git a/src/p_saveg.c b/src/p_saveg.c index b7df7f1ea..fa37caba1 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -581,7 +581,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT16(save->p, players[i].wavedash); WRITEUINT8(save->p, players[i].wavedashdelay); WRITEUINT16(save->p, players[i].wavedashboost); - WRITEUINT16(save->p, players[i].overdriveboost); + WRITEUINT16(save->p, players[i].overdrive); WRITEFIXED(save->p, players[i].wavedashpower); WRITEFIXED(save->p, players[i].overdrivepower); WRITEUINT16(save->p, players[i].speedpunt); @@ -1191,7 +1191,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].wavedash = READUINT16(save->p); players[i].wavedashdelay = READUINT8(save->p); players[i].wavedashboost = READUINT16(save->p); - players[i].overdriveboost = READUINT16(save->p); + players[i].overdrive = READUINT16(save->p); players[i].wavedashpower = READFIXED(save->p); players[i].overdrivepower = READFIXED(save->p); players[i].speedpunt = READUINT16(save->p); diff --git a/src/p_spec.c b/src/p_spec.c index f7f46b4e0..db21a7cb1 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2048,6 +2048,7 @@ static void K_HandleLapIncrement(player_t *player) K_SpawnDriftBoostExplosion(player, 4); K_SpawnDriftElectricSparks(player, SKINCOLOR_SILVER, false); + K_SpawnAmps(player, 50, player->mo); rainbowstartavailable = false; } From 81e9441218b26889791f78a832eb7f9d0c75009b Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Mon, 22 Jul 2024 21:51:33 -0700 Subject: [PATCH 3/7] WIP: Overdrive polish 2 --- src/info.c | 1 + src/info.h | 1 + src/k_kart.c | 11 ----------- src/objects/block.c | 33 ++++++++++++++++++++++++++------- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/info.c b/src/info.c index 9d7b91e82..3aaefbcda 100644 --- a/src/info.c +++ b/src/info.c @@ -578,6 +578,7 @@ char sprnames[NUMSPRITES + 1][5] = "EGOO", "AMPA", + "AMPB", "WTRL", // Water Trail diff --git a/src/info.h b/src/info.h index fa8e3fc1b..2631ccc19 100644 --- a/src/info.h +++ b/src/info.h @@ -1117,6 +1117,7 @@ typedef enum sprite SPR_EGOO, SPR_AMPA, + SPR_AMPB, SPR_WTRL, // Water Trail diff --git a/src/k_kart.c b/src/k_kart.c index 28eacac7c..c29f658f1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2012,12 +2012,6 @@ static void K_SpawnGenericSpeedLines(player_t *player, boolean top) fast->color = SKINCOLOR_WHITE; fast->colorized = true; } - else if (player->overdrive) - { - fast->color = player->skincolor; - fast->renderflags |= RF_ADD; - fast->scale *= 2; - } else if (player->ringboost) { UINT8 ringboostcolors[] = {SKINCOLOR_AQUAMARINE, SKINCOLOR_EMERALD, SKINCOLOR_GARDEN, SKINCOLOR_CROCODILE, SKINCOLOR_BANANA}; @@ -12026,11 +12020,6 @@ static void K_KartSpindash(player_t *player) K_KartSpindashWind(player->mo); } - if ((player->overdrive > 0) && (spawnWind == true)) - { - K_KartSpindashWind(player->mo); - } - if (player->spindashboost > (TICRATE/2)) { K_KartSpindashDust(player->mo); diff --git a/src/objects/block.c b/src/objects/block.c index 91f542525..c30f18dc4 100644 --- a/src/objects/block.c +++ b/src/objects/block.c @@ -17,6 +17,8 @@ #include "../k_kart.h" #include "../k_powerup.h" +static UINT8 interlacedfuckingthing[] = {6,1,7,2,8,3,9,2,1,1,1,2,1,3,1,2,10,1,11,2,4,3,5,2,1,1,1,2,1,3,1,2}; + void Obj_BlockRingThink (mobj_t *ring) { if (P_MobjWasRemoved(ring->target) || !ring->target->player) @@ -32,23 +34,42 @@ void Obj_BlockRingThink (mobj_t *ring) ring->flags &= ~(MF_NOCLIPTHING); P_MoveOrigin(ring, mo->x, mo->y, mo->z + mo->height/2); ring->flags |= MF_NOCLIPTHING; - ring->color = mo->color; + ring->color = mo->player->skincolor; fixed_t baseScale = mo->scale / 2; baseScale += (mo->scale / 30) * player->spheres; + if (player->overdrive) + { baseScale += mo->scale; + ring->sprite = SPR_AMPB; + ring->frame = interlacedfuckingthing[(leveltime/1)%32]-1; + ring->colorized = true; + } + else + { + ring->colorized = false; + ring->frame = 0; + } + P_SetScale(ring, baseScale); // Twirl - ring->angle = ring->target->angle + (ANG15 * leveltime); + ring->angle = ring->target->angle + (ANG15/2 * leveltime); // Visuals ring->renderflags |= RF_ADD|RF_PAPERSPRITE; - if (leveltime%2) + if (player->overdrive > 35) + { ring->renderflags &= ~RF_DONTDRAW; + } else - ring->renderflags |= RF_DONTDRAW; + { + if (leveltime%2) + ring->renderflags &= ~RF_DONTDRAW; + else + ring->renderflags |= RF_DONTDRAW; + } if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !(K_PlayerGuard(player) || player->overdrive)) ring->renderflags |= RF_DONTDRAW; @@ -71,8 +92,6 @@ void Obj_BlockBodyThink (mobj_t *body) fixed_t baseScale = mo->scale / 2; baseScale += (mo->scale / 30) * player->spheres; - if (player->overdrive) - baseScale += mo->scale; P_SetScale(body, baseScale); P_MoveOrigin(body, mo->x, mo->y, mo->z + mo->height/2); @@ -87,7 +106,7 @@ void Obj_BlockBodyThink (mobj_t *body) else body->renderflags |= RF_DONTDRAW; - if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !(K_PlayerGuard(player) || player->overdrive)) + if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !K_PlayerGuard(player)) body->renderflags |= RF_DONTDRAW; } } From 4d202fbd676d741648ffdd83340e3efd8327f3d5 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Tue, 23 Jul 2024 17:00:17 -0700 Subject: [PATCH 4/7] WIP: Overdrive VFX refactor --- src/deh_tables.c | 8 ++++ src/info.c | 87 +++++++++++++++++++++++++++++++++ src/info.h | 10 ++++ src/k_objects.h | 4 ++ src/objects/amps.c | 114 ++++++++++++++++++++++++++++++++++++++++++-- src/objects/block.c | 28 ++--------- src/p_mobj.c | 33 +++++++++++++ 7 files changed, 256 insertions(+), 28 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index c40d56be3..a9d6f96c7 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1568,6 +1568,10 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKRING", "S_BLOCKBODY", + "S_AMPRING", + "S_AMPBODY", + "S_AMPAURA", + "S_CHARGEAURA", "S_CHARGEFALL", "S_CHARGEFLICKER", @@ -3507,6 +3511,10 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BLOCKRING", "MT_BLOCKBODY", + "MT_AMPRING", + "MT_AMPBODY", + "MT_AMPAURA", + "MT_CHARGEAURA", "MT_CHARGEFALL", "MT_CHARGEFLICKER", diff --git a/src/info.c b/src/info.c index 3aaefbcda..5a4cb9fbe 100644 --- a/src/info.c +++ b/src/info.c @@ -579,6 +579,8 @@ char sprnames[NUMSPRITES + 1][5] = "AMPA", "AMPB", + "AMPC", + "AMPD", "WTRL", // Water Trail @@ -2125,6 +2127,10 @@ state_t states[NUMSTATES] = {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY + {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING + {SPR_AMPC, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPBODY + {SPR_AMPD, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPAURA + {SPR_TRC1, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_CHARGEAURA {SPR_TRC2, FF_FULLBRIGHT|FF_ANIMATE|0, 20, {NULL}, 19, 1, S_NULL}, // S_CHARGEFALL {SPR_TRC3, FF_FULLBRIGHT|FF_ADD|0, 2, {NULL}, 0, 0, S_NULL}, // S_CHARGEFLICKER @@ -13634,6 +13640,87 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_AMPRING + -1, // doomednum + S_AMPRING, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 3, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_AMPBODY + -1, // doomednum + S_AMPBODY, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 2, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_AMPAURA + -1, // doomednum + S_AMPAURA, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + { // MT_CHARGEAURA -1, // doomednum S_CHARGEAURA, // spawnstate diff --git a/src/info.h b/src/info.h index 2631ccc19..42758fc57 100644 --- a/src/info.h +++ b/src/info.h @@ -1118,6 +1118,8 @@ typedef enum sprite SPR_AMPA, SPR_AMPB, + SPR_AMPC, + SPR_AMPD, SPR_WTRL, // Water Trail @@ -2593,6 +2595,10 @@ typedef enum state S_BLOCKRING, S_BLOCKBODY, + S_AMPRING, + S_AMPBODY, + S_AMPAURA, + S_CHARGEAURA, S_CHARGEFALL, S_CHARGEFLICKER, @@ -4559,6 +4565,10 @@ typedef enum mobj_type MT_BLOCKRING, MT_BLOCKBODY, + MT_AMPRING, + MT_AMPBODY, + MT_AMPAURA, + MT_CHARGEAURA, MT_CHARGEFALL, MT_CHARGEFLICKER, diff --git a/src/k_objects.h b/src/k_objects.h index c336956c2..29765ec69 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -139,6 +139,10 @@ void Obj_BlockRingThink(mobj_t *ring); void Obj_BlockBodyThink(mobj_t *body); void Obj_GuardBreakThink(mobj_t *fx); +void Obj_AmpRingThink(mobj_t *amp); +void Obj_AmpBodyThink(mobj_t *amp); +void Obj_AmpAuraThink(mobj_t *amp); + void Obj_AmpsThink(mobj_t *amps); void Obj_ChargeAuraThink(mobj_t *aura); diff --git a/src/objects/amps.c b/src/objects/amps.c index 8f250874c..646cd89e8 100644 --- a/src/objects/amps.c +++ b/src/objects/amps.c @@ -22,6 +22,8 @@ #define AMP_ARCTIME (8) +static UINT8 interlacedfuckingthing[] = {6,1,7,2,8,3,9,2,1,1,1,2,1,3,1,2,10,1,11,2,4,3,5,2,1,1,1,2,1,3,1,2}; + void Obj_AmpsThink (mobj_t *amps) { if (P_MobjWasRemoved(amps->target) @@ -46,7 +48,7 @@ void Obj_AmpsThink (mobj_t *amps) fixed_t vert = dist/3; fixed_t speed = 45*amps->scale; - if (amps->extravalue2) + if (amps->extravalue2) // Mode: going down, aim at the player and speed up / dampen stray movement { if (amps->extravalue1) amps->extravalue1--; @@ -58,7 +60,7 @@ void Obj_AmpsThink (mobj_t *amps) fakez = mo->z + (vert * amps->extravalue1 / AMP_ARCTIME); damper = 1; } - else + else // Mode: going up, aim above the player { amps->extravalue1++; if (amps->extravalue1 >= AMP_ARCTIME) @@ -86,4 +88,110 @@ void Obj_AmpsThink (mobj_t *amps) P_RemoveMobj(amps); } } -} \ No newline at end of file +} + +void Obj_AmpRingThink (mobj_t *amps) +{ + if (P_MobjWasRemoved(amps->target) || !amps->target->player) + { + P_RemoveMobj(amps); + } + else + { + mobj_t *mo = amps->target; + player_t *player = mo->player; + + amps->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(amps, mo->x, mo->y, mo->z + mo->height/2); + amps->flags |= MF_NOCLIPTHING; + + amps->color = mo->player->skincolor; + amps->sprite = SPR_AMPB; + amps->frame = interlacedfuckingthing[(leveltime/1)%32]-1; + amps->colorized = true; + + if (amps->scale != 3*mo->scale/2) + P_InstaScale(amps, 3*mo->scale/2); + + amps->angle = amps->target->angle + (ANG15/2 * leveltime); + amps->renderflags |= RF_ADD|RF_PAPERSPRITE|RF_FULLBRIGHT; + + if (player->overdrive) + amps->renderflags &= ~RF_DONTDRAW; + else + amps->renderflags |= RF_DONTDRAW; + + if (player->overdrive < 35 && player->overdrive % 2) + amps->renderflags |= RF_DONTDRAW; + } +} + +void Obj_AmpBodyThink (mobj_t *amps) +{ + if (P_MobjWasRemoved(amps->target) || !amps->target->player) + { + P_RemoveMobj(amps); + } + else + { + mobj_t *mo = amps->target; + player_t *player = mo->player; + + amps->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(amps, mo->x, mo->y, mo->z + mo->height/2); + amps->flags |= MF_NOCLIPTHING; + + amps->color = mo->player->skincolor; + amps->frame = leveltime%14; + amps->colorized = true; + + if (amps->scale != 5*mo->scale/4) + P_InstaScale(amps, 5*mo->scale/4); + + amps->angle = amps->target->angle; + amps->renderflags |= RF_ADD|RF_FULLBRIGHT; + + if (player->overdrive) + amps->renderflags &= ~RF_DONTDRAW; + else + amps->renderflags |= RF_DONTDRAW; + + if (player->overdrive < 35 && player->overdrive % 2) + amps->renderflags |= RF_DONTDRAW; + } +} + +void Obj_AmpAuraThink (mobj_t *amps) +{ + if (P_MobjWasRemoved(amps->target) || !amps->target->player) + { + P_RemoveMobj(amps); + } + else + { + mobj_t *mo = amps->target; + player_t *player = mo->player; + + amps->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(amps, mo->x, mo->y, mo->z + mo->height/2); + amps->flags |= MF_NOCLIPTHING; + + amps->color = mo->player->skincolor; + amps->frame = leveltime%2; + amps->colorized = true; + + if (amps->scale != 5*mo->scale/4) + P_InstaScale(amps, 5*mo->scale/4); + + amps->angle = amps->target->angle; + amps->renderflags |= RF_ADD|RF_FULLBRIGHT; + + amps->renderflags &= ~RF_TRANSMASK; + amps->renderflags |= (max(3, NUMTRANSMAPS - player->overdrive/TICRATE) << RF_TRANSSHIFT); + + if (!player->overdrive) + amps->renderflags |= RF_DONTDRAW; + else + amps->renderflags &= ~RF_DONTDRAW; + } +} diff --git a/src/objects/block.c b/src/objects/block.c index c30f18dc4..9332274f9 100644 --- a/src/objects/block.c +++ b/src/objects/block.c @@ -17,8 +17,6 @@ #include "../k_kart.h" #include "../k_powerup.h" -static UINT8 interlacedfuckingthing[] = {6,1,7,2,8,3,9,2,1,1,1,2,1,3,1,2,10,1,11,2,4,3,5,2,1,1,1,2,1,3,1,2}; - void Obj_BlockRingThink (mobj_t *ring) { if (P_MobjWasRemoved(ring->target) || !ring->target->player) @@ -39,19 +37,6 @@ void Obj_BlockRingThink (mobj_t *ring) fixed_t baseScale = mo->scale / 2; baseScale += (mo->scale / 30) * player->spheres; - if (player->overdrive) - { - baseScale += mo->scale; - ring->sprite = SPR_AMPB; - ring->frame = interlacedfuckingthing[(leveltime/1)%32]-1; - ring->colorized = true; - } - else - { - ring->colorized = false; - ring->frame = 0; - } - P_SetScale(ring, baseScale); // Twirl @@ -59,19 +44,12 @@ void Obj_BlockRingThink (mobj_t *ring) // Visuals ring->renderflags |= RF_ADD|RF_PAPERSPRITE; - if (player->overdrive > 35) - { + if (leveltime%2) ring->renderflags &= ~RF_DONTDRAW; - } else - { - if (leveltime%2) - ring->renderflags &= ~RF_DONTDRAW; - else - ring->renderflags |= RF_DONTDRAW; - } + ring->renderflags |= RF_DONTDRAW; - if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !(K_PlayerGuard(player) || player->overdrive)) + if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !K_PlayerGuard(player)) ring->renderflags |= RF_DONTDRAW; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 13fb1b0f5..f5a71a7ac 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8595,6 +8595,21 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_BlockBodyThink(mobj); break; } + case MT_AMPRING: + { + Obj_AmpRingThink(mobj); + break; + } + case MT_AMPBODY: + { + Obj_AmpBodyThink(mobj); + break; + } + case MT_AMPAURA: + { + Obj_AmpAuraThink(mobj); + break; + } case MT_CHARGEAURA: { Obj_ChargeAuraThink(mobj); @@ -12155,6 +12170,24 @@ void P_SpawnPlayer(INT32 playernum) K_MatchGenericExtraFlags(body, p->mo); body->renderflags |= RF_DONTDRAW; + mobj_t *aring = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_AMPRING); + P_SetTarget(å->target, p->mo); + P_SetScale(aring, p->mo->scale); + K_MatchGenericExtraFlags(aring, p->mo); + aring->renderflags |= RF_DONTDRAW; + + mobj_t *abody = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_AMPBODY); + P_SetTarget(&abody->target, p->mo); + P_SetScale(abody, p->mo->scale); + K_MatchGenericExtraFlags(abody, p->mo); + abody->renderflags |= RF_DONTDRAW; + + mobj_t *aaura = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_AMPAURA); + P_SetTarget(&aaura->target, p->mo); + P_SetScale(aaura, p->mo->scale); + K_MatchGenericExtraFlags(aaura, p->mo); + aaura->renderflags |= RF_DONTDRAW; + if (K_PlayerGuard(p)) S_StartSound(body, sfx_s1af); } From ed1dde5788731822a7ba4b01bfca5d17dedee8a9 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Tue, 23 Jul 2024 17:32:10 -0700 Subject: [PATCH 5/7] WIP: Separate Overdrive shield --- src/d_player.h | 3 ++- src/k_kart.c | 12 +++++++++--- src/lua_playerlib.c | 12 ++++++++---- src/objects/amps.c | 6 +++--- src/p_inter.c | 2 +- src/p_saveg.c | 6 ++++-- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 56e39028b..c35c490f4 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -1030,10 +1030,11 @@ struct player_t UINT8 ringboxaward; // Where did we stop? UINT8 amps; - UINT8 ampsounds; + UINT8 amppickup; UINT8 ampspending; UINT16 overdrive; + UINT16 overshield; fixed_t overdrivepower; UINT8 itemflags; // holds IF_ flags (see itemflags_t) diff --git a/src/k_kart.c b/src/k_kart.c index c29f658f1..4de45a660 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4019,7 +4019,7 @@ void K_AwardPlayerAmps(player_t *player, UINT8 amps) else player->amps = getamped; - player->ampsounds = 1; + player->amppickup = 1; player->ampspending--; if (oldamps/AMPLEVEL != player->amps/AMPLEVEL) @@ -4079,6 +4079,7 @@ boolean K_Overdrive(player_t *player) S_StartSound(player->mo, sfx_cdfm13); player->overdrive += (player->amps)*6; + player->overshield += (player->amps)*2; player->overdrivepower = FRACUNIT; player->amps = 0; @@ -9085,6 +9086,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->overdrive--; } + if (player->overshield > 0 && onground == true) + { + player->overshield--; + } + if (player->wavedashboost == 0 || player->wavedashpower > FRACUNIT) { player->wavedashpower = FRACUNIT; // Safety @@ -9136,7 +9142,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) K_DoIngameRespawn(player); } - if (player->ampsounds && (leveltime%2)) + if (player->amppickup && (leveltime%2)) { if (P_IsDisplayPlayer(player)) { @@ -9147,7 +9153,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { S_StartSoundAtVolume(NULL, sfx_mbs43, 127); } - player->ampsounds--; + player->amppickup--; } diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index dc0ac7ef7..8e1eb5fe0 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -282,8 +282,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->ringboxaward); else if (fastcmp(field,"amps")) lua_pushinteger(L, plr->amps); - else if (fastcmp(field,"ampsounds")) - lua_pushinteger(L, plr->ampsounds); + else if (fastcmp(field,"amppickup")) + lua_pushinteger(L, plr->amppickup); else if (fastcmp(field,"ampspending")) lua_pushinteger(L, plr->ampspending); else if (fastcmp(field,"itemflags")) @@ -366,6 +366,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->wavedashboost); else if (fastcmp(field,"overdrive")) lua_pushinteger(L, plr->overdrive); + else if (fastcmp(field,"overshield")) + lua_pushinteger(L, plr->overshield); else if (fastcmp(field,"wavedashpower")) lua_pushinteger(L, plr->wavedashpower); else if (fastcmp(field,"overdrivepower")) @@ -854,8 +856,8 @@ static int player_set(lua_State *L) plr->ringboxaward = luaL_checkinteger(L, 3); else if (fastcmp(field,"amps")) plr->amps = luaL_checkinteger(L, 3); - else if (fastcmp(field,"ampsounds")) - plr->ampsounds = luaL_checkinteger(L, 3); + else if (fastcmp(field,"amppickup")) + plr->amppickup = luaL_checkinteger(L, 3); else if (fastcmp(field,"ampspending")) plr->ampspending = luaL_checkinteger(L, 3); else if (fastcmp(field,"itemflags")) @@ -936,6 +938,8 @@ static int player_set(lua_State *L) plr->wavedashboost = luaL_checkinteger(L, 3); else if (fastcmp(field,"overdrive")) plr->overdrive = luaL_checkinteger(L, 3); + else if (fastcmp(field,"overshield")) + plr->overshield = luaL_checkinteger(L, 3); else if (fastcmp(field,"wavedashpower")) plr->wavedashpower = luaL_checkinteger(L, 3); else if (fastcmp(field,"overdrivepower")) diff --git a/src/objects/amps.c b/src/objects/amps.c index 646cd89e8..dab90aba2 100644 --- a/src/objects/amps.c +++ b/src/objects/amps.c @@ -82,7 +82,7 @@ void Obj_AmpsThink (mobj_t *amps) amps->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), speed)); amps->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), speed); - if (dist < (120 * amps->scale) && amps->extravalue2 && !player->ampsounds) + if (dist < (120 * amps->scale) && amps->extravalue2 && !player->amppickup) { K_AwardPlayerAmps(player, 2); P_RemoveMobj(amps); @@ -116,12 +116,12 @@ void Obj_AmpRingThink (mobj_t *amps) amps->angle = amps->target->angle + (ANG15/2 * leveltime); amps->renderflags |= RF_ADD|RF_PAPERSPRITE|RF_FULLBRIGHT; - if (player->overdrive) + if (player->overshield) amps->renderflags &= ~RF_DONTDRAW; else amps->renderflags |= RF_DONTDRAW; - if (player->overdrive < 35 && player->overdrive % 2) + if (player->overshield < 35 && player->overshield % 2) amps->renderflags |= RF_DONTDRAW; } } diff --git a/src/p_inter.c b/src/p_inter.c index dc30a26ca..4245f50fb 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3006,7 +3006,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da sfx = sfx_s3k3a; clash = true; } - else if (player->overdrive && + else if (player->overshield && (type != DMG_EXPLODE || inflictor->type != MT_SPBEXPLOSION || !inflictor->movefactor)) { clash = true; diff --git a/src/p_saveg.c b/src/p_saveg.c index fa37caba1..504987b1a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -582,6 +582,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].wavedashdelay); WRITEUINT16(save->p, players[i].wavedashboost); WRITEUINT16(save->p, players[i].overdrive); + WRITEUINT16(save->p, players[i].overshield); WRITEFIXED(save->p, players[i].wavedashpower); WRITEFIXED(save->p, players[i].overdrivepower); WRITEUINT16(save->p, players[i].speedpunt); @@ -630,7 +631,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].ringboxaward); WRITEUINT8(save->p, players[i].amps); - WRITEUINT8(save->p, players[i].ampsounds); + WRITEUINT8(save->p, players[i].amppickup); WRITEUINT8(save->p, players[i].ampspending); WRITEUINT8(save->p, players[i].itemflags); @@ -1192,6 +1193,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].wavedashdelay = READUINT8(save->p); players[i].wavedashboost = READUINT16(save->p); players[i].overdrive = READUINT16(save->p); + players[i].overshield = READUINT16(save->p); players[i].wavedashpower = READFIXED(save->p); players[i].overdrivepower = READFIXED(save->p); players[i].speedpunt = READUINT16(save->p); @@ -1240,7 +1242,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].ringboxaward = READUINT8(save->p); players[i].amps =READUINT8(save->p); - players[i].ampsounds =READUINT8(save->p); + players[i].amppickup =READUINT8(save->p); players[i].ampspending =READUINT8(save->p); players[i].itemflags = READUINT8(save->p); From 83be26cd76a367f8b7654ca9dd585e8b2d3c8a0c Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sun, 4 Aug 2024 00:09:16 -0700 Subject: [PATCH 6/7] Defensive Overdrive when hit into debt --- src/k_kart.c | 21 +++++++++++++++++++++ src/k_kart.h | 1 + src/p_inter.c | 2 ++ 3 files changed, 24 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 4de45a660..28ac439a6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4087,6 +4087,27 @@ boolean K_Overdrive(player_t *player) return true; } +boolean K_DefensiveOverdrive(player_t *player) +{ + if (player->amps == 0) + return false; + if (player->rings > 0) + return false; + + K_SpawnDriftBoostExplosion(player, 3); + K_SpawnDriftElectricSparks(player, player->skincolor, true); + S_StartSound(player->mo, sfx_cdfm35); + S_StartSound(player->mo, sfx_cdfm13); + + player->overdrive += (player->amps)*4; + player->overshield += (player->amps)*2 + TICRATE*2; + player->overdrivepower = FRACUNIT; + + player->amps = 0; + + return true; +} + void K_DoInstashield(player_t *player) { mobj_t *layera; diff --git a/src/k_kart.h b/src/k_kart.h index 9dd5ae478..8e2d081d7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -135,6 +135,7 @@ void K_SpawnAmps(player_t *player, UINT8 amps, mobj_t *impact); void K_AwardPlayerAmps(player_t *player, UINT8 amps); void K_AwardPlayerRings(player_t *player, UINT16 rings, boolean overload); boolean K_Overdrive(player_t *player); +boolean K_DefensiveOverdrive(player_t *player); void K_DoInstashield(player_t *player); void K_DoPowerClash(mobj_t *t1, mobj_t *t2); void K_DoGuardBreak(mobj_t *t1, mobj_t *t2); diff --git a/src/p_inter.c b/src/p_inter.c index 4245f50fb..b7bfbfdb8 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3357,6 +3357,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { player->flipDI = true; } + + K_DefensiveOverdrive(target->player); } } else From ccf0d9c7da4b4c08f613aa658ea67438652c4f3f Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sun, 4 Aug 2024 00:11:26 -0700 Subject: [PATCH 7/7] Restore Ring Box time (up for debate here!) --- src/k_objects.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_objects.h b/src/k_objects.h index 29765ec69..9a2d314bc 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -167,7 +167,7 @@ void Obj_RandomItemVisuals(mobj_t *mobj); boolean Obj_RandomItemSpawnIn(mobj_t *mobj); fixed_t Obj_RandomItemScale(fixed_t oldScale); void Obj_RandomItemSpawn(mobj_t *mobj); -#define RINGBOX_TIME (70) +#define RINGBOX_TIME (105) /* Gachabom Rebound */ void Obj_GachaBomReboundThink(mobj_t *mobj);