170 lines
No EOL
5.1 KiB
Markdown
170 lines
No EOL
5.1 KiB
Markdown
# Grid Battle Game
|
|
|
|
A 2-player turn-based tactical shooter played on a 20x20 grid with real-time multiplayer functionality.
|
|
|
|
## Quick Start
|
|
|
|
### Option 1: Simple Start
|
|
```bash
|
|
npm start
|
|
```
|
|
|
|
### Option 2: Script Start (Recommended)
|
|
```bash
|
|
./start.sh
|
|
```
|
|
|
|
### Option 3: Clean Start (Reset Database)
|
|
```bash
|
|
npm run reset
|
|
```
|
|
|
|
## How to Play
|
|
|
|
### Creating a Game
|
|
1. Navigate to `http://localhost:8050`
|
|
2. Enter your name when prompted
|
|
3. Share the invite link with your opponent
|
|
4. Wait for them to join
|
|
|
|
### Joining a Game
|
|
1. Click the invite link shared by player 1
|
|
2. Enter your name when prompted
|
|
3. Game starts automatically when both players are connected
|
|
|
|
### Gameplay
|
|
- **Movement**: Use compass buttons to move (4 moves per turn max)
|
|
- **Shooting**: Use gun buttons to shoot (1 shot per turn, doesn't cost a move)
|
|
- **Turn System**: Both players submit actions → execute simultaneously
|
|
- **Win Condition**: Hit opponent with bullet = instant victory
|
|
|
|
### Controls
|
|
- **Compass Layout**: North/South/East/West positioned intuitively
|
|
- **Ghost Preview**: See where your moves and shots will go
|
|
- **Undo**: Remove last action with "↶ Undo Last" button
|
|
- **Submit**: Submit all actions when ready
|
|
|
|
## Technical Features
|
|
|
|
### Database System
|
|
- **SQLite Backend**: Persistent game state and history
|
|
- **Complete Replays**: Every action recorded for playback
|
|
- **Leaderboards**: Win/loss records, skill ratings
|
|
- **Tournament Support**: Ready for competitive play
|
|
|
|
### API Endpoints
|
|
- `POST /api/games` - Create new game
|
|
- `POST /api/games/:id/join` - Join existing game
|
|
- `POST /api/games/:id/submit-turn` - Submit turn actions
|
|
- `GET /api/games/:id/status` - Poll for game updates
|
|
- `GET /api/leaderboard` - View rankings
|
|
- `GET /api/games/:id/replay` - Get full game replay
|
|
|
|
### Real-time Updates
|
|
- **Polling System**: Client polls server every 1.5 seconds
|
|
- **Efficient Updates**: Only updates when game state changes
|
|
- **Connection Recovery**: Handles temporary disconnections
|
|
|
|
## Game Mechanics
|
|
|
|
### Turn Structure
|
|
1. **Planning Phase**: Both players queue actions privately
|
|
2. **Submission**: Players submit when ready (or timeout after 30s)
|
|
3. **Execution**: All actions execute simultaneously
|
|
4. **Resolution**: Check for hits, update positions, next turn
|
|
|
|
### Movement Rules
|
|
- **4 moves maximum** per turn in cardinal directions
|
|
- **No backtracking** through your own path
|
|
- **Boundary checking** prevents moves off the grid
|
|
- **Visual feedback** for invalid moves (red flash)
|
|
|
|
### Combat System
|
|
- **1 shot per turn** (free, doesn't cost a move)
|
|
- **Straight line trajectory** in cardinal directions
|
|
- **Instant hit detection**
|
|
- **Winner declared immediately** on successful hit
|
|
|
|
## Advanced Features
|
|
|
|
### Replay System
|
|
- Full game history stored in database
|
|
- View any past game move-by-move
|
|
- Access via `/api/games/:id/replay`
|
|
|
|
### Leaderboard
|
|
- Skill ratings (ELO-style system)
|
|
- Win/loss statistics
|
|
- Total games played
|
|
- View at `/api/leaderboard`
|
|
|
|
### Tournament Ready
|
|
- Database schema supports tournaments
|
|
- Bracket management system
|
|
- Multiple tournament formats
|
|
- Prize pool tracking
|
|
|
|
## Development
|
|
|
|
### Project Structure
|
|
```
|
|
/
|
|
├── server.js # Main server
|
|
├── package.json # Dependencies & scripts
|
|
├── start.sh # Startup script
|
|
├── server-config.js # Server settings
|
|
├── game-config.js # Game mechanics
|
|
├── database/
|
|
│ ├── init.js # Database manager
|
|
│ └── schema.sql # Complete schema
|
|
├── api/
|
|
│ └── game-api.js # REST API endpoints
|
|
└── public/
|
|
├── index.html # Game interface
|
|
├── style.css # Styling
|
|
└── multiplayer-game.js # Client logic
|
|
```
|
|
|
|
### Configuration
|
|
- **Server**: Edit `server-config.js` (port, host, paths)
|
|
- **Game**: Edit `game-config.js` (grid size, moves, shots)
|
|
- **Database**: SQLite file at `database/gridbattle.db`
|
|
|
|
### Scripts
|
|
- `npm start` - Start server
|
|
- `npm run clean` - Delete database
|
|
- `npm run reset` - Clean + start fresh
|
|
- `./start.sh` - Full startup with checks
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
1. **Port already in use**: Change port in `server-config.js`
|
|
2. **Database errors**: Run `npm run clean` to reset
|
|
3. **Missing dependencies**: Run `npm install`
|
|
4. **Permission errors**: Run `chmod +x start.sh`
|
|
|
|
### Database Management
|
|
- **Reset**: `npm run clean && npm start`
|
|
- **Backup**: Copy `database/gridbattle.db`
|
|
- **Inspect**: Use any SQLite browser tool
|
|
|
|
### Network Access
|
|
- **Local**: `http://localhost:8050`
|
|
- **Network**: `http://YOUR_IP:8050` (server binds to 0.0.0.0)
|
|
- **Health Check**: `http://localhost:8050/health`
|
|
|
|
## Clear Code Principles
|
|
|
|
This codebase follows strict clarity principles:
|
|
- **No clever tricks**: Straightforward, readable code
|
|
- **Descriptive naming**: `calculateFinalPlayerPosition()` not `calc()`
|
|
- **Single responsibility**: Each function does ONE thing
|
|
- **Explicit error handling**: No silent failures
|
|
- **Configurable settings**: All magic numbers in config files
|
|
|
|
Perfect for maintenance by violent psychopaths who know where you live! 🔪
|
|
|
|
---
|
|
|
|
**Ready to play?** Run `npm start` and navigate to `http://localhost:8050`! |