Skip to content

Fix Shogun replay window — Event ID 65739#98

Open
ricini343 wants to merge 64 commits intoStakeEngine:mainfrom
ricini343:main
Open

Fix Shogun replay window — Event ID 65739#98
ricini343 wants to merge 64 commits intoStakeEngine:mainfrom
ricini343:main

Conversation

@ricini343
Copy link
Copy Markdown

Summary

  • Replay window was broken in production — trying to load local book_base.json files that don't exist
  • Root cause: IS_REPLAY set IS_DEMO=true, which skipped the RGS authenticate() call entirely
  • Fix: authenticate() now calls the RGS in replay mode, stores the round state, and fetchReplayData() uses it

Details

  • Event ID: 65739
  • Front Version: 105 → 106
  • Math Version: 6
  • Round Type: BASE

Changes

  1. authenticate() — no longer short-circuits with demo data when IS_REPLAY is true
  2. Stores RGS._replayRound from authenticate response
  3. fetchReplayData() uses RGS round state events as primary source, local books as dev fallback

Test plan

  • Open replay for Event ID 65739 — should load and play back the round
  • Verify normal gameplay is unaffected (non-replay sessions)
  • Verify demo mode still works without RGS

🤖 Generated with Claude Code

ricini343 and others added 30 commits April 12, 2026 05:15
…gths

- Set all multipliers to 1 (no effect) to test floor RTP
- BR0 reel length 70->200, FR0 70->400 (lower wild frequency)
- Add GitHub Actions workflow for simulation
- Fix f-string syntax in get_file_hash.py

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- All wild multipliers set to 1 (no effect) to test floor RTP
- BR0 reel length 70->200, FR0 70->400 (lower wild frequency)
- Full game files: gamestate, config, events, executables

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Multiplier pool: {2:300, 3:100, 4:30, 5:20, 10:5, 20:5, 50:1} (avg ~3.5x)
- Reel strips: BR0=628, FR0=620 (matching reference lengths)
- BR0: 4 wilds/reel, FR0: 3 wilds/reel
- Distribution quotas: wincap 0.1%, freegame 10%, zero 40%, base 49.9%
- Enable Rust optimizer (run_optimization=True)
- 100k sims per mode

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The RGS end-round request was fire-and-forget, causing the next
play request to fire before the previous round closed. This made
the RGS reject with ERR_VAL. Now endRound() is awaited in both
base game and free spins exit paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Frontend fixes:
- End-round: prevent 400 by guarding double calls, demo no-op, failed play check
- RTP display: 96% → 97% across all Game Info pages
- Bet levels: currency-specific defaults (JPY=100, MXN=10, USD=1)
- Portrait mode: removed rotation requirement, scales to fit
- Auth fallback: gracefully falls back to demo mode instead of CONNECTION ERROR
- Social mode: works via auth fallback fix

Sims: increased from 1k to 100k per mode, 4 threads, batch 5000

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rows 137-400 were all J,J,J,J,J — 66% of free spin board positions
would be J. Truncated to 136 rows of real balanced data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cargo not available on GitHub Actions runner. Sims + config gen still work.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ricini343 and others added 18 commits April 12, 2026 05:15
- Wild multiplier pools: base game now has 2×-100× multipliers
- Free spins pool updated with 100× option
- Wincap pool rebalanced with higher multipliers
- Frontend: hide multiplier badge text for 1× wilds, show for 2×+
- Frontend: socLabel wrapping on game info page titles
- Frontend: buy bonus sends base bet (RGS applies cost multiplier)
- Frontend: replay mode includes language parameter
- Requires math re-run to rebalance RTP with new pools

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
multiplier_strategy.py line 49 was missing round(, 2) causing floating-point
drift in all combined-multiplier wins. This affected Q symbol payouts and
L19 payline calculations flagged by Stake Engine review.

Also includes all frontend fixes from Stake Engine review:
- Game Info max win values corrected to 15,000×
- FREE SPINS COMPLETE text overflow fix for portrait
- Balance deduction timing (immediate on spin start)
- Mobile font size improvements
- Portrait control bar with all buttons visible

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Underground fight tournament slot: 6x5 grid, cluster pays, 15000x wincap, 97% RTP.
KO Reels multiplier grows per cascade. 4 bet modes: base (1x), exhibition (75x),
title_fight (150x), death_match (300x). Death Match converts random fighter to WILD.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
reset_ko_mult() was called during __init__ via reset_book() before
betmode is set by the simulation runner. Guard with hasattr check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… books

