Added stateKey field to VoiceMessage interface to explicitly link messages
with warning states, preventing infinite repeat loops.
Bug fixes:
- Messages check warning state exists before re-queuing
- clearWarningState() now purges matching messages from queue
- Proper cleanup when resources increase above thresholds
Changes to voiceAudioSystem.ts:
- VoiceMessage interface: Added stateKey field
- queueMessage(): Added stateKey parameter
- handleStatusChange(): Pass state keys when queueing warnings
- update(): Validate state exists before re-queuing repeating messages
- clearWarningState(): Filter queue to remove messages with matching stateKey
Also includes explosion audio improvements:
- Use onEndedObservable instead of setTimeout for audio cleanup
- Adjusted explosion force and duration parameters
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented repeating voice messages that automatically replay at intervals until the condition clears, with danger messages superseding warnings.
Changes:
- VoiceMessage interface: Added repeatInterval and lastPlayedTime fields
- queueMessage(): Now accepts repeatInterval parameter (0 = no repeat)
- update(): Implements repeat logic
- After sequence completes, checks repeatInterval
- Re-queues message with timestamp tracking
- Waits for interval to elapse before replaying
- clearWarningState(): New method to clear specific warning states
- handleStatusChange(): Enhanced logic with prioritization
- Clears warning states when resources increase above thresholds
- Danger warnings (< 10%): repeat every 2s, clear warning state
- Regular warnings (10-30%): repeat every 4s, only if not in danger
- Empty warnings: play once, no repeat
Behavior:
- Fuel 25%: "warning → fuel" repeats every 4s
- Fuel drops to 8%: Warning stops, "danger → fuel" repeats every 2s
- Fuel recovers to 15%: Danger stops, "warning → fuel" resumes
- Fuel recovers to 35%: All warnings stop
- Refueling/repairing clears states, allows re-triggering
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented VoiceAudioSystem class that loads voice clips and plays them sequentially in response to game events (fuel/hull/ammo warnings).
Changes:
- VoiceAudioSystem: New class for managing voice audio
- Loads 13 voice MP3 files (warning, danger, fuel, hull, ammo, etc.)
- Priority queue system (HIGH, NORMAL, LOW)
- Sequential playback with state polling
- One-shot warning tracking to prevent spam
- Non-spatial audio (cockpit computer voice)
- Ship: Integrated VoiceAudioSystem
- Initialize voice system after ShipAudio
- Subscribe to ShipStatus.onStatusChanged events
- Call update() in render loop for sequential playback
Features:
- Event-driven warnings trigger on status thresholds
- Fuel/hull/ammo < 30%: "warning" → resource name
- Fuel/hull/ammo < 10%: "danger" → resource name
- Resource = 0: resource name → "empty"
- Comprehensive debug logging for troubleshooting
- State machine handles queue and playback sequencing
Note: Current implementation has a bug in getMaxValue() calculation that prevents warnings from triggering correctly. Will be fixed in next commit.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>