From 45e6fc6aefa04211c4c4dc89f1d58dd15e5e27a5 Mon Sep 17 00:00:00 2001 From: minenice55 Date: Thu, 26 Mar 2026 17:49:18 -0400 Subject: [PATCH] add cvars for boost values, small aim assist, contact damage --- src/d_netcmd.c | 9 +++++++ src/d_netcmd.h | 9 +++++++ src/k_collide.c | 14 +++++++++++ src/k_items.c | 10 -------- src/k_kart.c | 62 +++++++++++++++++++++++++++++++++++++++++-------- src/k_kart.h | 9 +++++++ 6 files changed, 93 insertions(+), 20 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 075291a65..2a9498d23 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -543,6 +543,15 @@ consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_acce consvar_t cv_kartstacking_flame_handleboost = CVAR_INIT ("vanillaboost_flame_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_stackable = CVAR_INIT ("vanillaboost_flame_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); +consvar_t cv_kartstacking_attraction_speedboost_himin = CVAR_INIT ("vanillaboost_attraction_speedboost_himin", "0.5", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_attraction_speedboost_himax = CVAR_INIT ("vanillaboost_attraction_speedboost_himax", "0.6", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_attraction_speedboost_normmin = CVAR_INIT ("vanillaboost_attraction_speedboost_normmin", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_attraction_speedboost_normmax = CVAR_INIT ("vanillaboost_attraction_speedboost_normmax", "0.3", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_attraction_accelboost_hi = CVAR_INIT ("vanillaboost_attraction_accelboost_hi", "10.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_attraction_accelboost_norm = CVAR_INIT ("vanillaboost_attraction_accelboost_norm", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_attraction_handleboost = CVAR_INIT ("vanillaboost_sttraction_handleboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_attraction_stackable = CVAR_INIT ("vanillaboost_sttraction_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); + consvar_t cv_kartstacking_start_speedboost = CVAR_INIT ("vanillaboost_start_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_start_accelboost = CVAR_INIT ("vanillaboost_start_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_start_handleboost = CVAR_INIT ("vanillaboost_start_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 649906854..2bca61b5f 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -133,6 +133,15 @@ extern consvar_t cv_kartstacking_flame_accelboost; extern consvar_t cv_kartstacking_flame_handleboost; extern consvar_t cv_kartstacking_flame_stackable; +extern consvar_t cv_kartstacking_attraction_speedboost_himin; +extern consvar_t cv_kartstacking_attraction_speedboost_himax; +extern consvar_t cv_kartstacking_attraction_speedboost_normmin; +extern consvar_t cv_kartstacking_attraction_speedboost_normmax; +extern consvar_t cv_kartstacking_attraction_accelboost_hi; +extern consvar_t cv_kartstacking_attraction_accelboost_norm; +extern consvar_t cv_kartstacking_attraction_handleboost; +extern consvar_t cv_kartstacking_attraction_stackable; + extern consvar_t cv_kartstacking_grow_speedboost; extern consvar_t cv_kartstacking_grow_accelboost; extern consvar_t cv_kartstacking_grow_handleboost; diff --git a/src/k_collide.c b/src/k_collide.c index eea78d7a3..2df3c9214 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -1206,6 +1206,20 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) return true; } + // Attraction Shield tackle damage + t1Condition = (t1->player->attractionattack && t1->player->attractionattack_hipower); + t2Condition = (t2->player->attractionattack && t2->player->attractionattack_hipower); + if (t1Condition == true && t2Condition == false) + { + P_DamageMobj(t2, t1, t1, 1, DMG_FLIPOVER); + return true; + } + else if (t1Condition == false && t2Condition == true) + { + P_DamageMobj(t1, t2, t2, 1, DMG_FLIPOVER); + return true; + } + // Battle Mode Sneaker and Bubble damage // (Pogo Spring damage is handled in head-stomping code) if (gametypes[gametype]->rules & GTR_BUMPERS) diff --git a/src/k_items.c b/src/k_items.c index 7d2b32354..4bcf0f887 100644 --- a/src/k_items.c +++ b/src/k_items.c @@ -1928,16 +1928,6 @@ void K_DoAttractionShield(player_t *player, boolean hipower) mo->color = SKINCOLOR_CYAN; mo->scale = player->mo->scale*3 + (player->mo->scale/2); - // spawn horizontal bolts; - for (i=0; i<7; i++) - { - mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); - mo->angle = P_RandomRange(0, 359)*ANG1; - mo->fuse = P_RandomRange(20, 50); - P_SetTarget(&mo->target, player->mo); - P_SetMobjState(mo, S_KLIT1); - } - // spawn the radius thing: an = ANGLE_22h; for (i=0; i<15; i++) diff --git a/src/k_kart.c b/src/k_kart.c index ecd2796dc..18da65f92 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -340,6 +340,15 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartstacking_flame_handleboost); CV_RegisterVar(&cv_kartstacking_flame_stackable); + CV_RegisterVar(&cv_kartstacking_attraction_speedboost_himin); + CV_RegisterVar(&cv_kartstacking_attraction_speedboost_himax); + CV_RegisterVar(&cv_kartstacking_attraction_speedboost_normmin); + CV_RegisterVar(&cv_kartstacking_attraction_speedboost_normmax); + CV_RegisterVar(&cv_kartstacking_attraction_accelboost_hi); + CV_RegisterVar(&cv_kartstacking_attraction_accelboost_norm); + CV_RegisterVar(&cv_kartstacking_attraction_handleboost); + CV_RegisterVar(&cv_kartstacking_attraction_stackable); + CV_RegisterVar(&cv_kartstacking_start_speedboost); CV_RegisterVar(&cv_kartstacking_start_accelboost); CV_RegisterVar(&cv_kartstacking_start_handleboost); @@ -2921,7 +2930,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->attractionboost) { - K_DoBoost(player, player->attractionboost, (player->attractionattack_hipower) ? 3*FRACUNIT : FRACUNIT, FRACUNIT/4, true, false); // + ???% top speed, + 300% acceleration + K_DoBoost(player, player->attractionboost, (player->attractionattack_hipower) ? ATTRACTIONACCELHI : ATTRACTIONACCELNORM, ATTRACTIONHANDLEBOOST, ATTRACTIONSTACKABLE, false); // + ???% top speed, + 300% acceleration } if (player->slopeboost || player->slopeaccel) @@ -11786,9 +11795,11 @@ boolean K_NullDriftTiltEnabled(void) } #define TargetThreshold (80*FRACUNIT/100) +#define TargetAngleAssist (FRACUNIT/2) void K_KartAttractHomingAttack(player_t *player) { fixed_t influence = 0; + fixed_t angleassist = 0; INT32 lastTarg = player->lastitemtarget; if (lastTarg >= 0) @@ -11801,10 +11812,25 @@ void K_KartAttractHomingAttack(player_t *player) mobj_t *targMo = players[lastTarg].mo; vector2_t targetdirection = {targMo->x - player->mo->x, targMo->y - player->mo->y}; vector2_t movedirection = {P_ReturnThrustX(NULL, player->mo->angle, FRACUNIT), P_ReturnThrustY(NULL, player->mo->angle, FRACUNIT)}; - + fixed_t targetangle = AngleFixed(R_PointToAngle2(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, targMo->x + targMo->momx, targMo->y + targMo->momy)); + FV2_Normalize(&movedirection); FV2_Normalize(&targetdirection); - influence = FixedDiv(CLAMP(FV2_Dot(&movedirection, &targetdirection), 0, TargetThreshold), TargetThreshold); + influence = FixedDiv(CLAMP(FV2_Dot(&targetdirection, &movedirection), 0, TargetThreshold), TargetThreshold); + + if (FV2_Dot(&targetdirection, &movedirection) > 0) + { + angleassist = (targetangle - AngleFixed(player->mo->angle)); + if (angleassist < -180*FRACUNIT) + { + angleassist += 360*FRACUNIT; + } + else if (angleassist > 180*FRACUNIT) + { + angleassist -= 360*FRACUNIT; + } + angleassist = FixedMul(CLAMP(angleassist, -TargetAngleAssist, TargetAngleAssist), influence); + } } } @@ -11813,25 +11839,41 @@ void K_KartAttractHomingAttack(player_t *player) && player->bumpUnstuck == 0) { mobj_t *mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); - mo->angle = P_RandomRange(-30, 30)*ANG1 + R_PointToAngle2(0,0, player->mo->momx, player->mo->momy) - ANGLE_180; + angle_t effectangle = player->mo->angle; + if (player->speed > 0) + { + effectangle = R_PointToAngle2(0,0, player->mo->momx, player->mo->momy); + } + mo->angle = P_RandomRange(-30, 30)*ANG1 + effectangle - ANGLE_180; mo->fuse = P_RandomRange(10, 20); - P_SetScale(mo, player->mo->scale); - mo->destscale = mo->scale/2; + P_SetScale(mo, player->mo->scale/2); + mo->destscale = mo->scale/3; P_SetTarget(&mo->target, player->mo); P_SetMobjState(mo, S_KLIT1); - mo->renderflags |= RF_ADD|RF_FULLBRIGHT; - P_SpawnGhostMobj(player->mo); + mo->renderflags |= RF_ADD|RF_FULLBRIGHT|RF_TRANS30; + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); + P_SetTarget(&mo->target, player->mo); + P_SetMobjState(mo, S_KSPARK1); + mo->renderflags |= RF_ADD|RF_FULLBRIGHT|RF_TRANS30; + + P_SpawnGhostMobj(player->mo); if (player->attractionattack_hipower) { - player->attractionboost = Easing_InCubic(influence, 50*FRACUNIT/100, 60*FRACUNIT/100); + player->attractionboost = Easing_InCubic(influence, ATTRACTIONSPEEDHIMIN, ATTRACTIONSPEEDHIMAX); } else { - player->attractionboost = Easing_InCubic(influence, 25*FRACUNIT/100, 30*FRACUNIT/100); + player->attractionboost = Easing_InCubic(influence, ATTRACTIONSPEEDNORMMIN, ATTRACTIONSPEEDNORMMAX); } + if (angleassist) + { + player->mo->angle += FixedAngle(angleassist); + P_SetPlayerAngle(player, player->mo->angle); + } + player->attractionattack--; } else diff --git a/src/k_kart.h b/src/k_kart.h index b9e91772b..6e217f873 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -138,6 +138,15 @@ extern vector3_t clusterpoint, clusterdtf; #define FLAMEHANDLEBOOST CV_Get(&cv_kartstacking_flame_handleboost) #define FLAMESTACKABLE CV_Get(&cv_kartstacking_flame_stackable) +#define ATTRACTIONSPEEDHIMIN CV_Get(&cv_kartstacking_attraction_speedboost_himin) +#define ATTRACTIONSPEEDHIMAX CV_Get(&cv_kartstacking_attraction_speedboost_himax) +#define ATTRACTIONSPEEDNORMMIN CV_Get(&cv_kartstacking_attraction_speedboost_normmin) +#define ATTRACTIONSPEEDNORMMAX CV_Get(&cv_kartstacking_attraction_speedboost_normmax) +#define ATTRACTIONACCELHI CV_Get(&cv_kartstacking_attraction_accelboost_hi) +#define ATTRACTIONACCELNORM CV_Get(&cv_kartstacking_attraction_accelboost_norm) +#define ATTRACTIONHANDLEBOOST CV_Get(&cv_kartstacking_attraction_handleboost) +#define ATTRACTIONSTACKABLE CV_Get(&cv_kartstacking_attraction_stackable) + #define ALTSHRINKTIME CV_Get(&cv_kartaltshrinktime) #define SHRINKSPEEDBOOST CV_Get(&cv_kartstacking_altshrink_speedboost) #define SHRINKACCELBOOST CV_Get(&cv_kartstacking_altshrink_accelboost)