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 MessageMarkup.MD for RE7 message tags such as
<COLOR RRGGBB>,<SIZE n>,<ICON NAME>,<PAGE>,<TIME ...>, and unobserved engine enum entries.
-
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###. - The Guest House attic M19 (
b09f6174-47f2-4851-acc3-3106d0902bfainenvironment/scene/chapter1/c01_3f.scn.20) can duplicate randomized Birthday skills when itsGetItemEventpickup shape is retained. The user verified that replacing the event object with a regular item template fixes collection while retaining the "OK, fine!" dialogue.ItemModifiertherefore replaces this reviewed event pickup with the selected item's regular template, retaining its root GUID, transform, andapp.Itemsettings, and generating a fresh save GUID. The replacement interaction must retainabb411f5-de67-0b95-0a58-a794254c3417:1200_HandGunGet_Mesinleveldesign/fsm/chapter1/levelfsm_c01.scn.20references that child viaapp.fsm.InteractTest.InteractObj. Other cloned children receive fresh GUIDs.preserve-item-modelsstill retains the original mesh. Keep other FSM-controlled pickups intact until their event and progression behavior is separately verified. The generated fix has been confirmed working in-game; save/reload persistence has not been separately verified.
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 recipe
ResultItemIDvalues fromprefab/item/itemcombinedata.user.2, not recipeDataIDlabels. The local RT TDB (reframework/il2cpp_dump_rt.json.gz) declaresapp.ItemCombineData.getData(System.String)with parameterresultItemID; the exact-table recipe implementation likewise builds dictionary entries from result IDs. Multiple recipe variants share one visible result entry. - The native combine menu only navigates 8 entries. BioRand's REFramework recipe handling enables additional entries; normal recipe generation caps the dictionary at
RecipeModifier.MaxRecipeCountdistinct result items (20, arranged in 4 columns and 5 rows). - Duplicate entries lead to weird GUI behaviour
-
prefab/item/itemcombinedata.user.2DataIDlabels a recipe; the dictionary above references itsResultItemIDinstead.- source item IDs and result item ID must be valid
- The native combine GUI has strict validations. Randomized combinations need BioRand's REFramework recipe handling to appear correctly.
- 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]
Historical ideas for new recipes (pseudocode; author current recipes in _Data/recipes.csv using the RecipeModel schema):
// Ammo -> Ammo
CreateRecipe("HandgunBulletL", 20, "ChemicalL", 1, "MagnumBullet", 10), // Enhanced Handgun Ammo + Separating Agent => 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 + 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/ch1_startinventory.user.2 -> tested successfully with chainsaw
Mia starting inventory (present-day ship): natives/stm/leveldesign/fsm/chapter4/chapter4_1/other/4-1startinventory.user.2
Mia starting inventory (Old Videotape, with 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
-
Enemy placement directives (
preserve,aggro,nodup,cull,Include, andExclude) are consumed from the enemy spreadsheet and embedded CSV. Seedocs/enemies/enemy_spawning.mdfor precedence, definition-ID wildcards, and remaining native encounter safeguards. -
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