From 9c2144c3409c723f05c7a831d27c5aa8ca6267b9 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 18 Aug 2024 18:48:05 -0400 Subject: [PATCH] Give Battle mode item spawners their own RNG class PR_ITEM_ROULETTE is explicitly meant only for K_FillItemRouletteData, and nothing else is ever meant to use it. May possibly be the cause of the dedicated overtime desync, but I am not convinced it is. --- src/k_battle.c | 18 +++++++++--------- src/k_kart.c | 4 ++-- src/m_random.h | 4 +++- src/p_mobj.c | 10 +++++----- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/k_battle.c b/src/k_battle.c index daddc4572..9c82c38dc 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -267,7 +267,7 @@ mobj_t *K_SpawnChaosEmerald(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT mobj_t *overlay; P_Thrust(emerald, - FixedAngle(P_RandomFixed(PR_ITEM_ROULETTE) * 180) + angle, + FixedAngle(P_RandomFixed(PR_ITEM_SPAWNER) * 180) + angle, 36 * mapobjectscale); emerald->momz = flip * 36 * mapobjectscale; @@ -317,8 +317,8 @@ mobj_t *K_SpawnSphereBox(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 f drop->angle = angle; P_Thrust(drop, - FixedAngle(P_RandomFixed(PR_ITEM_ROULETTE) * 180) + angle, - P_RandomRange(PR_ITEM_ROULETTE, 4, 12) * mapobjectscale); + FixedAngle(P_RandomFixed(PR_ITEM_SPAWNER) * 180) + angle, + P_RandomRange(PR_ITEM_SPAWNER, 4, 12) * mapobjectscale); drop->momz = flip * 12 * mapobjectscale; if (drop->eflags & MFE_UNDERWATER) @@ -480,7 +480,7 @@ void K_RunPaperItemSpawners(void) { K_SpawnChaosEmerald( battleovertime.x, battleovertime.y, battleovertime.z + (128 * mapobjectscale * flip), - FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip, + FixedAngle(P_RandomRange(PR_ITEM_SPAWNER, 0, 359) * FRACUNIT), flip, firstUnspawnedEmerald ); } @@ -488,7 +488,7 @@ void K_RunPaperItemSpawners(void) { K_FlingPaperItem( battleovertime.x, battleovertime.y, battleovertime.z + (128 * mapobjectscale * flip), - FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip, + FixedAngle(P_RandomRange(PR_ITEM_SPAWNER, 0, 359) * FRACUNIT), flip, 0, 0 ); @@ -496,7 +496,7 @@ void K_RunPaperItemSpawners(void) { K_SpawnSphereBox( battleovertime.x, battleovertime.y, battleovertime.z + (128 * mapobjectscale * flip), - FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip, + FixedAngle(P_RandomRange(PR_ITEM_SPAWNER, 0, 359) * FRACUNIT), flip, 10 ); } @@ -570,7 +570,7 @@ void K_RunPaperItemSpawners(void) // Large = 16 + 1 = 17 / 2 = 8 if (spotAvailable > 0 && monitorsSpawned < (mapheaderinfo[gamemap - 1]->playerLimit + 1) / 2) { - const UINT8 r = spotMap[P_RandomKey(PR_ITEM_ROULETTE, spotAvailable)]; + const UINT8 r = spotMap[P_RandomKey(PR_ITEM_SPAWNER, spotAvailable)]; Obj_ItemSpotAssignMonitor(spotList[r], Obj_SpawnMonitor( spotList[r], 3, firstUnspawnedEmerald)); @@ -603,7 +603,7 @@ void K_RunPaperItemSpawners(void) } else { - key = P_RandomKey(PR_ITEM_ROULETTE, spotCount); + key = P_RandomKey(PR_ITEM_SPAWNER, spotCount); } r = spotMap[key]; @@ -614,7 +614,7 @@ void K_RunPaperItemSpawners(void) drop = K_SpawnSphereBox( spotList[r]->x, spotList[r]->y, spotList[r]->z + (128 * mapobjectscale * flip), - FixedAngle(P_RandomRange(PR_ITEM_ROULETTE, 0, 359) * FRACUNIT), flip, + FixedAngle(P_RandomRange(PR_ITEM_SPAWNER, 0, 359) * FRACUNIT), flip, 10 ); diff --git a/src/k_kart.c b/src/k_kart.c index 888366c93..f4eabed79 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7430,7 +7430,7 @@ SINT8 K_GetTotallyRandomResult(UINT8 useodds) if (totalspawnchance > 0) { - totalspawnchance = P_RandomKey(PR_ITEM_ROULETTE, totalspawnchance); + totalspawnchance = P_RandomKey(PR_ITEM_SPAWNER, totalspawnchance); for (i = 0; i < NUMKARTRESULTS && spawnchance[i] <= totalspawnchance; i++); } else @@ -7520,7 +7520,7 @@ mobj_t *K_FlingPaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 f mobj_t *drop = K_CreatePaperItem(x, y, z, angle, flip, type, amount); P_Thrust(drop, - FixedAngle(P_RandomFixed(PR_ITEM_ROULETTE) * 180) + angle, + FixedAngle(P_RandomFixed(PR_ITEM_SPAWNER) * 180) + angle, 16*mapobjectscale); drop->momz = flip * 3 * mapobjectscale; diff --git a/src/m_random.h b/src/m_random.h index 8d8120f0e..6cabb7bcc 100644 --- a/src/m_random.h +++ b/src/m_random.h @@ -63,7 +63,7 @@ typedef enum PR_MUSICSELECT, // Randomized music selection - PR_ITEM_ROULETTE, // Item results + PR_ITEM_ROULETTE, // Item results. Overwritten constantly by K_FillItemRouletteData, not meant for typical use. PR_ITEM_RINGS, // Flung ring/bumper/player (on death) PR_ITEM_SHRINK, // Shrink gun offsets PR_ITEM_BUBBLE, // Item bubbles @@ -87,6 +87,8 @@ typedef enum PR_FROSTTHROWERS, + PR_ITEM_SPAWNER, // Battle mode item spawners + PRNUMSYNCED, PR_INTERPHUDRANDOM = PRNUMSYNCED, // Interpolation-accomodating HUD randomisation diff --git a/src/p_mobj.c b/src/p_mobj.c index 4ffafb1c3..cf9b73a10 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10985,15 +10985,15 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) { // set default item & count #if 0 // set to 1 to test capsules with random items, e.g. with objectplace - if (P_RandomChance(PR_ITEM_ROULETTE, FRACUNIT/3)) + if (P_RandomChance(PR_ITEM_SPAWNER, FRACUNIT/3)) mobj->threshold = KITEM_SUPERRING; - else if (P_RandomChance(PR_ITEM_ROULETTE, FRACUNIT/3)) + else if (P_RandomChance(PR_ITEM_SPAWNER, FRACUNIT/3)) mobj->threshold = KITEM_SPB; - else if (P_RandomChance(PR_ITEM_ROULETTE, FRACUNIT/3)) + else if (P_RandomChance(PR_ITEM_SPAWNER, FRACUNIT/3)) mobj->threshold = KITEM_ORBINAUT; else - mobj->threshold = P_RandomRange(PR_ITEM_ROULETTE, 1, NUMKARTITEMS - 1); - mobj->movecount = P_RandomChance(PR_ITEM_ROULETTE, FRACUNIT/3) ? 1 : P_RandomKey(PR_ITEM_ROULETTE, 32) + 1; + mobj->threshold = P_RandomRange(PR_ITEM_SPAWNER, 1, NUMKARTITEMS - 1); + mobj->movecount = P_RandomChance(PR_ITEM_SPAWNER, FRACUNIT/3) ? 1 : P_RandomKey(PR_ITEM_SPAWNER, 32) + 1; #else mobj->threshold = KITEM_SUPERRING; // default item is super ring mobj->movecount = 1;