Quest Forge Wizard
The Quest Forge is the foundation wizard of the Simple Quest Forge ecosystem. Every quest you create here becomes available to Quest Chain Forge (as chain steps) and can be referenced by the Procedural Quest Forge for template-based generation. The Quest Forge is always your starting point — define your quests once, use them everywhere.
Open the wizard via Window › Simple Quest Forge › Quest Forge Wizard. It
walks you through a 5-step process to define your quest properties, create quests
with objectives, rewards, and prerequisites, configure output paths, and generate a complete
database with type-safe enums and a custom Inspector editor.
The Quest Forge is unique among the Forge ecosystem because it uses a two-level dynamic property system. You define properties at both the quest level AND the objective level, giving you unprecedented flexibility in how you structure your quest data.
The Two-Level Property System
Unlike Simple Enemy Forge (which has a single-level property system), Simple Quest Forge defines dynamic properties at two separate levels. This is the most powerful feature of the Quest Forge and the key to its flexibility.
Quest-Level Properties
Properties that describe the quest as a whole. These are attached to the quest itself and apply globally to the entire quest. Think of these as the "big picture" attributes of a quest.
| Property Type | Stored As | Example |
|---|---|---|
| Category | int[] categoryValues |
Quest Type (Kill, Fetch, Escort), Region (Forest, Desert, Dungeon), Difficulty (Easy, Normal, Hard) |
| Flag | bool[] flagValues |
Is Repeatable, Is Hidden, Is Timed, Auto-Accept |
| Numeric | float[] numericValues |
Recommended Level, XP Reward, Gold Reward, Time Limit |
| Text | string[] textValues |
Journal Entry, Completion Dialogue, Failure Message |
Objective-Level Properties
Properties that describe individual objectives within a quest. These are attached to each objective and can vary from one objective to another within the same quest. Think of these as the "per-task" attributes within a quest.
| Property Type | Stored As | Example |
|---|---|---|
| Category | int[] categoryValues |
Objective Type (Kill, Collect, Talk, Explore), Tracking Mode (Automatic, Manual) |
| Flag | bool[] flagValues |
Is Tracked, Show on Map, Has Waypoint |
| Numeric | float[] numericValues |
XP Multiplier, Difficulty Bonus, Priority |
| Text | string[] textValues |
Hint Text, Map Marker Label, Completion Text |
This two-level system means a quest and each of its objectives can have completely different property values. A "Kill 10 Wolves" objective might have an XP Multiplier of 1.5, while the parent quest has a Recommended Level of 5 and a Region of "Forest". Each level is independent.
GetCategoryLabels(), GetFlagNames(), etc. Objective-level metadata is
accessed via GetObjectiveCategoryLabels(), GetObjectiveFlagNames(), etc.
This means your game code can distinguish between quest-level and objective-level properties and
display them appropriately in your UI.
Understanding the Four Property Types
Before diving into the wizard steps, it helps to understand what each property type does and when to use it. These four types cover virtually any data you might want to attach to a quest or objective.
Categories
A Category is a dropdown menu. You define a label (e.g., "Quest Type") and a list of entries (e.g., "Kill", "Fetch", "Escort", "Talk"). Each quest or objective stores an integer index pointing to the selected entry. Categories can be single-select or multi-select (when Allow Multiple is checked).
When to use: Whenever you need a fixed list of options to choose from. Quest types, regions, biomes, difficulty tiers, objective types — anything where the possible values are known in advance.
Flags
A Flag is a simple on/off toggle (boolean). You define a name (e.g.,
"Is Repeatable") and each quest or objective stores true or false.
Flags are displayed as full-width ToggleLeft controls in the wizard, one per row.
When to use: Binary attributes that are either true or false. "Is this quest repeatable?", "Is this objective optional?", "Should this show on the map?", "Does this require a party?"
Numerics
A Numeric is a number value (stored as float). You can optionally
define whether it should be treated as an integer, whether it uses a range with min/max constraints,
and default values. Good for anything quantitative.
When to use: Any numeric data. XP rewards, gold amounts, recommended levels, time limits, reputation gains, multipliers, cooldown durations — any value that's a number.
Texts
A Text is a free-form string. You define a name (e.g., "Journal Entry") and each quest or objective stores a string value. Text fields use scrollable TextAreas in the wizard for comfortable editing of longer content.
When to use: Narrative content, descriptions, hints, dialogue snippets, lore entries, map marker labels — anything that's free-form text rather than a number or a selection from a list.
Genre Templates
Step 1 of the wizard offers a template dropdown that pre-populates your property definitions with genre-appropriate categories, flags, numerics, and texts at both quest and objective levels. Templates also include example quests with full objectives, rewards, and prerequisites — giving you a head start and showing you what well-structured quest data looks like.
| Template | Quest-Level Props | Objective-Level Props | Examples | Highlights |
|---|---|---|---|---|
| None | 0 | 0 | 0 | Blank canvas — define everything from scratch |
| Generic RPG | 3C + 2F + 3N + 1T | 1C + 1F + 1N + 1T | 3 | Quest Type, Region, Difficulty, kill/collect/escort objectives, XP/Gold rewards |
| Open World | 4C + 3F + 3N + 2T | 1C + 2F + 1N + 1T | 3 | Discovery/Radiant/Bounty quests, map reveals, compass clues, fast travel unlocks |
| MMO | 3C + 3F + 4N + 1T | 1C + 2F + 2N + 1T | 3 | Daily/Weekly/Dungeon/Raid, party requirements, reputation, tokens |
| Survival | 3C + 3F + 3N + 1T | 1C + 2F + 1N + 1T | 3 | Tutorial/Milestone/Challenge, biome/season, crafting/gathering/building |
| Narrative RPG | 3C + 4F + 3N + 2T | 1C + 2F + 1N + 2T | 3 | Moral choices, companions, branching paths, skill checks, relationship shifts |
| Roguelike | 3C + 3F + 3N + 1T | 1C + 1F + 2N + 1T | 3 | Run goals, meta unlocks, per-run vs cumulative tracking, heat levels |
See the Templates page for detailed breakdowns of what each template includes.
Step 1 — Setup
The Setup step configures the basic identity of your quest database, selects a template, and links external databases for cross-forge integration.
Database Configuration
A human-readable name for your quest database (e.g., "Main Quest Database", "Side Quests"). This is for your reference in the Unity Editor — it does not affect generated code.
The C# namespace for generated scripts (e.g., "MyGame.Quests"). Leave empty for global namespace. Must be a valid C# namespace if provided (letters, digits, dots, underscores).
A short identifier (e.g., "Fantasy", "SciFi", "MainQuest") prepended to all generated file names. For example, prefix
Fantasy generates FantasyType.cs,
FantasyDatabase.cs, and FantasyDatabaseEditor.cs. Must be a valid
C# identifier (start with letter, letters/digits only).
An optional suffix appended after the prefix (e.g., suffix "Quest" with prefix "Fantasy" produces
FantasyQuestType.cs, FantasyQuestDatabase.cs). Useful when you have
multiple databases with the same prefix.
Template Selection
Choose a genre template from the dropdown to pre-populate both quest-level and objective-level property definitions with genre-appropriate properties and example quests. If you already have definitions, a confirmation dialog will ask before replacing them.
Linked Databases
Below the template selection, ReorderableList panels allow you to link external databases from companion forge packages. Each list accepts multiple databases and supports drag-and-drop. When databases are linked, the smart target code picker in Step 3 shows categorized dropdown menus instead of plain text fields.
| Database Type | Bridge | Provides |
|---|---|---|
| Enemy Databases | SEFBridge | Enemy codes for kill objectives (GOBLIN_WARRIOR, ELDER_DRAGON) |
| Faction Databases | SEFBridge | Faction codes for reputation rewards (THIEVES_GUILD, ROYAL_GUARD) |
| Item Databases | SIFBridge | Item codes for collect objectives and item rewards (SILVER_PENDANT, HEALTH_POTION) |
| Loot Databases | SIFBridge | Loot table codes for loot-based rewards (BOSS_LOOT_TABLE) |
| Attribute Databases | SAFBridge | Attribute names for prerequisites and rewards (STR, DEX, WIS) |
Step 2 — Definitions
This is where you design the "shape" of your quest data at both levels. Think of this step as building a custom form — you're deciding what fields appear when you create a quest in Step 3. The step is divided into two major sections: Quest-Level Properties and Objective-Level Properties. Each section has its own Categories, Flags, Numerics, and Texts subsections.
Quest-Level Properties
Define the properties that apply to quests as a whole:
- Categories — Dropdown menus with named entries. Each category has a label (e.g., "Quest Type") and a list of entries (e.g., "Kill", "Fetch", "Escort"). You can check Allow Multiple to let quests select more than one entry.
- Flags — Boolean toggles with a name (e.g., "Is Repeatable", "Is Hidden"). Each flag defaults to false unless you set a default value.
- Numerics — Number values with a name, optional min/max constraints, integer toggle, and default value (e.g., "Recommended Level" with min 1, max 99, integer).
- Texts — Free-form string fields with a name and configurable line count for the text area (e.g., "Journal Entry" with 3 lines).
Objective-Level Properties
Define the properties that apply to individual objectives within quests. These work identically to quest-level properties but are stored on each objective independently:
- Categories — Objective-specific dropdowns (e.g., "Objective Type": Kill, Collect, Talk, Explore)
- Flags — Per-objective toggles (e.g., "Is Tracked", "Show on Map")
- Numerics — Per-objective numbers (e.g., "XP Multiplier", "Difficulty Bonus")
- Texts — Per-objective strings (e.g., "Hint Text", "Map Marker Label")
Schema Export / Import
At the top of Step 2, a foldout section provides the Schema Export/Import system with four buttons:
- Export Full JSON — All definitions (both levels), all quests with objectives/rewards/prerequisites, AI instructions, and linked database codes
- Export Light JSON — Definitions and AI instructions only, empty quests array — for interactive AI sessions
- Export Markdown — Human-readable format ideal for pasting into AI chat
- Import Schema (JSON) — Import definitions and quests with 3-choice conflict resolution (Replace All, Add to Existing, Cancel)
See the AI Workflow page for full details on the schema system.
Step 3 — Quests
This is the main workspace where you create and edit quests using the properties defined in Step 2. The interface uses a split-panel layout with a quest list on the left and the quest editor on the right.
Left Panel — Quest List (280px)
The left panel contains the master quest list with a multi-row toolbar:
- Search bar + Find button — Filter quests by name or code (case-insensitive)
- Category filter — Two dropdowns to filter by any quest-level category value (e.g., show only "Kill" quests, or only "Forest" region quests)
- Sort dropdown — None, Name A-Z, Name Z-A, Code A-Z, Code Z-A
- Multi-select toolbar — Select All, Delete Selected, Duplicate Selected, Set Icon (bulk assign an icon to all selected quests)
- Pagination — Show All toggle, items-per-page count, page navigation buttons. Enable pagination when working with large databases (100+ quests) for better editor performance.
Right Panel — Quest Editor
Select a quest from the list to edit it. The editor shows all sections in collapsible foldouts. Click a foldout header to expand or collapse it.
Identity Section
- Name — Display name shown to players (e.g., "Wolf Menace", "The Dragon's Bane")
- Code — Unique identifier used in code and data references (e.g.,
WOLF_MENACE). The Auto button generates a code from the name automatically (uppercase, underscores for spaces). - Description — Scrollable TextArea for quest description / journal text
- Icon — Sprite ObjectField with a 70x70 preview thumbnail
Understanding Objectives
Objectives are the individual tasks a player must complete within a quest. Each quest can have any number of objectives, and each objective is independently configurable. Objectives appear as a nested ReorderableList in the quest editor — you can drag to reorder, click + to add, and click - to remove.
Each objective contains:
| Field | Type | Description |
|---|---|---|
| Code | string |
Unique identifier within the quest (e.g., "KILL_WOLVES", "FIND_PENDANT"). Used by
SimpleQuestTracker to track progress. |
| Description | string |
Text shown to the player (e.g., "Kill 10 wolves in the forest") |
| Target Code | string |
What to target — an enemy code, item code, location code, or any custom string. When databases are linked in Step 1, a dropdown button appears showing a categorized GenericMenu with sections for Enemies, Items, Factions, Attributes, and other Quests. |
| Target Count | int |
How many the player needs (e.g., 10 wolves, 1 pendant, 3 shrines). Default is 1. |
| Time Limit | float |
Optional time limit in seconds. Set to 0 for no time limit. The
SimpleQuestTracker automatically counts down timed objectives. |
| Is Optional | bool |
If checked, this objective is a bonus objective — the quest can be completed without it. Required objectives (unchecked) must all be completed for the quest to succeed. |
| Sort Order | int |
Display order within the quest. Lower numbers appear first. Use
SimpleQuestHelper.GetObjectivesBySort() at runtime to get sorted objectives. |
| Objective-Level Properties | (varies) | All Categories, Flags, Numerics, and Texts defined at the objective level in Step 2. Each objective stores its own independent values. |
- "Gather 5 Dragon Scales" (code: GATHER_SCALES, target: DRAGON_SCALE, count: 5, optional: false)
- "Forge the Dragon Slayer Sword" (code: FORGE_SWORD, target: DRAGON_SWORD, count: 1, optional: false)
- "Discover the Dragon's Weakness" (code: DISCOVER_WEAKNESS, target: DRAGON_LORE, count: 1, optional: true — bonus!)
Understanding Rewards & Choice Groups
Rewards define what the player receives upon completing a quest. Each reward is a separate entry in a nested ReorderableList. Rewards have a powerful choice group system that lets you create "pick one" reward sets.
| Field | Type | Description |
|---|---|---|
| Code | string |
Unique identifier for the reward (e.g., "GOLD_REWARD", "XP_REWARD") |
| Description | string |
Text shown to the player (e.g., "500 Gold", "Sword of Valor") |
| Target Code | string |
What to give — an item code, attribute code, currency code, or custom string (e.g., "GOLD", "XP", "SWORD_OF_VALOR", "STR") |
| Amount | float |
How much (e.g., 500 gold, 1000 XP, +5 STR). Your game code interprets this value. |
| Is Choice | bool |
Whether this reward is part of a choice set (player picks one from the group) |
| Choice Group | int |
Groups choice rewards together. All rewards with the same non-zero choice group form a "pick one" set. See below for details. |
How Choice Groups Work
Choice groups are a simple but powerful system for offering the player a selection of rewards:
- Non-choice rewards (
isChoice = false) are always granted when the quest is completed. These are your guaranteed rewards like XP and gold. - Choice rewards (
isChoice = true) with the samechoiceGroupnumber form a set. The player picks one from the set; the others are forfeited. - You can have multiple choice groups in the same quest. Group 1 might be "pick a weapon" while Group 2 might be "pick a potion".
At runtime, use SimpleQuestHelper.GetRequiredRewards(quest) to get guaranteed rewards
and SimpleQuestHelper.GetChoiceGroups(quest) to get a dictionary of choice groups
for your reward selection UI.
Understanding Prerequisites
Prerequisites define conditions that must be met before a player can start a quest. Each prerequisite checks a target value against a threshold using a comparison operator. Prerequisites appear as a compact nested ReorderableList in the quest editor.
| Field | Type | Description |
|---|---|---|
| Target Code | string |
What to check — a quest code (is it completed?), an attribute code (what's the player's STR?), a faction code (what's their reputation?), or any custom value code. |
| Comparison | SimpleQuestComparison |
The comparison operator. Options: GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, Equal, NotEqual |
| Value | float |
The threshold value to compare against (e.g., 20 for "Level >= 20", 1 for "Quest completed == 1") |
At runtime, use SimpleQuestHelper.CheckAllPrerequisites(quest, valueProvider) where
valueProvider is a Func<string, float> delegate that returns the
current value for a given target code. For quest completion checks, return 1 if the quest is
complete, 0 if not. For attributes, return the current attribute value.
(code) => code == "PLAYER_LEVEL" ? playerLevel : questTracker.IsComplete(code) ? 1f : 0f
Quest-Level Properties Section
Below objectives, rewards, and prerequisites, the quest editor displays all quest-level Categories, Flags, Numerics, and Texts defined in Step 2. Each property shows with its proper name (e.g., "Quest Type", "Is Repeatable", "Recommended Level") rather than generic "Element 0" labels.
SAF Modifiers Section (Conditional)
When Simple Attribute Forge is installed, a Modifiers section appears with a ReorderableList of ScriptableObject ObjectField slots. Drag SAF modifier assets here to attach them as quest rewards. These are actual ScriptableObject references — useful for granting permanent stat buffs, temporary boosts, or other modifier-based effects when the quest is completed.
SIF Loot Table Section (Conditional)
When Simple Item Forge is installed, a Loot Table section appears with a loot table code field (dropdown when loot databases are linked) and a loot database ObjectField reference. This links the quest to a SIF loot table for drop-table-based rewards.
Step 4 — Settings
Configure output paths and generation options.
Output Paths
A single Output Folder field with a Browse button. Default is
Assets/Generated/Quests. A Custom Paths toggle reveals separate
fields for Scripts folder and Assets folder if you want them in different locations.
Code Generation Options
| Toggle | Generates | Description |
|---|---|---|
| Generate Enum | {Prefix}Type.cs |
C# enum with one entry per quest code. Enables compile-time safety. |
| Generate Database | {Prefix}Database.cs + .asset |
ScriptableObject implementing ISimpleQuestDataSource + custom editor |
Step 5 — Generate
Review your configuration summary and click Generate. The wizard uses a two-phase generation process to work around Unity's domain reload requirement.
Phase 1 — Script Generation
Writes C# files to disk, saves all wizard data to a temporary JSON file in the
Temp/ folder, sets a SessionState flag, and triggers
AssetDatabase.Refresh(). Unity then recompiles all scripts (domain reload).
Phase 2 — Asset Creation (Automatic)
After domain reload, an [InitializeOnLoad] handler detects the pending SessionState
flag, waits for the generated type to load via a retry loop in
EditorApplication.delayCall, then creates the ScriptableObject asset and populates
it with all quest data from the temporary JSON file.
[Simple Quest Forge] if something goes wrong.
What Gets Generated
{Prefix}Type.cs — Enum
{Prefix}Database.cs — ScriptableObject
Implements ISimpleQuestDataSource with methods for quest access, filtering,
and metadata queries at both quest and objective levels.
{Prefix}DatabaseEditor.cs — Custom Inspector
A professional split-panel editor with search, sort, category filter, pagination, and nested ReorderableLists for objectives, rewards, and prerequisites. Every property shows its real name. Includes an "Open Quest Forge Wizard" button for easy access back to the wizard.
{Prefix}Database.asset — Data File
The ScriptableObject asset containing all quest data. Assign this to Quest Chain Forge as a
linked quest database for chain step code dropdowns. Assign to
SimpleQuestTracker.Initialize() for runtime tracking.
Runtime Data Structures
These are the actual C# struct definitions from the SimpleQuestForge namespace.
All types are [Serializable] structs for Unity serialization compatibility.
SimpleQuestDefinition
SimpleQuestObjective
SimpleQuestReward
SimpleQuestPrerequisite
ISimpleQuestDataSource
| Method Group | Key Methods |
|---|---|
| Quest Access | GetQuestDefinitions(), GetQuestByCode(string),
GetQuestByName(string), GetQuestCodes(),
GetQuestNames(), HasQuest(string), QuestCount |
| Quest-Level Metadata | GetCategoryLabels(), GetCategoryEntries(int),
GetFlagNames(), GetNumericNames(), GetTextNames() |
| Objective-Level Metadata | GetObjectiveCategoryLabels(), GetObjectiveCategoryEntries(int),
GetObjectiveFlagNames(),
GetObjectiveNumericNames(), GetObjectiveTextNames() |
| Filtering | GetQuestsByCategory(int categoryIndex, int entryIndex),
GetQuestsByFlag(int flagIndex, bool value) |
Tips & Best Practices
Start With a Template
Even if you plan to customize everything, starting with a genre template gives you a solid foundation with both quest-level and objective-level properties pre-configured. You can always add, remove, or modify properties after loading a template.
Use AI for Bulk Content
Define 3-5 quests manually to establish your patterns and tone, then export your schema and let AI generate the rest. The two-level property system exports cleanly and AI models produce consistently structured quests when they have good examples to learn from.
Link Databases for Smart Pickers
Link enemy, item, and attribute databases in Step 1 to enable the dropdown button on every targetCode field. This shows a categorized menu of all available codes, preventing typos and making data entry much faster.
Use Choice Groups for Rewards
Mark rewards as choice rewards and assign the same choiceGroup number to create
"pick one" reward sets. This is perfect for "Choose your reward" quest completion screens.
Use SimpleQuestHelper.GetChoiceGroups() at runtime to build the selection UI.
Design for Chains
If you plan to use Quest Chain Forge, give each quest a meaningful code and use prerequisites to establish natural ordering. Chain steps reference quests by code, and prerequisites define the unlock flow. Well-coded quests chain together naturally.
Keep Codes Descriptive
Quest codes are your primary identifiers across the entire ecosystem. Prefer
WOLF_MENACE over QUEST_01. Chain steps, prerequisites, runtime
tracking, cross-reference queries — everything references quests by code. Descriptive
codes make debugging and content management much easier.
Window › Simple Quest Forge ›
Quest Browser) to browse across multiple generated databases, and the
Quest Dependencies window to visualize prerequisite relationships.