From e52de2de88e5c3387a5df4086343f5afe9e597dc Mon Sep 17 00:00:00 2001 From: Lach Date: Sat, 6 Sep 2025 18:18:54 +1000 Subject: [PATCH] Display up to one Ancient Gear on the minimap --- src/k_hud.cpp | 6 ++++ src/k_objects.h | 1 + src/objects/ancient-gear.c | 57 ++++++++++++++++++++++++++++++++++++++ src/p_mobj.c | 1 + 4 files changed, 65 insertions(+) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index c1aaf1642..e36c20eb9 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -6292,6 +6292,12 @@ static void K_drawKartMinimap(void) colormap = R_GetTranslationColormap(TC_RAINBOW, static_cast(owner->color), GTC_CACHE); } break; + case MT_ANCIENTGEAR: + if (mobj == Obj_GetAncientGearMinimapMobj()) + { + workingPic = kp_unknownminimap; + colormap = R_GetTranslationColormap(TC_RAINBOW, static_cast(K_RainbowColor(leveltime)), GTC_CACHE); + } default: break; } diff --git a/src/k_objects.h b/src/k_objects.h index 3ddbc5ab2..3da9c7882 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -500,6 +500,7 @@ void Obj_AncientGearSetup(mobj_t *gear, mapthing_t *mt); void Obj_AncientGearLevelInit(void); player_t *Obj_GetAncientGearCollectingPlayer(void); boolean Obj_AllAncientGearsCollected(void); +mobj_t *Obj_GetAncientGearMinimapMobj(void); void Obj_MushroomHillPolePlayerThink(player_t *player); void Obj_MushroomHillPoleTouch(mobj_t *pole, mobj_t *toucher); diff --git a/src/objects/ancient-gear.c b/src/objects/ancient-gear.c index 446da8385..2431775ca 100644 --- a/src/objects/ancient-gear.c +++ b/src/objects/ancient-gear.c @@ -37,6 +37,7 @@ static UINT32 gearBank = 0; static UINT8 gearBankIndex = 0; static boolean allGearsCollected = false; static player_t *collectingPlayer = NULL; +static mobj_t *minimapGear = NULL; static void UpdateAncientGearPart(mobj_t *part) { @@ -122,6 +123,11 @@ void Obj_AncientGearPartThink(mobj_t *part) void Obj_AncientGearRemoved(mobj_t *gear) { + if (gear == minimapGear) + { + minimapGear = NULL; + } + while (!P_MobjWasRemoved(gear->hnext)) { P_RemoveMobj(gear->hnext); @@ -281,6 +287,7 @@ void Obj_AncientGearLevelInit(void) gearBankIndex = 0; numGears = 0; collectingPlayer = NULL; + minimapGear = NULL; } player_t *Obj_GetAncientGearCollectingPlayer(void) @@ -292,3 +299,53 @@ boolean Obj_AllAncientGearsCollected(void) { return allGearsCollected; } + +mobj_t *Obj_GetAncientGearMinimapMobj(void) +{ + UINT8 lowestTag = UINT8_MAX; + UINT8 tag; + mobj_t *mobj; + + // no gears in the map? nothing to display + if (numGears == 0) + { + return NULL; + } + + // if a gear is currently being tracked, display it on the minimap + if (!P_MobjWasRemoved(minimapGear)) + { + // only display the gear while uncollected, + // but keep it tracked so there's some natural delay between when one gear disappears and when the next one is chosen + if (minimapGear->health > 0) + { + return minimapGear; + } + return NULL; + } + + minimapGear = NULL; + + // try to find a new gear to track + for (mobj = trackercap; mobj; mobj = mobj->itnext) + { + if ( + mobj->type != MT_ANCIENTGEAR + || !(mobj->health > 0) + ) + { + continue; + } + + tag = ((UINT8)(mobj->thing_args[0] - 1)) % MAX_GEARS; // 0 minus 1 wraps around to 31 so that untagged gears are chosen last + + if (tag < lowestTag) + { + lowestTag = tag; + minimapGear = mobj; + } + } + + // display the tracked gear, if found + return minimapGear; +} diff --git a/src/p_mobj.c b/src/p_mobj.c index 8abc77242..a7ea49baa 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5458,6 +5458,7 @@ static boolean P_IsTrackerType(INT32 type) case MT_SPB: case MT_BATTLECAPSULE: case MT_CDUFO: + case MT_ANCIENTGEAR: return true; // Players sometimes get targeted with HUD tracking