moved md files to root
This commit is contained in:
243
README.md
Normal file
243
README.md
Normal file
@@ -0,0 +1,243 @@
|
||||
# Multiplayer Coop Top-Down Action RPG
|
||||
|
||||
A Godot 4.6 multiplayer cooperative game supporting both local and online multiplayer with physics-based interactions.
|
||||
|
||||
## 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
|
||||
|
||||
Reference in New Issue
Block a user