$npx -y skills add thedivergentai/GD-Agentic-Skills --skill godot-genre-partyExpert blueprint for party games including minigame resource system (define via .tres files), local multiplayer input (4-player controller management), asymmetric gameplay (1v3 balance), scene management (clean minigame loading/unloading), persistent scoring (track wins across ro
| 1 | ## Godot 4.7 Baseline |
| 2 | |
| 3 | - Expert patterns in this skill target **Godot 4.7+** (stable, 2026-06-18). |
| 4 | - Consult the [Godot 4.7 migration guide](https://docs.godotengine.org/en/4.7/tutorials/migrating/upgrading_to_godot_4.7.html) when upgrading projects from 4.6. |
| 5 | - **NEVER** assume 4.6 defaults (stretch mode, audio area_mask, RichTextLabel percent flags) without checking 4.7 migration notes. |
| 6 | |
| 7 | # Genre: Party / Minigame Collection |
| 8 | |
| 9 | Expert blueprint for party games balancing accessibility, variety, and social fun. |
| 10 | |
| 11 | ## NEVER Do (Expert Anti-Patterns) |
| 12 | |
| 13 | ### Multiplayer & Input |
| 14 | - NEVER hardcode player inputs to specific joypad IDs (e.g., 0 or 1); strictly query dynamically via `Input.get_connected_joypads()`. |
| 15 | - NEVER bake player-IDs into the input map (e.g., "p1_jump"); strictly use a **Dynamic Input Router** to map physical controllers to players at runtime. |
| 16 | - NEVER use `Input.is_action_pressed()` for assigning new player joins; strictly parse raw `InputEventJoypadButton` in `_unhandled_input()` for device metadata. |
| 17 | - NEVER allow inconsistent controls between games; strictly standardize across all minigames (**A = Accept/Action**, **B = Back/Cancel**, **Joystick = Move**). |
| 18 | - NEVER assume a disconnected joypad removes a player; strictly connect to the `joy_connection_changed` signal to pause and handle dropouts gracefully. |
| 19 | - NEVER use boolean polling for analog sticks; strictly use `Input.get_vector()` for precision and deadzones. |
| 20 | |
| 21 | ### User Experience & Feedback |
| 22 | - NEVER use long text-based tutorials; strictly use a **3-second looping GIF** + a single-sentence instruction overlay (e.g., "Mash A to fly!"). |
| 23 | - NEVER ignore "Asymmetric" balance in 1v3 games; strictly provide the "One" with unique abilities or increased HP/speed to offset the numerical disadvantage. |
| 24 | - NEVER neglect Accessibility and Handicap systems; strictly implement optional support (e.g., speed boosts for lower-skilled players) to keep the competition social. |
| 25 | - NEVER leave UI Control nodes with `FOCUS_NONE` for gamepad menus; strictly set to `FOCUS_ALL` with explicit focus neighbors for accessible navigation. |
| 26 | |
| 27 | ### Rendering & Architecture |
| 28 | - NEVER use heavy scene transitions; strictly keep minigame assets light and use **Threaded Background Loading** while the instructions screen is active. |
| 29 | - NEVER draw global `CanvasLayer` UI for individual split-screen players; strictly use per-viewport `CanvasLayer` children. |
| 30 | - NEVER manually set sizes on `SubViewport` children; strictly use `GridContainer` or `BoxContainer` for automatic split-screen layout. |
| 31 | - NEVER store tournament state or scores inside minigame scenes; strictly use a **Persistent Autoload** (Singleton). |
| 32 | - NEVER use a static `Camera2D` for shared-room games; strictly use a **dynamic group camera** that zooms/pans to fit all players in frame. |
| 33 | - NEVER overlap `SubViewportContainer` nodes without setting `mouse_filter` to `PASS`; otherwise, top viewports will block input. |
| 34 | |
| 35 | --- |
| 36 | |
| 37 | ## 🛠 Expert Components (scripts/) |
| 38 | |
| 39 | ### Original Expert Patterns |
| 40 | - [party_input_router.gd](scripts/party_input_router.gd) - Professional local multiplayer solution mapping `device_id` to `player_id`. |
| 41 | |
| 42 | ### Modular Components |
| 43 | - [player_join_manager.gd](scripts/player_join_manager.gd) - Slot mapping logic using raw JoypadButton event parsing. |
| 44 | - [split_screen_manager.gd](scripts/split_screen_manager.gd) - SubViewport synchronization for shared physics worlds. |
| 45 | - [tournament_state.gd](scripts/tournament_state.gd) - Persistent Autoload singleton for cross-scene state. |
| 46 | |
| 47 | --- |
| 48 | |
| 49 | ## Core Loop |
| 50 | 1. **Lobby**: Players join and select characters/colors. |
| 51 | 2. **Meta**: Players move on a board or vote for the next game. |
| 52 | 3. **Play**: Short, intense minigame (30s - 2m). |
| 53 | 4. **Score**: Winners get points/coins. |
| 54 | 5. **Repeat**: Cycle continues until a turn limit or score limit. |
| 55 | |
| 56 | ## Skill Chain |
| 57 | |
| 58 | | Phase | Skills | Purpose | |
| 59 | |-------|--------|---------| |
| 60 | | 1. Input | `input-mapping` | Handling 2-4 local controllers dynamically | |
| 61 | | 2. Scene | `godot-scene-management` | Loading/Unloading minigames cleanly | |
| 62 | | 3. Data | `godot-resource-data-patterns` | Defining minigames via Resource files | |
| 63 | | 4. UI | `godot-ui-containers` | Scoreboards, instructions screens | |
| 64 | | 5. Logic | `godot-turn-system` | Managing the "Board Game" phase | |
| 65 | | 6. Balance | `godot-monte-carlo-balancer` | Asymmetric 1v3 / role power offsets | |
| 66 | |
| 67 | ## Architecture Overview |
| 68 | |
| 69 | ### 1. Minigame Definition |
| 70 | Using Resources to define what |