279 lines
9.6 KiB
Markdown
279 lines
9.6 KiB
Markdown
|
|
# 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)
|