From 0e15b3fe5367b32ec1ca0f38c6303b0c0f9169e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Untersch=C3=BCtz?= Date: Wed, 22 Apr 2026 23:24:57 +0200 Subject: [PATCH] introduce controlled asset randomness: implement shuffled asset bag logic for balanced and repeatable asset spawning --- cmd/client/web/game.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/cmd/client/web/game.js b/cmd/client/web/game.js index 239d078..d2de8ea 100644 --- a/cmd/client/web/game.js +++ b/cmd/client/web/game.js @@ -27,6 +27,7 @@ let presiAssets = []; let presiPlayers = new Map(); let presiQuoteInterval = null; let presiAssetInterval = null; +let presiAssetBag = []; // Shuffled bag for controlled randomness // Central UI State Manager function setUIState(newState) { @@ -982,10 +983,21 @@ async function spawnPresiAsset() { const track = document.querySelector('.presi-assets-track'); if (!track) return; - const assetKeys = Object.keys(assetsManifest).filter(k => - ['player', 'coin', 'eraser', 'pc-trash', 'godmode', 'jumpboost', 'magnet', 'baskeball', 'desk'].includes(k) - ); - const key = assetKeys[Math.floor(Math.random() * assetKeys.length)]; + // Refill the bag if empty + if (presiAssetBag.length === 0) { + const assetKeys = Object.keys(assetsManifest).filter(k => + ['player', 'coin', 'eraser', 'pc-trash', 'godmode', 'jumpboost', 'magnet', 'baskeball', 'desk'].includes(k) + ); + // Add each asset twice for a longer cycle + presiAssetBag = [...assetKeys, ...assetKeys]; + // Shuffle + for (let i = presiAssetBag.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [presiAssetBag[i], presiAssetBag[j]] = [presiAssetBag[j], presiAssetBag[i]]; + } + } + + const key = presiAssetBag.pop(); const def = assetsManifest[key]; const el = document.createElement('div');