# 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

