mirror of
https://github.com/cliffe/BreakEscape.git
synced 2026-02-20 13:50:46 +00:00
- Created a new documentation file detailing usage examples for the NPC item giving system, including immediate and container-based item transfers. - Updated the ContainerMinigame to support additional NPC context, enhancing the user experience when interacting with NPC inventories. - Implemented new NPC configurations in the scenario JSON to demonstrate item giving mechanics and container UI features. - Added an Ink script for the Equipment Officer NPC, showcasing how to present items through the container UI and manage player interactions.
272 lines
6.6 KiB
Markdown
272 lines
6.6 KiB
Markdown
# NPC Item Giving System - Usage Examples
|
|
|
|
This document demonstrates how to use the NPC item giving system with both immediate and container-based approaches.
|
|
|
|
## Setup
|
|
|
|
NPCs must declare `itemsHeld` array in the scenario JSON:
|
|
|
|
```json
|
|
{
|
|
"id": "equipment_officer",
|
|
"displayName": "Equipment Officer",
|
|
"itemsHeld": [
|
|
{
|
|
"type": "lockpick",
|
|
"name": "Lock Pick Kit",
|
|
"takeable": true,
|
|
"observations": "Professional lock picking set"
|
|
},
|
|
{
|
|
"type": "workstation",
|
|
"name": "Analysis Workstation",
|
|
"takeable": true,
|
|
"observations": "Portable workstation"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Ink Variables
|
|
|
|
Items are automatically synced to Ink variables:
|
|
|
|
```ink
|
|
VAR has_lockpick = false
|
|
VAR has_workstation = false
|
|
VAR has_phone = false
|
|
VAR has_keycard = false
|
|
```
|
|
|
|
Declare only the `has_*` variables you need for your NPC.
|
|
|
|
## Usage Pattern 1: Immediate Single Item Transfer
|
|
|
|
**Tag:** `#give_item:type`
|
|
|
|
**Use Case:** Give one specific item immediately without opening UI
|
|
|
|
**Ink Example:**
|
|
```ink
|
|
=== give_basic_item ===
|
|
Here's a lockpick set!
|
|
#give_item:lockpick
|
|
Good luck!
|
|
-> hub
|
|
```
|
|
|
|
**How it works:**
|
|
1. Player reads dialogue
|
|
2. Tag is processed
|
|
3. First `lockpick` from NPC's `itemsHeld` is added to inventory
|
|
4. Item is removed from NPC's inventory
|
|
5. Conversation continues
|
|
|
|
**Notes:**
|
|
- Only gives the first matching item type
|
|
- No UI overlay
|
|
- Fast and clean for single items
|
|
|
|
---
|
|
|
|
## Usage Pattern 2: Container UI - All Items
|
|
|
|
**Tag:** `#give_npc_inventory_items`
|
|
|
|
**Use Case:** Show all items the NPC is holding for player to choose from
|
|
|
|
**Ink Example:**
|
|
```ink
|
|
=== give_all_items ===
|
|
# speaker:npc
|
|
Here are all the tools I have available. Take what you need!
|
|
#give_npc_inventory_items
|
|
What else can I help with?
|
|
-> hub
|
|
```
|
|
|
|
**How it works:**
|
|
1. Tag is processed
|
|
2. Container minigame opens in "NPC mode"
|
|
3. Shows NPC's portrait and all items in `itemsHeld`
|
|
4. Player can take items from container
|
|
5. Each taken item is removed from NPC's inventory
|
|
6. Variables updated automatically
|
|
7. Conversation continues
|
|
|
|
**Container UI Features:**
|
|
- NPC portrait/avatar displayed
|
|
- "Equipment Officer offers you items" header
|
|
- Grid of available items
|
|
- Player can examine each item before taking
|
|
|
|
---
|
|
|
|
## Usage Pattern 3: Container UI - Filtered Items
|
|
|
|
**Tag:** `#give_npc_inventory_items:type1,type2`
|
|
|
|
**Use Case:** Show only specific item types from NPC's inventory
|
|
|
|
**Ink Example:**
|
|
```ink
|
|
=== give_tools_only ===
|
|
# speaker:npc
|
|
Here are the specialized tools we have. Choose what you need for the job.
|
|
#give_npc_inventory_items:lockpick,workstation
|
|
Let me know if you need anything else!
|
|
-> hub
|
|
```
|
|
|
|
**Comma-separated types:**
|
|
```ink
|
|
// Show lockpicks and keycards only
|
|
#give_npc_inventory_items:lockpick,keycard
|
|
|
|
// Show workstations only
|
|
#give_npc_inventory_items:workstation
|
|
```
|
|
|
|
**How it works:**
|
|
1. Tag parsed for filter types
|
|
2. Container UI opens showing only matching items
|
|
3. If NPC has 2 lockpicks, 1 workstation, 1 keycard:
|
|
- With filter `lockpick,keycard`: shows 2 lockpicks + 1 keycard (not workstation)
|
|
4. Player can take from filtered list
|
|
5. Variables updated
|
|
|
|
---
|
|
|
|
## Advanced Example: Conditional Item Giving
|
|
|
|
**Ink Example:**
|
|
```ink
|
|
=== equipment_hub ===
|
|
What tools do you need?
|
|
|
|
{has_lockpick and has_workstation and has_keycard:
|
|
+ [I have all the tools I need]
|
|
-> thanks_npc
|
|
}
|
|
|
|
{has_lockpick or has_workstation or has_keycard:
|
|
+ [Show me everything else you have]
|
|
#give_npc_inventory_items
|
|
-> equipment_hub
|
|
}
|
|
|
|
+ [I need specialized tools]
|
|
-> show_tools
|
|
|
|
+ [I need security access]
|
|
-> show_keycards
|
|
|
|
+ [I'm good for now]
|
|
-> goodbye
|
|
|
|
=== show_tools ===
|
|
Here are our specialized tools:
|
|
#give_npc_inventory_items:lockpick,workstation
|
|
-> equipment_hub
|
|
|
|
=== show_keycards ===
|
|
Here are the access devices:
|
|
#give_npc_inventory_items:keycard
|
|
-> equipment_hub
|
|
|
|
=== thanks_npc ===
|
|
Perfect! Anything else?
|
|
-> equipment_hub
|
|
|
|
=== goodbye ===
|
|
Come back if you need anything!
|
|
-> END
|
|
```
|
|
|
|
---
|
|
|
|
## Complete Scenario Example
|
|
|
|
From `npc-sprite-test2.json`:
|
|
|
|
### Helper NPC (Immediate Item Transfer)
|
|
- Position: (5, 3)
|
|
- Story: `helper-npc.ink`
|
|
- Items: phone, workstation, lockpick
|
|
- Pattern: Uses `#give_item:type` for single items
|
|
- Demonstrates: Conditional dialogue that adapts to available items
|
|
|
|
### Equipment Officer (Container-Based UI)
|
|
- Position: (8, 5)
|
|
- Story: `equipment-officer.ink`
|
|
- Items: 2 lockpicks (Basic & Advanced), 1 workstation, 1 keycard
|
|
- Pattern: Uses `#give_npc_inventory_items` to show container minigame
|
|
- Demonstrates:
|
|
- Container UI with NPC portrait
|
|
- Multiple items of same type
|
|
- All items displayed in interactive grid
|
|
- Items removed from NPC inventory as player takes them
|
|
- Conversation continues after item selection
|
|
|
|
## Container Minigame UI Features (NPC Mode)
|
|
|
|
When `#give_npc_inventory_items` is used, the container minigame opens with:
|
|
|
|
1. **NPC Portrait/Avatar** - Displayed at top if available
|
|
2. **Custom Header** - "Equipment Officer offers you items"
|
|
3. **Item Grid** - Interactive grid showing all held items (or filtered items)
|
|
4. **Item Details** - Click items to see observations/descriptions
|
|
5. **Take Items** - Player can take any/all items shown
|
|
6. **Automatic Updates** - NPC inventory decreases as items taken
|
|
7. **Variable Sync** - `has_*` variables update in real-time
|
|
|
|
Example dialogue flow:
|
|
```
|
|
Player: "Show me what you have available"
|
|
→ Container minigame opens with NPC's items
|
|
→ Player takes "Advanced Lock Pick Kit"
|
|
→ NPC inventory now has 1 lockpick instead of 2
|
|
→ has_lockpick variable remains true (still has items)
|
|
→ Conversation continues with "What else can I help with?"
|
|
```
|
|
|
|
---
|
|
|
|
## Event System
|
|
|
|
When items are given, the `npc_items_changed` event is emitted:
|
|
|
|
```javascript
|
|
window.eventDispatcher.emit('npc_items_changed', { npcId });
|
|
```
|
|
|
|
This automatically triggers:
|
|
1. Variables re-sync in Ink
|
|
2. Conditions re-evaluated
|
|
3. Conversation state updated
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
1. **Declare all `has_*` variables** you'll check in Ink at the top of your story
|
|
2. **Use immediate giving** (`#give_item`) for story-critical single items
|
|
3. **Use container UI** when offering multiple items or choices
|
|
4. **Use filtered container UI** for specialized equipment categories
|
|
5. **Check variables** in conditions to adapt dialogue based on what's available
|
|
6. **Remove items as they're taken** - they're automatically removed from NPC inventory
|
|
|
|
---
|
|
|
|
## Testing
|
|
|
|
To test the NPC item giving system:
|
|
|
|
1. Load `npc-sprite-test2.json` scenario
|
|
2. Talk to "Helper NPC" (5, 3) - demonstrates immediate giving
|
|
3. Talk to "Equipment Officer" (8, 5) - demonstrates container UI
|
|
4. Try different dialogue paths to see variable updates
|
|
5. Verify items appear in player inventory
|
|
6. Check that NPC inventory decreases as items are taken
|
|
|