I've gathered this information while working on the randomizer.
-
(key) item locations: re_chunk_000/natives/stm/leveldesign/itemset
-
prefabs: re_chunk_000/natives/stm/prefab/item
-
item combine data
- re_chunk_000/natives/stm/prefab/item/dictionarycombinedata.user.2
- re_chunk_000/natives/stm/prefab/item/itemcombinedata.user.2
-
key item prefabs
- re_chunk_000/natives/stm/prefab/item/keyitemsettings.user.2
-
message text and markup
- re_chunk_000/natives/stm/message/*.msg.17
- See
docs/items/MessageMarkup.MDfor RE7 message tags such as<COLOR RRGGBB>,<SIZE n>,<ICON NAME>,<PAGE>,<TIME ...>, and engine-supported but unobserved tag types.
-
Main House starts reuse the native Chapter 1
app.AddItemaction in0_Ch1Item_ItemBoxIn_FFS, replacing the transfer from the skipped chapter. Keep the original action UID andForceFsmSave/gimmick controls so the configured loadout initializes once and survives reload. -
Placed weapon chests use the template's unlocked root FSM, with its interaction references rebound to the cloned drawer. Strip the imported LockLv1 children; their state checks reference locks absent from the placed chest. Keep drawer ownership of the hidden weapon until opening, and give the weapon an identity local transform. Reusing the chest's world transform applies the placement offset twice.
-
The key item location randomizer is intentionally conservative. If an item is tied to a boss reward, cutscene, or puzzle state rather than a plain inventory pickup, keep it vanilla until the full FSM sequence is understood and runtime-tested.
- D-Series Arm, D-Series Head, Snake Key, and E-Necrotoxin retain their native rewards and story transitions. Their phase floors alone do not prove relocation safe. Do not remove the cultivation-room doors to compensate for an early E-Necrotoxin pickup.
- Spider lockers and the deputy-body rating variants are not valid key carriers. The former need damage resources; the latter are mutually exclusive regional objects despite having no CSV difficulty restriction.
- Key carriers also require a reviewed GUID and scene in
KeyItemCarrierSafety; extra pickups must retain their reviewed coordinates. The Main Hall cubby is excluded because its position intersects solid geometry. Adding CSV rows must not silently expand the progression pool. Update the independent pickup prerequisites inKeyItemProgressionAuditTestswhen approving a new carrier.
-
RandomizerConfigurationDefinition.csis the source of truth for therandom-key-item-locationsoption. Do not only edit profile JSON when changing the option. -
Do not emulate trigger-driven room-entry flags as pickup side effects. Stone Statuette (
SilhouettePazzlePieceOldHouse) remains randomizable, but its formerc03_3_Main_EnterMiaCapturedRoompickup side effect is intentionally skipped because the original writer is150_Main_EnterMiaCapturedRoom, a physicalTriggerInActioninlevelfsm_c03_3.scn.20. The randomizer adds an equivalent fallback trigger on the natural Old House shadow-puzzle path so players do not need to detour through the vanilla Stone Statuette room just to advance hidden progression. -
Current unsafe preserved items include:
- Hatch Key (
FloorDoorKey): relocation breaks Jack's Main House progression triggers. Preserve the native pickup and its interaction/flag sequence; even reachable pre-hatch supply locations are unsafe replacements. Its original pickup must not carry another randomized key either. - Red Dog Head (
3CrestKeyC): itsc03_2_Main_GetCrestInFreezerRoomflag is the Jack 2/freezer reward progression state, not just an item-acquired flag. - Candle (
Candle_Lighted): itsc03_4_Main_PazzleRoom_CandleOnflag is part of the Lucas birthday puzzle state machine. - Lantern, Ox Statuette, keycards, Chapter 1 key items, Chapter 4 fuse, and complete serum remain vanilla until exact access-sphere and FSM side effects are proven safe.
- Hatch Key (
-
The D-Series Arm is a real progression precondition for the Lucas/snake-room branch:
objectivefsm_c03readsc03_3_Main_GetEvlineArm, and the attic ladder branch also depends on the resulting Lucas card-key flow. Keep the graph edge into snake-key rooms gated on both Snake Key and D-Series Arm. -
Route reachability is not sufficient for pickups that advance a level FSM. Their rules also carry an earliest-safe phase, which is checked independently of carrier masks. Crank cannot be collected before completing the Old House Stone Statuette puzzle, Crow Key cannot be collected before the crank bridges, and Power Cable cannot be collected before the Corrosive-gated ship rooms. If no carrier satisfies both the phase floor and the normal route deadline, preserve the vanilla pickup.
-
Flashback copies of key items are separate scripted state. Do not replace them with filler and do not use them when deriving relocated pickup side effects.
-
Scripted flashback scenes (
ff*and chapter 4*past.scnscenes) are protected from enemy replacement, enemy multiplication, extra enemy placement, and collision-bearing extra objects. Loose non-key supplies may still be randomized. -
Carrier safety is an invariant over every eligible placement, not only generated routes. Extend
KeyItemLocations_AllProgressionFlagCarriersRespectMinimumSafePhaseswhenever another pickup is shown to advance an FSM phase. -
Chapter 3 key matching prefers less occupied rooms, treating the kitchen, pantry, and crawlspace as one starting area. Keep this a soft preference with seeded tie-breaking: constrained keys may share an area, and every assignment must still pass the existing carrier, phase, and complete-route checks.
-
The
4-key-hintsoutput asset is a seed-specific offline HTML map spoiler.KeyItemMapRepositorymaps stable pickup GUIDs to room-label centroids on embedded floor plans under_Data/key_item_maps; marker numbers and legends retain route-sphere order, original carrier names, and collapsible scene/GUID/world-position diagnostics. KeepKeyItemLocations_RandomizesSupportedKeyItemsIntoRouteSafeNormalPlacementscovering every eligible route target so a newly added pickup cannot silently lose its map marker. -
Chapter 4
ff050/bfitemset metadata identifies Ship S2 but not an exact room. Those spoiler markers are deliberately labeled as approximate floor-level locations. Do not invent exact room calibration without additional structured evidence.
The .pak files are found in the dlc directory.
(chapter|c)0?7_1 => Bedroom ((chapter|c)0?7_2)|cardgame|survival => 21 (chapter|c)0?7_3 => Nightmare (chapter|c)0?7_4 => Daughters (chapter|c|ch)0?8 => NotAHero (chapter|c|ch)0?9 => EndOfZoe birthday => Jacks55thBirthday /(e|i)md => EthanMustDie (dlcitem|coin)_01 => DefenseCoinAndMadhouseUnlock (dlcitem|coin)_02 => AttackCoinAndMadhouseUnlock (dlcitem|coin)_03 => InstinctCoinAndMadhouseUnlock (dlcitem|coin)_04 => ReloadCoinAndMadhouseUnlock (dlcitem|coin)_05 => UniversalCoinAndMadhouseUnlock
General lessons:
- The C# TDB in
.analysis/re7_srcis the fastest source for class names, inheritance, fields, and enums. Use IDA for xrefs, decompilation, strings, and runtime control flow after narrowing the target. CH8is Not a Hero andCH9is End of Zoe. Jack's 55th Birthday logic usesBirthday*andFsmBirthday*classes, not CH8 classes.- Bringing a DLC object into the main game usually requires the full runtime component chain and asset load chain. A prefab, mesh, or enum ID alone is rarely enough.
natives/stm/scenes/master.scn.20andnatives/stm/scenes/dlc/dlc_active_root.scn.20are important DLC scene roots. Standby/default-standby state on the DLC folder chain can decide whether referenced DLC scenes and assets are actually mounted.- If a DLC asset still does not appear after scene data looks correct, compare what the DLC mode loads from the main menu rather than only inspecting the final object prefab.
- Live REFramework MCP is configured through
C:\Users\Julian\.codex\config.tomland runsF:\RE_Modding\re-engine-mcp-master\mcp-serveragainsthttp://localhost:8899. - Confirmed live MCP probes on 2026-05-06:
reframework_get_tdbreturned 78687 types, 507723 methods, 147762 fields, and 103892 properties;reframework_get_camerareturned FOV 81, near clip 0.05, far clip 1000;reframework_get_singletonsexposed relevant managers includingapp.DLCContentManager,app.DLCContentSceneManager,app.EnemyGeneratorManager,app.InventoryManager,app.ItemManager,app.ItemResourceManager,app.ObjectManager,via.ResourceManager, andvia.SceneManager. reframework_get_inventoryis a thin MCP wrapper overGET /api/inventoryand still returned a generic invocation error after retrying in a loaded gameplay state. Treat that endpoint as needing WebAPI/plugin investigation before using it for RE7 inventory research.
Birthday skills:
- Skills are defined under
natives/stm/prefab/item/birthdayskillitemsetting.user.2and use IDsskl001throughskl023. - The
skl###noentries are locked/dummy Birthday variants and should not be injected as usable main-game skills. - Direct placement of
Prefab/Skill/skl001/Skl001PassiveSkill.userinto Ethan'sapp.PlayerPassiveSkillManager.PlayerPassiveSkillworked and granted infinite ammo, proving the main-game player manager can consume Birthday passive userdata. - For inventory support, the important chain is the original skill inventory prefab
Prefab/Skill/skl###/Skl###.pfb, itsapp.PassiveSkillItem, the referencedPlayerPassiveSkill.user, messages copied intoui_item_mes.msg.17, and REFramework handling to avoid the native Birthday-only inventory callback freeze. - Birthday skills do not have normal world pickup meshes. Static/random placements should use a known-good pickup shell and override
app.Item.ItemDataIDto the chosenskl###.
Not a Hero and End of Zoe enemies:
- DLC enemies need imported enemy templates and spawn-info templates in
template.scn.20; missing templates should be skipped rather than emitted partially. - Not a Hero generator replacements require
app.CH8EnemyGenerator,app.CH8EnemyPool,app.CH8EnemySpawnInfo, and the concreteapp.CH8EnemySpawnInfoOptionEm####. - End of Zoe generator replacements use
app.CH9EnemySpawnInfoandapp.CH9EnemySpawnInfoOptionEm####; noCH9EnemyGenerator/CH9EnemyPooltypes were found in the current TDB. app.EnemySpawnInfoOptionDLCexists, but real DLC spawn-info objects do not universally include or require it.- Template import must match concrete
UnitAliasand prefab alias, not just option class suffix. Some CH8 aliases reuse base stacks. Em4210= Fat Headless Molded. It usesUnitAlias = Em4210, but the runtime stack isapp.CH8Em4200*plusapp.CH8EnemySpawnInfoOptionEm4200.Em4400= Mama Mold.Em4450= Little Crawler.Em4460= Mama Mold. A wrapper object with nestedEm4450exists, butmain300generator.scn.20also has a normal generator-styleUnitAlias = Em4460source.Em4500= Mutated Lucas. This is the Not a Hero final boss and should stay opt-in/special-case until runtime-proven.Em4600= Fumer. It usesUnitAlias = Em4600, but the runtime stack isapp.CH8Em4000*plusapp.CH8EnemySpawnInfoOptionEm4000.
IDA MCP confirmation pass, 2026-08-25, RE7 1.0.0.7, SHA-256 D550260029B51A580E206B9A12A4EB7F4A1B4DD230BBA5DEFCCA81DA40597321:
Full function addresses, control-flow evidence, signatures, and implementation consequences are recorded in DLCIntegrationEvidence.MD.
- The missing CH8 command actions are not caused by an explicit chapter check in
app.CH8Em4400ActionController::doAwake149958(0x1418DDB00). Its first call isapp.CH8MoldedActionController::doAwake144706; if that base call leaves a managed exception, the Em4400 method returns before inserting any actions. app.CH8MoldedActionController::doAwake144706(0x141E35C20) andapp.CH8EnemyActionController::doAwake150859(0x1410EF950) both require theapp.CH8GameRankManagersingleton when the enemy has an initializedEnemyRankManager. A missing singleton takes the null/error path before the derived action insertion block.- This dependency covers the known ordinary CH8 families: Em4000, Em4200, and Em4400 call the CH8 molded base; Em4450 calls the CH8 enemy base directly. The preferred experiment is now a narrow campaign-only rank-sync bypass/fallback, not manual action construction.
- Base
app.EnemySpawnInfo::setupInstance90108already gets the current rank from the ordinaryapp.GameManagerand applies it withEnemyRankManager.setRank. Skipping only the earlier CH8-specific rank synchronization should therefore retain campaign rank semantics. app.CH8EnemyGenerator::.ctor323011(0x1401066A0) setsIsEnablePause = true; imported CH8 generators must be explicitly unpaused.app.CH8EnemyPool::.ctor323010is only a thunk to the base pool constructor.- IDA contains no
CH9EnemyGeneratororCH9EnemyPoolfunctions.app.CH9EnemySpawnInfo::.ctor325718(0x14032F790) sets one default value and calls the base spawn-info constructor, supporting base generator/pool use for CH9. - CH8 need-area requests are unsuitable for campaign FSMs:
requestSpawnWithNeedArea189521only queues a deduplicated Spawn operation when the spawn-info GameObject hasUpdateSelf;update189520drains it throughrequestOperationWithNeedArea189526, which calls the CH8 blackboard and generator manager.
Not a Hero and End of Zoe items:
app.ItemManager::createItemInstance319138(0x142146680) returns null whenItemDataorItemPrefabis missing, otherwise instantiates the prefab at the owner transform and parents it to the owner.app.fsm.ItemAddTest::start357511(0x14045C1B0) tests its own_Multiple,_ItemList, and_ItemDataIDpath. Changing only the sceneapp.Item.ItemDataIDis not sufficient for these interactions.app.CH9PassiveSkillItem::onInsertInventory113604(0x1415621D0) requiresapp.ICH9PlayerOrderfrom the inventory owner and registers attack/guard amulets and the passive skill through that interface. Ethan cannot consume this callback unchanged.app.CH9Weapon1600::onInsertInventory328503(0x140556DD0) resolvesapp.CH9PlayerEquipManagerfrom the inventory owner and callsregisterKnuckleWeapon; Joe's gauntlets are a player-system port, not a data-only weapon import.app.CH8WeaponRemedyAppend::use324610(0x140AA29F0) requires a CH8-compatible player interface and optionally updatesCH8GameRankManagerremedy-use score.app.CH9WeaponRemedyAppend::use328562(0x1414BDDC0) likewise checks a CH9-specific player interface. Campaign healing should use a campaign-native remedy adapter.
-
prefab/item/dictionarycombinedata.user.2- Defines what recipes are shown in the combine menu
- Only contains ItemDataID keys for a
Dictionarythat is evaluated at runtime - All entries MUST be valid item IDs (see enum
app.ItemID)! Otherwise the game does not load (infinite loop). Own IDs are not allowed. - Must reference DataIDs from recipes in
prefab/item/itemcombinedata.user.2 - If there are more than 8 entries the additional ones won't be accessible in the combine menu, only the icons can be seen but the cursor can't be moved to them. Modding it via REFramework is possible but not ideal
- Duplicate entries lead to weird GUI behaviour
-
prefab/item/itemcombinedata.user.2- DataID is referenced by the dictionary above
- source item IDs and result item ID must be valid
- the combine GUI has very strict validations, random combinations do not appear!
- items can be combined with themselves
- EnableFlag refers to a flag which allows the item to be crafted. E.g. the flag
eab670f7-4475-4258-b900-cbe91664c9a3which iscmb_enable_DybbukMedicineactivates the ability to craft the serum - IsTrophyTarget: Likely refers to the achievement "1st Place at the Science Fair" where you must create all items that contain Chem Fluid and Strong Chem Fluid
- IsTutorialTarget: ?
Original recipes:
Original crafting recipes
1x Burner Grip + 1x Burner Nozzle ⇒ 1x Burner
1x Herb + 1x Chem Fluid ⇒ 1x First Aid Med
1x Herb + 1x Strong Chem Fluid ⇒ 1x Strong First Aid Med
1x Supplements + 1x Chem Fluid ⇒ 1x Psychostimulants
1x Solid Fuel + 1x Strong Chem Fluid ⇒ 2x Flame Rounds
1x Supplements + 1x Strong Chem Fluid ⇒ 2x Neuro Rounds
1x Solid Fuel + 1x Chem Fluid ⇒ 100x Burner Fuel
1x First Aid Med + 1x Separating Agent ⇒ 1x Chem Fluid
1x Psychostimulants + 1x Separating Agent ⇒ 1x Chem Fluid
100x Burner Fuel + 1x Separating Agent ⇒ 1x Chem Fluid
1x Strong First Aid Med + 1x Separating Agent ⇒ 1x Strong Chem Fluid
1x Flame Rounds + 1x Separating Agent ⇒ 1x Strong Chem Fluid
1x Neuro Rounds + 1x Separating Agent ⇒ 1x Strong Chem Fluid
1x Gunpowder + 1x Strong Chem Fluid ⇒ 10x Enhanced Handgun Ammo
1x Repair Kit + 1x Broken Handgun ⇒ 1x M19 Handgun
1x Repair Kit + 1x Broken Shotgun ⇒ 1x M21 Shotgun
1x Gunpowder + 1x Chem Fluid ⇒ 10x Handgun Ammo
10x Handgun Ammo + 1x Separating Agent ⇒ 1x Chem Fluid
10x Enhanced Handgun Ammo + 1x Separating Agent ⇒ 1x Strong Chem Fluid
10x Handgun Ammo + 1x Gunpowder ⇒ 5x Enhanced Handgun Ammo
Recipes in the combine GUI:
1x Herb [Drug] + 1x Chem Fluid [Material] ⇒ 1x First Aid Med [Drug]
1x Gunpowder [Material] + 1x Chem Fluid [Material] ⇒ 10x Handgun Ammo [Shell]
1x Solid Fuel [Material] + 1x Chem Fluid [Material] ⇒ 100x Burner Fuel [Shell]
1x Supplements [Material] + 1x Chem Fluid [Material] ⇒ 1x Psychostimulants [Drug]
1x Herb [Drug] + 1x Strong Chem Fluid [Material] ⇒ 1x Strong First Aid Med [Drug]
1x Gunpowder [Material] + 1x Strong Chem Fluid [Material] ⇒ 10x Enhanced Handgun Ammo [Shell]
1x Solid Fuel [Material] + 1x Strong Chem Fluid [Material] ⇒ 2x Flame Rounds [Shell]
1x Supplements [Material] + 1x Strong Chem Fluid [Material] ⇒ 2x Neuro Rounds [Shell]
Ideas for new recipes:
// Ammo -> Ammo
CreateRecipe("HandgunBulletL", 20, "ChemicalL", 1, "MagnumBullet", 10), // Enhanced Handgun Ammo + Strong Chem Fluid => 44 MAG Ammo
CreateRecipe("ShotgunBullet", 10, "ChemicalM", 1, "MagnumBullet", 5), // Shotgun Shell + Strong Chem Fluid => 44 MAG Ammo
CreateRecipe("HandgunBulletL", 10, "MagnumBullet", 5, "ShotgunBullet", 20), // Enhanced Handgun Ammo + 44 MAG Ammo => Shotgun Shells
CreateRecipe("BurnerBullet", 100, "HandgunBulletL", 10, "FlameBulletS", 5), // Burner Fuel + Enhanced Handgun Ammo => Flame Rounds
CreateRecipe("HandgunBulletL", 10, "ChemicalS", 1, "AcidBulletS", 5), // Enhanced Handgun Ammo + Strong Chem Fluid => Neuro Rounds
// Heal -> Heal
CreateRecipe("RemedyM", 1, "RemedyM", 1, "RemedyL", 1), // First Aid Med + First Aid Med => Strong First Aid Med
CreateRecipe("RemedyM", 1, "Herb", 1, "RemedyL", 1), // First Aid Med + Herb => Strong First Aid Med
CreateRecipe("RemedyL", 1, "RemedyL", 1, "Stimulant", 1), // Strong First Aid Med + Strong First Aid Med => Steroids
CreateRecipe("RemedyM", 1, "EyeDrops", 1, "Depressant", 1), // First Aid Med + Psychostimulants => Stabilizer
CreateRecipe("EyeDrops", 1, "Herb", 1, "Depressant", 1), // Psychostimulants + Herb => StabilizerEthan starting inventory: natives/stm/leveldesign/fsm/chapter1/other -> tested successfully with chainsaw
Mia starting inventory (VHS): natives/stm/leveldesign/fsm/chapter4/chapter4_1/other/4-1startinventory.user.2
Mia starting inventory (w/ machine gun): natives/stm/leveldesign/fsm/ff050/other/ff050_startinventory.user.2
Clancy VHS starting inventory natives/stm/leveldesign/fsm/ff000/other/startinventory_ff000.user.2
Files where inventory size is changed:
- levelfsm_c07_3_normalmode.scn.20
- levelfsm_c07_3_survivalmode.scn.20
- stage1_seta.scn.20
- stage1_setb.scn.20
- stage2_seta.scn.20
- stage2_setb.scn.20
- stage3_seta.scn.20
- stage3_setb.scn.20
- ship1f.scn.20
- shipoutside.scn.20
- mainhouse_east.scn.20
- oldhouse.scn.20
- levelfsm_ff000.scn.20
- level_fsm_ff050.scn.20
- levelfsm_c07_2_storymode.scn.20
- levelfsm_c04_1.scn.20
- levelfsm_c04_2.scn.20
- mainflow_gimmick.scn.20
- levelfsm_c09_4.scn.20
- ch8_game.scn.20
- em2000: Mia
- em3000: Jack
- em3001: Jack (Nightmare DLC)
- em3002: Jack (Daughters DLC)
- em3100: Marguerite
- em3101: Marguerite (Bedroom DLC)
- em3600: Marguerite Fight Boss
- em4000: Molded
- em4100: 4-Legged Molded
- em4200: Fat Molded
- em5400: Insects
- em5500: Darker Insects
- em55[10..40]: Insects
- em6400: end of zoe jack
- em8000: Jack Saw Fight
- em8001: Jack with Shears (Nightmare DLC)
- em8100: Jack Eyes Boss
- em8900: Evie Final Form
- in the FSM, the UIDs are not arbitrary. they are actually state IDs hard-coded in .fsm.16 files!
- therefore, only assign valid UIDs in biorand
- wandering enemies must be edited by removing the MapName in via.navigation.NavigationSurface
- Initial Jack (Em3000) encounter: natives/stm/leveldesign/fsm/chapter1/amaro.scn.20
- Molded Group outside of Swamp Hut: natives/stm/scenes/chapter/chapter4/chapter4_2/moldeads.scn.20
- HP: natives/stm/prefab/character/pl0000/pl0000maxhealthtable.user.2
- Eye drop params (max time and range): natives/stm/prefab/system/systemparameterdata.user
- Lucas puzzle door FSM: leveldesign/fsm/chapter3/chapter3_4/levelfsm_c03_4.scn.20