Files
BreakEscape/TESTING_GUIDE.md
Z. Cliffe Schreuders cb95a857fd Implement global variable system for NPC conversations
- Introduced a data-driven global variable system to manage narrative state across NPC interactions.
- Added support for global variables in scenario JSON, allowing for easy extension and management.
- Implemented synchronization of global variables between Ink stories and the game state, ensuring real-time updates across conversations.
- Enhanced state persistence, allowing global variables to survive page reloads and be restored during conversations.
- Created comprehensive documentation and testing guides to facilitate usage and verification of the new system.
2025-11-08 15:44:24 +00:00

296 lines
8.1 KiB
Markdown

# Global Ink Variables - Testing Guide
## Quick Start Test
### Prerequisites
- Open the game with the `npc-sprite-test2.json` scenario
- Browser console open (F12)
### Test 1: Basic Functionality
1. **Verify Initial State**
```javascript
console.log(window.gameState.globalVariables);
// Should show: { player_joined_organization: false }
```
2. **Start conversation with test_npc_back**
- Click on the back NPC in test_room
- Follow the conversation through to "player_closing"
3. **Make the Join Choice**
- Select "I'd love to join your organization!"
- Observe NPC response
4. **Check Global State**
```javascript
console.log(window.gameState.globalVariables.player_joined_organization);
// Should now be: true
```
### Test 2: Cross-NPC Syncing
1. **Start conversation with container_test_npc (Equipment Officer)**
- Click on the equipment officer NPC
- Start conversation
2. **Observe Menu Options**
- If you joined in Test 1, you should see:
- "Tell me about your equipment"
- **"Show me what you have available"** ← This should appear!
- "Show me your specialist items"
- If you didn't join, only the specialist items option appears
3. **Verify Variable Synced**
```javascript
console.log(window.gameState.globalVariables.player_joined_organization);
// Still true from previous conversation!
```
### Test 3: Direct Phaser Access
1. **Open Console**
2. **Directly Set Variable**
```javascript
window.gameState.globalVariables.player_joined_organization = false;
```
3. **Start new conversation with Equipment Officer**
- Full inventory option should now be GONE
- Only specialist items option appears
4. **Set Back to True**
```javascript
window.gameState.globalVariables.player_joined_organization = true;
```
5. **Start conversation again**
- Full inventory option should reappear
### Test 4: State Persistence
1. **Join organization** (if not already done)
- Complete the test_npc_back conversation
- Choose to join
2. **Talk to Equipment Officer**
- Verify full inventory option is available
3. **End conversation**
- Close the minigame
4. **Reload the page** (F5)
- Wait for game to fully load
5. **Check Global State**
```javascript
console.log(window.gameState.globalVariables.player_joined_organization);
// Should still be true!
```
6. **Talk to Equipment Officer again**
- Full inventory option should still appear
## Debugging Checks
### Verify Scenario Loaded
```javascript
console.log(window.gameScenario.globalVariables);
// Should show: { player_joined_organization: false }
```
### Check All Global Variables
```javascript
console.log('Global Variables:', window.gameState.globalVariables);
console.log('NPC Cache:', Array.from(window.npcManager.inkEngineCache.keys()));
console.log('Saved States:', window.npcConversationStateManager.getSavedNPCs());
```
### Check Variable Change Events
Add this before starting a conversation:
```javascript
// Temporarily enable verbose logging
window.npcConversationStateManager._log = (level, msg, data) => {
console.log(`[${level}]`, msg, data);
};
```
Then start a conversation and watch the console for variable sync messages.
### Verify Ink Variable Names
```javascript
// Check what variables are in test2.ink story
const test2Engine = window.npcManager.inkEngineCache.get('test_npc_back');
if (test2Engine?.story?.variablesState?._defaultGlobalVariables) {
console.log('test2.ink variables:',
Array.from(test2Engine.story.variablesState._defaultGlobalVariables.keys()));
}
// Check equipment officer
const eqEngine = window.npcManager.inkEngineCache.get('container_test_npc');
if (eqEngine?.story?.variablesState?._defaultGlobalVariables) {
console.log('equipment-officer.ink variables:',
Array.from(eqEngine.story.variablesState._defaultGlobalVariables.keys()));
}
```
## Expected Console Output
When everything is working correctly, you should see messages like:
```
🌐 Initialized global variables: {player_joined_organization: false}
✅ Synced player_joined_organization = false to story
🔍 Auto-discovered global variable: player_joined_organization = false
🌐 Global variable changed: player_joined_organization = true (from test_npc_back)
📡 Broadcasted player_joined_organization = true to container_test_npc
✅ Restored global variables: {player_joined_organization: true}
```
## Common Issues & Solutions
### Issue: Full inventory option never appears
**Check:**
1. Did you actually choose "Join organization"?
```javascript
console.log(window.gameState.globalVariables.player_joined_organization);
```
2. Did the Equipment Officer conversation load?
```javascript
console.log(window.npcManager.inkEngineCache.has('container_test_npc'));
```
3. Are the stories properly synced?
```javascript
const eqStory = window.npcManager.inkEngineCache.get('container_test_npc').story;
console.log('Eq Officer has variable:', eqStory.variablesState.GlobalVariableExistsWithName('player_joined_organization'));
console.log('Value:', eqStory.variablesState['player_joined_organization']);
```
### Issue: Variable resets on page reload
**Check:**
1. Was state actually saved?
```javascript
console.log(window.npcConversationStateManager.getNPCState('test_npc_back'));
```
2. Does saved state have global snapshot?
```javascript
const state = window.npcConversationStateManager.getNPCState('test_npc_back');
console.log('Global snapshot:', state?.globalVariablesSnapshot);
```
### Issue: Changes not syncing to other NPCs
**Check:**
1. Are multiple stories loaded?
```javascript
console.log('Loaded stories:', Array.from(window.npcManager.inkEngineCache.keys()));
```
2. Does the variable exist in both stories?
```javascript
// Check each story's variables
window.npcManager.inkEngineCache.forEach((engine, id) => {
const exists = engine.story.variablesState.GlobalVariableExistsWithName('player_joined_organization');
console.log(`${id}: has player_joined_organization =`, exists);
});
```
## Advanced Testing
### Test Auto-Discovery of global_* Variables
1. Create a new Ink file with:
```ink
VAR global_test_flag = false
```
2. Add it to an NPC in scenario
3. Load that NPC's conversation
4. Check console:
```javascript
console.log(window.gameState.globalVariables);
// Should auto-discover: { player_joined_organization: false, global_test_flag: false }
```
### Test Modifying from Phaser Code
1. Get reference to game code:
```javascript
// In Phaser scene, emit an event
window.dispatchEvent(new CustomEvent('player-achievement', {
detail: { achievement: 'joined_org' }
}));
// In listener code:
window.addEventListener('player-achievement', (e) => {
window.gameState.globalVariables.player_joined_organization = true;
});
```
2. Start new NPC conversation
3. Verify variable is synced
### Test Multiple Global Variables
1. Update `npc-sprite-test2.json`:
```json
"globalVariables": {
"player_joined_organization": false,
"reputation": 0,
"quest_stage": 0
}
```
2. Add to Ink files:
```ink
VAR player_joined_organization = false
VAR reputation = 0
VAR quest_stage = 0
```
3. Use in conditionals:
```ink
{reputation >= 5:
You're well known around here
}
```
4. Test syncing multiple variables at once
## Success Criteria
✅ Initial state loads with correct defaults
✅ Variable changes persist in window.gameState
✅ Changes sync to other loaded stories in real-time
✅ Menu options conditionally appear based on variables
✅ State persists across page reloads
✅ Console shows appropriate sync messages
✅ No errors in browser console
✅ Multiple variables can be managed simultaneously
## Performance Notes
The system is optimized for:
- **Few global variables** (< 50 per scenario) ✅
- **Multiple NPCs** (handles all loaded stories) ✅
- **Event-driven syncing** (only syncs on change) ✅
- **No circular loops** (prevents infinite propagation) ✅
If testing with > 100 global variables, monitor console for any performance impact.