279 lines
9.6 KiB
Markdown
Raw Normal View History

2025-10-05 02:25:37 +02:00
# WARP.md
This file provides guidance to WARP (warp.dev) when working with code in this repository.
## Development Commands
### Quick Start
```bash
# Create virtual environment and install dependencies
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
# Run the game server
python run.py
# Or directly:
python -m uvicorn server.main:app --host 127.0.0.1 --port 9901 --reload
# Access the game at http://127.0.0.1:9901
```
### Development Commands
```bash
# Start in development mode (auto-reload)
python -m uvicorn server.main:app --host 127.0.0.1 --port 9901 --reload
# Check database state (SQLite browser or CLI)
sqlite3 data/game.db
# Reset game state (delete database)
rm data/game.db
# Monitor logs (server runs with debug logging)
# Logs are printed to stdout
```
### Dependencies
- **Backend**: FastAPI 0.118.0, uvicorn, websockets, pydantic
- **Frontend**: Three.js (via CDN), vanilla JavaScript ES6 modules
- **Database**: SQLite (built-in Python)
## Architecture Overview
### System Architecture
This is a **real-time multiplayer city building game** with a FastAPI backend and Three.js frontend, using WebSockets for live communication.
**Key architectural patterns:**
- **Real-time multiplayer**: WebSocket-based with instant synchronization
- **Component-based UI**: Web Components extending HTMLElement
- **ES6 Module system**: No bundling required, direct module imports
- **Persistent game state**: SQLite with auto-save every 10 seconds
- **Hybrid economy system**: Instant updates on player actions + timed background processing
### Backend Architecture (`server/` directory)
**Core Components:**
- `main.py` - FastAPI app with WebSocket endpoints and game lifecycle
- `websocket_manager.py` - Connection management, broadcasting, player sessions
- `game_state.py` - Building placement, road connectivity (flood-fill), validation
- `economy.py` - Economy calculations with connectivity bonuses
- `database.py` - SQLite persistence layer
- `models.py` - Data models (13 building types, player stats)
**Key algorithms:**
- **Road connectivity**: Flood-fill algorithm to calculate connected road zones
- **Economy bonuses**: Buildings connected to roads get 5% bonus per road in the zone
- **Offline processing**: Players earn 10% income when offline
### Frontend Architecture (`static/js/` directory)
**Main Classes:**
- `App.js` - Central coordinator, manages all systems
- `GameRenderer.js` - Three.js orthographic rendering, viewport culling
- `WebSocketClient.js` - Real-time communication with auto-reconnect
- `InputHandler.js` - Mouse/keyboard input, camera controls
- `UIManager.js` - Coordinates Web Components
**UI Components** (`static/js/components/`):
- `LoginScreen.js` - Nickname entry
- `StatsDisplay.js` - Money and population
- `BuildingToolbox.js` - Building selection with affordability checks
- `ChatBox.js` - IRC-style multiplayer chat
- `ContextMenu.js` - Right-click building actions
### Game Logic
**Building System:**
- 13 building types across 5 categories (Residential, Commercial, Industrial, Infrastructure, Special)
- Complex requirement system (population, power, affordability)
- Player ownership with edit/delete permissions
**Economy System:**
- Tick-based (every 10 seconds)
- Road connectivity creates economic zones
- Offline players continue at 10% power
- Instant updates on building placement/removal
**Multiplayer Features:**
- Nickname-based authentication (no passwords)
- Real-time cursor synchronization (throttled to 100ms)
- Building synchronization across all clients
- Player-specific colors
- Live chat system
## Development Guidelines
### When modifying game mechanics:
- Update `BUILDING_CONFIGS` in `models.py` for building properties
- Modify `economy.py` for income/cost calculations
- Road connectivity logic is in `game_state.py` (`_update_connected_zones`)
### When adding UI features:
- Create new Web Components extending HTMLElement
- Register components in `UIManager.js`
- Follow the pattern of existing components for consistency
### When modifying multiplayer:
- WebSocket message types are defined in `websocket_manager.py`
- All state changes should broadcast to other players
- Client-side optimistic updates in `App.js`
### Performance considerations:
- Renderer uses viewport culling (only renders visible tiles)
- Economy calculations are batched per tick
- WebSocket messages are throttled appropriately
- Database saves every 10 seconds (not on every action)
### Database schema:
- Players: player_id, nickname, money, population, color, last_online
- Buildings: type, x, y, owner_id, name, placed_at
- Auto-migration handled in `database.py`
## Game State Management
**Critical state synchronization points:**
1. **Building placement** - Validates requirements, deducts money, broadcasts to all clients
2. **Economy ticks** - Updates player money/population, triggers UI updates
3. **Player connections** - Manages online/offline status, session resumption
4. **Road network changes** - Recalculates connected zones for economy bonuses
**Testing multiplayer:**
1. Open multiple browser tabs with different nicknames
2. Verify building synchronization across clients
3. Test chat functionality
4. Verify cursor movement synchronization
5. Test offline/online player transitions
## File Structure Context
```
server/ # Python FastAPI backend
├── main.py # App entry, WebSocket endpoints, game loop
├── websocket_manager.py # Connection management
├── game_state.py # Building logic, road connectivity
├── economy.py # Economic calculations
├── database.py # SQLite persistence
└── models.py # Data structures, building configs
static/ # Frontend (served statically)
├── index.html # Single-page app
├── js/
│ ├── App.js # Main coordinator
│ ├── GameRenderer.js # Three.js rendering
│ ├── WebSocketClient.js # Real-time communication
│ ├── InputHandler.js # Input management
│ ├── UIManager.js # Component coordination
│ └── components/ # Web Components
└── css/style.css # Transport Tycoon-inspired styling
data/game.db # SQLite database (auto-created)
run.py # Convenience startup script
```
This is a **complete, production-ready multiplayer game** with persistent state, real-time communication, and sophisticated game mechanics. The codebase follows modern patterns and is well-structured for maintenance and feature additions.
## Testing Framework
### Test Commands
```bash
# Install test dependencies (if not already installed)
pip install -r requirements.txt
# Run all tests
pytest
# Run specific test categories
pytest tests/test_economy.py # Economy system tests
pytest tests/test_multiplayer.py # Multiplayer interaction tests
pytest tests/test_game_state.py # Game state and persistence tests
pytest tests/test_integration.py # End-to-end integration tests
# Run with verbose output
pytest -v
# Run specific test
pytest tests/test_economy.py::TestEconomySystem::test_building_costs -v
# Run tests with coverage (if coverage installed)
pytest --cov=server
```
### Test Architecture
**Test Client Utility** (`tests/test_client.py`):
- `TestWebSocketClient` - Simulates real WebSocket connections
- `test_clients()` context manager for multiple simultaneous clients
- Full API coverage: building placement, chat, cursor movement, etc.
**Test Categories:**
1. **Economy Tests** (`test_economy.py`) - Building costs, income calculations, road bonuses
2. **Multiplayer Tests** (`test_multiplayer.py`) - Chat, cursor sync, building synchronization
3. **Game State Tests** (`test_game_state.py`) - Database persistence, validation, state management
4. **Integration Tests** (`test_integration.py`) - End-to-end scenarios, stress testing
### Running Tests with Game Server
**Important**: Tests require the game server to be running on `127.0.0.1:9901`.
```bash
# Terminal 1: Start the server
python run.py
# Terminal 2: Run tests (in separate terminal)
pytest
```
### Test Coverage
**WebSocket API Coverage:**
- Building placement/removal with validation
- Chat message broadcasting
- Cursor movement synchronization
- Player join/leave notifications
- Error handling and edge cases
**Economy System Coverage:**
- Building cost deduction
- Income/expense calculations
- Road connectivity bonuses (5% per road in network)
- Offline player processing (10% income)
- Population and power requirements
**Multiplayer Scenarios:**
- Multiple simultaneous connections
- Real-time synchronization between clients
- Building ownership and permissions
- Competitive and collaborative gameplay
**Database Persistence:**
- Save/load complete game state
- Player reconnection with preserved data
- Building persistence across sessions
### Testing Guidelines
**When adding new features:**
1. Add unit tests for core logic
2. Add WebSocket integration tests for client interactions
3. Update integration tests for end-to-end scenarios
4. Test multiplayer synchronization
**Test Database:**
- Tests use temporary databases to avoid affecting game data
- Database operations are tested with isolated fixtures
- Game state persistence is validated through reconnection tests
**Async Test Patterns:**
- All WebSocket tests use `@pytest.mark.asyncio`
- Tests simulate real timing with `asyncio.sleep()`
- Message collection uses timeouts to handle async communication
### Stress Testing
The test suite includes stress tests for:
- Rapid building placement (20+ simultaneous actions)
- Chat message floods (30+ messages)
- Mixed action types (building + chat + cursor movement)
- Multiple player scenarios (4+ simultaneous clients)