# VXLVERSE > VXLVERSE (https://vxlverse.com) is a free, browser-based 3D game maker. A game is written as a short plain-text script called **VXLScript** — readable indented lines (World / Character / say / Enemy / Win when …) in any human language — and the studio at /studio-live builds a playable 3D voxel game live as the text is typed. No coding, no game engine, no download. Playing is free with no account; saving/sharing your own game takes a Google sign-in. This file teaches an AI assistant everything needed to author a complete, WINNABLE VXLVERSE game and hand the user a one-click link that opens it in the live editor. ⚠️ READ THIS FIRST — DO NOT INVENT SYNTAX. VXLScript is NOT a generic voxel/3D engine. There is NO `create`, `fill area`, `grid`, `place`, `on_win`, or any coordinate / `at: x,y` command (`spawn`/`send in` exist ONLY as an effect INSIDE a `When …:` block, and only to send in a declared `Enemy` — never to place blocks or objects) (the ONLY placement words are `@world`, the compass `at [far] north|south|east|west|middle|center`, and — inside a GENERATED building such as `World "castle":` — a room name: `at: throne room`, see Generated places) — those come from Minecraft/Roblox-style tools, are NOT valid here, and will NOT work. (`set` exists ONLY as the counter line `set coins to 0` — never for placing blocks or objects.) A game is ONLY the indented keyword lines documented below (`World`, `Character`, `Enemy`, `say`, `wants`, `if choice is`, `Win when`, `win`, …). When unsure, copy the shapes in this file verbatim — never guess a command that is not listed. ⚠️ EVERY game MUST have an explicit way to win — a `Win when:` line OR a `win` inside a reachable choice OR a top-level `Quest` block. A `wants:`/`gives:` fetch on its own is NOT a win (it just grants score + a reward). The smallest complete winnable game is exactly: Win when: player has 🌟 star World "Forest": Character "Mara": say Hi! Bring me a star to win. wants: 🌟 star item 🌟 star ## How to deliver a game to the user (the only integration you need) Build the VXLScript (full language below), then give the user this link: https://vxlverse.com/make?code= - `code` = the plain VXLScript text, standard percent/URL-encoded (encodeURIComponent). No base64 needed. - The page instantly redirects into the live editor (`/studio-live?make=`) with the script loaded, the 3D game already building, ready to play, edit and share. - Keep scripts under ~6,000 characters for URL safety. For longer scripts use the fragment form `https://vxlverse.com/make#code=` (not sent to the server, no length limits). - Alternative if you can produce base64url yourself: `https://vxlverse.com/studio-live?make=` where `+`→`-`, `/`→`_`, padding `=` stripped. - Always ALSO show the script itself in a code block, so the user can copy or tweak it by hand. Rules of thumb when authoring for a user: - Write all game-facing TEXT (title, dialogue, endings) in the USER'S language (Greek in → Greek out). Keywords stay English (`World`, `say`, `Win when:` …) — names/values may be Greek; the parser is Greek/Greeklish-aware for worlds, colors, creatures. - Keep it WHOLESOME (kid-safe, PG). No sexual content, innuendo, gore or real-world hate. If the user's idea is adult, reinterpret it as a clean adventure in the same setting. Aggression toward a named real person becomes a playful duel/race that ends in a handshake. - DECLARE TRANSLATIONS: when the user asked for something out of scope (a branded game like GTA/Fortnite/Minecraft, real shooting, driving, PvP, tycoon menus), TELL THEM in one warm sentence what does not fit and what you are building instead ("GTA-style driving won't fit — building you a city crime-story with missions!"), then build that adventure. Never use brand or licensed names inside the game itself. - Every game MUST be winnable: include a `win` inside a reachable dialogue branch OR a satisfiable `Win when:` line. Aside from the hard errors listed under Parsing rules, the compiler refuses nothing — an unwinnable game still builds, with a warning in the editor. - Don't over-build: 1–2 worlds, 2–4 characters, one clear goal beats a sprawling epic. ## VXLScript — complete language reference ### Document shape & parsing rules - Plain text, line-based. INDENTATION IS THE TREE: children are indented (2 spaces is the convention; tabs count as 2). Blank lines ignored. - Keywords are CASE-INSENSITIVE. Quotes around names are optional (curly quotes auto-normalized). - `# whole-line comment` is dropped. A trailing ` # comment` (space before #) is stripped only from structural lines (headers, traits, `Win when:` …). Free text after `say`/`Story:`/`Ending:` keeps a literal `#`. - Unknown block keyword (e.g. `Charcter`) demotes to narration and SKIPS its whole indented block (a "did you mean" warning fires for near-misses). Any unrecognized indented line under a Character becomes a `say` line. - HARD ERRORS (the game fails to build): `Win when: talked to X` where no Character "X" exists, and a `Quest` chain step whose target was never declared (`talk to` / `get` / `defeat` naming a missing Character/item/Enemy). Everything else degrades to warnings. - Names slug to ids in any language (Greek keeps Greek letters); gates/wins match items and characters BY NAME, emoji ignored — `if player has 👑 crown:` matches `item 👑 crown`. ### Top-level lines (any order; put them at the top) Title: The Lost Crown # game name (default: "My Adventure") Goal: Find the 3 gems # HUD hint; auto-derived from the win rule if omitted Story: The beach was quiet. # one line of opening narration; stack up to 8 (220 chars each) Ending: You saved the island! # win-screen text (single ending) Ending "good": Peace returns. # NAMED ending — pair with `win good` in a branch (multiple endings) Win when: # ONE global win rule (last one wins) — see Winning Mode: waves # game kind: parkour | waves | horde | normal (omit = story) — see Kinds Weapon: sword # starting weapon: pistol smg shotgun crossbow blaster dagger sword hammer Waves: 10 # wave count for battle mode, 1–50 Music: fantasy # soundtrack mood — see vocabularies Save: off # OPT-OUT of auto-save/Continue (default is ON — see Saving) Aliases accepted: `intro`→Story, `outro`/`finale`→Ending, `win if`/`win when`/`you win when`→Win when, `lose if`/`fail when`/`game over when`/`you lose when`→Lose when, `game type`/`type`→Mode, `gun`/`armed with`→Weapon, `rounds`→Waves, `soundtrack`/`song`/`theme`→Music, `saving`/`save game`/`auto save`→Save. The BARE forms work too, at the far left and only with a condition after them: `Win: player has 👑 crown` · `Win player has 👑 crown` · `Lose: time > 90s`. A bare `win` with NO condition stays the dialogue victory ACTION and is only meaningful inside a branch. ### Worlds (optional; max 6; 2+ worlds auto-connect with portals) World "beach": music: horror # per-world soundtrack override (same 13 moods as Music:) Character "Mara": # anything indented under the World lives there say Hello! - The name free-matches (English/Greek/Greeklish) to one of the 44 places — 35 open worlds + the 9 GENERATED buildings below. The grouped list is in Exact vocabularies. No match → forest. "παραλία" → beach, "cherry blossom" → sakura, "Spooky Castle" → a composed castle. - The nine building words win over the biome table: `dungeon`, `cave`, `crypt`, `mansion` and `house` all build a COMPOSED place (see Generated places). The two CLASSIC open interiors are still there under names no building claims — `World "temple":` for the old torch-lit maze, `World "indoors":` for the old procedural halls. - dungeon + house are INDOOR rooms. Dark-themed: cemetery, volcano, city-night, dungeon, house, crystal, mushroom, moon (twilight wears a violet dusk). - Aliases for the `World` keyword: `Scene "beach":` · `Place "cave":` · `Level "tower":` — all four open a world block (a `Cutscene` block is never one of them; the word starts "cut"). `level: 5` with a NUMBER is the enemy tier trait, not a world header. - NEVER start a World name with "the", and always refer to a world by EXACTLY the name you declared. The three rules that name a world do not agree about articles: `Win when: reach X` matches the World name literally (no article is added or removed either way — `World "reactor":` + `Win when: reach the reactor` is a FATAL error, and so is `World "the reactor":` + `Win when: reach reactor`), while `open the way to X` and `when player reaches X` STRIP a leading "the" from the name they are given and then look for a world called the rest. So a world called "the lamp room" is unreachable by all three; `when player reaches the lamp room` does not even warn about the world — it quietly puts a "lamp room" on the floor as a thing to walk up to. Write `World "lamp room":` and `Win when: reach lamp room`. - Column-0 `Character`/`Enemy`/`Ally`/`item` lines AFTER a World (not indented) still join that world until the next `World`. - `in: cave` under a Character moves that one character OUT of the first/default world into the named world. It's ignored on a character already declared under a second-or-later `World` block — indent the character under the World you want instead. ### Generated places — castle · school · shop · office · haunted house · hospital · prison · dungeon · house Nine World words build a COMPOSED building instead of an open biome: a real single-storey floor plan (rooms sharing walls around corridors and halls, courtyards, towers), furnished from a voxel prop library, with default INHABITANTS who walk routes and chat (castle guards/cooks/courtiers, school teachers/pupils, hospital nurses/doctors, prison guards/inmates, shop cashiers/customers…), and usually one to three LOCKED doors whose keys lie somewhere in the plan. Every page load gets a fresh layout. World "castle": # the name picks the building (longest keyword wins; EN / Greek / Greeklish) Character "King" at: throne room # `at: ` on the Character line puts them IN that room say My crown is gone! Character "Cook": at: kitchens # …or as a trait line under the character say Out of my kitchen! item 👑 crown at: dungeon cells # an item takes the same `at:` — a Character and an item are the ONLY two Enemy "Rat" # an Enemy gets NO `at:` — `Enemy "Rat" at: undercroft` is accepted and then kind: spider # silently ignored; enemies spawn where the spawner puts them - WHICH WORDS build which place: `castle` (also palace, keep, fortress, κάστρο, kastro) · `school` (σχολείο) · `shop` / `pizza shop` / `bakery` / `restaurant` / `mall` / `supermarket` / `store` (μαγαζί) · `office` · `haunted house` / `haunted` / `hotel` / `Haunted Mansion` (στοιχειωμένο) · `hospital` / `clinic` / `lab` / `laboratory` (νοσοκομείο, εργαστήριο — mind that "lab" builds the composed HOSPITAL, not the open Science Lab interior) · `prison` / `jail` / `police station` (φυλακή) · `dungeon` (cave/crypt style) · `house` / `home` / `mansion` (σπίτι). An adjective picks a style variant: `World "winter castle":`, `World "modern house":`. Anything else ("beach", "forest", "city") stays an open biome exactly as before. - PLACES you can name after `at:` (the room KIND words always resolve, whatever the layout calls the room; display names in parentheses also work): · castle: gatehouse/gate · courtyard/bailey · throne room · armoury/treasury · dungeon cells/cells · tower/keep · chapel · kitchens/kitchen · great hall/hall · passage (Gatehouse, Barbican, Inner Bailey, Hall of the Crown, Audience Chamber, Strongroom, The Oubliette, East Tower, West Tower, Watch Tower, Crypt Chapel, Shrine, Scullery, Buttery, Feast Hall, Gallery, Undercroft) · school: lobby/entrance · lockers/locker hall · classroom/art room/science lab/music room · cafeteria/canteen · gym · bleachers · office/principal's office/staff room · library · bathroom · janitor's closet/supply closet · field/playground · corridor/east wing/west wing · shop: shop floor/storefront · counter/till/checkout · kitchen/bakehouse · stockroom/storage · office/manager's office · loading bay/delivery · concourse/atrium/mall · store (toy store, bookshop, sweet shop, shoe store, pet store, phone store, clothes store, music store) · food court/cafe/restaurant · parking lot/yard · corridor · office: reception/lobby/front desk · open plan/the floor/dev floor · meeting room/boardroom/fishbowl/huddle room · ceo's office/corner office · server room/comms room · kitchenette/break room/coffee corner · bathroom · store room/archive/stationery cupboard · corridor · haunted: foyer/grand foyer/lobby · ballroom · library/reading room · suite/room 13/room 7/room 101/nursery/bedroom · dining hall/breakfast room · cellar/boiler room/basement · loft/attic/clock loft · closet/linen closet/broom cupboard · secret passage/hidden way · corridor/long corridor · hospital: reception/waiting room/front desk · ward/ward a/ward b/ward c · surgery/operating theatre · lab/laboratory/pathology lab · containment/isolation/quarantine · supply room/pharmacy/linen store · morgue/cold room · control room/nurses' station/security desk · corridor · prison: gate/intake/sally port · cell block/cell block a/b/c/cells · yard/exercise yard · cafeteria/mess hall/chow line · control room/guard station/security office · vents/air duct/vent shaft/crawlspace · guard post/watchtower · main gate/checkpoint/exit · warden's office/administration · hallway/corridor · dungeon: entrance/crypt entrance/cave mouth · chamber/bone chamber/echo chamber/flooded chamber · cells/the oubliette · shrine/altar/candle chapel · treasury/vault/hoard room · trap hall/hall of blades/spike gallery · boss hall/throne of bones/the deep hall/lair · corridor/passage/low tunnel · house: front hall/foyer/hallway · living room/lounge · kitchen · dining room · bedroom/kids room/master bedroom/guest room · bathroom · study/office · attic/loft/box room/store room · cellar/basement/pantry · garage/workshop · garden/back yard/front yard · corridor Greek and Greeklish room words work too (κουζίνα/kouzina, αυλή/avli, βιβλιοθήκη/vivliothiki, κελί/keli, διάδρομος/diadromos…). A place you name is PLANNED INTO the building — ask for a throne room and the plan has one. A word that matches no room of that building falls back to classic placement with a warning in the editor, so stick to the lists. - LOCKED DOORS & KEYS are automatic. Each layout locks ONE TO THREE doors and drops a matching 🗝️ key at a spot elsewhere in the plan — and a `house`, `shop` or `office` plan sometimes locks NOTHING (roughly a fifth to a quarter of layouts), so never make the finding of a key the story itself; a `school` always locks exactly one (a castle: the armoury door locked, the key in the oubliette; a school: the principal's office locked, the key in the library). Walking into a locked door toasts "Locked — you need the key"; picking the key up opens its door on the spot ("Unlocked: Armoury"). Which door is locked and where its key lies CHANGE with every layout, so write dialogue that stays true for any plan: "a locked door has its key somewhere in this place — the door itself tells you which". NEVER author your own item with "key" (or "keycard") in its name inside a generated world: ONE such item suppresses EVERY key the plan would have dropped. Your key is not dead — picking up anything key-shaped unlocks the first door still locked — but a layout that locked TWO doors is now one key short, and the room behind the second can never be opened. (An ordinary item you `at:`-place also eats the plan's key if the layout happened to hide that key in the same room, and an ordinary item unlocks nothing — one more reason to leave the keys alone.) Put the goal item behind the story instead (`at: dungeon cells`, a `wants:`, an Enemy that `drops` it). - DEFAULT INHABITANTS are free: a castle already has guards on the walls, cooks in the kitchens and courtiers in the hall, each with a walk route and a line or two. Author ONLY the characters the story needs (the King, the Thief) — 2-4 named Characters is plenty. `Win when: talked to X` and quests target only Characters YOU wrote. - EVERY WORLD KEEPS ITS OWN BUILDING. `World "castle":` + `World "school":` is two composed places in one game, and the portal between them carries each one's plan — the castle door never opens onto another castle. The only limit is ONE building per visual family: castle and dungeon share the `dungeon` family; school, shop, office, haunted and house share `house`; hospital and prison share `lab`. Write a castle AND a crypt and the second falls back to a free outdoor biome with a warning — pairing a building with an OUTDOOR world (`World "castle":` + `World "forest":`) is still the best contrast. - `Mode: horde` ALWAYS keeps the legacy OPEN ARENA, and so does a PURE fight — `Mode: waves` with no Characters at all — because a castle of rooms strangles the spawner. A wave story WITH a cast KEEPS its building, and so does every story, explore and stealth game. - In the studio the 🌍 World chip opens a shelf of all 44 places and WRITES the `World "…":` line for the kid; the 🎲 next to it shuffles the place she is standing in into a brand-new layout. Tell her both, so she can shop for the plan she likes. ### Characters & dialogue (max 24 characters; the player walks up and presses E) Character "Mara": say Welcome, traveler! # a dialogue page; stack up to 12 per node; quotes optional say Bring me the lost crown. - Aliases: `char`, `npc`, `person`, `people`, `hero`. - Looks (all optional, under the Character): gender: girl # girl|boy|man|woman (or a bare `girl` line); otherwise inferred from dress/Greek name endings hair: long blonde # colors: black brown blonde red grey white blue pink purple green; "long" = long hair wears: red shirt # alias clothes:; a dress/skirt word routes the color to a dress (⇒ female look) dress: purple pants: navy skin: tan # pale fair medium olive tan brown dark model: wizard # a ready-made 3D model from the character library INSTEAD of the block look (alias looks:) — ONE word from the Model words vocabulary below looks like a woman with black hair # THE PLAIN SENTENCE — no colon anywhere. `she looks like an old farmer in a brown coat` / Greek `μοιάζει με …` are mined into gender/hair/dress/shirt/pants/model, so a look can be written the way a child says it. Only claimed when the words really carry an appearance; anything else stays a `say` line. ### Choices & branching (max 3 options per menu; nestable) Character "Guard": say Who goes there? if choice is "A friend": say Pass, friend. win if choice is "None of your business": trust_guard - 1 say Hmph. else: say Think about it. - THE ARROW — a whole choice on ONE line. `Ask about the siren -> say Something is loose up there.` expands into `if choice is Ask about the siren:` + the indented answer, so a second thing to ask about costs one line. `=>` and `→` work too. It only fires on an INDENTED line whose label is short and colon-free; a line already opening with a keyword (`say`, `look at`, `if`, a cutscene beat) is left exactly as written, so an arrow inside spoken text stays spoken text. ### Gates — condition branches (under a Character) if player has key: # item gate; `if player has 3 gems:` = live count gate if talked to "Elder": # opens after finishing a talk with THAT character (must exist!) if talked before: # second+ conversation with this same character if coins >= 10: # named counter gate; ops: is/=/==/>=/<=/>/< ("is" means AT LEAST) if coins at least 5: # word forms of the same gate: `at least N` · `equals N` · `reaches N` · `hits N` if warmer: / if colder: / if neutral: # relationship gates — see Relationships if warmer and player has 🎁 gift: # AND-gate — opens only when EVERY condition holds if talked to "Tom" and talked to "Ana": # combine any conditions with `and` (2+ allowed) else: # fail branch of the gate directly above (same indent) - A top-level gate on a character becomes an auto-shown gated greeting; a gate written inside a choice becomes an in-place fork. Wrapping `if choice is` menus inside a gate (`if player has X:` then choices) is fully supported, and mixing gated reactions with a choice menu on one character is clean (no warning). - `and`-gates: join conditions on one `if … :` line with ` and ` (any mix of player-has / talked-to / warmer / counter). The branch opens only when ALL are true — the way to require several clues, an item AND a mood, etc. (There is no `or`; write separate gates for alternatives.) - Gate items that can't be obtained are auto-placed on the floor silently (only the `Win when: player has X` auto-placement warns). ### Items, quests & inventory item 👑 crown # floor pickup in the current world; first emoji = its icon (else keyword-guessed). Aliases: `pickup`, `loot`, `thing` item 🧪 potion heals 30 # usable consumable: restores 30 HP (drink from the bag) item 🔋 cells ammo 24 # refills gun ammo (aliases: refills / reloads / `gives 24 ammo`) item 🪙 coin x10 # quantity scatter (max 30 copies) item 💎 gem @cave # place in another world by name item 🗺️ map at far north # compass placement: at [far] north|south|east|west|middle|center (also spelled `centre`) — kid words, no coordinates give 🔑 key # under a Character: the NPC gifts the item via a "Take the key 🎁" choice wants: 🐟 fish # under a Character: fetch quest — bring the item to this NPC (one per character) gives: 🏅 medal # under the SAME Character: the quest reward (needs wants:; one per character) - Coins/treasure go to the backpack (NOT to score). Delivering a `wants:` quest awards 50 score + the `gives:` item. ### Quest chains (a top-level `Quest` block — ordered steps that auto-track) Quest "The Journey": # a named, multi-step quest shown in the HUD tracker talk to Rowan # step 1: walk to Character "Rowan" and press E get herb # step 2: pick up item herb (aliases: collect / find / bring; `get herb x2` = 2) defeat Warden # step 3: kill Enemy "Warden" (aliases: kill / beat / slay) - Steps run IN ORDER; the tracker shows the current one ("The Journey — Talk to Rowan (1/4)") and the ◆ marker leads to it. Completing a step auto-advances to the next — no dialogue/Accept needed. Finishing the LAST step WINS the game (so a `Quest` block needs no separate `Win when:`). - Each step's target must be a declared `Character` (talk), `item` (get), or `Enemy` (defeat) — a step naming a target that does not exist is a HARD ERROR (the game fails to build). Max 12 steps. The single-line `wants:`/`gives:` fetch quest above still works and is unaffected. - A `defeat` step also flips a Mode-less game into a wave battle — write an explicit `Mode: story` to keep it an exploration (see Winning & losing). - Step targets match BY NAME with emoji ignored, exactly like gates (`get 🏮 lantern` and `get lantern` both match `item 🏮 lantern`), and a step may target a Character/item/Enemy in ANY world — the ◆ marker leads across portals. A `talk to X` step completes the moment you press E to open the conversation, however many say-lines it has. Use a Quest chain of `get` steps for a "gather several things, then deliver" recipe (a single `wants:` takes only one item). ### Enemies (max 16 types; they attack the player on sight) Enemy "Skeleton King": kind: skeleton # skeleton zombie mummy drone dog wolf raider robot slime bat spider ghost wyrm golem # synonyms map: dragon→wyrm, giant/troll→golem, alien→drone, bear→dog, goblin/orc/pirate/knight→raider, # ghoul→zombie, vampire→bat, scorpion/bug→spider, phantom/spirit→ghost, ooze→slime tier: 10 # difficulty 1–50 (size/HP/damage scale); `level: 10` is the same trait count: 5 # spawn exactly N (1–99); any count = exact authored roster fights: ranged # behavior: melee(chase) | swarm | ranged | flanker | support (healer) hp: 500 # overrides: hp 1–5000, speed 1–30, dmg 0–200 speed: 8 dmg: 15 drops 🦴 bone # always drops this item on death drops 5 gold # GOLD BOUNTY: coins fall at the corpse; `drops 3-8 gold` rolls a range - Aliases: `monster`, `foe`, `villain`, `boss` (alias of Enemy — bossness comes from attacks:/phases:, below). - Omitting `kind:` infers the creature from the name ("Dragon" → wyrm look, "Troll" → golem look). ### Bosses (an Enemy with attack patterns; spawns as the finale) Enemy "Dragon Lord": attacks: slam volley / charge / summon # 4 moves: slam volley charge summon; "/" splits HP phases (max 3) phases: 3 # phases alone also makes a boss (default attacks) arena: 30 # it holds its post inside this circle until you step in (12-60) says: You should not have come here. # PHASE 1 — said as the fight opens says: Enough. Now you see me. # PHASE 2 — said when the fight turns says: I have held this tower a hundred years! # PHASE 3 last words: The tower... falls... # said as it goes down (`dies:` / `final words:` too) - A boss gets a health bar, telegraphed attacks and forced tier 4. In a story with no other win rule, a boss auto-switches the game to a wave battle. - A wave battle wants at least ONE non-boss enemy too — declare a regular `Enemy` (a few trash mobs) alongside the boss, or a lone-boss battle auto-adds a warm-up wave (the editor shows a note when it does — that note is informational, not an error). - ENCOUNTER, not a health bar. `arena:` STAGES the fight: the boss stands dormant inside a circle drawn on the ground — no HP bar, no chasing, no attacks — until the player walks in (or lands the first hit). Then it rises, the circle turns red, the bar fills in and the fight starts. Writing any `says:` line turns the staging on by itself (default arena 30). - `says:` inside an Enemy block is ONE LINE PER HP PHASE, in order (max 3, 160 chars each). Each is delivered with the letterbox down and the camera on the boss's face — the same directed camera a `Cutscene` uses — and is skippable. `last words:` plays as it dies, and the victory card waits for it. - Each of the four attacks now WARNS you differently before it lands, so a player learns the fight: 💥 slam = an orange circle on the floor at the true blast radius · ✳️ volley = violet lines along every bolt's path (locked at the wind-up, so stepping off them dodges) · ➡️ charge = a yellow lane from the boss to where it will run · 👾 summon = green rings where the minions will land. Each has its own sound. - A boss keeps the statline you WROTE (`hp:` / `dmg:`, default 1000/24) — ×3 HP for a three-phase fight, damage exactly as written, and only the HP scales with the wave count. Tier 4 still sets its size and colour. ### Allies (companions; squad max 20 per world) Ally "Rex": kind: dog count: 3 # N numbered copies (Rex 1, Rex 2, …) - Aliases: `companion`, `friend`, `pet`, `sidekick`, `partner`, `buddy`. Allies follow the player and fight enemies. Parkour mode removes allies and enemies. - An Ally declared inside a `World "x":` lives in THAT world only; declare it BEFORE any World line to make a global companion that follows through portals. A top-level Ally can also be pinned to one world with `in: reef` (same as a Character's `in:`). Each world fields up to 20 active companions (globals count everywhere). - Every world keeps its OWN cast: enemies, NPCs, items and allies you write under (or after) a `World` block only appear in that world, and each world wears its own natural sky/light (a night moon, a bright reef). A boss authored in a later world stays the finale of THAT world — it will not gate-crash another world's last wave. ### Relationships & mood (per-character trust, 0–5, starts at 2) Character "Nia": if choice is "You look lovely today": trust_nia + 1 # raise/lower with counter lines on trust_ say Oh, thank you! if warmer: # trust >= 3 say I trust you now. join me # the NPC becomes a fighting companion if colder: # trust <= 1 turn hostile # the NPC becomes an enemy - `trust_*` counters can NOT be a `Win when:` goal. ### Score & counters (fire when the dialogue line is reached) score + 10 # points (win with `Win when: score is 30`). Same line, other spellings: `score 10` · `add 10 points` · `+10 points` · `10 points` coins + 5 # any named counter; also `coins - 2` set coins to 0 # absolute set; also `coins = 10` - Reserved words can't be counter names (say, win, give, item, if, score, set, world, character, enemy, loop …). ### Gold & shops (the loot → buy-gear loop) Enemy "Goblin": drops 5 gold # a bounty in coins (also `drops 3-8 gold`); chests + crates pay gold too Character "Merchant": sells sword for 30 gold # a price list → a 🪙 Trade choice in THEIR dialogue that opens the Trading Post sells 🧪 potion for 10 gold # a weapon name is WIELDED on purchase; anything else goes in the bag Character "Elder": gives 20 gold # hands the money over on the spot wants: crystal # …or, with a wants:, pay it as the quest REWARD: gives: 30 gold if gold is 50: # gold is an ordinary counter — gate on it, or `Win when: gold is 100` - Writing `gold` ANYWHERE turns the game's economy to gold: the 🪙 purse appears in the HUD and the shop charges gold instead of ☆ score. A game that never says `gold` is unchanged (the shop keeps charging score). - `drops 💰 gold` (no number) still means an ITEM called gold — it is the NUMBER that makes a line money. ### Winning & losing win # inside a branch: instant victory ("The End") win good # victory showing the named `Ending "good":` text lose # inside a branch: defeat Win when: defeat all # global rules: defeat all | defeat | survive Win when: player has 👑 crown # player has [N] — hold the item, or N of it: `player has 20 🪙 coin` (auto-placed if unobtainable) Win when: player has 🥕 carrot and 🧅 onion and 🍄 mushroom # SET win — hold ALL, any order (recipe / collect-a-set / clues) Win when: talked to Mara # talked to — the character MUST exist (hard error!) Win when: talked to Leo and talked to Fia # MEET-THEM-ALL win — talk to EVERY one, any order (`talked to Leo and Fia` and comma lists work too); every name must exist Win when: reach Castle Peak # reach — win on entering that world via a portal (needs 2+ worlds; not the START world) Win when: survive 300s # survive Ns — a live TIMER; win when it elapses ("survive 5 minutes" also works). Bare `survive` = clear the enemies instead. Win when: defend Rex for 90s # defend for Ns — hold out N seconds with that ally alive (its death loses the run) Win when: score is 30 # score is/reaches N | is N Lose when: time > 90s # global LOSS: run out of time — lose once the clock passes N seconds Lose when: Rex dies # dies — an escort/protect fail: lose the run if that companion falls - ONE `Win when:` per game (the last wins). A `win` inside dialogue overrides an item/talked `Win when:` (warning). `Lose when:` is separate and pairs with any win rule (e.g. `survive 300s` + `time > 90s`, or `defend Rex for 90s` on its own). - What flips a STORY into a wave battle: a `Win when: defeat …/survive` (bare), a declared boss, or a Quest chain `defeat` step (any kill step ⇒ waves when no `Mode:` is written; add an explicit `Mode: story` to keep a defeat-step game an exploration where the target simply roams). A roaming `Enemy` beside a dialogue `win`, or a `survive 300s`/`defend` timer, stays a story — the enemies simply roam and threaten (great for escort/survive-the-clock games). - To win on a QUANTITY of a physical PICKUP (`Win when: player has 20 🪙 coin`) — hold N of that `item` — the count is stripped and matched to the authored item, same as the `if player has 3 gems:` gate. But when the quantity is EARNED as points (kills, choices) rather than picked up off the floor, use a COUNTER instead: add `coins + 1` where each coin is earned, and `Win when: coins is 20`. ### Things that happen by themselves (When / Whenever) — SCRIPTED WORLD EVENTS A `When` block is the only way to make the world ACT. Everything else declares what exists; a `When` block says what happens, and when. Write it at the FAR LEFT (never inside a Character), with its actions indented under it. When player reaches the bridge: # a WORLD name, a Character name, or an item say The bridge groans — and drops into the dark. raise bridge_down When 90 seconds pass: # also `2 minutes pass` / `after 30 seconds` say The alarm starts howling. raise alarm When the alarm rises: # a name something else raised (also `happens` / `is raised`) send in 3 Guard # `send in 3 Guard here` puts them right on top of the player open the way to Vault # the portal into that World STARTS LOCKED and opens now When Grix dies: # a declared Enemy went down (also `is defeated`) say The pack scatters. score + 50 When player is hurt: # took a hit (also `takes damage`) Mara says Keep your head down! # a declared Character shouts it mid-fight When health drops below 30: # also `health is low` give 🧪 potion When quest The Council is done: # a `Quest "…":` chain finished (or `step 1 of The Council is done`) say The doors open. Whenever 30 seconds pass: # WHENEVER = every time it comes true again send in 2 Guard - **`When` fires ONCE. `Whenever` fires EVERY time.** Once is the default on purpose — a rule that fires forever is a broken game, so you have to ask for it by name. You may also write `only once` or `every time` as a line inside the block to say it out loud. - `player reaches ` fires the moment the player is IN that world — including the START world at the very beginning of the run, which is how you open a mission with a briefing. - MOMENTS you can wait for: `player reaches ` · `player has ` / `player has ` (the same sentence a Cutscene `when` takes — fires the moment the thing is in the bag) · ` seconds pass` / ` minutes pass` · ` rises` · ` dies` · `player is hurt` · `health drops below ` · `quest is done` / `step <N> of <Title> is done`. - ARRIVING has many spellings, and the SAME sentence works in a `When` block and in a `Cutscene` trigger: `reaches` · `arrives at/in/into` · `gets to/into` · `enters` · `walks into` · `steps into/onto/on` · `finds` · `comes to` · `is near` / `nears`. The subject may be `player`, `hero`, `you`, `I` or `we` — `When we get to the reactor:` is a real reachWorld event. - ACTIONS a block can take (up to 8, in the order you write them): `say <line>` · `<Character> says <line>` · `send in <N> <Enemy>` (alias `spawn`; add `here` for an ambush at the player's feet) · `raise <name>` · `give <item>` · `open the way to <World>` / `close the way to <World>` · `start quest <Title>` · `play <Cutscene title>` · `score + N` · `<counter> + N` / `set <counter> to N` · `win` · `lose`. - `play <Cutscene title>` cues a `Cutscene "…":` block you wrote — the directed camera takes over at exactly this moment, then hands control straight back. - `raise <name>` is how two blocks talk to each other: one raises it, another waits for it with `When <name> rises:`, and ordinary gates can read it too. - `open the way to <World>` makes that portal start LOCKED and open only when the event fires — the mission-door lane. `close the way to <World>` seals it for good once fired. - Everything a block names must EXIST (`Enemy "Guard":`, `item 🔦 lantern`, `World "Vault":`, `Character "Mara":`). A name that resolves to nothing is dropped with a warning rather than shipped as a rule that can never fire. - A fired `When` block is REMEMBERED in the save, so pressing Continue never replays a bridge that already fell. - Events also count toward winnability: `Win when: reach Vault` behind an `open the way to Vault` is understood as a real way to win. ### Cutscenes — the DIRECTED CAMERA (max 8 per game, max 16 beats each) A `Cutscene` block is the one place you DIRECT a moment instead of just staging it. The camera takes over, black letterbox bars come down, input locks and the HUD goes quiet; you frame a face, hold, pan onto the thing they were meant to notice, shake it, fade — then control returns EXACTLY where the player left it. A SKIP button sits in the corner — that button is the only way out, on purpose: keys and taps are swallowed so a kid mashing through dialogue cannot erase a directed moment without meaning to. Write it at the FAR LEFT with its beats indented, in the order they happen — it reads like a small screenplay. Cutscene "the warning": # the title is for YOU; the player never sees it when talked to Mara # WHEN it plays (see below). Leave it out / write `at start` for the opening shot. look at Mara # frame a Character / Enemy / Ally / item — add `for 3` to hold longer Mara says They are already inside the gate. # a line delivered IN the world (their name above it, no panel) wait 1 # hold on the shot (0.2-6s) shake # punch the camera — a blast, an impact, a door slamming look around # pull back: an establishing shot of the place fade out # `fade in` brings the picture back Cutscene "the opening": at start # plays once, right as the world finishes rising look around say The siren has not stopped since dawn. # narration — a line nobody speaks look at me # the hero, framed from the front World "the mako reactor": # A CUTSCENE INSIDE A WORLD BELONGS TO THAT WORLD Cutscene "arriving": # …so it plays the first time the player gets HERE look around say The air tastes like iron. - BEATS (the whole vocabulary): `look at <Character|Enemy|Ally|item>` (also `look at me`, `look around`, and `look at X for <N>`) · `<Character> says <line>` · `say <line>` · `wait <N>` · `shake` · `fade out` / `fade in`. - WHEN it plays — one line, and it fires ONCE, the first moment it becomes true: `when talked to <Character>` · `when player has <item>` · `when <counter> is <N>` · `when quest <Title> is done` · `when player reaches <World>` · `at start` (or no `when` line at all). Accepted openers for that line: `when …` · `after …` · `once …` · `plays when …` · `starts when …`. Synonyms for `at start`: `at the beginning` · `when the game starts` · `at once` · `straight away`. - EACH WORLD GETS ITS OWN OPENING SHOT. INDENT a `Cutscene` inside a `World "…":` block and it belongs to that world: with no `when` line it plays the first time the player ARRIVES there. In the world the game starts in that is the opening of the game, exactly as before. The same moment written at the far left is `when player reaches <World>` (also `when the player arrives in X` · `when we get to X` · `when you enter X` — the very same phrase a `When …:` event takes, so there is one sentence to learn). This is how a multi-world story gives each place an establishing shot. - A cutscene can also be CUED BY AN EVENT: `play <Cutscene title>` inside a `When …:` block. Nothing stops one scene being BOTH: a `Cutscene` with no `when` line is the opening shot AND still plays again wherever an event cues it. If a scene is only meant to be cued, give it a `when` line it can never reach on its own — or accept that it opens the run too. - A cutscene is PURELY PRESENTATIONAL — no beat moves the player, grants anything, raises a flag or wins the game. That is what makes it safe to skip at any moment, safe to die in, and safe across a portal. Put the consequences in the dialogue or the `When` block that triggered it. - Everything a beat names must EXIST in the game, AND BE THERE. `look at <someone not in the game>` is dropped with a warning rather than shipped as a shot of empty grass — and so is a scene in one world that looks at someone who lives in another (the hero, the place, a global `Ally` and anything in the bag travel with you, so those are always fair game). - ONE opening shot PER WORLD (not one per game). Two `at start` scenes in the SAME world is an authoring mistake: the second is dropped with a warning that names the world. - INDENT THE BEATS. Beats written at the `Cutscene` header's OWN column are still read (a flat screenplay is a shape kids type), but the scan then keeps going until it hits something that is not a beat — and `Save: off` / `Stealth: on` / `Limit: Omnislash` / a bare `Win: …` READ as beats (`<Name>: <line>`). The directive is swallowed into the scene and silently LOST (`def.saveOff` never set, plus a junk `say "off"` beat). `Music:` / `Ending:` / `Waves:` / `Win when:` are safe because they are known constructs. Always indent a cutscene's beats 2 spaces under its header and this can never happen. - Cutscenes are LOCAL in multiplayer: each player sees their own, and one is never waited on by anyone else. ### Loops (text macros — expand before parsing; max 30 reps) `loop` also answers to `for` and `repeat`: `for 3:` · `for 3 times:` · `repeat 3 times:` · `repeat over a, b, c:`. The `as` name may be written with or without a `$` (`loop 3 as i:` = `loop 3 as $i:`); inside the body it is always `$i`. loop 3 as i: Enemy "Guard $i": # $i = 1..3 → Guard 1, Guard 2, Guard 3 kind: raider loop over coin, gem, star as x: item 🍀 $x ### Sneaking past guards (Stealth / guards / sees) — ENEMIES THAT HAVE TO SEE YOU Normally an `Enemy` knows where the player is from the moment it exists and walks at them forever. A GUARD does not: it patrols its own route and has to actually SEE the player — inside a ~120° cone in FRONT of it, inside its sight range, and with NO WALL in between. That single change is what turns a fight into a mission. It is OPT-IN: a game that never writes `Stealth:` or `guards:` behaves exactly as it always did. Stealth: on # every enemy in the game becomes a guard, and the player gets crouch World "outpost": Enemy "Guard": kind: raider Enemy "Watchman": # …or tag ONE enemy instead of the whole game: kind: raider guards: yes # `guards: the bridge` works too — any value but no/off means yes sees: 30 # how far its eyes reach, in steps (8-60, default 26). Implies `guards`. When spotted rises: # the alarm is a normal flag, so the When layer scripts what it DOES say The whole yard is awake now. send in 3 Guard - THE FOUR STATES, and the mark the player reads off a guard's head: nothing = it has not noticed you · **❓** = it heard or half-saw something and is coming to look · **❗** = it has you, and it SHOUTS (every guard within ~34 steps joins the hunt) · **👁** = it lost you and is searching where it last saw you. It cools all the way back down after about ten quiet seconds. - THREE ways to be unseen, and the player can use any of them: be BEHIND it (outside the cone), be FAR (past its `sees:` range), or be behind a WALL. Cover beats everything — no distance and no noise can see through it. - HOW LOUD YOU ARE: crouch (**C**, or the 🤫 button on a phone) is completely SILENT and makes you harder to see — and half speed. Walking is heard about 7 steps away, sprinting about 17, and sound does NOT stop at walls (a corner hides you from eyes, never from ears). A noise alone never catches you: it brings a guard over to look. - Being spotted raises the flag `spotted`, once per run. That is a normal flag, so `When spotted rises:` fires an event, and any `if` gate can read it. - A BOSS is never a guard — a boss is a set-piece you are meant to be found by. `Stealth: on` skips them. - Write it only when the story is really about not being seen. A game meant as a fight is worse, not better, with enemies that have to notice you first. ### Materia (`teaches <element>`) — MAGIC THE PLAYER FINDS, SLOTS AND GROWS By default every combat game hands the player all three spells for free, from the first second, forever: nothing is earned and nothing is chosen. Write `teaches fire` (or `lightning`, or `ice`) after any thing and that thing stops being a keepsake — it becomes a POWER. The moment ONE materia exists anywhere in a game, the free trio is withdrawn: the player starts with NO magic and each spell key is filled only by a materia they have found and equipped. A game that never writes `teaches` is completely unaffected. World "reactor": item 🔥 fire crystal teaches fire # lying in the world — walk over it Character "the Sage": say The storm is yours now. give storm orb teaches lightning # a character hands it over Character "Trader": sells ember shard teaches fire for 30 gold # …or a shop sells it Enemy "Ice Wyrm": kind: wyrm drops frost stone teaches ice # …or the hardest fight pays it out When Ice Wyrm dies: give heart stone teaches fire # …or a scripted beat grants it - THREE MAGICS, and nothing else is one: `teaches fire` (🔥 Fireball), `teaches lightning` (⚡ Thunder), `teaches ice` (❄️ Blizzard). Friendlier words for the same three also work: flame · thunder/storm/spark/bolt · frost/snow/blizzard/cold. A word that is NOT a magic (`teaches maths`) is refused with a warning and the thing stays an ordinary item — never a dud power. - THREE SOCKETS, one per spell key. Picking a materia up slots it automatically while a socket is free; past that the player must choose. Equipping lives in the BACKPACK (press **I**, then Equip / Take off) — there is no second menu. The bag shows each materia's star row, the spell it casts, and which key it is on. - IT GROWS, and the growth is visible. A materia is ★1 when found and earns a star at 6, 16, 32 and 55 casts (★5 max). Each star is +22% damage AND one milestone tier, so a grown power visibly changes shape — more fireballs at once, more chained thunder targets, a wider blizzard. A SPARE COPY is worth a star immediately, which is how a story grants a power-up without a new keyword: hand the same materia over twice, or write `x2` on the floor line. - The id ignores the modifier, so every other line still refers to the plain name: `item 🔥 fire crystal teaches fire` + `Win when: player has fire crystal` is one item, not two. - Sockets, star levels and cast counts all survive Continue, portals and the phone's on-screen spell buttons. - Use it when the STORY is about earning power ("the Sage teaches you fire", "the crystal in the reactor core grants lightning"). For an ordinary fight, leave it out and the player keeps all three spells free. ### The LIMIT BREAK (`Limit:`) — the peak of a fight A fight has no peak on its own: the player shoots, dodges, and a bar empties. `Limit:` names the hero's ONE enormous move and gives the fight a moment the player EARNS and then chooses to SPEND. A meter fills as they deal damage and about 5.5× faster as they TAKE it — it is a comeback mechanic, so it arrives for the player who is losing. At full it turns gold and names its key; pressing **Q** (or the 💢 button on a phone) swings the camera onto the hero, stops the world for a beat, prints the move's name and clears the room. One top-level line, and it is entirely OPT-IN: a game that never writes `Limit:` has no meter, no key and no button. Limit: Omnislash # the hero has it from the first second Limit: Meteor after the reactor # …or they LEARN it, at a story beat you choose - WHERE IT GOES: at the FAR LEFT, like `Title:` / `Mode:` / `Stealth:`. One per game — the last one written wins. - THE NAME is yours and is shown to the player (HUD meter, the banner when they learn it, the card on the release). Keep it to a NAME — up to five words, no full sentences (a sentence is treated as ordinary story text, so `Limit: one wish, and one only.` stays prose). - `after <beat>` is the story gate, and it is the good version of this feature: until it passes there is no meter at all, and the moment it rises the game announces "💢 OMNISLASH LEARNED!" with a fanfare. Four shapes, all of which a kid guesses: - `after the reactor` — a plain story beat: the same name a `When …:` block writes with `raise the reactor`. - `after player has crystal` — they learn it by finding a thing. - `after talked to Mara` — a person teaches it. - `after quest "The Council" is done` — a finished quest teaches it. - BALANCE, so you can write a fight around it: an ordinary foe inside ~22 steps takes 480 damage (a grunt has 70, so a crowd simply ends). A BOSS instead loses a flat 18% of its own max HP — about five limit breaks for a whole boss, which means the move TURNS a boss fight and never replaces it. Never a critical hit: the number is authored, not a dice roll. - Alternative first words for the same line, if they read better in your story: `Limit break:` · `Overdrive:` · `Ultimate:` · `Special move:` · `Super move:` · `Finisher:`. - The meter survives Continue and portals, and it is strictly LOCAL in multiplayer — each player earns and spends their own, and nobody waits on anybody. - REFUSED, with a warning, in the two places it would be a dead HUD chip: `Mode: parkour` (nothing to unleash it on) and a game with no `Enemy` at all (nothing to charge it on). Give the game a fight and it works. - WRITE IT when the story has a hero with a signature move, a comeback, or a finale worth a camera. Leave it out of a quiet talking game. ### Game kinds (Mode) - (no Mode line) → STORY adventure: explore, talk, quest, win by dialogue/`Win when:`. - `Mode: waves` → wave BATTLE: fight `Waves: N` (default 5) waves of your enemies, boss last. Synonyms: battle, combat, arena. No enemies declared → a default roster is injected. - `Mode: parkour` → floating-platform jump course auto-built from the Title; enemies/allies are removed. Synonyms: platformer, jump. - `Mode: horde` → endless SURVIVAL arena: ONE flat open world, ever-growing swarms of your declared enemies (a default roster if none), pick-ups + an in-run shop; survive 15 minutes to WIN (the run keeps going after). Synonyms: hordes, survival, endless. Multiple worlds collapse into the single arena (no portals; every declared enemy joins the roster); an indoor world (dungeon/house) swaps to badlands. - waves/parkour/horde auto-win by their own rules — no `Win when:` needed. - Combat is batteries-included: every game with fighting hands the player three spells on keys 1/2/3 — 🔥 Fireball, ⚡ Thunder (chains between foes), ❄️ Blizzard (freezing ground zone) — and city worlds have parked cars the player can drive (walk up, press E). Nothing to author. (The ONE exception: a game that uses `teaches <element>` MATERIA starts with no spells at all — see Materia above.) ### Saving & Continue (automatic — you rarely write anything) - Every story game REMEMBERS ITSELF. Progress is written down at natural beats — walking into a new world, taking or finishing a quest, ending a conversation, plus a light periodic tick — so a two-hour adventure survives a closed tab. - On the game's start card a **Continue** button appears beside Start whenever a saved run exists. Start still means start: pressing it throws the save away. Finishing the game (win or lose) clears it too. - What comes back: the world you were in, where you stood, your HP, backpack, counters, story flags, quest progress, who you had already talked to, your weapon, your spells, and — in a materia game — which materia are socketed and the star level each has earned. - `Save: off` at the top level turns the whole layer off — no autosave, no Continue, every run begins at the beginning. Use it for a short arcade/score-attack game where restarting IS the game. Accepted values: `off`/`no`/`false`/`never` (and `on`/`yes`/`true`/`always`, which is just the default written out). - Nothing to opt IN to: leave `Save:` out and long stories save themselves. `Mode: parkour` (a time trial) and `Mode: horde` (an endless arena) never save — they are meant to be replayed from zero — and co-op rooms don't save either. - A save can never break a game: an unreadable or out-of-date one is ignored and the player simply gets a fresh run. ### Exact vocabularies - Worlds — the 44 places, in the order the /games shelf lists them. Write the WORD in a `World "…":` line: · 🚪 Walk into (COMPOSED buildings — rooms, furniture, inhabitants, a locked door; see Generated places): mansion/house · castle · school · shop (pizza shop, bakery, mall) · office · haunted house (hotel) · hospital (clinic) · prison (jail) · crypt (dungeon, cave) · 🏙️ Towns & cities: city (city-day) · city at night (city-night) · neon strip (city-neon) · slums (city-slums) · bombed city (city-ruins) · 🌿 Woods, fields & shores: forest · meadow · sakura · autumn · jungle · beach · reef · ❄️ Cold & high: snow · tundra · highlands · moon · 🔥 Hot & harsh: desert · canyon · savanna · badlands · volcano · wasteland · junkyard · ✨ Strange & magic: crystal · mushroom · candy · twilight · graveyard (cemetery) · swamp · old ruins (ruins) · 🏭 Indoors & machines [INDOOR]: reactor · tower · the science lab (write "specimen" or "experiment" — the word "lab"/"laboratory"/"clinic" builds the composed HOSPITAL instead) · the classic torch-lit maze (write "temple" — "dungeon"/"cave"/"crypt" build the composed crypt) · the classic procedural halls (write "indoors" — "house"/"home"/"mansion" build the composed home) - Creature kinds (14): skeleton zombie mummy drone dog wolf raider robot slime bat spider ghost wyrm golem - Weapons (8): pistol smg shotgun crossbow blaster dagger sword hammer - Music moods (13): ambient exploration fantasy battle horror mystery town cinematic sad victory scifi jazz_funk menu - Boss attacks (4): slam volley charge summon — fight roles (5): melee swarm ranged flanker support - Materia elements (3): fire lightning ice — accepted synonyms: flame/burn/ember/heat→fire, thunder/storm/spark/bolt/electric/shock→lightning, frost/snow/blizzard/cold/freeze→ice - Colors: red blue navy green yellow orange purple pink black white grey brown teal cyan gold maroon (hair also: blonde) - Model words (`model:` / `looks:`, ONE word): wizard witch king queen princess farmer police pirate astronaut soldier swat robot mech ghost zombie skeleton slime drone bee golem alpaca woman girl man adventurer hero runner cube punk suit worker beach hoodie casual medieval scifi formal · queen/princess (Greek vasilissa/prigkipissa) wear the medieval gown — there is no woman's `king`, so a queen is written as a queen · synonyms: mage→wizard, cop/officer→police, explorer→adventurer, captain→pirate, robot/mech→the same mech body, spacesuit→astronaut, girl→woman (Greek/Greeklish accepted: μάγος/magos → wizard). Shared outfits (suit worker punk casual soldier swat) follow `gender:` — a girl/woman wears the woman's cut. ### Hard limits (the parser clamps/culls past these, with warnings) 6 worlds · 24 characters · 16 enemy types · 20 allies per world (globals count in every world) · 12 dialogue pages per node · 3 choices per menu · 12 dialogue nodes per character · 8 Story lines · 220 chars per Story/Ending line · 30 copies per item · loops ≤30 reps & ≤1500 expanded lines · tier 1–50 · waves 1–50 · boss phases ≤3 · 3 boss phase lines (160 chars each) · boss arena 12–60 · hp ≤5000 · speed ≤30 · dmg ≤200 · 8 cutscenes & 16 beats each (a `wait` is clamped to 6s) · guard sight 8–60 · 3 materia sockets · materia stars 1–5 ### Common mistakes (avoid these) 1. `Win when: talked to X` without declaring Character "X" → fatal error. A `Quest` step naming an undeclared target is fatal too — declare every step's Character/item/Enemy. 2. `gives:` without `wants:` on the same character → demoted to a plain gift. 3. A 4th `if choice is` on one menu → dropped with its whole body. Split across pages instead. 4. Expecting a top-level `win` to work in a populated game → it only fires inside dialogue; use `Win when:` for global rules. 5. Using `trust_x` as a win goal → rejected; use a normal counter. 6. Forgetting that `Mode: parkour` deletes all enemies/allies/quests — parkour is Title + Mode only. 7. Story games don't need combat: don't force enemies into a quiet quest. 8. `Win when: player has N X` (e.g. `player has 20 coin`) requires HOLDING N of that physical `item`. If the "coins" are earned as points (not floor pickups), model them as a counter instead: `coins + 1` + `Win when: coins is 20`. 9. Every game needs an explicit win: a `Win when:`, a `win` in a reachable choice, or a top-level `Quest` block. A lone `wants:` is NOT a win. 10. Inside a generated place (`World "castle":`…) never write your own `item 🗝️ key` — one item with "key"/"keycard" in its name suppresses EVERY key the plan drops, and a layout that locked two doors is then one key short. Let the keys be automatic; use `at: <room>` to put YOUR items and characters where the story wants them. 11. `at: throne room` only means a room inside a GENERATED place. In an open biome (`World "forest":`) the only placement is the compass (`at far north`) — a room name there is ignored. ## Worked examples (each is a complete, winnable game) ### 1 · Story adventure (quest, gift, multiple endings) Title: The Lighthouse Secret Story: The light went out last night. The fishing boats are lost in the fog. Ending "hero": The light burns again. The boats come home. ⛵ Ending "quiet": You kept the secret. The sea keeps its ghosts. World "beach": Character "Old Keeper": say The lamp wants its 💎 sun-crystal back. wants: 💎 sun-crystal gives: 🗝️ brass key if talked before: say Check the cave, past the rocks. item 💎 sun-crystal @cave World "cave": Character "Echo": say Some lights are better left dark… if talked to "Old Keeper": if choice is "Relight the lamp": win hero if choice is "Let the sea rest": win quiet else: say Come back when the Keeper has told you his side of it. ### 2 · Wave battle (boss, roles, weapon) Title: Last Stand at the Canyon Mode: waves Waves: 6 Weapon: crossbow World "canyon": Enemy "Raider": kind: raider fights: melee Enemy "Sharpshooter": kind: drone fights: ranged tier: 8 Enemy "Warlord": attacks: slam volley / charge / summon phases: 3 arena: 30 says: You are late. They are already gone. says: Enough of this. last words: ...tell them... I held... Ally "Scout": kind: dog ### 3 · Parkour course (the Title shapes the course) Title: Cloud Kingdom Dash Mode: parkour World "snow": ### 4 · Generated place (a castle with named rooms, `at:`, the automatic locked door, default inhabitants) Title: The Stolen Crown Story: The crown vanished from the throne room at dawn. Story: The guards swear nobody passed the gate. Ending: The crown is back where it belongs — and the castle cheers your name. 👑 World "castle": Cutscene "the empty cushion": at start look around look at King for 2 King says It was here at the night bell. It is not here now. say Somewhere below, a door closes. Character "King" at: throne room say My crown! Gone before breakfast! say Someone hid it down in the dungeon cells. Bring it back and the kingdom is in your debt. wants: 👑 crown gives: 🏅 royal medal if talked before: say The cells are below the great hall. Mind the locked doors — their keys are somewhere in the castle. Character "Cook" at: kitchens say Psst. I saw the steward sneaking toward the cells with a sack. Take a pie — you'll need your strength. give 🥧 pie Character "Steward" at: dungeon cells say Fine, FINE — I only borrowed it for the weighing of the taxes! if choice is "Hand it over": say *sighs* Take it. Tell the King I'm sorry. if choice is "Why the cells?": say Nobody ever looks here. Except you, apparently. item 👑 crown at: dungeon cells Win when: player has royal medal Why it works — the whole loop inside one generated place: `World "castle":` builds a furnished keep with guards, cooks and courtiers already walking its halls, so only the THREE characters the story needs are written. The `Cutscene` indented inside that World is its opening shot: the camera pulls back over the plan, holds on the King and lets him speak before the player has moved. `at: throne room` / `kitchens` / `dungeon cells` pin the cast to named rooms — the plan is BUILT to contain them. The crown lies in the cells behind the story (`at: dungeon cells`), never behind a key the author wrote: the castle locks a door or two and drops its OWN 🗝️ keys, which is what turns the walk down to the cells into a search, and the Cook's line stays true for any layout. The fetch (`wants:` → `gives:`) pays out the medal, and `Win when: player has royal medal` ends it. ## Links - Studio (live editor): https://vxlverse.com/studio-live - Open-a-script deep link: https://vxlverse.com/make?code=<url-encoded VXLScript> - Human guide (same language, illustrated): https://vxlverse.com/guide - Play ready games: https://vxlverse.com/games · Community games: https://vxlverse.com/explore - X/Twitter: https://x.com/strugglecoder · YouTube: https://www.youtube.com/@theStruggleCoder