274 lines
7.9 KiB
Markdown
274 lines
7.9 KiB
Markdown
# Multiplayer Coop Top-Down Action RPG
|
|
|
|
A Godot 4.6 multiplayer cooperative game supporting both local and online multiplayer with physics-based interactions.
|
|
|
|
Start with arguments:
|
|
|
|
--host or --join # instantly hosts or joins a game
|
|
|
|
--room-debug # shows information above each room what types of puzzles it has, and if player entered the room or not...
|
|
|
|
--webrtc # this selects webrtc network mode directly. if combined with --join it will try to find room and join that.
|
|
|
|
## Features
|
|
|
|
### Multiplayer Support
|
|
- **Host or Join**: Any player can host a game or join an existing one
|
|
|
|
- **Local Multiplayer**: Each machine can have multiple local players (up to 4)
|
|
|
|
- First local player uses keyboard controls
|
|
|
|
- Additional local players use gamepads
|
|
|
|
- **Online Multiplayer**: Players can join from different machines
|
|
|
|
- **Drop-in/Drop-out**: Players can join at any time during gameplay
|
|
|
|
### Gameplay Mechanics
|
|
- **Top-Down Action RPG**: Classic top-down perspective with smooth character movement
|
|
|
|
- **Physics-Based Interactions**:
|
|
|
|
- **Lift (Tap Grab)**: Pick up objects above your head and carry them
|
|
|
|
- **Push/Pull (Hold Grab)**: Hold the grab button to push or pull objects
|
|
|
|
- **Throw**: While lifting, tap grab again to throw in movement direction
|
|
|
|
- **Arc Physics**: Thrown objects and players fly in realistic arcs with Z-axis simulation
|
|
|
|
- **Dynamic Shadows**: Shadows scale and fade based on height
|
|
|
|
- **Box Breaking**: Boxes shatter into 4 pieces when hitting players or other boxes
|
|
|
|
- **Damage System**: Players take damage and knockback from thrown boxes
|
|
|
|
### Camera System
|
|
- Dynamic camera that follows all local players
|
|
|
|
- Automatically adjusts zoom based on player spread
|
|
|
|
- Smooth camera movement for comfortable gameplay
|
|
|
|
## Controls
|
|
|
|
### Player 1 (Keyboard)
|
|
|
|
- **WASD** or **Arrow Keys**: Move
|
|
|
|
- **E (Tap)**: Lift object above head
|
|
- **E (Hold)**: Push/Pull object
|
|
- **E (While Lifting + Moving)**: Throw object
|
|
- **E (While Lifting + Still)**: Place down object
|
|
|
|
### Player 2+ (Gamepad)
|
|
- **Left Stick**: Move
|
|
- **A Button (Tap)**: Lift object above head
|
|
- **A Button (Hold)**: Push/Pull object
|
|
- **A Button (While Lifting + Moving)**: Throw object
|
|
- **A Button (While Lifting + Still)**: Place down object
|
|
|
|
## How to Play
|
|
|
|
### Starting a Game
|
|
|
|
1. **Host a Game**:
|
|
|
|
- Set the number of local players (1-4)
|
|
|
|
- Click "Host Game"
|
|
|
|
- Share your IP address with friends who want to join
|
|
|
|
2. **Join a Game**:
|
|
- Set the number of local players (1-4)
|
|
|
|
- Enter the host's IP address
|
|
|
|
- Click "Join Game"
|
|
|
|
### Command-Line Testing (Easy Multiplayer Testing)
|
|
|
|
You can launch the game with command-line arguments to automatically host or join, making it easy to test multiplayer with multiple instances:
|
|
|
|
**Host Instance:**
|
|
```bash
|
|
# Windows
|
|
godot.exe --path "C:\dev\godot\multiplayer-coop" -- --host
|
|
|
|
# Or with custom player count
|
|
godot.exe --path "C:\dev\godot\multiplayer-coop" -- --host --players=2
|
|
```
|
|
|
|
**Join Instance:**
|
|
```bash
|
|
# Windows
|
|
godot.exe --path "C:\dev\godot\multiplayer-coop" -- --join
|
|
|
|
# Or with custom address and player count
|
|
godot.exe --path "C:\dev\godot\multiplayer-coop" -- --join --address=127.0.0.1 --players=2
|
|
```
|
|
|
|
**Quick Test Setup:**
|
|
1. Open 3 terminals
|
|
2. Terminal 1: `godot.exe --path "path/to/project" -- --host`
|
|
3. Terminal 2: `godot.exe --path "path/to/project" -- --join`
|
|
4. Terminal 3: `godot.exe --path "path/to/project" -- --join`
|
|
|
|
All instances will automatically start and connect - no clicking required!
|
|
|
|
**Available Arguments:**
|
|
- `--host` - Automatically host a game
|
|
- `--join` - Automatically join a game
|
|
- `--address=IP` - Server address to join (default: 127.0.0.1)
|
|
- `--players=N` - Number of local players (default: 1, max: 4)
|
|
|
|
### Gameplay
|
|
|
|
**Lifting Objects:**
|
|
1. Get close to an object (box)
|
|
2. **Tap** the grab button (E or A)
|
|
3. Object appears above your head
|
|
4. **Move + Tap** grab to throw it
|
|
5. **Stand still + Tap** grab to place it down
|
|
|
|
**Pushing/Pulling Objects:**
|
|
1. Get close to an object
|
|
2. **Hold** the grab button (E or A)
|
|
3. Move with WASD/stick to push/pull
|
|
4. **Release** button to let go
|
|
|
|
**Other Interactions:**
|
|
- Walk into objects to push them naturally
|
|
- Grab other players the same way as objects
|
|
- Throw players for fun chaos! They fly in arcs just like boxes
|
|
- Throw boxes at players to damage and knock them back
|
|
- Boxes break into 4 pieces when hitting players or other boxes
|
|
- Work together to move heavy objects
|
|
|
|
## Technical Details
|
|
|
|
### Network Architecture
|
|
- Uses Godot's built-in ENet multiplayer system
|
|
- Server-authoritative architecture for consistency
|
|
- Supports up to 8 concurrent connections
|
|
- Default port: 7777
|
|
|
|
### Project Structure
|
|
```
|
|
multiplayer-coop/
|
|
├── scenes/
|
|
│ ├── main.tscn # Entry point
|
|
│ ├── main_menu.tscn # Main menu UI
|
|
│ ├── game_world.tscn # Game arena
|
|
│ ├── player.tscn # Player character
|
|
│ └── interactable_object.tscn # Grabbable objects
|
|
├── scripts/
|
|
│ ├── network_manager.gd # Network handling (autoload)
|
|
│ ├── player_manager.gd # Player spawning
|
|
│ ├── game_world.gd # Game logic
|
|
│ ├── player.gd # Player controller
|
|
│ ├── interactable_object.gd # Object physics
|
|
│ └── game_ui.gd # UI logic
|
|
└── project.godot
|
|
```
|
|
|
|
### Key Systems
|
|
|
|
#### Network Manager (Autoload)
|
|
- Handles hosting and joining games
|
|
- Manages player registration and synchronization
|
|
- Tracks all connected players and their local player counts
|
|
|
|
#### Player Manager
|
|
- Spawns players for each peer
|
|
- Manages player lifecycle (spawn/despawn)
|
|
- Handles local vs remote player distinction
|
|
|
|
#### Player Controller
|
|
- Input handling for keyboard and multiple gamepads
|
|
- Physics-based movement
|
|
- Interaction system (grab/throw)
|
|
- Network synchronization
|
|
|
|
#### Interactable Objects
|
|
- RigidBody2D-based physics
|
|
- Can be grabbed, pushed, and thrown
|
|
- Weight affects throw distance
|
|
|
|
## Development Notes
|
|
|
|
### Adding New Features
|
|
|
|
**New Interactable Objects**:
|
|
1. Create a scene inheriting from `interactable_object.tscn`
|
|
2. Adjust the sprite, collision shape, and mass
|
|
3. Optionally override interaction methods
|
|
|
|
**Custom Player Abilities**:
|
|
1. Add new input actions in Project Settings
|
|
2. Implement ability logic in `player.gd`
|
|
3. Add network synchronization if needed
|
|
|
|
**New Game Modes**:
|
|
1. Create a new scene inheriting from `game_world.tscn`
|
|
2. Add game mode logic in a new script
|
|
3. Update the main menu to select game modes
|
|
|
|
### Testing Multiplayer
|
|
|
|
**Local Testing**:
|
|
1. Run the game from Godot editor
|
|
2. Click "Host Game"
|
|
3. Run a second instance from the exported build
|
|
4. Enter "127.0.0.1" and click "Join Game"
|
|
|
|
**Network Testing**:
|
|
1. Host on one machine
|
|
2. Find the host's local IP address (ipconfig/ifconfig)
|
|
3. Join from another machine on the same network
|
|
4. For internet play, configure port forwarding on port 7777
|
|
|
|
## Troubleshooting
|
|
|
|
**Connection Failed**:
|
|
- Verify the IP address is correct
|
|
- Check firewall settings (allow port 7777)
|
|
- Ensure both machines are on the same network (for LAN play)
|
|
|
|
**Players Not Spawning**:
|
|
- Check the console for errors
|
|
- Verify the player scene is assigned in PlayerManager
|
|
- Ensure NetworkManager is loaded as an autoload
|
|
|
|
**Gamepad Not Working**:
|
|
- Connect gamepad before starting the game
|
|
- Check gamepad is recognized in Godot's input settings
|
|
- Verify you have more than 1 local player selected
|
|
|
|
**Objects Not Grabbable**:
|
|
- Ensure object has `can_be_grabbed()` method
|
|
- Check GrabArea collision layers/masks
|
|
- Verify object is within grab range (80 units)
|
|
|
|
## Future Enhancements
|
|
|
|
- [ ] Combat system with health and damage
|
|
- [ ] Enemy AI
|
|
- [ ] Level progression and multiple maps
|
|
- [ ] Character customization
|
|
- [ ] Inventory system
|
|
- [ ] Cooperative puzzles
|
|
- [ ] Voice chat integration
|
|
- [ ] Dedicated server support
|
|
|
|
## License
|
|
|
|
This project is open source and available for modification and distribution.
|
|
|
|
## Credits
|
|
|
|
Built with Godot Engine 4.6
|
|
|