Game Studio – Plan
A website that collects the design tools for Keystone in one place, with sidebar navigation. No login to start.
Exported from the claude.ai "RPG Game" project on 2026-11-13. The project copy is the source of truth; re-export after changes.
Decisions so far
- Stack: full-stack Next.js. The database does not have to be SQLite; Postgres via Coolify is the natural fit.
- Hosting: Anvi's Hetzner server running Coolify. There is no login, so protect it at the proxy (basic auth or Tailscale), especially since AI generation costs money per call.
- Class designer and gear designer: rebuilt from scratch, using the old Keystone Class Designer and Gear Forge only as inspiration.
- Look and feel: the same visual language as the original Keystone Class Designer, a WoW / Warcraft III "game window":
- Panels and frames: warm near-black panels (#0b0907 to #14110d) with brass frames (#8a7444 / #4a3d24) and square corners.
- Type: Marcellus for headings, names and buttons (gold #f2c14e); Alegreya Sans for body text.
- Selected items: a brown-gold gradient with yellow (#ffd100) text.
- Status colors: green (#4fd14f) for ranks and OK states, red (#ef5a4a) for warnings.
- Icons: colored radial-gradient tiles with a light glyph.
- Talents: tiles with the icon and name side by side, a rank badge in the corner and a row-number gutter.
- Tooltips: a dark tooltip with a gold edge, a white title and yellow description text.
- Shared rules registry: stats, resources, roles, rarities and armor types are defined once and used by every tool. Every design object gets a stable ID, matching the GameDatabase model in game-design.md. Each resource has a singular and a plural name (Soul / Souls).
- Hybrid builds are a core feature.
- Talents in one specialization tree may modify abilities unlocked in another.
- The tools must treat this as normal and validate across all trees.
- Notes: one big pure canvas (Excalidraw embedded in Next.js; the scene is stored as JSON in the database).
- Icons: AI-generated.
- An Art Style page holds a versioned style: style prompt, reference images, an "avoid" list, composition rules and a provider.
- Icons are generated from a description, or with "Generate icon" on an ability in the class designer.
- Several variants are generated and one is picked; it is saved as an asset with a stable ID and linked to an ability or other object.
- The prompt, model and style version are stored with the icon so it can be regenerated.
- Icons are generated without a frame; the game UI draws rarity and school frames.
- Anvi has two reference images still being polished.
- Provider: generation sits behind our own interface. Start with OpenAI GPT Image or Gemini Image, and consider Scenario custom models if style consistency is not good enough.
Class structure (Anvi's spec)
A class consists of:
- Class name
- A short class fantasy
- Roles: derived from the specializations, never set by hand. The class's roles are the roles its specializations have.
- A primary resource
- An optional secondary resource, with a max value and a plural name
- Specializations, at most 3. Each has a role, name, icon, flavor text and a 4×5 talent tree. The fifth row is always two capstones: two distinct paths the specialization can take. The capstone rules matter most to the class design skill, which will be updated later.
- A shared class ability pool
- Two class passives. Each passive is either a stat bonus ("group gains [value] [%/flat] [stat]") or a custom description that follows the ability description rules.
Class designer screen
- Identity: name, armor type, class color and class fantasy.
- Resources: primary resource, plus an optional secondary resource with a max value and a plural name.
- Specialization cards. Each card has:
- icon, name and a role picker
- flavor text
- the two capstone paths: path name plus capstone talent
- abilities from this tree: what the tree unlocks or replaces, with "(replaces X)" notes
- a footer with the talent count, the number of hybrid links, and "Open tree →"
- Roles panel: read-only. It lists each role and the specialization(s) that give it, or "No specialization".
- Class passives.
- Ability pool table.
- No checks panel: removed at Anvi's request.
Ability editor
Abilities are kept simple, WoW-style, with a free-text description. Fields:
- Icon (generate), name, type (Damage / Healing / Utility)
- Target:
- Enemy
- Ally
- Enemy or Ally: harmful on an enemy, helpful on an ally, casts on yourself with no valid target
- Self
- Ground: placed with the mouse
- Direction: aimed toward the mouse cursor when cast; the character does not turn
- None
- Range applies to Enemy, Ally, Enemy or Ally, Ground (placement range) and Direction (length).
- Cast: Instant, Cast, Channel or Toggle. Cast and Channel have a time.
- Cooldown and charges
- Off global cooldown: a checkbox, for interrupts and defensives. New abilities default to on the GCD.
- Cost:
- Fixed, a range (e.g. 1–3 Souls), all available, or nothing.
- The resource can be the primary, the secondary or Health. Health costs are a % of max health.
- Drains (toggles only): an amount of a resource per sec while active.
- Generates: an amount of a resource. The tooltip adds it automatically.
- Description (free text)
The tooltip is shown WoW-style:
- Cost on the left, range on the right.
- Cast on the left, cooldown on the right.
- The description below, in yellow.
Display rules:
- No range is shown for Self or None.
- A range of 5 yd or less shows as "Melee range".
- More than one charge shows as "N charges · X recharge".
- Resource names use the plural form when the amount is not 1.
- A toggle with a cost and a drain reads "10 Rage, then 2 Rage per sec".
- Tags are derived from the fields: target, off-GCD, usable while moving.
Description rules
- Start with what it does, in present tense: "Deals …", "Heals …", "Stuns …", or a short themed phrase that leads into it: "Consecrates the land beneath you, causing …".
- Every scaling number goes in braces as a base value plus a percentage of a stat:
{80 + 60% AP},{45% SP},{120% WD}. The stats are AP (Attack Power), SP (Spell Power), HP (max health) and WD (weapon damage). - Name the school right after a damage number: "{…} Fire damage".
- Say who it hits: "to an enemy", "to all enemies within 8 yd".
- Effects over time: write the total, then the duration: "{…} Shadow damage over 12 sec".
- Fixed numbers stay plain text: "for 3 sec", "up to 5 targets".
- Counts on a target are "stacks", never "charges": "Stacks up to 5 times."
- Don't write costs, drains or generation in the description; the fields add them.
- Mechanics stay exact and complete. A few words of theme that fit the class are fine ("Finishing move that disembowels the target"); no lore, separate flavor sentences or design notes.
The tooltip can show either computed values (from sample stats in the studio, real player stats in game) or the formulas. The editor flags braces it cannot parse.
Talent tree editor
- One tab per specialization, showing its role and the points spent in it.
- The point budget is shown across all trees (21 total, shared by the class).
- Rows 1–4 hold 4 talents each. Each row shows its point requirement: 0, 3, 6, 9 or 12 points spent in earlier rows of the same tree.
- Row 5 holds the two capstones. Each has a path name, is always 1 rank, and only one can be taken per tree.
- Each talent has an icon, a name, a max rank (1–3), a kind and a description.
- Kinds:
- Passive
- Unlocks: teaches one ability. Always 1 rank.
- Modifies: links to one or more abilities from the class pool, from any tree.
- Replaces: swaps one ability for another. Always 1 rank.
- A colored left edge on the talent tile shows its kind. A ⇄ marker shows a talent that modifies an ability from another tree (a hybrid link). Its tooltip and ability chips name that tree.
- Per-rank values:
{2/4/6}. They also work inside formulas:{20 + 10/20% AP}. The tooltip previews each rank WoW-style, with "Rank X/Y" and "Next rank:". - Description check: the editor flags braces it cannot read, a value count that doesn't match the max rank, and a fixed number on a multi-rank talent.
- Two modes:
- Design: click a talent to edit it.
- Test build: spend points across all three trees, as in a real build. It enforces:
- row requirements in each tree
- the shared 21-point budget
- one capstone per tree
- The test build lists "Abilities in this build": baseline abilities, plus abilities from any tree with the tree and row they came from, plus replaced abilities struck through.
- Dependency warnings: a taken Modifies talent warns only when none of its linked abilities are in the build. The warning explains why: the ability is unlocked by a talent in another tree (naming the tree and row), or it was replaced.
Reviews
Review 1: "Stormcaller" (Damage / Healer / Support, Mana + Static)
The first review found gaps in 5 of 16 abilities and 4 of 10 talents. All were fixed:
- Target type
- Off global cooldown
- Multi-ability talent links
- Per-rank values inside formulas
- Custom passives
- A "Generates" field
- Variable and "all" costs
- WD stat token
- Health cost
- "Replaces" talent kind
- Toggle cast type
- The over-time rule (write the total)
- "Stacks" wording
- Unlock talents locked to 1 rank
- Dependency warnings
Review 2: "Gravewarden" (Damage / Healer / Tank, Mana + Souls)
The mockups' own logic was run against the test cases in Node.
- All review 1 fixes worked.
- Two bugs were fixed: replaced abilities still counted as owned, and talent descriptions had no check.
- New findings, all now applied:
- Plural resource names
- Health cost as % of max health
- Enemy-or-Ally target
- Toggle drain
- Directional target
- Hybrid-aware test build across all trees
Review 3: verification run
- Abilities: every new field was checked in Node:
- "All Souls", "1–3 Souls", "1 Soul", "Generates 2 Souls"
- "10% of max health"
- "2 Rage per sec" and "10 Rage, then 2 Rage per sec"
- a drain is ignored on non-toggles
- Enemy or Ally
- Direction, with a "Length" label
- Hybrid build: Banneret (support) took Banner Wall, which modifies Shield Wall:
- Without Shield Wall, it warned "Shield Wall is unlocked by the Shield Wall talent (Bulwark, row 2)".
- The warning cleared after 4 points in Bulwark.
- Vanguard's Lance Charge and Banneret's Battle Standard replacing Rallying Banner all showed correctly in "Abilities in this build".
- Row gating blocked a row-4 Banneret talent until 9 points were spent in that tree.
Later
- Status effect library: buffs and debuffs as objects with duration, stacking and dispel type (GDD §6). Today they only exist as text in descriptions.
- Summons, transformations and procs: text only for now.
- Tick rate for damage-over-time and channel effects, if the game needs it as data.
Design doc follow-up
- Directional abilities change GDD §21. The GDD says the mouse only places ground spells and does not aim normal attacks. A "Direction" target type means some abilities are aimed toward the cursor. game-design.md needs updating if this is kept.
Sidebar (draft)
- Dashboard
- Design: Classes, Gear, Affixes, Enemies
- Create: Icons, Art Styles, Notes, 3D models (later), Spell animation (later)
- System: Rules & stats, Export to Godot, MCP
Still open
- Whether the two class passives are the group passives from game-design.md (pick one of two).
- Update GDD §21 for directional abilities.
- What the gear designer should look like this time.
- Affix and enemy designer screens.
- Text generator: what it should do.
- Export format for Godot (.tres or JSON).
Mockups
The source of every mockup screen is in docs/mockups/. See the README there.
- Sidebar
- Dashboard
- Icon generator
- Art style
- Notes board
- Class designer
- Ability editor
- Talent tree editor