Files
echoes-of-the-ash/docs/GAME_IMPROVEMENTS_2025.md
2025-11-07 15:27:13 +01:00

168 lines
6.7 KiB
Markdown

# Game Improvements - 2025
## Summary
This document outlines the major gameplay and UI improvements implemented in this update.
## Changes Overview
### 1. ✅ Distance Tracking in Meters
- **Changed**: Statistics now track actual distance walked in meters instead of stamina cost
- **Implementation**:
- Modified `move_player()` in `api/game_logic.py` to return distance as 5th value
- Distance calculated as: `int(coord_distance * 100)` for integer meters
- Updated move endpoint to track `distance_walked` in meters
- **Files Modified**:
- `api/game_logic.py` (lines 11-66)
- `api/main.py` (lines 738-780)
### 2. ✅ Integer Distance Display
- **Changed**: All distances rounded to integers (no decimals/centimeters)
- **Implementation**: Changed all `round(distance, 1)` to `int(distance)`
- **Files Modified**:
- `api/game_logic.py`
- `api/main.py` (direction details endpoint)
### 3. ✅ Game Title Update
- **Changed**: Game name updated to **"Echoes of the Ash"**
- **Files Modified**:
- `pwa/src/components/GameHeader.tsx` (line 18)
- `pwa/src/components/Login.tsx` (line 37)
- `pwa/index.html` (title tag)
- `api/main.py` (line 85 - API title)
### 4. ✅ Movement Cooldown System
- **Added**: 5-second cooldown between movements to prevent rapid zone hopping
- **Backend Implementation**:
- Database: Added `last_movement_time` FLOAT column to `players` table
- Migration: `migrate_add_movement_cooldown.py` (successfully executed)
- API validates cooldown in move endpoint (returns 400 if < 5 seconds)
- Game state endpoint returns `movement_cooldown` (seconds remaining)
- **Frontend Implementation**:
- State management: `movementCooldown` state variable
- Countdown timer: useEffect hook decrements every second
- Compass buttons: Disabled during cooldown
- Visual feedback: Shows `⏳ 3s` countdown instead of stamina cost
- Tooltip: Displays "Wait Xs before moving" when on cooldown
- **Duration**: Initially 30 seconds, reduced to 5 seconds based on feedback
- **Files Modified**:
- `api/database.py` (line 58 - schema)
- `api/main.py` (lines 423-433, 738-765 - cooldown logic)
- `pwa/src/components/Game.tsx` (lines 74-75, 93-99, 125-128, 474-498)
- `migrate_add_movement_cooldown.py` (new file)
- `Dockerfile.api` (line 22 - copy migrations)
### 5. ✅ Enhanced Danger Level Display
- **Changed**: Danger level badges enlarged and improved visibility
- **Improvements**:
- Font size: Increased to 1rem (from smaller)
- Padding: Increased to 0.5rem 1.2rem
- Border radius: Increased to 24px
- Borders: All levels have 2px solid borders
- Safe zones: New green badge styling for danger_level 0
- **Safe Zone Badge**:
- Background: `rgba(76, 175, 80, 0.2)`
- Color: `#4caf50` (green)
- Border: `2px solid #4caf50`
- **Files Modified**:
- `pwa/src/components/Game.css` (lines 267-320)
- `pwa/src/components/Game.tsx` (location display logic)
### 6. ✅ Enemy Turn Delay (Combat Animation)
- **Added**: 2-second dramatic pause for enemy turns in combat
- **Implementation**:
- Shows "🗡️ Enemy's turn..." message with orange pulsing animation
- Waits 2 seconds before displaying enemy attack results
- Player actions shown immediately
- Enemy actions shown after delay
- **Visual Style**:
- Orange background: `rgba(255, 152, 0, 0.2)`
- Border: `2px solid rgba(255, 152, 0, 0.5)`
- Animation: Pulse effect (scale and opacity)
- **Files Modified**:
- `pwa/src/components/Game.tsx` (lines 371-451 - handleCombatAction)
- `pwa/src/components/Game.css` (lines 2646-2675 - enemy-turn-message style)
### 7. ✅ Encounter Rate System
- **Added**: Random enemy encounters when arriving in dangerous zones
- **Mechanics**:
- Triggers only when moving to locations with `danger_level > 1`
- Uses `encounter_rate` from `danger_config` in `locations.json`
- Rolls random chance: if `random() < encounter_rate`, spawn enemy
- Selects random enemy from location's spawn table
- Automatically initiates combat upon arrival
- Does not trigger if already in combat
- **Backend Implementation**:
- Check in move endpoint after successful movement
- Uses existing `LOCATION_DANGER` and `get_random_npc_for_location()`
- Creates combat directly (not from wandering enemy table)
- Returns encounter data in move response
- **Frontend Implementation**:
- Detects `encounter.triggered` in move response
- Sets combat state immediately
- Shows ambush message in combat log
- Stores enemy info (name, image)
- Clears previous combat log
- **Example Rates**:
- Safe zones (danger 0): 0% encounter rate
- Low danger (danger 1): 10% encounter rate
- Medium danger (danger 2): 15-22% encounter rate
- High danger (danger 3): 25-30% encounter rate
- **Files Modified**:
- `api/main.py` (lines 780-835 - encounter check in move endpoint)
- `pwa/src/components/Game.tsx` (lines 165-218 - handleMove with encounter handling)
## Technical Details
### Database Changes
- **New Column**: `players.last_movement_time` (FLOAT, default 0)
- **Migration**: Successfully executed via `migrate_add_movement_cooldown.py`
### API Changes
- **Move Endpoint** (`POST /api/game/move`):
- Now validates 5-second cooldown
- Returns `encounter` object if triggered
- Updates `last_movement_time` timestamp
- Tracks distance in meters (not stamina)
- **Game State Endpoint** (`GET /api/game/state`):
- Now includes `movement_cooldown` (seconds remaining)
### Frontend Changes
- **New State Variables**:
- `movementCooldown` (number) - seconds remaining
- `enemyTurnMessage` (string) - shown during enemy turn delay
- **New Effects**:
- Countdown timer for movement cooldown
- **Updated Functions**:
- `handleMove()` - handles encounter responses
- `handleCombatAction()` - adds 2-second delay for enemy turns
- `renderCompassButton()` - shows cooldown countdown
## Configuration
- **Movement Cooldown**: 5 seconds (reduced from initial 30 seconds)
- **Enemy Turn Delay**: 2 seconds
- **Encounter Rates**: Configured per location in `gamedata/locations.json`
## Testing Notes
- ✅ All containers rebuilt successfully
- ✅ Migration executed without errors
- ✅ Movement cooldown functional (backend + frontend)
- ✅ Danger badges properly styled
- ✅ Combat turn delay working with animation
- ✅ Encounter system integrated with move endpoint
## Known Issues
- TypeScript lint errors (pre-existing configuration issues, do not affect functionality)
- No issues with core game mechanics
## Future Improvements
- Consider adding sound effects for enemy turns
- Add visual shake/impact effect during enemy attacks
- Consider different cooldown times based on distance traveled
- Add encounter notification sound/vibration
---
**Deployment Date**: 2025
**Status**: ✅ Successfully Deployed
**Game Version**: Updated to "Echoes of the Ash"