214 lines
5.9 KiB
Markdown
214 lines
5.9 KiB
Markdown
|
|
# Language Overview
|
||
|
|
|
||
|
|
> **The Storybook language enables narrative simulation through structured declarations of characters, behaviors, relationships, and events.**
|
||
|
|
|
||
|
|
## Philosophy
|
||
|
|
|
||
|
|
Storybook is a domain-specific language for narrative simulation, influenced by:
|
||
|
|
|
||
|
|
- **Rust**: Strong typing, explicit declarations, and clear ownership semantics
|
||
|
|
- **C#**: Object-oriented patterns with declarative syntax
|
||
|
|
- **Python**: Readable, accessible syntax that prioritizes clarity
|
||
|
|
|
||
|
|
The language balances **technical precision** with **narrative expressiveness**, making it accessible to storytellers while maintaining the rigor developers need.
|
||
|
|
|
||
|
|
## Design Principles
|
||
|
|
|
||
|
|
### 1. Code as Narrative
|
||
|
|
Named nodes and prose blocks let code read like stories:
|
||
|
|
```storybook
|
||
|
|
behavior Baker_MorningRoutine {
|
||
|
|
choose daily_priority {
|
||
|
|
then prepare_sourdough { ... }
|
||
|
|
then serve_customers { ... }
|
||
|
|
then restock_display { ... }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Explicit is Better Than Implicit
|
||
|
|
Every declaration is self-documenting:
|
||
|
|
- Character fields show what defines them
|
||
|
|
- Behavior trees show decision structures
|
||
|
|
- Relationships name their participants
|
||
|
|
|
||
|
|
### 3. Progressive Disclosure
|
||
|
|
Simple cases are simple, complex cases are possible:
|
||
|
|
- Basic characters need just a name and fields
|
||
|
|
- Templates enable inheritance and reuse
|
||
|
|
- Advanced features (state machines, decorators) available when needed
|
||
|
|
|
||
|
|
### 4. Semantic Validation
|
||
|
|
The compiler catches narrative errors:
|
||
|
|
- Bond values must be 0.0..1.0
|
||
|
|
- Schedule blocks can't overlap
|
||
|
|
- Life arc transitions must reference valid states
|
||
|
|
|
||
|
|
## Language Structure
|
||
|
|
|
||
|
|
### Declaration Types
|
||
|
|
|
||
|
|
Storybook has 10 top-level declaration types:
|
||
|
|
|
||
|
|
| Declaration | Purpose | Example |
|
||
|
|
|-------------|---------|---------|
|
||
|
|
| `character` | Define entities with traits and behaviors | A baker with skills and schedule |
|
||
|
|
| `template` | Reusable patterns with ranges | A generic NPC template |
|
||
|
|
| `behavior` | Decision trees for actions | How a character responds to events |
|
||
|
|
| `life_arc` | State machines for life stages | Apprentice → Baker → Master |
|
||
|
|
| `schedule` | Time-based activities | Daily routine from 6am to 10pm |
|
||
|
|
| `relationship` | Connections between entities | Parent-child with bond values |
|
||
|
|
| `institution` | Organizations and groups | A bakery with employees |
|
||
|
|
| `location` | Places with properties | The town square |
|
||
|
|
| `species` | Type definitions with traits | Human vs Cat vs Rabbit |
|
||
|
|
| `enum` | Named value sets | EmotionalState options |
|
||
|
|
|
||
|
|
### Value Types
|
||
|
|
|
||
|
|
Fields can contain:
|
||
|
|
|
||
|
|
- **Primitives**: `42`, `3.14`, `"text"`, `true`
|
||
|
|
- **Time**: `08:30:00`, `14:15`
|
||
|
|
- **Duration**: `2h30m`, `45s`
|
||
|
|
- **Ranges**: `20..40` (for templates)
|
||
|
|
- **Identifiers**: `OtherCharacter`, `path::to::Thing`
|
||
|
|
- **Lists**: `[1, 2, 3]`
|
||
|
|
- **Objects**: `{ field: value }`
|
||
|
|
- **Prose blocks**: ` ---tag\nMulti-line\ntext\n---`
|
||
|
|
|
||
|
|
### Expression Language
|
||
|
|
|
||
|
|
Conditions and queries use:
|
||
|
|
|
||
|
|
- **Comparisons**: `age > 18`, `energy <= 0.5`
|
||
|
|
- **Equality**: `status is active`, `ready is true`
|
||
|
|
- **Logic**: `tired and hungry`, `rich or lucky`, `not ready`
|
||
|
|
- **Field access**: `self.health`, `other.bond`
|
||
|
|
- **Quantifiers**: `forall x in children: x.happy`
|
||
|
|
|
||
|
|
## Compilation Model
|
||
|
|
|
||
|
|
### Source → AST → SBIR → Runtime
|
||
|
|
|
||
|
|
```
|
||
|
|
.sb files → Parser → Abstract Syntax Tree → Resolver → SBIR Binary
|
||
|
|
```
|
||
|
|
|
||
|
|
**SBIR** (Storybook Intermediate Representation) is a compact binary format that:
|
||
|
|
- Resolves all cross-file references
|
||
|
|
- Validates semantic constraints
|
||
|
|
- Optimizes for simulation runtime
|
||
|
|
|
||
|
|
### Validation Layers
|
||
|
|
|
||
|
|
1. **Lexical**: Valid tokens and syntax
|
||
|
|
2. **Syntactic**: Correct grammar structure
|
||
|
|
3. **Semantic**: Type checking, reference resolution
|
||
|
|
4. **Domain**: Narrative constraints (bond ranges, schedule overlaps)
|
||
|
|
|
||
|
|
## File Organization
|
||
|
|
|
||
|
|
### Project Structure
|
||
|
|
```
|
||
|
|
my-storybook/
|
||
|
|
├── characters/
|
||
|
|
│ ├── baker.sb
|
||
|
|
│ └── family.sb
|
||
|
|
├── behaviors/
|
||
|
|
│ └── daily_routine.sb
|
||
|
|
├── world/
|
||
|
|
│ ├── locations.sb
|
||
|
|
│ └── institutions.sb
|
||
|
|
└── schema/
|
||
|
|
├── species.sb
|
||
|
|
└── templates.sb
|
||
|
|
```
|
||
|
|
|
||
|
|
### Import System
|
||
|
|
|
||
|
|
Use `use` statements to reference definitions from other files:
|
||
|
|
|
||
|
|
```storybook
|
||
|
|
use schema::species::Human;
|
||
|
|
use schema::templates::Adult;
|
||
|
|
|
||
|
|
character Baker: Human from Adult {
|
||
|
|
// ...
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Resolution order:**
|
||
|
|
1. Same file
|
||
|
|
2. Explicitly imported
|
||
|
|
3. Error if not found
|
||
|
|
|
||
|
|
## Quick Reference
|
||
|
|
|
||
|
|
### Character Declaration
|
||
|
|
```storybook
|
||
|
|
character Name: Species from Template {
|
||
|
|
field: value
|
||
|
|
field: value
|
||
|
|
---prose_tag
|
||
|
|
Text content
|
||
|
|
---
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Behavior Tree
|
||
|
|
```storybook
|
||
|
|
behavior Name {
|
||
|
|
choose label { // Selector
|
||
|
|
then label { ... } // Sequence
|
||
|
|
if (condition) // Condition
|
||
|
|
ActionName // Action
|
||
|
|
include path // Subtree
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Life Arc
|
||
|
|
```storybook
|
||
|
|
life_arc Name {
|
||
|
|
state StateName {
|
||
|
|
on condition -> NextState
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Schedule
|
||
|
|
```storybook
|
||
|
|
schedule Name {
|
||
|
|
08:00 -> 12:00: activity { }
|
||
|
|
12:00 -> 13:00: lunch { }
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Relationship
|
||
|
|
```storybook
|
||
|
|
relationship Name {
|
||
|
|
Person1 as role
|
||
|
|
Person2 as role
|
||
|
|
bond: 0.85
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
Dive deeper into each declaration type:
|
||
|
|
|
||
|
|
- [Characters](10-characters.md) - Detailed character syntax
|
||
|
|
- [Behavior Trees](11-behavior-trees.md) - Complete behavior node reference
|
||
|
|
- [Decorators](12-decorators.md) - All decorator types
|
||
|
|
- [Life Arcs](13-life-arcs.md) - State machine semantics
|
||
|
|
- [Schedules](14-schedules.md) - Time-based planning
|
||
|
|
- [Relationships](15-relationships.md) - Connection modeling
|
||
|
|
- [Other Declarations](16-other-declarations.md) - Templates, institutions, etc.
|
||
|
|
- [Expressions](17-expressions.md) - Full expression language
|
||
|
|
- [Value Types](18-value-types.md) - All field value types
|
||
|
|
- [Validation](19-validation.md) - Error checking rules
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Philosophy Note**: Storybook treats narrative as data. Characters aren't objects with methods - they're **declarations** of traits, connected by **behaviors** and **relationships**. This separation enables rich analysis, modification, and simulation of narrative worlds.
|