One check for every broken reference in your project — deleted items, missing common events, events bound to deleted NPCs — each with a link to fix it.
Project Health
Deleting a record never deletes the things that point at it. A recipe keeps its ingredient after you delete that item, a map event keeps calling a common event you removed, a guard's event stays bound to an NPC you replaced. Nothing warns you at the time — the game just quietly does nothing at that step. Project Health finds all of them at once.
Where to find it#
- Tools → Project Health in the menu bar.
- Database → System → Project Health.
- Ctrl+K (Cmd+K on a Mac) and type health, broken or missing.
After a check has run, all three show a count badge with the number of problems it found. The editor also runs one quiet check a little while after you open a project, so the badge is filled in before you go looking. It is red when any problem is an error and amber when there are only warnings.
How to use it#
- Open Project Health. The check starts straight away — on a big imported project it takes about a second.
- Read the summary line under the title: how many errors and warnings, and how many records were checked.
- Work down the list. Errors come first, then Warnings; inside each, problems are grouped by what kind of record is broken (Recipes, Map events, Items…).
- Press Open on a problem to go to the editor that fixes it (see the table below).
- Fix the reference — pick an existing record, recreate the missing one, or remove the step.
- Come back and press Check again. When everything points at something real you see No problems found.
What each problem means#
| Problem | Severity | What it means | How to fix it |
|---|---|---|---|
| Points at a record that no longer exists | Error | A field such as a recipe's Ingredients, a mob's Abilities or Loot, a quest's Start NPC or Prerequisite quests, or a loot table's Drops names a record that was deleted. The Missing line shows the ids. | Open the record and choose an existing entry in that field, or recreate the missing record. |
| Calls a common event that no longer exists | Error | A Call Common Event command (on a map event or inside another common event), or an item's or skill's Common event field, names a common event that is gone. At that step nothing runs, so anything that depended on it — a door, a guard chase, a reward — silently stops. | Point the command at an existing common event, recreate the common event, or delete the command. |
| Call Common Event with no common event chosen | Warning | The command was added but never given a common event. It does nothing. | Choose a common event in the command, or delete it. |
| Bound to an NPC that no longer exists | Error | A map event is bound to an NPC definition that was deleted, so talking to that NPC can never run the event. | Bind the event to an existing NPC, or unbind it so it runs from its own tile. |
| Leads to a map that is not in the game | Error | A Transfer Player command (on a map event or in a common event), a portal or a door sends players to a map the game does not have. A map is only in the game when it is active in the world — placed on the Overworld, or switched on under World Config → World Setup → Map Activation — but the destination lists show every map. In game the player is told "Unknown zone." and stays where they are. The row sits under the map that is missing from the game, counts what leads to it and names the first few. It also tells you when that map is one piece of a streamed world (in game only the whole world is a map) or when the destination no longer exists (that row sits under the map holding the transfers). | Switch the map on (or place it) and publish. For a piece of a streamed world, point the transfer at the world itself and pick the tile on the joined map. For a deleted map, choose a destination that exists. |
| More records than one check reads | Warning | A content type has over 5,000 records; the ones past that were not checked. | Nothing is broken by this — just re-check after cleaning up, or ask the Copilot to validate that type. |
| Map events differ from an older saved copy | Error | Every map's events are stored once for the game and the map editor, plus an older saved copy kept for projects opened by earlier Studio versions. This row means the older copy is different — the counts say how many events are only in the current copy, only in the older copy, or changed. The map editor and players both get the current events. | Press Keep current events (the usual choice — it brings the older copy in line) or Restore older copy (only when you know the current events are wrong, for example after an AI change you want to undo). A map whose events exist only in the older copy — the game never received them — shows a single Repair button that copies them into the game. |
| A database update did not apply | Error | Hosted and Studio Web projects only. When an engine update adds to the project database, one of those updates failed on your project. The row names the update file, how many times it has been tried and the database error. It is not marked as done: it is tried again every time the project opens, and later updates wait for it. Features that need it may not work until it applies. | Usually nothing — a temporary failure clears on the next open. If the same update keeps failing (the attempt count keeps rising), contact support with the file name and error shown. |
| Has an expression the game cannot run | Error | A Conditional Branch → Script, a variable compared to an expression, or a Control Variables → Script operand holds a formula the expression language cannot read — most often a script an RPG Maker import brought in, or one saved before Studio checked expressions. In game the condition always counts as false and the value as 0. The row says how many on that event, the pages they are on, and spells out the first three: Page 2, command 5 (Conditional Branch → Script): Unknown name "foo" (at character 1) in “foo > 2”. | Press Open, open the event, go to that page and command, and rewrite the expression until the box says This expression can run — or replace the command with a built-in condition. Nothing is rewritten for you. |
| Has commands that never run | Warning | An event or common event holds a Script or Plugin Command (kept from an RPG Maker import), or a command the game does not act on yet such as Broadcast Message. The row says how many of each. The event steps past them. | Rebuild what they did with event commands, or delete them. |
| Starts a battle that is not fought | Warning | The event has a Battle Processing command. No battle is fought yet: it counts as a win at once, so only the If Win commands run. | Nothing to fix. Check that what the event gives under If Win is safe to give without a fight. |
| RPG Maker battle from an older import | Error (Warning when the battle had no branches) | The event was imported before battles converted and still holds the battle as comments reading [MZ Code 301] …. No battle starts, and the commands for every outcome (win, escape and lose) run one after the other. | Import the project again to convert it, or delete the leftover comment rows and the outcome commands you do not want. |
| Battle Processing names a mob party that does not exist | Warning | A battle names a party that was never imported (events imported without Troops, or a troop with no name, which the import skips) or that was deleted since. No battle is fought yet, so nothing changes in game today. | Open the command and pick an existing party, or import the troops. |
What Publish does with the event rows. None of the five rows above can stop a publish. Has commands that never run and Starts a battle that is not fought leave nothing to fix, so the publish check does not list them as warnings: it shows one note with how many events hold each, and does not ask for Publish anyway over them. The other three are listed as warnings in the publish check, and it asks for Publish anyway — so a project that had no warnings before and holds old expressions the game cannot run will now be asked to confirm a publish.
Where "Open" takes you#
| Broken record | Opens |
|---|---|
| Items, loot tables, recipes, mobs, mob parties, abilities, skills, quests and the other Database content | That record's Database section. Find the record by the name (or the id shown beside it). |
| Map events | The map editor, on the map the event is on. The row tells you where: map name, tile (x, y) and the page numbers of the broken commands. Press E to show events if they are hidden. |
| Common events | The Common Events page. |
| A map that is not in the game | The map editor, on that map. When the destination was deleted, it opens the map the transfers are on instead. |
Copy all into the game#
When more than one map has events that exist only in the older copy (typically a project last saved by a much older Studio), a bar at the top of the list offers Copy all into the game.
- Open Project Health (Tools → Project Health).
- If the bar "N maps have events only in the old editor copy" appears, press Copy all into the game.
- Check the confirmation: it says how many events on how many maps will be copied.
- Press Copy into the game. The check runs again; those rows are gone.
Map event storage#
Large maps can hold thousands of events. When your studio runs with per-event storage turned on, each event is saved on its own, so saving one event no longer rewrites every event on the map. Maps convert by themselves the first time you save them; the Map event storage card converts the rest at once.
- Open Project Health (Tools → Project Health).
- The Map event storage card says how many maps still store all their events together, and how many events that is.
- Press Convert. Maps convert a few at a time; the card shows how many are done and how many are left.
- Press Stop at any time. Resume carries on where it stopped.
| Field / control | What it does |
|---|---|
| Maps / events count | Maps that still keep all their events together, and how many events they hold. Maps with no events are not listed — they convert when you add one. |
| Convert / Resume | Converts the listed maps a few at a time. Each map converts on its own, so stopping never leaves a map half-done. |
| Stop | Stops after the batch in progress. |
- Your events do not change. Converting only changes how they are stored. An editor tab that has the map open keeps working — its next save is not refused as out of date.
- The card is hidden unless per-event storage is on for your studio (the
EVENTS_PER_ROWsetting — see Feature Flags). With it off, Convert refuses to run, because an older game server would not see converted maps' events. - Converting updates the running game. The converted maps are sent to the running server straight away; if it cannot be reached you see a "not live yet" note — press Publish later.
Dangling references#
When you delete a record that other records still point at — a rarity that items use, a passive a tome teaches — those links used to keep the deleted record's id forever. Some links are now checked by the database: deleting the target clears the link, and a save can never write an id that does not exist. Links that were already broken before your project updated are kept until you clear them here.
The Dangling references card sits at the top of the report. It only appears while at least one link still needs attention.
- Open Project Health.
- Read the Dangling references card: each line names a field (for example
item_definitions.rarity_id → rarity_definitions), how many records hold a deleted id, and a few of the missing ids. - Click Clear dangling links. You see how many links will be cleared before anything changes; confirm to clear them. The records themselves are kept — only the dead link is emptied, which is what the game already does with an id it can't find.
- Click Switch N clean links to fully checked. From then on the database checks every existing row too, not just new saves.
- Publish so a game server with its own database receives the cleared links.
| Field | Points at | When the target is deleted |
|---|---|---|
| Item → Rarity | Rarities | The item's rarity is cleared (it falls back to its tier) |
| Item (tome) → Passive learned | Passives | The tome teaches nothing until you pick a new passive |
| Mount → Source pet | Pets | The mount is no longer linked to a pet |
| Character template → Creator pack | Character creator packs | The template uses the project's default pack |
| Item → Weapon type | Weapon types | The item has no weapon type (class weapon restrictions and the type's hotbar abilities no longer apply) |
| Item → Armor type | Armor types | The item has no armor type (class armor restrictions no longer apply) |
| Item → Element | Elements | The weapon's basic attacks are unelemental (×1) |
| Ability → Element | Elements | The ability deals unelemental damage |
| Mob → Element | Elements | The mob has no element affinity |
| Status effect → Element | Elements | The effect's ticks are unelemental |
| Class → Element | Elements | The class has no element affinity |
| NPC → Element | Elements | The NPC has no element affinity |
More links will join this list over time; the card picks them up automatically.
- An empty field is saved as "none". Leaving one of these dropdowns blank always saves as "no link" — a blank is never refused as a missing record.
- "Delete anyway" clears these links. The delete confirm still warns you what uses a record. For the fields above, deleting anyway empties the link; restoring the record from the Trash does not put the link back — set it again.
- A save that names a missing record is refused. If an import or the AI tries to save, say, an item whose rarity no longer exists, the save fails instead of storing a dead link. Pick an existing record or leave the field empty.
- Clear before publishing to a new server. A record that already holds a dead link is accepted by your editor, but a freshly created game server with its own database refuses it on the first Publish. Clear dangling links first.
- Required fields are listed, not cleared. If a required field ever points at a deleted record, the card lists it for you to fix by hand — it never guesses a replacement.
Media stored in the database#
Older projects can still keep images, sounds and fonts inside the project database. When any is left, a card at the top reads "N media rows still stored in the database (X MB)" with a Move to files button. See Moving Stored Media to Files.
Gotchas#
- The check reads what is saved. Unsaved edits in an open editor are not seen until you save, then press Check again.
- Fixing it here is not the same as fixing it live. On a hosted or managed server, press Publish (or Playtest) after fixing so the running game gets the change.
- RPG Maker imports are the usual source. An import can bring in map events that call common events by their RPG Maker number (for example "9") when those common events were never imported — every one of those calls shows up here.
- It only changes your project when you press a repair button. The check itself is read-only, so it is safe to run as a viewer on a shared project, and as often as you like. Keep current events rewrites the older copy; Restore older copy and Repair rewrite the events the game runs.
- Close the map before repairing its events. A map editor tab that is already open still holds the old copy; reload it after a repair, or its next save writes that old copy back.
- Copy all into the game never overwrites. A map the game already has events for is skipped, so you can run it again safely.
- Restore older copy, Repair and Copy all update the running game. The events are sent to the running server straight away; if it cannot be reached you see a "not live yet" note — press Publish later.
- The Copilot uses the same check. Asking the Copilot to validate a content type runs the same reference check you see here, so you and the AI always get the same answer.
- There is no feature flag — Project Health is always available in the editor.