View Format: Multi-Page

Simple Quest Forge

Generate Complete Quest Databases, Quest Chains, and Procedural Templates in Minutes.

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 5 Steps: Setup → Definitions → Quests → Settings → Generate. You can move freely between steps using the tab bar at the top of the wizard window. Each step validates its input and shows errors or warnings in real time. You don't need to fill everything in order — jump between steps as needed.

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.

How it works at runtime: The generated database includes separate metadata arrays for quest-level and objective-level properties. Quest-level metadata is accessed via 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.

Switching templates clears existing definitions. A confirmation dialog appears before any definitions are replaced. Export your schema first as a backup if needed.

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

1 Database Name
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.
2 Namespace (Optional)
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).
3 Class Prefix
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).
4 Append Suffix (Optional)
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)
Databases are optional. The Quest Forge works perfectly without any linked databases. When no databases are linked, target code fields are plain text inputs instead of dropdowns. You can type any string you want as a target code. Databases just add convenience.

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.
Example: A quest "The Dragon's Bane" might have 3 objectives:
  1. "Gather 5 Dragon Scales" (code: GATHER_SCALES, target: DRAGON_SCALE, count: 5, optional: false)
  2. "Forge the Dragon Slayer Sword" (code: FORGE_SWORD, target: DRAGON_SWORD, count: 1, optional: false)
  3. "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 same choiceGroup number 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".
Example: "The Dragon's Bane" Rewards Guaranteed (always granted): - 5000 XP (isChoice: false) - 500 Gold (isChoice: false) Choice Group 1 (player picks one weapon): - Dragonslayer Sword (isChoice: true, choiceGroup: 1) - Dragonscale Shield (isChoice: true, choiceGroup: 1) - Dragon Staff (isChoice: true, choiceGroup: 1) Choice Group 2 (player picks one consumable): - 10 Health Potions (isChoice: true, choiceGroup: 2) - 5 Mana Potions (isChoice: true, choiceGroup: 2)

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")
Example Prerequisites for "The Dragon's Bane": 1. WOLF_MENACE >= 1 (Quest WOLF_MENACE must be completed) 2. THE_LOST_PENDANT >= 1 (Quest THE_LOST_PENDANT must be completed) 3. PLAYER_LEVEL >= 20 (Player level must be at least 20) 4. FIRE_RESISTANCE >= 50 (Fire resistance must be at least 50)

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.

The valueProvider pattern: Prerequisites are deliberately generic — they don't know what system "PLAYER_LEVEL" or "FIRE_RESISTANCE" comes from. You provide a delegate that maps target codes to current values from your game systems:

(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.

Generate clicked → Write C# scripts to disk → Save wizard data to Temp/SimpleQuestForge_PendingAssetData.json → Set SessionState flag: SimpleQuestForge_WaitingForCompilation → AssetDatabase.Refresh() → Unity compiles new scripts (domain reload) → [InitializeOnLoad] detects flag + temp file → EditorApplication.delayCall retry loop → CreateDatabaseAsset() — populate SO with all data → Cleanup: delete temp file, clear SessionState flag
Do not close Unity during generation. The two-phase process requires a domain reload to complete. If Unity crashes or is closed during Phase 1, the generated scripts will still be valid, but you'll need to regenerate to create the asset file. Check the Console for messages prefixed with [Simple Quest Forge] if something goes wrong.

What Gets Generated

{Prefix}Type.cs — Enum

public enum FantasyType { WolfMenace, TheLostPendant, TheDragonsBane, // ... one entry per quest code (PascalCase) }

{Prefix}Database.cs — ScriptableObject

Implements ISimpleQuestDataSource with methods for quest access, filtering, and metadata queries at both quest and objective levels.

// Reference the database in your scripts [SerializeField] private FantasyDatabase questDB; // Access quests by code string or by enum var quest = questDB.GetQuestByCode("WOLF_MENACE"); var quest2 = questDB.GetQuest(FantasyType.TheDragonsBane); // Access sub-entries var objectives = quest.Value.objectives; var rewards = quest.Value.rewards; var prereqs = quest.Value.prerequisites; // Filter by quest-level category var killQuests = questDB.GetQuestsByCategory(0, 0); // Category 0, Entry 0 // Metadata string[] questCatLabels = questDB.GetCategoryLabels(); // Quest-level string[] objCatLabels = questDB.GetObjectiveCategoryLabels(); // Objective-level

{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

public struct SimpleQuestDefinition { // Identity public string code; public string name; public string description; public Sprite icon; // Sub-entries public SimpleQuestObjective[] objectives; public SimpleQuestReward[] rewards; public SimpleQuestPrerequisite[] prerequisites; // Quest-level dynamic properties public int[] categoryValues; public bool[] flagValues; public float[] numericValues; public string[] textValues; // SAF integration (modifier ScriptableObject references) public ScriptableObject[] modifiers; // SIF integration (loot table linking) public string lootTableCode; public ScriptableObject lootTable; // Convenience accessors public int GetCategoryValue(int index); public bool GetFlagValue(int index); public float GetNumericValue(int index); public string GetTextValue(int index); }

SimpleQuestObjective

public struct SimpleQuestObjective { public string code; // Unique within quest (e.g., "KILL_WOLVES") public string description; // Player-facing text public string targetCode; // What to target (enemy code, item code, etc.) public int targetCount; // How many (default 1) public float timeLimit; // Seconds, 0 = no limit public bool isOptional; // true = bonus objective public int sortOrder; // Display order (lower = first) // Objective-level dynamic properties public int[] categoryValues; public bool[] flagValues; public float[] numericValues; public string[] textValues; // Convenience accessors public int GetCategoryValue(int index); public bool GetFlagValue(int index); public float GetNumericValue(int index); public string GetTextValue(int index); }

SimpleQuestReward

public struct SimpleQuestReward { public string code; // Unique within quest (e.g., "GOLD_REWARD") public string description; // Player-facing text (e.g., "500 Gold") public string targetCode; // What to give (item code, attribute code, etc.) public float amount; // How much public bool isChoice; // Is this part of a choice set? public int choiceGroup; // Same non-zero group = pick one }

SimpleQuestPrerequisite

public struct SimpleQuestPrerequisite { public string targetCode; // What to check public SimpleQuestComparison comparison; // GreaterThan, Equal, etc. public float value; // Threshold }

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.

The Quest Forge is the foundation. Every quest you create here becomes available to Quest Chain Forge (as chain steps) and can be tracked at runtime with SimpleQuestTracker. Use the Quest Browser window (Window › Simple Quest Forge › Quest Browser) to browse across multiple generated databases, and the Quest Dependencies window to visualize prerequisite relationships.