@magicborn/dialogue-forge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +233 -0
- package/bin/dialogue-forge.js +78 -0
- package/demo/app/layout.tsx +36 -0
- package/demo/app/page.tsx +440 -0
- package/demo/components/ThemeSwitcher.tsx +611 -0
- package/demo/next.config.mjs +7 -0
- package/demo/package.json +29 -0
- package/demo/postcss.config.mjs +7 -0
- package/demo/public/logo.svg +1 -0
- package/demo/styles/globals.css +19 -0
- package/demo/tailwind.config.ts +90 -0
- package/demo/tsconfig.json +42 -0
- package/dist/components/ChoiceEdgeV2.d.ts +3 -0
- package/dist/components/ChoiceEdgeV2.js +103 -0
- package/dist/components/CodeBlock.d.ts +8 -0
- package/dist/components/CodeBlock.js +24 -0
- package/dist/components/ConditionAutocomplete.d.ts +14 -0
- package/dist/components/ConditionAutocomplete.js +284 -0
- package/dist/components/ConditionalNodeV2.d.ts +16 -0
- package/dist/components/ConditionalNodeV2.js +147 -0
- package/dist/components/DialogueEditorV2.d.ts +22 -0
- package/dist/components/DialogueEditorV2.js +1170 -0
- package/dist/components/EdgeIcon.d.ts +8 -0
- package/dist/components/EdgeIcon.js +13 -0
- package/dist/components/ExampleLoader.d.ts +11 -0
- package/dist/components/ExampleLoader.js +52 -0
- package/dist/components/ExampleLoaderButton.d.ts +15 -0
- package/dist/components/ExampleLoaderButton.js +102 -0
- package/dist/components/FlagManager.d.ts +11 -0
- package/dist/components/FlagManager.js +282 -0
- package/dist/components/FlagSelector.d.ts +11 -0
- package/dist/components/FlagSelector.js +235 -0
- package/dist/components/GuidePanel.d.ts +7 -0
- package/dist/components/GuidePanel.js +1176 -0
- package/dist/components/Minimap.d.ts +16 -0
- package/dist/components/Minimap.js +93 -0
- package/dist/components/NPCEdgeV2.d.ts +3 -0
- package/dist/components/NPCEdgeV2.js +104 -0
- package/dist/components/NPCNodeV2.d.ts +26 -0
- package/dist/components/NPCNodeV2.js +86 -0
- package/dist/components/NodeEditor.d.ts +18 -0
- package/dist/components/NodeEditor.js +1025 -0
- package/dist/components/PlayView.d.ts +12 -0
- package/dist/components/PlayView.js +307 -0
- package/dist/components/PlayerNodeV2.d.ts +16 -0
- package/dist/components/PlayerNodeV2.js +139 -0
- package/dist/components/ReactFlowPOC.d.ts +61 -0
- package/dist/components/ReactFlowPOC.js +312 -0
- package/dist/components/ScenePlayer.d.ts +18 -0
- package/dist/components/ScenePlayer.js +196 -0
- package/dist/components/YarnView.d.ts +9 -0
- package/dist/components/YarnView.js +45 -0
- package/dist/components/ZoomControls.d.ts +11 -0
- package/dist/components/ZoomControls.js +34 -0
- package/dist/esm/components/ChoiceEdgeV2.d.ts +3 -0
- package/dist/esm/components/ChoiceEdgeV2.js +67 -0
- package/dist/esm/components/CodeBlock.d.ts +8 -0
- package/dist/esm/components/CodeBlock.js +18 -0
- package/dist/esm/components/ConditionAutocomplete.d.ts +14 -0
- package/dist/esm/components/ConditionAutocomplete.js +248 -0
- package/dist/esm/components/ConditionalNodeV2.d.ts +16 -0
- package/dist/esm/components/ConditionalNodeV2.js +111 -0
- package/dist/esm/components/DialogueEditorV2.d.ts +22 -0
- package/dist/esm/components/DialogueEditorV2.js +1134 -0
- package/dist/esm/components/EdgeIcon.d.ts +8 -0
- package/dist/esm/components/EdgeIcon.js +7 -0
- package/dist/esm/components/ExampleLoader.d.ts +11 -0
- package/dist/esm/components/ExampleLoader.js +46 -0
- package/dist/esm/components/ExampleLoaderButton.d.ts +15 -0
- package/dist/esm/components/ExampleLoaderButton.js +66 -0
- package/dist/esm/components/FlagManager.d.ts +11 -0
- package/dist/esm/components/FlagManager.js +246 -0
- package/dist/esm/components/FlagSelector.d.ts +11 -0
- package/dist/esm/components/FlagSelector.js +199 -0
- package/dist/esm/components/GuidePanel.d.ts +7 -0
- package/dist/esm/components/GuidePanel.js +1140 -0
- package/dist/esm/components/Minimap.d.ts +16 -0
- package/dist/esm/components/Minimap.js +57 -0
- package/dist/esm/components/NPCEdgeV2.d.ts +3 -0
- package/dist/esm/components/NPCEdgeV2.js +68 -0
- package/dist/esm/components/NPCNodeV2.d.ts +26 -0
- package/dist/esm/components/NPCNodeV2.js +80 -0
- package/dist/esm/components/NodeEditor.d.ts +18 -0
- package/dist/esm/components/NodeEditor.js +989 -0
- package/dist/esm/components/PlayView.d.ts +12 -0
- package/dist/esm/components/PlayView.js +271 -0
- package/dist/esm/components/PlayerNodeV2.d.ts +16 -0
- package/dist/esm/components/PlayerNodeV2.js +103 -0
- package/dist/esm/components/ReactFlowPOC.d.ts +61 -0
- package/dist/esm/components/ReactFlowPOC.js +275 -0
- package/dist/esm/components/ScenePlayer.d.ts +18 -0
- package/dist/esm/components/ScenePlayer.js +160 -0
- package/dist/esm/components/YarnView.d.ts +9 -0
- package/dist/esm/components/YarnView.js +39 -0
- package/dist/esm/components/ZoomControls.d.ts +11 -0
- package/dist/esm/components/ZoomControls.js +28 -0
- package/dist/esm/examples/example-loader.d.ts +29 -0
- package/dist/esm/examples/example-loader.js +103 -0
- package/dist/esm/examples/examples-registry.d.ts +38 -0
- package/dist/esm/examples/examples-registry.js +153 -0
- package/dist/esm/examples/index.d.ts +26 -0
- package/dist/esm/examples/index.js +50 -0
- package/dist/esm/examples/legacy-examples.d.ts +9 -0
- package/dist/esm/examples/legacy-examples.js +814 -0
- package/dist/esm/examples/yarn-examples.d.ts +35 -0
- package/dist/esm/examples/yarn-examples.js +181 -0
- package/dist/esm/index.d.ts +21 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/lib/flag-manager.d.ts +21 -0
- package/dist/esm/lib/flag-manager.js +93 -0
- package/dist/esm/lib/yarn-converter/__tests__/round-trip.test.d.ts +1 -0
- package/dist/esm/lib/yarn-converter/__tests__/round-trip.test.js +169 -0
- package/dist/esm/lib/yarn-converter.d.ts +17 -0
- package/dist/esm/lib/yarn-converter.js +521 -0
- package/dist/esm/lib/yarn-runner/__tests__/condition-evaluator.test.d.ts +1 -0
- package/dist/esm/lib/yarn-runner/__tests__/condition-evaluator.test.js +171 -0
- package/dist/esm/lib/yarn-runner/__tests__/node-processor.test.d.ts +1 -0
- package/dist/esm/lib/yarn-runner/__tests__/node-processor.test.js +237 -0
- package/dist/esm/lib/yarn-runner/__tests__/variable-manager.test.d.ts +1 -0
- package/dist/esm/lib/yarn-runner/__tests__/variable-manager.test.js +106 -0
- package/dist/esm/lib/yarn-runner/condition-evaluator.d.ts +12 -0
- package/dist/esm/lib/yarn-runner/condition-evaluator.js +56 -0
- package/dist/esm/lib/yarn-runner/index.d.ts +12 -0
- package/dist/esm/lib/yarn-runner/index.js +11 -0
- package/dist/esm/lib/yarn-runner/node-processor.d.ts +18 -0
- package/dist/esm/lib/yarn-runner/node-processor.js +129 -0
- package/dist/esm/lib/yarn-runner/variable-manager.d.ts +51 -0
- package/dist/esm/lib/yarn-runner/variable-manager.js +120 -0
- package/dist/esm/lib/yarn-runner/variable-operations.d.ts +16 -0
- package/dist/esm/lib/yarn-runner/variable-operations.js +88 -0
- package/dist/esm/types/conditionals.d.ts +29 -0
- package/dist/esm/types/conditionals.js +1 -0
- package/dist/esm/types/constants.d.ts +59 -0
- package/dist/esm/types/constants.js +55 -0
- package/dist/esm/types/flags.d.ts +49 -0
- package/dist/esm/types/flags.js +49 -0
- package/dist/esm/types/game-state.d.ts +62 -0
- package/dist/esm/types/game-state.js +6 -0
- package/dist/esm/types/index.d.ts +77 -0
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/utils/constants.d.ts +5 -0
- package/dist/esm/utils/constants.js +5 -0
- package/dist/esm/utils/feature-flags.d.ts +11 -0
- package/dist/esm/utils/feature-flags.js +11 -0
- package/dist/esm/utils/game-state-flattener.d.ts +41 -0
- package/dist/esm/utils/game-state-flattener.js +135 -0
- package/dist/esm/utils/layout/collision.d.ts +27 -0
- package/dist/esm/utils/layout/collision.js +74 -0
- package/dist/esm/utils/layout/index.d.ts +82 -0
- package/dist/esm/utils/layout/index.js +98 -0
- package/dist/esm/utils/layout/registry.d.ts +91 -0
- package/dist/esm/utils/layout/registry.js +148 -0
- package/dist/esm/utils/layout/strategies/dagre.d.ts +19 -0
- package/dist/esm/utils/layout/strategies/dagre.js +182 -0
- package/dist/esm/utils/layout/strategies/force.d.ts +21 -0
- package/dist/esm/utils/layout/strategies/force.js +178 -0
- package/dist/esm/utils/layout/strategies/grid.d.ts +17 -0
- package/dist/esm/utils/layout/strategies/grid.js +91 -0
- package/dist/esm/utils/layout/strategies/index.d.ts +8 -0
- package/dist/esm/utils/layout/strategies/index.js +8 -0
- package/dist/esm/utils/layout/types.d.ts +100 -0
- package/dist/esm/utils/layout/types.js +7 -0
- package/dist/esm/utils/layout.d.ts +9 -0
- package/dist/esm/utils/layout.js +17 -0
- package/dist/esm/utils/node-helpers.d.ts +7 -0
- package/dist/esm/utils/node-helpers.js +94 -0
- package/dist/esm/utils/reactflow-converter.d.ts +42 -0
- package/dist/esm/utils/reactflow-converter.js +217 -0
- package/dist/examples/example-loader.d.ts +29 -0
- package/dist/examples/example-loader.js +109 -0
- package/dist/examples/examples-registry.d.ts +38 -0
- package/dist/examples/examples-registry.js +160 -0
- package/dist/examples/index.d.ts +26 -0
- package/dist/examples/index.js +63 -0
- package/dist/examples/legacy-examples.d.ts +9 -0
- package/dist/examples/legacy-examples.js +817 -0
- package/dist/examples/yarn-examples.d.ts +35 -0
- package/dist/examples/yarn-examples.js +189 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +66 -0
- package/dist/lib/flag-manager.d.ts +21 -0
- package/dist/lib/flag-manager.js +99 -0
- package/dist/lib/yarn-converter/__tests__/round-trip.test.d.ts +1 -0
- package/dist/lib/yarn-converter/__tests__/round-trip.test.js +171 -0
- package/dist/lib/yarn-converter.d.ts +17 -0
- package/dist/lib/yarn-converter.js +525 -0
- package/dist/lib/yarn-runner/__tests__/condition-evaluator.test.d.ts +1 -0
- package/dist/lib/yarn-runner/__tests__/condition-evaluator.test.js +173 -0
- package/dist/lib/yarn-runner/__tests__/node-processor.test.d.ts +1 -0
- package/dist/lib/yarn-runner/__tests__/node-processor.test.js +239 -0
- package/dist/lib/yarn-runner/__tests__/variable-manager.test.d.ts +1 -0
- package/dist/lib/yarn-runner/__tests__/variable-manager.test.js +108 -0
- package/dist/lib/yarn-runner/condition-evaluator.d.ts +12 -0
- package/dist/lib/yarn-runner/condition-evaluator.js +60 -0
- package/dist/lib/yarn-runner/index.d.ts +12 -0
- package/dist/lib/yarn-runner/index.js +21 -0
- package/dist/lib/yarn-runner/node-processor.d.ts +18 -0
- package/dist/lib/yarn-runner/node-processor.js +133 -0
- package/dist/lib/yarn-runner/variable-manager.d.ts +51 -0
- package/dist/lib/yarn-runner/variable-manager.js +124 -0
- package/dist/lib/yarn-runner/variable-operations.d.ts +16 -0
- package/dist/lib/yarn-runner/variable-operations.js +92 -0
- package/dist/types/conditionals.d.ts +29 -0
- package/dist/types/conditionals.js +2 -0
- package/dist/types/constants.d.ts +59 -0
- package/dist/types/constants.js +58 -0
- package/dist/types/flags.d.ts +49 -0
- package/dist/types/flags.js +52 -0
- package/dist/types/game-state.d.ts +62 -0
- package/dist/types/game-state.js +7 -0
- package/dist/types/index.d.ts +77 -0
- package/dist/types/index.js +2 -0
- package/dist/utils/constants.d.ts +5 -0
- package/dist/utils/constants.js +8 -0
- package/dist/utils/feature-flags.d.ts +11 -0
- package/dist/utils/feature-flags.js +14 -0
- package/dist/utils/game-state-flattener.d.ts +41 -0
- package/dist/utils/game-state-flattener.js +140 -0
- package/dist/utils/layout/collision.d.ts +27 -0
- package/dist/utils/layout/collision.js +77 -0
- package/dist/utils/layout/index.d.ts +82 -0
- package/dist/utils/layout/index.js +109 -0
- package/dist/utils/layout/registry.d.ts +91 -0
- package/dist/utils/layout/registry.js +151 -0
- package/dist/utils/layout/strategies/dagre.d.ts +19 -0
- package/dist/utils/layout/strategies/dagre.js +189 -0
- package/dist/utils/layout/strategies/force.d.ts +21 -0
- package/dist/utils/layout/strategies/force.js +182 -0
- package/dist/utils/layout/strategies/grid.d.ts +17 -0
- package/dist/utils/layout/strategies/grid.js +95 -0
- package/dist/utils/layout/strategies/index.d.ts +8 -0
- package/dist/utils/layout/strategies/index.js +14 -0
- package/dist/utils/layout/types.d.ts +100 -0
- package/dist/utils/layout/types.js +8 -0
- package/dist/utils/layout.d.ts +9 -0
- package/dist/utils/layout.js +25 -0
- package/dist/utils/node-helpers.d.ts +7 -0
- package/dist/utils/node-helpers.js +101 -0
- package/dist/utils/reactflow-converter.d.ts +42 -0
- package/dist/utils/reactflow-converter.js +223 -0
- package/package.json +70 -0
package/README.md
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Dialogue Forge
|
|
2
|
+
|
|
3
|
+
A visual node-based dialogue editor with Yarn Spinner support for game development.
|
|
4
|
+
|
|
5
|
+
## 🚀 Quick Start
|
|
6
|
+
|
|
7
|
+
### Run the Demo
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx @magicborn/dialogue-forge
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
This will download the package and start an interactive demo server at `http://localhost:3000`.
|
|
14
|
+
|
|
15
|
+
### Install as Library
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @magicborn/dialogue-forge
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### 1. Define Your Flags
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { FlagSchema, FLAG_TYPE, FLAG_VALUE_TYPE } from '@magicborn/dialogue-forge';
|
|
27
|
+
|
|
28
|
+
const flagSchema: FlagSchema = {
|
|
29
|
+
categories: ['quests', 'items', 'stats'],
|
|
30
|
+
flags: [
|
|
31
|
+
{
|
|
32
|
+
id: 'quest_dragon_slayer',
|
|
33
|
+
name: 'Dragon Slayer Quest',
|
|
34
|
+
type: FLAG_TYPE.QUEST, // ✅ Use constant, not 'quest'
|
|
35
|
+
category: 'quests',
|
|
36
|
+
valueType: FLAG_VALUE_TYPE.STRING
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'item_ancient_key',
|
|
40
|
+
name: 'Ancient Key',
|
|
41
|
+
type: FLAG_TYPE.ITEM, // ✅ Use constant
|
|
42
|
+
category: 'items'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'stat_gold',
|
|
46
|
+
name: 'Gold',
|
|
47
|
+
type: FLAG_TYPE.STAT, // ✅ Use constant
|
|
48
|
+
category: 'stats',
|
|
49
|
+
valueType: FLAG_VALUE_TYPE.NUMBER,
|
|
50
|
+
defaultValue: 0
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
};
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 2. Load Dialogue from Yarn
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { importFromYarn } from '@magicborn/dialogue-forge';
|
|
60
|
+
|
|
61
|
+
const yarnContent = await loadFile('merchant.yarn');
|
|
62
|
+
const dialogue = importFromYarn(yarnContent, 'Merchant Dialogue');
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 3. Edit Dialogue
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
import { DialogueEditor, exportToYarn } from '@magicborn/dialogue-forge';
|
|
69
|
+
|
|
70
|
+
<DialogueEditor
|
|
71
|
+
dialogue={dialogue}
|
|
72
|
+
onChange={(updated) => {
|
|
73
|
+
const yarn = exportToYarn(updated);
|
|
74
|
+
saveFile('merchant.yarn', yarn);
|
|
75
|
+
}}
|
|
76
|
+
flagSchema={flagSchema}
|
|
77
|
+
/>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 4. Run Dialogue with Game State
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
import { DialogueSimulator } from '@magicborn/dialogue-forge';
|
|
84
|
+
|
|
85
|
+
// Get current game flags
|
|
86
|
+
const gameFlags = {
|
|
87
|
+
quest_dragon_slayer: 'complete',
|
|
88
|
+
item_ancient_key: true,
|
|
89
|
+
stat_gold: 1000
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
<DialogueSimulator
|
|
93
|
+
dialogue={dialogue}
|
|
94
|
+
initialFlags={gameFlags}
|
|
95
|
+
onComplete={(result) => {
|
|
96
|
+
// Update game state with new flags
|
|
97
|
+
gameState.flags = {
|
|
98
|
+
...gameState.flags,
|
|
99
|
+
...result.updatedFlags
|
|
100
|
+
};
|
|
101
|
+
}}
|
|
102
|
+
/>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Features
|
|
106
|
+
|
|
107
|
+
- **Visual Node Editor** - Drag nodes, connect edges, right-click menus
|
|
108
|
+
- **Yarn Spinner Import/Export** - Work with `.yarn` files
|
|
109
|
+
- **Flag System** - Reference game flags with autocomplete dropdown
|
|
110
|
+
- **Simulation Mode** - Test dialogues with current game state
|
|
111
|
+
- **Built-in Guide** - Click book icon for complete documentation
|
|
112
|
+
|
|
113
|
+
## Flag System
|
|
114
|
+
|
|
115
|
+
Flags represent game state (quests, items, achievements, etc.). The editor:
|
|
116
|
+
- Shows available flags in dropdowns when setting flags
|
|
117
|
+
- Validates flag references
|
|
118
|
+
- Exports flags to Yarn format
|
|
119
|
+
- Returns updated flags after dialogue completes
|
|
120
|
+
|
|
121
|
+
**Flag Types** (use `FLAG_TYPE` constant):
|
|
122
|
+
- `FLAG_TYPE.QUEST` - Quest state and completion
|
|
123
|
+
- `FLAG_TYPE.ACHIEVEMENT` - Unlocked achievements
|
|
124
|
+
- `FLAG_TYPE.ITEM` - Inventory items
|
|
125
|
+
- `FLAG_TYPE.STAT` - Player statistics
|
|
126
|
+
- `FLAG_TYPE.TITLE` - Earned titles
|
|
127
|
+
- `FLAG_TYPE.DIALOGUE` - Temporary, dialogue-scoped
|
|
128
|
+
- `FLAG_TYPE.GLOBAL` - Global game state
|
|
129
|
+
|
|
130
|
+
**Important:** Always use the exported constants (`FLAG_TYPE`, `NODE_TYPE`, etc.) instead of string literals for type safety.
|
|
131
|
+
|
|
132
|
+
See [DATA_STRUCTURES.md](./DATA_STRUCTURES.md) for complete type documentation and [FLAG_SYSTEM.md](./FLAG_SYSTEM.md) for flag system details.
|
|
133
|
+
|
|
134
|
+
## API Reference
|
|
135
|
+
|
|
136
|
+
### Components
|
|
137
|
+
|
|
138
|
+
- `DialogueEditor` - Visual editor for creating/editing dialogues
|
|
139
|
+
- `DialogueSimulator` - Run dialogues with game state, returns updated flags
|
|
140
|
+
- `GuidePanel` - Built-in documentation panel
|
|
141
|
+
- `FlagSelector` - Flag autocomplete component
|
|
142
|
+
|
|
143
|
+
### Utilities
|
|
144
|
+
|
|
145
|
+
- `importFromYarn(yarnContent, title)` - Parse Yarn file to DialogueTree
|
|
146
|
+
- `exportToYarn(dialogue)` - Convert DialogueTree to Yarn format
|
|
147
|
+
- `initializeFlags(schema)` - Create default flag state from schema
|
|
148
|
+
- `mergeFlagUpdates(current, updates, schema)` - Merge flag updates
|
|
149
|
+
- `validateFlags(flags, schema)` - Validate flags against schema
|
|
150
|
+
|
|
151
|
+
### Types
|
|
152
|
+
|
|
153
|
+
- `DialogueTree` - Dialogue structure
|
|
154
|
+
- `DialogueNode` - Individual dialogue node (NPC or Player)
|
|
155
|
+
- `FlagSchema` - Flag definitions
|
|
156
|
+
- `GameFlagState` - Current flag values `{ [flagId]: value }`
|
|
157
|
+
- `DialogueResult` - Result from running dialogue (updated flags, visited nodes)
|
|
158
|
+
|
|
159
|
+
## Complete Example
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import {
|
|
163
|
+
DialogueEditor,
|
|
164
|
+
DialogueSimulator,
|
|
165
|
+
importFromYarn,
|
|
166
|
+
exportToYarn,
|
|
167
|
+
FlagSchema,
|
|
168
|
+
GameFlagState
|
|
169
|
+
} from '@magicborn/dialogue-forge';
|
|
170
|
+
|
|
171
|
+
// Define flags
|
|
172
|
+
import { FLAG_TYPE } from '@magicborn/dialogue-forge';
|
|
173
|
+
|
|
174
|
+
const flagSchema: FlagSchema = {
|
|
175
|
+
flags: [
|
|
176
|
+
{ id: 'quest_complete', type: FLAG_TYPE.QUEST, category: 'quests' },
|
|
177
|
+
{ id: 'item_key', type: FLAG_TYPE.ITEM, category: 'items' },
|
|
178
|
+
]
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// Load dialogue
|
|
182
|
+
const dialogue = importFromYarn(yarnFile, 'Merchant');
|
|
183
|
+
|
|
184
|
+
// Get current game state
|
|
185
|
+
const gameFlags: GameFlagState = {
|
|
186
|
+
quest_complete: 'complete',
|
|
187
|
+
item_key: true
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Edit dialogue
|
|
191
|
+
<DialogueEditor
|
|
192
|
+
dialogue={dialogue}
|
|
193
|
+
onChange={(updated) => {
|
|
194
|
+
const yarn = exportToYarn(updated);
|
|
195
|
+
saveFile(yarn);
|
|
196
|
+
}}
|
|
197
|
+
flagSchema={flagSchema}
|
|
198
|
+
initialFlags={gameFlags}
|
|
199
|
+
/>
|
|
200
|
+
|
|
201
|
+
// OR run dialogue
|
|
202
|
+
<DialogueSimulator
|
|
203
|
+
dialogue={dialogue}
|
|
204
|
+
initialFlags={gameFlags}
|
|
205
|
+
onComplete={(result) => {
|
|
206
|
+
// Update game with new flags
|
|
207
|
+
gameState.flags = result.updatedFlags;
|
|
208
|
+
// Next dialogue will have different options
|
|
209
|
+
// based on updated flags
|
|
210
|
+
}}
|
|
211
|
+
/>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Documentation
|
|
215
|
+
|
|
216
|
+
- **[GUIDE.md](./GUIDE.md)** - Friendly, educational guide for learning Dialogue Forge
|
|
217
|
+
- **[UNREAL_INTEGRATION.md](./UNREAL_INTEGRATION.md)** - Complete guide for integrating with Unreal Engine
|
|
218
|
+
- **[DATA_STRUCTURES.md](./DATA_STRUCTURES.md)** - Complete type reference and API documentation
|
|
219
|
+
- **[INTEGRATION.md](./INTEGRATION.md)** - General integration patterns
|
|
220
|
+
- **[FLAG_SYSTEM.md](./FLAG_SYSTEM.md)** - Detailed flag system documentation
|
|
221
|
+
|
|
222
|
+
Click the **book icon** in the editor to open the built-in guide.
|
|
223
|
+
|
|
224
|
+
### Key Concepts
|
|
225
|
+
|
|
226
|
+
**Flags = Yarn Variables**: Flags you define in Dialogue Forge become `$variable` in Yarn Spinner. These variables are stored in Yarn Spinner's Variable Storage at runtime, not in the .yarn file.
|
|
227
|
+
|
|
228
|
+
**Bidirectional Flow**:
|
|
229
|
+
- Edit in Dialogue Forge → Export .yarn → Import to Unreal
|
|
230
|
+
- Game sets variables → Yarn reads them → Dialogue reacts
|
|
231
|
+
- Dialogue sets variables → Yarn stores them → Game reads them
|
|
232
|
+
|
|
233
|
+
See [UNREAL_INTEGRATION.md](./UNREAL_INTEGRATION.md) for complete details.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Dialogue Forge Demo Server
|
|
5
|
+
*
|
|
6
|
+
* This script starts the Next.js demo server for Dialogue Forge.
|
|
7
|
+
* Users can run: npx @magicborn/dialogue-forge
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const { spawn } = require('child_process');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
|
|
14
|
+
// Get the directory where this package is installed
|
|
15
|
+
const packageDir = path.resolve(__dirname, '..');
|
|
16
|
+
const demoDir = path.join(packageDir, 'demo');
|
|
17
|
+
|
|
18
|
+
// Check if demo directory exists
|
|
19
|
+
if (!fs.existsSync(demoDir)) {
|
|
20
|
+
console.error('❌ Demo directory not found. Make sure the package is properly installed.');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Check if we're in a published package (has node_modules/@magicborn) or local dev
|
|
25
|
+
const isPublished = fs.existsSync(path.join(packageDir, 'node_modules', '@magicborn'));
|
|
26
|
+
const nodeModulesPath = path.join(demoDir, 'node_modules');
|
|
27
|
+
|
|
28
|
+
// For published packages, use npm package references
|
|
29
|
+
// For local dev, use file references (already set in package.json)
|
|
30
|
+
if (isPublished) {
|
|
31
|
+
// Update demo package.json to use published packages
|
|
32
|
+
const demoPackageJson = path.join(demoDir, 'package.json');
|
|
33
|
+
const pkg = JSON.parse(fs.readFileSync(demoPackageJson, 'utf8'));
|
|
34
|
+
pkg.dependencies['@magicborn/dialogue-forge'] = '*';
|
|
35
|
+
pkg.dependencies['@magicborn/server-template'] = '*';
|
|
36
|
+
fs.writeFileSync(demoPackageJson, JSON.stringify(pkg, null, 2));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!fs.existsSync(nodeModulesPath)) {
|
|
40
|
+
console.log('📦 Installing dependencies...');
|
|
41
|
+
const install = spawn('npm', ['install'], {
|
|
42
|
+
cwd: demoDir,
|
|
43
|
+
stdio: 'inherit',
|
|
44
|
+
shell: true,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
install.on('close', (code) => {
|
|
48
|
+
if (code !== 0) {
|
|
49
|
+
console.error('❌ Failed to install dependencies');
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
startServer();
|
|
53
|
+
});
|
|
54
|
+
} else {
|
|
55
|
+
startServer();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function startServer() {
|
|
59
|
+
console.log('🚀 Starting Dialogue Forge Demo Server...');
|
|
60
|
+
console.log('📖 Open http://localhost:3000 in your browser\n');
|
|
61
|
+
|
|
62
|
+
const dev = spawn('npm', ['run', 'dev'], {
|
|
63
|
+
cwd: demoDir,
|
|
64
|
+
stdio: 'inherit',
|
|
65
|
+
shell: true,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
dev.on('close', (code) => {
|
|
69
|
+
process.exit(code);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Handle Ctrl+C
|
|
73
|
+
process.on('SIGINT', () => {
|
|
74
|
+
dev.kill('SIGINT');
|
|
75
|
+
process.exit(0);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Metadata } from 'next';
|
|
2
|
+
import 'reactflow/dist/style.css';
|
|
3
|
+
import 'react-tooltip/dist/react-tooltip.css';
|
|
4
|
+
import '../styles/globals.css';
|
|
5
|
+
import '../../../../packages-shared/server-template/styles/globals.css';
|
|
6
|
+
import { BrandedLayout } from '../../../../packages-shared/server-template/components/BrandedLayout';
|
|
7
|
+
|
|
8
|
+
export const metadata: Metadata = {
|
|
9
|
+
title: 'Dialogue Forge - Visual Dialogue Editor',
|
|
10
|
+
description: 'Interactive demo of Dialogue Forge - a visual node-based dialogue editor with Yarn Spinner support',
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// Tell Next.js this layout is static (no dynamic params/searchParams)
|
|
14
|
+
export const dynamic = 'force-static';
|
|
15
|
+
|
|
16
|
+
export default function RootLayout({
|
|
17
|
+
children,
|
|
18
|
+
}: {
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
}) {
|
|
21
|
+
return (
|
|
22
|
+
<html lang="en">
|
|
23
|
+
<body>
|
|
24
|
+
<BrandedLayout
|
|
25
|
+
packageName="Dialogue Forge"
|
|
26
|
+
packageDescription="Visual node-based dialogue editor with Yarn Spinner support"
|
|
27
|
+
packageRepo="https://github.com/MagicbornStudios/dialogue-forge"
|
|
28
|
+
portfolioUrl="bengarrard.com"
|
|
29
|
+
>
|
|
30
|
+
{children}
|
|
31
|
+
</BrandedLayout>
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|