Tutorial
Tutorial: The RPG Campaign
Welcome to the Typedown tutorial. Typedown is a Consensus Modeling Language (CML) designed to turn fluid thought into verifiable data. In this guide, we will model a simple RPG campaign to explore Typedown's core pillars:
- Definitions: Modeling concepts and declaring entities.
- References: Linking the world together via "Intent."
- Evolution: Tracking the state of the world through time.
1. Setup: The Context Field
Typedown reflects the physical structure of your workspace. We start by configuring our environment in config.td. Here, we import our Pydantic models (Schemas) that define what a Character, Item, and Monster look like.
# config.td
from models.schema import Character, Item, Monster
2. Defining The World (The Manual)
In 00_manual.td, we define our base game assets. This is our static "Source of Truth."
Basic Items
We define a potion and a sword. Note the id field—this is the Slug, a stable, global identifier.
name: "Healing Potion (Small)"
weight: 0.5
value: 10
name: "Iron Sword"
weight: 1.5
value: 50
Monster Templates
Next, we define a Goblin. In Typedown, we prefer Explicitness. Instead of deep inheritance trees, we use AI or simple templates to populate data.
name: "Goblin"
type: "Humanoid"
hp: 30
attack: 5
loot:
- [[item_sword_iron]]
A Note on References:
[[item_sword_iron]]is a Query Intent. It means "Find the entity with this ID or Handle in the current context."
3. The Adventure Party
In 01_party.td, we introduce our protagonists.
name: "Valen"
class_name: "Warrior"
hp: 100
max_hp: 100
inventory:
- [[item_sword_iron]]
name: "Lyra"
class_name: "Mage"
hp: 60
max_hp: 60
inventory:
- [[item_potion_hp]]
4. The Session (Evolution)
As the game unfolds in 02_session.td, we encounter Typedown's most powerful feature: Evolution Semantics.
The Encounter
Two goblins appear! Instead of complex "derivation," we simply declare them as distinct entities in this specific session context.
name: "Crazy Goblin"
hp: 20
attack: 5
State Updates: The Timeline
After a fierce battle, Valen is wounded and Lyra consumes a potion. We don't overwrite the old data; we evolve it. By using the former keyword, we link the new state to the previous one, creating an immutable history.
Valen V2: Wounded, but has scavenged an extra sword.
former: "char_valen_v1"
name: "Valen"
class_name: "Warrior"
hp: 80
max_hp: 100
inventory:
- [[item_sword_iron]]
- [[item_sword_iron]]
Lyra V2: Spent her potion.
former: "char_lyra_v1"
name: "Lyra"
class_name: "Mage"
hp: 60
max_hp: 60
inventory: []
Conclusion: The Power of the Field
By using former, you've created a verifiable timeline. The compiler can now:
- Track how Valen's HP changed over sessions.
- Ensure that
valen_v2is still a validCharacter. - Navigate between the past and present of your world.
This is the promise of Typedown: Cognitive freedom through the discipline of modeling.