1. Overview
A static, browser-only suite of ten interconnected tools for designing tile-based games. There is no backend, no account, and no installation. Open index.html in a browser and start authoring. All state lives in memory and is serialized to JSON for export and snapshots.
- Tilemap — square/hex grid editor with strategy-grade extensions (markers, elevation, symmetry, validation).
- Dialogue — node-based dialogue trees with conditions, effects, locales, and a graph view.
- Quests — multi-quest designer with structured rewards, prereqs, branching outcomes, and a DAG view.
- Stats — characters with class templates, abilities, equipment, resistances; combat sims and TTK heatmap.
- Loot — weighted tables with conditions, qty ranges, nested sub-tables, seeded rolls, distribution chart.
- Names — parts, Markov-chain, and surname combinator generators with custom banks.
- World map — image-backed annotator with typed routes, layers, distance ruler, and NPC links.
- Timeline — multi-animation planner with sprite sheet binding, audio cues, easing per keyframe.
- Hitboxes — frame-aware hit/hurt boxes with knockback, hitstun, priority, mirror, onion skin.
- Save editor — JSON editor with schema validation, migrations, JSONPath, deep diff, replay scrubber.
- Library — assets (items, NPCs, locations, factions) with stable IDs that other tools reference.
- Play — reference runner that consumes your project and walks dialogue / quests / loot live.
2. Quick start
- Author a few characters in Stats, then add an item in Library.
- In Quests, add a quest with one objective and a reward referencing that item.
- In Dialogue, add two nodes; on the first choice set
effecttoquest.start = q_xxxusing your quest's id (visible in the JSON panel). - Switch to Play ▶, pick a hero and the dialogue start node, hit Start, click choices, then Mark objective ✓.
- Export Suite at the top to save everything to a JSON file. Reload via Import.
3. Keyboard shortcuts
| Keys | Action |
|---|---|
| Ctrl+Z | Undo (whole-state snapshot) |
| Ctrl+Y or Ctrl+Shift+Z | Redo |
| Ctrl+S | Open named snapshots |
| Ctrl+F | Find/replace across whole project |
| Ctrl+N | Open notes for the active tool |
| ? | Open this guide |
| 1–9, 0 | Switch to tool 1–10 (sidebar order) |
| Esc | Close any open modal / blur the focused field |
Inside text inputs, only Esc is captured (to blur). Other shortcuts pass through.
4. Cross-cutting features
Snapshots
Named snapshots are stored in localStorage under gameDevSuiteNamedSnapshots. Open the modal, give a snapshot a name, save. Each entry shows a load / export / delete trio. Loading replaces the whole project (with a confirm prompt).
Autosave
Every 30 seconds the project is serialized to localStorage at gameDevSuiteAutosave. On next load, if the autosave is less than seven days old, you'll be prompted to restore.
Find / Replace
Searches every string value across the entire suite — quest titles, dialogue text, tile tags, item descriptions. Supports regex and case-sensitive flags. Replace-all rewrites in place. Click any match path (e.g. quests[2].objectives[0].text) to inspect.
Notes (per tool)
Press Ctrl+N to open a notes textarea scoped to the currently active tool. Notes survive with the project and appear in the Markdown design-doc export.
Validate
The topbar Validate button surfaces all cross-tool issues: dialogue choices pointing to missing nodes, tile layers with unknown tile ids, quest rewards referencing a deleted library item, character abilities with stale ids, world pins linking dead NPCs, duplicate ids across tool kinds, and more.
Exports
Export Suite saves all 13 sections as one JSON file. Export Doc generates a Markdown design document spanning every tool with embedded notes. Each tool has its own per-section Export JSON button for partial exports.
5. Tilemap editor
Square or hex grids up to 256 × 256. Designed for strategy levels but generic enough for tactical, top-down, or 4X games.
Map metadata
Name, description, max players, victory condition, turn limit, recommended army size. Flows into the project export and the Markdown doc.
Tools
- Brush / Eraser — paints (or clears) the active tile id with the chosen brush size.
- Fill — flood-fills connected same-id cells.
- Rectangle — drag from corner to corner.
- Marker — places spawns, objectives, or resource nodes (sub-type chosen in Markers panel). Click an existing pin to remove.
- Select — drag a rect; then Save Stamp / Copy / Cut / Paste / Delete.
- Noise fill — flood-fills a region using the active tile group's weighted distribution.
- Elevation + / Elevation − — bump the per-cell elevation 0..9. Used by line-of-sight as occluder.
- Path preview — click two tiles; A* over
walkable+costdraws the cheapest path. - Line of sight — click an origin; tiles within range are tinted green, with non-walkable cells and elevation acting as occluders.
Symmetry brush
Off / horizontal / vertical / 180° / hex 6-way. Mirrors every paint, fill, and rect operation. Use for fair multiplayer maps. Hex-6 uses cube-coordinate rotation around the map center.
Tile types
Each tile has id, name, color, walkable, cost, damage, defense, tags. Custom tiles are added via the "Add Tile" row.
Tile groups + noise fill
Define a "biome" group with weighted parts (e.g. forest 60, grass 30, stone 10). Activate the group, switch tool to Noise fill, click a tile to flood with weighted random samples.
Stamps
Select a region → enter a name → Save Stamp. Saved stamps persist in the project. Click Place on a stamp to arm it; the next canvas click pastes its tiles, elevation, and markers.
Layers
Multiple painting layers; each has visibility. Markers and elevation are global, not per-layer.
Pan / zoom
Zoom slider 0.25× – 3×. Large maps scroll within the viewport.
Validate Strategy
Reports unreachable spawn pairs, resource imbalance per spawn within 8 tiles, choke-point tiles (Tarjan articulation), objectives placed on non-walkable cells, and missing spawns vs maxPlayers.
Tiled compatibility
Tiled JSON exports an orthogonal or hexagonal map with a tileset where each tile carries its custom properties. Import Tiled reads the same shape back.
6. Dialogue tree builder
Author branching dialogue trees with conditions, effects, portraits, moods, and locales.
Node fields
id— string used as a target by other nodes.speaker,portraitURL,mood(neutral / happy / sad / angry / wary / excited / tired).textin the default locale; per-locale text intextLocales.choices— each choice hastext,target,condition,effect.
Conditions
Condition strings are evaluated in a sandboxed with(vars) scope. Use the topbar Preview vars JSON field to feed values, e.g. {"flag.met":true,"var.gold":10}. Examples:
flag.met flag.gold > 100 !quest.started
Effects
Statements separated by ;. Supported scopes: flag.x, var.x, quest.start. Operators: =, +=, -=. Examples:
flag.met = true var.gold += 50 quest.start = q_lanterns
Variable interpolation
Use {{var.name}} or {{flag.foo}} in any node text or choice text. The Play tool exposes the hero name as var.name automatically.
Locales
Add a locale code in the topbar; the editor swaps the text textarea to that locale. The default en stays in node.text; other locales live in node.textLocales[code].
Graph view
Toggles an SVG flow chart with nodes and arrows. Drag any node to reposition; coordinates persist in state.dialogue.layout and survive save/load.
Twine import
Reads either a Twine JSON export (passages[]) or a Twee/.tw file. Each passage becomes a node; [[link]] blocks become choices.
Validation
Validate Links reports any choice whose target id no longer exists.
7. Quest designer
Multi-quest tool. Pick the active quest in the dropdown; everything below it edits that quest.
Fields
- Title, summary, giver NPC (picker from Library), time limit, repeatable.
- Objectives — text, kind (step / kill / collect / talk / reach), count. Reorderable with ↑ ↓.
- Rewards — kind: xp / gold / item / label. item picks from Library.
- Prerequisites — quest done / flag / level / label. quest picks from your other quests.
- Outcomes — branch (success / fail / alt) with text and a list of side-effects (auto-applied in Play).
DAG view
Toggle to see a textual dependency graph: each quest lists which other quests must be done first (via quest done prereqs).
8. Character stat balancer
Roster
Each row is a character: name, class (from class templates), level, HP / ATK / DEF / SPD, abilities (free-form list of ability ids), and computed stat budget.
Class templates
Each class has base stats and per-level deltas. Apply class curves recomputes every character's stats from class + level.
Abilities
Define abilities with kind (single / aoe / heal / buff), power multiplier, element (matches resistance keys), and cooldown.
Resistances & equipment
Per-character resistance multipliers per damage type; equipment slots (weapon / armor / accessory / trinket) pull from Library items.
Combat sims
- 1v1 Sim — first vs second character; reports turns-to-kill each way.
- Party Sim — splits roster in half, runs a turn-based brawl, reports winner.
- TTK Heatmap — every character vs every other; cells colored from green (fast kill) to red (slow).
Normalize Budget
Scales each character's stats so all converge on the average stat-budget — useful for re-balancing a roster.
9. Loot table generator
Row fields
item label, library item link, rarity, weight, qty range, min level, biome, nested sub-table.
Conditions
Set player level and biome filter in the topbar to filter the active table before rolling. A row with minLevel = 5 is excluded if the player's level is below 5.
Nested sub-tables
Define a sub-table from the collapsed panel. Set a row's Nest column to a sub-table; when that row is rolled, the sub-table is rolled instead (recursively, max 5 levels).
Seeded rolls
Type any string in the seed field. The Mulberry32 PRNG re-seeds on every roll, so the same seed produces the same rolls.
Charts
Bar chart shows weight per row at a glance. Sim 1000 rolls and reports cumulative drops by item.
10. Procedural name generator
- Style — built-in (fantasy / scifi / cozy) or any custom bank you create.
- Mode:
- Parts — concatenates one element from each part list.
- Markov — trains a 2-order chain on the corpus textarea (or the active bank's pooled parts) and samples names.
- Combinator — first name + appended title (
"the Bold","of the Hollow", etc.).
- Unique — drops duplicates within the current generation.
- Custom banks store a list of part-arrays. Edit the parts JSON via the bank's Edit parts button.
11. World map annotator
Modes
- Pin — drops a labeled pin on click. Optionally link a Library NPC; pin colors purple when linked.
- Route — click two points to draw a typed route (road / river / sea / trail). Each type has its own color and dash style.
- Region — click 3+ points; the polygon is filled.
- Measure — click multiple points; pixel distance shown beneath the canvas.
Layers
Add political / biome / trade / climate layers; toggle visibility independently. Each new pin / route / region gets the active layer's id.
Background image
Upload a PNG / JPEG via the file input; the canvas fits it. Export PNG downloads the canvas.
Grid
Toggleable 40-px grid for spatial reference.
12. Animation timeline planner
Multiple animations
Switch via the dropdown; each has its own name, fps, frames, tracks, events, audio cues, and sprite-sheet assignments.
Keyframes
Click any frame cell on a track to toggle a keyframe. Each key has an easing hint (linear / ease-in / ease-out / ease-in-out / step) — currently editable through the JSON panel.
Sprite sheet
Upload a sheet, set cols / rows / frame W×H. Cells appear in the preview. Click a cell to select it, then click a frame cell on a track — the frame is bound to that sprite index in spriteFrames.
Audio cues
Add a frame number, a label, and optionally an audio file. During Play, each cue fires at its frame.
Onion skin
Toggle to dim adjacent frames during preview (rendered live in tracks).
13. Hitbox editor
Drag on the canvas to draw a box on the active frame. Each box stores type (hurt / hit / block / grab), shape (rect / circle), x/y/w/h, frame, damage, knockback X/Y, hitstun, priority, mirror.
- Onion 0..10 — show boxes from neighboring frames as dashed outlines.
- Copy → next frame — clone the active frame's boxes onto the next frame.
- Mirror — duplicate the current frame's boxes flipped across the canvas, with knockback X negated.
- Sprite-sheet metadata fields are stored on
state.hitboxSpriteSheet(cols / rows / frame W×H). - Frame data table at the right summarizes box counts per frame.
14. Save game editor
Edit any JSON save file. Distinct from the project JSON — this is for in-game runtime saves.
- Format / Minify / Sample for quick text ops.
- Search across all keys and values.
- JSONPath — type
$.player.goldor any deep path; the result appears in the summary. - Schema — required keys one per line; optional
key:typedeclares the expected JS type (string,number,boolean,array,object). Validate Now runs it. - Migration — paste a JS function body that mutates
data; it's wrapped as(data) => { … return data; }and applied to the editor's contents. - Snapshot stores the current JSON in
saveSnapshots; the slider scrubs through them as a replay. - Diff — pick a second JSON file via the diff input; deep recursive diff prints changed paths only.
15. Asset library
The single source of truth for items, NPCs, locations, and factions across the suite. Each entry has a stable id; other tools reference by id.
- Items — name, kind (weapon / armor / consumable / key / quest / misc), icon (any character/emoji), description.
- NPCs — name, role, dialogue root id, description.
- Locations — name, region, description.
- Factions — name, color, description.
Filter the active kind via the dropdown; search filters within the kind. Add or delete entries; references in other tools update on render.
16. Play (reference runner)
Walks your project as a tiny game. Pick a hero (from Stats), starting quest, and starting dialogue node. The runtime maintains flags, vars, inventory, and objectiveStatus.
- Choices that fail their
conditionare hidden. - Choice
effectstrings fire on click and update flags / vars / start quests. - Roll loot uses the loot table with the hero's level as filter context.
- Mark objective ✓ advances the active quest's first incomplete objective. Completing all of them fires the
success-branch effects. - The Game log records every step; the runtime JSON is exposed in the right panel.
17. Exports & file formats
Suite JSON
One file with every section: tilemap, dialogue, quests, characters, classTemplates, abilities, lootTable, lootTables, generatedNames, nameBanks, worldMap, animations, hitboxes, saveGame, saveSchema, saveSnapshots, library, notes, flags.
Per-tool JSON
Each tool's Export JSON button writes only that section.
Tiled JSON
Tilemap exports as Tiled-compatible JSON (orientation: orthogonal | hexagonal, tilesets with custom properties).
Markdown design doc
Export Doc writes a single .md with a section per tool, embedded notes, and tables for characters, loot, and library entries.
Save game JSON
Independent of the suite JSON — meant for runtime save files of your eventual game.
18. Tips & troubleshooting
- Stable ids matter. Library, quest, character, and ability ids are referenced by other tools. Renaming them via JSON edit will break references — use Validate to find them.
- Use named snapshots before risky edits. The undo stack is whole-state JSON; it caps at 80 entries and may not survive a refactor pass.
- Find/replace runs over the whole project. Inspect matches before clicking Replace All.
- Performance. 256×256 tilemaps render every cell as a button; expect a slight pause on regenerate. Articulation-point validation is O(V+E) but allocates strings for keys.
- Browser-only. File drops, audio, and image previews use object URLs — they don't survive a refresh. Re-upload sheets and audio after reloading a project.
- Print this guide. Use Print / Save as PDF at the top of this modal. Modern browsers can print directly to PDF.