-
Couldn't load subscription status.
- Fork 1
Description
Summary
Implement a new set_game_state function in src/lua/utils.lua that can apply a simplified game state (output from get_game_state) back to the game. This will enable game state serialization/restoration for testing, debugging, and development workflows.
Current State
We currently have utils.get_game_state() in src/lua/utils.lua that extracts and simplifies the complex game state object G into a clean, serializable format. The function returns:
{
state = G.STATE,
game = { -- simplified G.GAME fields
dollars = ...,
chips = ...,
current_round = { ... },
-- ... other key fields
},
hand = { ... }, -- simplified G.hand
jokers = { ... }, -- simplified G.jokers
consumables = { ... }, -- simplified G.consumables
shop_jokers = { ... }, -- simplified G.shop_jokers
shop_vouchers = { ... }, -- simplified G.shop_vouchers
shop_booster = { ... }, -- simplified G.shop_booster
}Proposed Solution
Create a new utils.set_game_state(game_state) function that:
- Takes a simplified game state (the output format of
get_game_state) - Applies values to the actual game state by setting fields in
G.GAME,G.hand,G.jokers, etc. - Handles nested field mapping properly (e.g.,
game_state.game.dollars→G.GAME.dollars) - Validates input structure and provides meaningful error messages
- Is safe and non-destructive - only sets fields that exist in the input
Use Cases
1. Testing Workflow
-- Reach a specific game state manually or using debugplus
local saved_state = utils.get_game_state()
-- Save to JSON file for test fixtures-- In tests: load and apply saved state
utils.set_game_state(test_fixture_state)
-- Run test scenarios from known state2. Development and Debugging
- Save interesting game states during development
- Reproduce specific scenarios for bug investigation
- Create standardized test scenarios for bot development
3. Consistency Validation
local original_state = utils.get_game_state()
utils.set_game_state(original_state)
local restored_state = utils.get_game_state()
-- Assert: original_state == restored_stateImplementation Requirements
Function Signature
---Applies a simplified game state back to the game
---@param game_state G The simplified game state (from get_game_state)
---@return boolean success, string? error_message
function utils.set_game_state(game_state)Key Field Mappings
The function should handle these main mappings:
game_state.game.*→G.GAME.*(dollars, chips, round, etc.)game_state.hand.*→G.hand.*(cards, config)game_state.jokers.*→G.jokers.*(cards, config)game_state.consumables.*→G.consumables.*game_state.shop_jokers.*→G.shop_jokers.*game_state.shop_vouchers.*→G.shop_vouchers.*game_state.shop_booster.*→G.shop_booster.*game_state.state→G.STATE
Error Handling
- Validate input structure before applying changes
- Return success/failure status with descriptive error messages
- Handle missing or invalid fields gracefully
- Preserve game state if restoration fails
Safety Considerations
- Only set fields that exist in the input (don't clear existing fields)
- Validate that target game objects exist (G.GAME, G.hand, etc.)
- Consider read-only or computed fields that shouldn't be set directly
- Handle complex nested structures carefully
Testing Strategy
-
Round-trip consistency test:
local original = utils.get_game_state() utils.set_game_state(original) local restored = utils.get_game_state() assert(original == restored)
-
Partial state restoration: Test with subsets of the full state
-
Error handling: Test with malformed or incomplete input
-
Edge cases: Empty states, missing fields, invalid values
Benefits
- Enhanced Testing: Create reproducible test scenarios from saved game states
- Debugging: Quickly reproduce specific game situations for investigation
- Development: Accelerate bot development by testing against known states
- State Management: Foundation for save/load functionality if needed in future
Implementation Notes
- Consider the extensive field mapping needed (reference
get_game_statefor structure) - Some fields might be computed or derived - identify which are safe to set directly
- Card objects have complex nested structures that need careful handling
- The function should be robust enough to handle partial state restoration
Acceptance Criteria
-
utils.set_game_state(game_state)function implemented - Handles all major game state categories (game, hand, jokers, consumables, shop areas)
- Returns success/failure status with error messages
- Passes round-trip consistency tests
- Includes proper input validation and error handling
- Documented with usage examples and field mappings
This issue was generate by claude. We need to double check it