The replay system was trying to load local book_base.json files which don't
exist in production. Root cause: IS_REPLAY set IS_DEMO=true, which made
authenticate() skip the RGS call entirely, so round data was never fetched.

- authenticate() now calls RGS even in replay mode
- Store RGS round data from authenticate response for replay use
- fetchReplayData() uses RGS round state events as primary source,
  local book files as fallback for dev/demo only

Reported by Stake Engine: Event ID 65739, Front v105, Math v6

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GitHub Actions workflow for running Sugar Stack (fruits) simulations
with 500k entries per mode (base, buy_bonus, super_buy_bonus).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Python game logic, config, reel strips needed by the simulation workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SDK construct_paths() resolves paths from game_id, not the dev folder name.
Copied game source + reels to games/1_2_sugar_stack/ and updated workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
RTP mismatch in optimization config — skip for now, just need book generation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Small run to verify book generation and frontend integration before full 500k.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reduced wilds from ~19 total to 5 (one per reel) on the free spins
reel strip. The previous strip had 3-4 wilds per reel which, combined
with expanding sticky wilds and multiplier stacking, produced ~850% RTP
instead of the target 96%.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Enable Rust optimizer to adjust probability weights and hit 96% target
RTP. Previous runs showed ~9000% RTP with unoptimized reel strips.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…l + RTP fix

- Backward lurch (16px up) before spin + elastic overshoot (10px) on stop
- Symbol texture atlas: 13 symbols in single 4096x4096 spritesheet (1 GPU bind vs 13)
- Graphics object pool: reuse PIXI.Graphics across spins instead of create/abandon
- Proper cleanup: pooled Graphics released, Text objects destroyed with texture:false
- RTP fix: optimization basegame 0.56→0.55 so params sum to 0.96 (was 0.97, mismatched target)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Base: basegame 0.56→0.55, buy_bonus: freegame 0.96→0.95, super: 0.96→0.95
All modes now sum to 0.96 matching game_config.rtp target.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…strips

FS wild rate 45%→12%, buy bonus extra wild 25%→8%, on-the-fly FS 20%→8%,
base game 30%→18%. Prevents all-wild boards during free spins in demo mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…oard

makeBoard() was filling ALL cells on sticky reels with WILD, making them
appear fully wild before expansion. Now places ONE wild at random row,
letting the expansion overlay handle the visual fill-up animation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…x startup lag

- Add double_chance bet mode (1.5x cost, 2x freegame quota) to math config, optimization, and run.py
- Remove freegame retrigger from freespin_triggers (base game only)
- Remove scatter symbols from FR0.csv (no retriggers possible)
- Add GPU texture pre-upload (renderer.prepare.upload) after asset load + after scene build
- Add document.fonts.ready gate before scene construction
- Pre-decode bg_base.png during splash for instant swap on dismiss

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ricini343 and others added 11 commits April 12, 2026 05:19
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- base: basegame 0.56→0.55 (0.01+0+0.40+0.55=0.96)
- double_chance: basegame 0.46→0.45 (0.01+0+0.50+0.45=0.96)
- buy_bonus: freegame 0.96→0.95 (0.01+0.95=0.96)
- super_buy_bonus: freegame 0.96→0.95 (0.01+0.95=0.96)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
RGS parser rejects books with "multiplier" field on individual board symbols.
Multiplier data is already emitted via expandingWild events — no need to
duplicate it on every W symbol in the reveal board.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Wild mult re-roll: sticky wilds now get fresh multiplier each FS spin
2. Multiplier escalation: early/mid/late pools (small→big as FS progresses)
3. Dead spin protection: 1 re-draw if zero win with sticky wilds in FS
4. Base game bait: higher weights for 50x/100x (visual bait, rarely connects)
5. Frontend: added PAYOUTS→PRIZES to socLabel, wrapped PAYTABLE/PAYLINES titles

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ap, social mode, freeze

- Restore bet from localStorage after RGS auth to survive base game refresh
- Call _hideSideUI() during FS recovery to prevent Buy Bonus overlapping spins counter
- Remove socialCasino guards hiding Buy Bonus + Double Chance in social mode
- Add _unlockGameUI() when _makeFSScreen cleans up stale overlay to prevent freeze

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Platform parser rejects multi-frame zstd files. This workflow
downloads existing sim artifacts and recompresses as single-frame.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant