From 7d9240c27711f648e5e49d7cebe4136d7cc7c43e Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Sun, 19 Apr 2026 02:48:05 -0700 Subject: [PATCH] Extend add-building candidate bridge artifact --- .../event-effects-building-bindings.json | 49 ++++++++++- .../event-effects-semantic-catalog.json | 88 +++++++++---------- docs/rehost-queue.md | 14 +-- .../py/build_event_effect_semantic_catalog.py | 8 +- 4 files changed, 105 insertions(+), 54 deletions(-) diff --git a/artifacts/exports/rt3-1.06/event-effects-building-bindings.json b/artifacts/exports/rt3-1.06/event-effects-building-bindings.json index c816937..ef36325 100644 --- a/artifacts/exports/rt3-1.06/event-effects-building-bindings.json +++ b/artifacts/exports/rt3-1.06/event-effects-building-bindings.json @@ -4,7 +4,8 @@ "Add-building descriptor ids 503..613 ground candidate id as descriptor_id - 503 through direct disassembly of 0x00430270 world_try_place_random_structure_batch_from_compact_record.", "Direct disassembly of 0x0041ede0 structure_candidate_collection_stream_load_records_seed_name_catalogs_and_refresh_filter_sidebands shows the imported candidate row names being copied into runtime name catalogs keyed by live candidate id.", "The concrete candidate names below are checked against the stable RT3 1.05 candidate-availability table order exposed by runtime inspect-candidate-table on Alternate USA, Southern Pacific, and Spanish Mainline saves.", - "Availability bits vary by scenario, but the ordered candidate names for candidate ids 0..66 are stable across the checked saves." + "Availability bits vary by scenario, but the ordered candidate names for candidate ids 0..66 are stable across the checked saves.", + "The checked RT3 1.05 candidate-availability table count stays at 0x43 = 67 across the current non-hook corpus, so descriptor-side candidate ids 67..110 remain grounded only as descriptor_id - 503 bridges until a broader non-hook name catalog is recovered." ], "bindings": [ { "descriptor_id": 503, "candidate_id": 0, "candidate_name": "AluminumMill", "binding_index": 1, "binding_source": "rt3_105_candidate_table_and_0x41ede0" }, @@ -73,6 +74,50 @@ { "descriptor_id": 566, "candidate_id": 63, "candidate_name": "Warehouse08", "binding_index": 64, "binding_source": "rt3_105_candidate_table_and_0x41ede0" }, { "descriptor_id": 567, "candidate_id": 64, "candidate_name": "Warehouse09", "binding_index": 65, "binding_source": "rt3_105_candidate_table_and_0x41ede0" }, { "descriptor_id": 568, "candidate_id": 65, "candidate_name": "Warehouse10", "binding_index": 66, "binding_source": "rt3_105_candidate_table_and_0x41ede0" }, - { "descriptor_id": 569, "candidate_id": 66, "candidate_name": "Warehouse11", "binding_index": 67, "binding_source": "rt3_105_candidate_table_and_0x41ede0" } + { "descriptor_id": 569, "candidate_id": 66, "candidate_name": "Warehouse11", "binding_index": 67, "binding_source": "rt3_105_candidate_table_and_0x41ede0" }, + { "descriptor_id": 570, "candidate_id": 67, "binding_index": 68, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 571, "candidate_id": 68, "binding_index": 69, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 572, "candidate_id": 69, "binding_index": 70, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 573, "candidate_id": 70, "binding_index": 71, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 574, "candidate_id": 71, "binding_index": 72, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 575, "candidate_id": 72, "binding_index": 73, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 576, "candidate_id": 73, "binding_index": 74, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 577, "candidate_id": 74, "binding_index": 75, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 578, "candidate_id": 75, "binding_index": 76, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 579, "candidate_id": 76, "binding_index": 77, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 580, "candidate_id": 77, "binding_index": 78, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 581, "candidate_id": 78, "binding_index": 79, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 582, "candidate_id": 79, "binding_index": 80, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 583, "candidate_id": 80, "binding_index": 81, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 584, "candidate_id": 81, "binding_index": 82, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 585, "candidate_id": 82, "binding_index": 83, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 586, "candidate_id": 83, "binding_index": 84, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 587, "candidate_id": 84, "binding_index": 85, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 588, "candidate_id": 85, "binding_index": 86, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 589, "candidate_id": 86, "binding_index": 87, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 590, "candidate_id": 87, "binding_index": 88, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 591, "candidate_id": 88, "binding_index": 89, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 592, "candidate_id": 89, "binding_index": 90, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 593, "candidate_id": 90, "binding_index": 91, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 594, "candidate_id": 91, "binding_index": 92, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 595, "candidate_id": 92, "binding_index": 93, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 596, "candidate_id": 93, "binding_index": 94, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 597, "candidate_id": 94, "binding_index": 95, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 598, "candidate_id": 95, "binding_index": 96, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 599, "candidate_id": 96, "binding_index": 97, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 600, "candidate_id": 97, "binding_index": 98, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 601, "candidate_id": 98, "binding_index": 99, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 602, "candidate_id": 99, "binding_index": 100, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 603, "candidate_id": 100, "binding_index": 101, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 604, "candidate_id": 101, "binding_index": 102, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 605, "candidate_id": 102, "binding_index": 103, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 606, "candidate_id": 103, "binding_index": 104, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 607, "candidate_id": 104, "binding_index": 105, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 608, "candidate_id": 105, "binding_index": 106, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 609, "candidate_id": 106, "binding_index": 107, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 610, "candidate_id": 107, "binding_index": 108, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 611, "candidate_id": 108, "binding_index": 109, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 612, "candidate_id": 109, "binding_index": 110, "binding_source": "0x430270_descriptor_bridge_only" }, + { "descriptor_id": 613, "candidate_id": 110, "binding_index": 111, "binding_source": "0x430270_descriptor_bridge_only" } ] } diff --git a/artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json b/artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json index d1a96fe..d350e7a 100644 --- a/artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json +++ b/artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json @@ -5135,7 +5135,7 @@ }, { "descriptor_id": 570, - "label": "Add Building Slot 68", + "label": "Add Building Candidate Slot 68", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5144,7 +5144,7 @@ }, { "descriptor_id": 571, - "label": "Add Building Slot 69", + "label": "Add Building Candidate Slot 69", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5153,7 +5153,7 @@ }, { "descriptor_id": 572, - "label": "Add Building Slot 70", + "label": "Add Building Candidate Slot 70", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5162,7 +5162,7 @@ }, { "descriptor_id": 573, - "label": "Add Building Slot 71", + "label": "Add Building Candidate Slot 71", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5171,7 +5171,7 @@ }, { "descriptor_id": 574, - "label": "Add Building Slot 72", + "label": "Add Building Candidate Slot 72", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5180,7 +5180,7 @@ }, { "descriptor_id": 575, - "label": "Add Building Slot 73", + "label": "Add Building Candidate Slot 73", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5189,7 +5189,7 @@ }, { "descriptor_id": 576, - "label": "Add Building Slot 74", + "label": "Add Building Candidate Slot 74", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5198,7 +5198,7 @@ }, { "descriptor_id": 577, - "label": "Add Building Slot 75", + "label": "Add Building Candidate Slot 75", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5207,7 +5207,7 @@ }, { "descriptor_id": 578, - "label": "Add Building Slot 76", + "label": "Add Building Candidate Slot 76", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5216,7 +5216,7 @@ }, { "descriptor_id": 579, - "label": "Add Building Slot 77", + "label": "Add Building Candidate Slot 77", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5225,7 +5225,7 @@ }, { "descriptor_id": 580, - "label": "Add Building Slot 78", + "label": "Add Building Candidate Slot 78", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5234,7 +5234,7 @@ }, { "descriptor_id": 581, - "label": "Add Building Slot 79", + "label": "Add Building Candidate Slot 79", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5243,7 +5243,7 @@ }, { "descriptor_id": 582, - "label": "Add Building Slot 80", + "label": "Add Building Candidate Slot 80", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5252,7 +5252,7 @@ }, { "descriptor_id": 583, - "label": "Add Building Slot 81", + "label": "Add Building Candidate Slot 81", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5261,7 +5261,7 @@ }, { "descriptor_id": 584, - "label": "Add Building Slot 82", + "label": "Add Building Candidate Slot 82", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5270,7 +5270,7 @@ }, { "descriptor_id": 585, - "label": "Add Building Slot 83", + "label": "Add Building Candidate Slot 83", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5279,7 +5279,7 @@ }, { "descriptor_id": 586, - "label": "Add Building Slot 84", + "label": "Add Building Candidate Slot 84", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5288,7 +5288,7 @@ }, { "descriptor_id": 587, - "label": "Add Building Slot 85", + "label": "Add Building Candidate Slot 85", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5297,7 +5297,7 @@ }, { "descriptor_id": 588, - "label": "Add Building Slot 86", + "label": "Add Building Candidate Slot 86", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5306,7 +5306,7 @@ }, { "descriptor_id": 589, - "label": "Add Building Slot 87", + "label": "Add Building Candidate Slot 87", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5315,7 +5315,7 @@ }, { "descriptor_id": 590, - "label": "Add Building Slot 88", + "label": "Add Building Candidate Slot 88", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5324,7 +5324,7 @@ }, { "descriptor_id": 591, - "label": "Add Building Slot 89", + "label": "Add Building Candidate Slot 89", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5333,7 +5333,7 @@ }, { "descriptor_id": 592, - "label": "Add Building Slot 90", + "label": "Add Building Candidate Slot 90", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5342,7 +5342,7 @@ }, { "descriptor_id": 593, - "label": "Add Building Slot 91", + "label": "Add Building Candidate Slot 91", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5351,7 +5351,7 @@ }, { "descriptor_id": 594, - "label": "Add Building Slot 92", + "label": "Add Building Candidate Slot 92", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5360,7 +5360,7 @@ }, { "descriptor_id": 595, - "label": "Add Building Slot 93", + "label": "Add Building Candidate Slot 93", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5369,7 +5369,7 @@ }, { "descriptor_id": 596, - "label": "Add Building Slot 94", + "label": "Add Building Candidate Slot 94", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5378,7 +5378,7 @@ }, { "descriptor_id": 597, - "label": "Add Building Slot 95", + "label": "Add Building Candidate Slot 95", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5387,7 +5387,7 @@ }, { "descriptor_id": 598, - "label": "Add Building Slot 96", + "label": "Add Building Candidate Slot 96", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5396,7 +5396,7 @@ }, { "descriptor_id": 599, - "label": "Add Building Slot 97", + "label": "Add Building Candidate Slot 97", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5405,7 +5405,7 @@ }, { "descriptor_id": 600, - "label": "Add Building Slot 98", + "label": "Add Building Candidate Slot 98", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5414,7 +5414,7 @@ }, { "descriptor_id": 601, - "label": "Add Building Slot 99", + "label": "Add Building Candidate Slot 99", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5423,7 +5423,7 @@ }, { "descriptor_id": 602, - "label": "Add Building Slot 100", + "label": "Add Building Candidate Slot 100", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5432,7 +5432,7 @@ }, { "descriptor_id": 603, - "label": "Add Building Slot 101", + "label": "Add Building Candidate Slot 101", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5441,7 +5441,7 @@ }, { "descriptor_id": 604, - "label": "Add Building Slot 102", + "label": "Add Building Candidate Slot 102", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5450,7 +5450,7 @@ }, { "descriptor_id": 605, - "label": "Add Building Slot 103", + "label": "Add Building Candidate Slot 103", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5459,7 +5459,7 @@ }, { "descriptor_id": 606, - "label": "Add Building Slot 104", + "label": "Add Building Candidate Slot 104", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5468,7 +5468,7 @@ }, { "descriptor_id": 607, - "label": "Add Building Slot 105", + "label": "Add Building Candidate Slot 105", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5477,7 +5477,7 @@ }, { "descriptor_id": 608, - "label": "Add Building Slot 106", + "label": "Add Building Candidate Slot 106", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5486,7 +5486,7 @@ }, { "descriptor_id": 609, - "label": "Add Building Slot 107", + "label": "Add Building Candidate Slot 107", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5495,7 +5495,7 @@ }, { "descriptor_id": 610, - "label": "Add Building Slot 108", + "label": "Add Building Candidate Slot 108", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5504,7 +5504,7 @@ }, { "descriptor_id": 611, - "label": "Add Building Slot 109", + "label": "Add Building Candidate Slot 109", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5513,7 +5513,7 @@ }, { "descriptor_id": 612, - "label": "Add Building Slot 110", + "label": "Add Building Candidate Slot 110", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, @@ -5522,7 +5522,7 @@ }, { "descriptor_id": 613, - "label": "Add Building Slot 111", + "label": "Add Building Candidate Slot 111", "target_mask_bits": 8, "parameter_family": "world_building_spawn", "runtime_key": null, diff --git a/docs/rehost-queue.md b/docs/rehost-queue.md index d395f00..49ca265 100644 --- a/docs/rehost-queue.md +++ b/docs/rehost-queue.md @@ -335,10 +335,11 @@ Working rule: grouped descriptor ids `521`, `526`, `528`, `548`, and `563` are now recovered as `Add Building FarmGrain`, `Add Building Furniture Factory`, `Add Building Logging Camp`, `Add Building Port01`, and `Add Building Warehouse05` respectively. The checked-in - `event-effects-building-bindings.json` artifact now widens that same bridge across the whole - first `67` add-building rows (`503..569`), grounding candidate names from the stable RT3 1.05 - candidate-table order plus the direct `descriptor_id - 503` candidate-id bridge in - `0x00430270` and the load-side `0x0041ede0` name-catalog copy keyed by live candidate id + `event-effects-building-bindings.json` now carries the full descriptor-side candidate bridge + across all `111` add-building rows (`503..613`) through the direct `descriptor_id - 503` + mapping in `0x00430270`, while concrete candidate names remain grounded only for the stable + RT3 1.05 live-catalog run `0..66` exposed by `0x0041ede0` and the checked candidate-table + corpus - the earlier `label_id - 2000` bridge for `548` and `563` is now known to be a false lead: those numeric collisions hit the special-condition label table (`Disable Building Stations`, `Completely Disable Money-Related Things`), but the extended @@ -349,8 +350,9 @@ Working rule: grouped opcode at all for descriptor strip `503..613`; it consumes the descriptor-derived candidate id, placement count byte `0x11`, and the packed span words at `0x14/0x16`. The next static-analysis pass should therefore target the remaining span-field meaning and - shell-owned placement-flow ownership on that strip, then continue the candidate bridge past the - currently grounded `503..569` front half of the widened strip, not more missing-label recovery + shell-owned placement-flow ownership on that strip, not more missing-label recovery: the + descriptor-side candidate bridge is now checked in across `503..613`, and the honest remaining + boundary is the missing non-hook name catalog for candidate ids `67..110` - the concrete owner strip above that bundle is grounded now too: `0x00433060` is the direct non-direct serializer loop that writes `0x4e99/0x4e9a/0x4e9b`, calls `0x00430d70` per live collection row, and sits beside the sibling `0x00433130` size/load diff --git a/tools/py/build_event_effect_semantic_catalog.py b/tools/py/build_event_effect_semantic_catalog.py index fb7a7dd..41c76ae 100644 --- a/tools/py/build_event_effect_semantic_catalog.py +++ b/tools/py/build_event_effect_semantic_catalog.py @@ -238,9 +238,13 @@ def classify( parameter_family = "world_building_spawn" binding = building_bindings.get(descriptor_id) if binding is not None: - label = f"Add Building {binding['candidate_name']}" + candidate_name = binding.get("candidate_name") + if candidate_name: + label = f"Add Building {candidate_name}" + else: + label = f"Add Building Candidate Slot {int(binding['candidate_id']) + 1}" else: - label = f"Add Building Slot {descriptor_id - 502}" + label = f"Add Building Candidate Slot {descriptor_id - 502}" runtime_status = "shell_owned" elif "Earthquake" in label or "Storm" in label: parameter_family = "world_disaster_scalar"