Cut content is everything the game's own files contain that a normal playthrough never touches: leftover test tables, items nobody hands out, statuses nothing applies, enemy models nobody places, a whole wave-defence mode, and the developer switches that were left in the release. Each claim below was checked by script against the extracted data tables and the Lua code (see Sources). "Unreferenced" always means that the id appears in no other table and in no Lua file; the game also has a Unity side that this wiki cannot read, so a row that looks dead can in principle still be driven from there. That caveat is spelled out where it matters.
Tables that the game never loads#
Almost every data table has a loader module in luascript/structdata/ (ms_*.lua) or is read by name. Five tables are exported but required by no Lua file at all.
| Table | Rows | What is in it | Verdict |
|---|---|---|---|
| Test | 19 | Rows numbered 10001 to 10019 with only Chinese labels and no English text. The labels read like move names from a prototype: a "test heal", a charge, a confusion spell, a taunt, a puppet, a lion's roar, a burning arrow, a ground-shaking quake, and one row literally called "aaa". Every row has type 1 and code 0. | Leftover prototype skill list; nothing reads it. |
| StatusType | 12 | The status families (bleed 101, poison 102, corrosion 103, gunner wound 104, heal 105, stone skin 106, fire resistance 107, burn 108, sanity restore 109, and three generic helpers 901 to 903) with default numbers. | Looks like an early version of the 124-row StatusData (inferred); see Status effects. |
| SkillComboData | 17 | Combo links for hero 10001 (Terrence) only, with Chinese move names. | Replaced by SkillChainData, which has 65 rows for hero 10001 (inferred: the newer table does the same job). |
| StoryBounty | 9 | Bounty records 1001 to 1005 and 2001 to 2004 with empty title and empty text. | An unfinished bounty feature. The word "bounty" in the code is only a local variable name in the statue menu (statueuictrl.lua:67). |
| StoryStairKickHint | 2 | Two hint rows for stair-kick 1 with empty quest conditions and dialog 0. | Hint text that was never filled in. |
One more exported table that looks unused is not: Cave1002 (25 rows) is loaded by name in ms_scenedata.lua:49. It belongs to the wave mode below.
An unfinished wave-defence mode#
The code contains a complete "defend the base" mode that no English menu offers.
- Mode switch.
controllermain.lua:2790-2802picks a game controller by battle type. Besides the story (PVE_Story), it knowsPVE_Occupy(50),PVE_Guard(51) andPVE_Custom(52). The guard type creates a home-base object (hero90001, Chinese label "base") and startsControllerGuardMode, an 866-line controller. - Map and waves. Choosing map 1 in
ControllerLobby:ChooseMap(controllerlobby.lua:1434-1440) selects scene 1002, the Cave1002 table. Enemy waves come from GuardModeSpawn: 84 rows, which is 14 waves of 6 sub-waves, each with up to three enemy types, counts, probabilities and an interval (15 s in the first row). - Rewards. BufferData has 12 rows (ids 101 to 112, six buffer types in two sets) that the guard controller gives as pick-up rewards during a run (
ControllerGuardMode:TouchReward,controllerguardmode.lua:477-582). Nothing else uses the table. - A second battle map. Map 2 selects scene 10001 and
PVE_Occupy, a capture-the-point mode with its own 558-line controller. The free-for-allPVE_Custommode has a 277-line controller. - Where the menu is. Only the hero-choice screen calls
ChooseMap(chooseheroctrl.lua:221-236), reached from the lobby; the lobby is not part of the story menu (inferred: a multiplayer or test lobby). See Game modes for the other modes that exist only in code.
Enemy models that are never placed#
HeroData has 75 rows. A script counted every HeroId placement in StoryMonster, StoryMazeMonster, the Arena tables and the challenge tables for the 68 non-hero models (ids from 20000):
| Model | Label in data | Placements | Notes |
|---|---|---|---|
| 20004 | Wheel Monster | 0 | Has full attack code (attack20004.lua). Its id shows up only as the MonsterType grouping label on 5 rows of other enemies (HeroIds 20005 and 20006). See Enemies. |
| 20008 | Moon Monster | 0 | Has attack code and a config file, no placement. |
| 90001 | Base | 0 | The home-base object of the wave mode above. |
| 90005, 90006 | Tentacle | 0 | Two tentacle objects with attack code (inferred: part of the same prototype mode). |
The other 63 enemy models are each placed at least once.
Items nobody hands out#
For every ItemData row the script looked for the id in the item, reward, drop, formula, cost and action columns of all other tables and for literal use in the Lua code.
| Id | Name | What the data says |
|---|---|---|
| 70031, 70045, 70046 | "None" (Chinese 无) | Material-type placeholder rows with price -1, no description and no references anywhere. |
| 70072 | Saint's Broken Spear | A fully written lore item (a broken Blessedland spear with an engraved name, Rochette) that no shop, drop pool, quest or script mentions. |
| 79014, 79015, 79019, 79020 | Formula: Elixir of Epiphany, Petrification Powder, Elixir of Health, Fireworks Barrel | Four formula items that no shop, pick-up or Lua file mentions. The recipes themselves work through other routes, see Alchemy and Blessing. |
| 80024, 80025 | Fusion Stone (levels 4 and 5) | Defined but referenced only by a hard-coded test save (below). |
| 80031 to 80035 | Whet Stone (levels 1 to 5) | Same. The Chinese name is "recast stone", but reforging consumes only the sacrificed trophy and its cost lookup never asks for a stone, see Trophy reforging. |
| 20002, 20003 | Medium and Large Health Potion | In the item list but not in any shop, drop or pick-up table; see Consumables. |
| 20009 | Ammo | No source in any table. |
| 21027 | (Chinese-only "Revive+") | Price 0, no English name, no source. |
Eight trophies, ids 67068 to 67075, have Chinese-only names and no reference in any item column (the id 67073 appears in three dialog and quest columns, but those are accidental number matches with unrelated ids). Their labels describe bonuses for the abnormal (collapse) state of Sanity and for being at full health or under 50% health, so they look like test pieces for the sanity system. See Trophies.
Chinese text left in English columns, checked for CJK characters in the en_Name column of every table with English text:
| Table | Rows with Chinese in the English name |
|---|---|
| ItemData | 9 (20008, 21027, 70031, 70045, 70046, 72001 to 72004) |
| TrophyData | 8 (67068 to 67075) |
| StorySkin | 2 (skin 5000, Jerold's default look, and skin 9301, an outfit named after "Irina" for hero id 21039) |
Items 72001 to 72004 are not dead: the Arcade mode swaps picked-up stones for these "time reduction" items (see Immundus), but nobody ever wrote them an English name.
Statuses that nothing applies#
Of the 124 StatusData rows, only a handful appear nowhere. The script searched the status columns of all other tables (item, skill, trap, trick, weapon and statue rows) and every literal in the Lua code outside the data files.
- Status 10073, "Corrosion 2". A 5 s debuff with 10 as its first parameter. No table row and no Lua file mentions it. The working corrosion statuses are described in Corrosion.
- Status 10088, a 60 s debuff whose Chinese label means "slowed stamina recovery". Same result: no table row and no Lua reference.
Many other statuses are absent from the tables but are applied by hero code under literal ids (for example Norwood's invincibility 10082 or Handel's bleed 10107), so absence from the tables alone does not prove a status is unused. Only the two above are missing from both places.
Dead stats and dead constants#
A name that is defined once and never read is a reliable sign of cut work.
- Three hero stats are defined and never read:
DamageHPRecovery(stat 28),CritEnergyRecovery(29) andCritMpRecovery(30) appear exactly once in all Lua, as entries of a name list atms_herodata.lua:35,:59and:32. See Character stats. SanDeadRate(0.6) is set once inanimalbase_value_define.lua:18and never used; see Sanity.SkillHpPercentfor Terror Obsession (hero20045_define.lua:54) is never read; his real phase thresholds are coded elsewhere.- Viola's
SanItemValueSubRate(300 per mille,hero10002_define.lua:86) is never read. Benita's version (500,hero10003_define.lua:78) is read in four places, which suggests Viola's penalty was cut. See Abnormal state.
Developer switches and test code left in the release#
- Debug flags.
xdefine.lua:88-136defines 114Debug*andDLC_*flags. Seven aretruein this build:DLC_Maze,DLC_Elena,DebugEnterMaze,DebugEnterTide,DebugEnterArcade,DebugShowSkinandDebugOpenFeedback. Five of them (DLC_Maze,DLC_Elena,DebugEnterMaze,DebugEnterTide,DebugEnterArcade) are gates for the extra content (see Dance of the Throne), which is why every add-on is open in the Lua we have. The other 107 arefalse, and three of them (DebugDontUseTweenFrame,DebugItemTest,DebugVideoCaptureMode) are not read anywhere. - The cheat menu.
debugcfg.luadefines a 60-entry debug menu: fly, AI off, grade up, keep yourself or the enemy alive, max all properties, add any item, add talents, complete or revert any quest, teleport, and more than a dozen entries for Deep into the Dark Mist (force statues, fountains, honey pots, crates, floors and boss). It is shown only whenDebugShowis true, andDebugShowisfalse(xdefine.lua:95; checked incontrollermain.lua:440).DebugTalentOpenAll(line 133), which forces every talent node open, is likewise off. - Empty test map. The "Travel" entry starts a save with
LS_Setting.dbgStageMapas its stage map. That table is empty (ls_setting.lua:356), so Travel mode has nothing to show (inferred from the code). - A hard-coded demo save.
LS_Game.GenerateSaveData(ls_game.lua:350-361) holds a pre-made save for slot 3 (a leveled hero and a trophy list that includes Fusion and Whet Stones) and otherwise writes the literal text "test". The lobby calls it with ids 20200801 and 20200802 when the app version isAppCJ2020(lobbymainctrl.lua:2158, 2276), so it was probably a trade-show demo build (inferred from the constant name). - Logging. The save code writes
SystemHelper.LogTestlines with the raw save text on every save and load (ls_game.lua:97, 153).
Sources#
- Tables:
kit/tables/Test.jsonl(19 rows),StatusType.jsonl(12),SkillComboData.jsonl(17),StoryBounty.jsonl(9),StoryStairKickHint.jsonl(2),GuardModeSpawn.jsonl(84),BufferData.jsonl(12),Cave1002.jsonl(25),HeroData.jsonl(75),ItemData.jsonl,TrophyData.jsonl,StorySkin.jsonl,StatusData.jsonlrows 10073 and 10088; raw filesreference/lua_src/gamedata/structdata/exportdata/es_*.lua. - Loader check: no occurrence of
ES_Test,ES_StatusType,ES_SkillComboData,ES_StoryBountyorES_StoryStairKickHintin any Lua file other than the export file itself;ms_scenedata.lua:49, 65(Cave1002 loaded by name). - Modes:
controllermain.lua:2790-2802,controllerlobby.lua:1434-1440,chooseheroctrl.lua:221-236,battledata.lua:7-10,controllerguardmode.lua(478-582, 190-233),controlleroccupymode.lua,controllerfreemode.lua. - Flags and test code:
gamedata/xdefine.lua:88-136,gamedata/debugcfg.lua,luascript/ui/controller/debugctrl.lua,structdata/fs_savestory.lua:3287,structdata/ls_setting.lua:356,structdata/ls_game.lua:350-361,ui/controller/lobbymainctrl.lua:2158, 2276. - Dead constants:
structdata/ms_herodata.lua:32-59,gamedata/playerdefine/animalbase_value_define.lua:18,hero20045_define.lua:54,hero10002_define.lua:86,hero10003_define.lua:78. - Scripts:
build/wiki/scripts/index_hidden/(refs.py,checks2.pytochecks6.py,models2.py,flags.py,final_checks.py); results inbuild/wiki/data/index_hidden/.