From 8e9b9dd0aa8a1b6fa6a7b24ab70a369ab138ccb8 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 2 Apr 2024 05:00:18 -0700 Subject: [PATCH] Preserve scale of Garden Top when thrown - If you deploy a Garden Top while grown/shrunk, the Top retains its size even after the grow/shrink effect runs out - When the Top was thrown, however, it always used default scale - Now the thrown Top keeps its scale intact --- src/k_kart.c | 9 +++++++++ src/objects/gardentop.c | 15 +++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index a22e142c4..89b6e7b47 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5207,6 +5207,15 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I finalspeed += FixedMul(source->player->speed, deltaFactor); finalscale = K_ItemScaleForPlayer(source->player); + + if (type == MT_GARDENTOP) + { + mobj_t *top = K_GetGardenTop(source->player); + if (top) + { + finalscale = top->scale; + } + } } if (type == MT_BUBBLESHIELDTRAP) diff --git a/src/objects/gardentop.c b/src/objects/gardentop.c index 741ee5f92..cb7fea0ea 100644 --- a/src/objects/gardentop.c +++ b/src/objects/gardentop.c @@ -45,10 +45,13 @@ enum { #define rider_top(o) ((o)->hnext) +/* All Top states */ #define top_mode(o) ((o)->extravalue1) #define top_float(o) ((o)->lastlook) #define top_sound(o) ((o)->extravalue2) #define top_soundtic(o) ((o)->movecount) +#define top_helpme(o) ((o)->cusval) +#define top_lifetime(o) ((o)->cvmem) /* TOP_ANCHORED */ #define top_rider(o) ((o)->tracer) @@ -57,8 +60,6 @@ enum { #define top_waveangle(o) ((o)->movedir) /* wavepause will take mobjinfo reactiontime automatically */ #define top_wavepause(o) ((o)->reactiontime) -#define top_helpme(o) ((o)->cusval) -#define top_lifetime(o) ((o)->cvmem) #define spark_top(o) ((o)->target) #define spark_angle(o) ((o)->movedir) @@ -562,6 +563,12 @@ Obj_GardenTopDeploy (mobj_t *rider) { player->curshield = KSHIELD_TOP; rider->radius = K_DefaultPlayerRadius(player); + + /* Doing this here to set itemscale. + And unset right afterward so the item box doesn't flicker! */ + K_SetItemOut(player); + P_InstaScale(top, K_ItemScaleForPlayer(player)); + K_UnsetItemOut(player); } spawn_spark_circle(top, 6); @@ -579,13 +586,13 @@ Obj_GardenTopThrow (player_t *player) const fixed_t oldfloat = top_float(top); const fixed_t height = top->height; - K_UpdateHnextList(player, true); - /* Sucks that another one needs to be spawned but this way, the throwing function can be used. */ top = K_ThrowKartItem( player, true, MT_GARDENTOP, 1, 0, 0); + K_UpdateHnextList(player, true); + init_top(top, TOP_LOOSE); top_float(top) = oldfloat;