diff --git a/Cargo.lock b/Cargo.lock index fe96d91..690d0a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -118,12 +118,19 @@ name = "rrt-cli" version = "0.1.0" dependencies = [ "rrt-model", + "serde", + "serde_json", "sha2", ] [[package]] name = "rrt-hook" version = "0.1.0" +dependencies = [ + "rrt-model", + "serde", + "serde_json", +] [[package]] name = "rrt-model" diff --git a/artifacts/exports/rt3-1.06/analysis-context-functions.csv b/artifacts/exports/rt3-1.06/analysis-context-functions.csv index 9fb8182..442c7e8 100644 --- a/artifacts/exports/rt3-1.06/analysis-context-functions.csv +++ b/artifacts/exports/rt3-1.06/analysis-context-functions.csv @@ -1,7 +1,2 @@ query_address,function_address,name,size,calling_convention,signature,caller_count,callers,callee_count,callees,data_ref_count,data_refs,entry_excerpt -0x00595440,0x00595440,multiplayer_transport_init_selector_slot,100,cdecl,"fcn.00595440(int32_t arg_4h, int32_t arg_39ch, int32_t arg_59bh);",2,0x00593841@0x00593790:multiplayer_transport_handle_names_query_response; 0x00593b25@0x00593b00:multiplayer_transport_handle_selector_update_response,3,0x00595490->0x005951f0:multiplayer_transport_service_status_pump; 0x00595499->0x00596fc0:multiplayer_transport_submit_profile_key_query_bundle_default; 0x0059547f->0x005a18a0:string_copy_bounded_zerofill,1,0x0059544f->0x005c87a8," 595420: movl $0x89ffff98, %esp # imm = 0x89FFFF98 | 595425: movl $0x9a4, %esi # imm = 0x9A4 | 59542a: popl %edi | 59542b: popl %esi | 59542c: addl $0x190, %esp # imm = 0x190 | 595432: retl | 595433: nop | 595434: nop | 595435: nop | 595436: nop | 595437: nop | 595438: nop | 595439: nop | 59543a: nop | 59543b: nop | 59543c: nop | 59543d: nop | 59543e: nop | 59543f: nop | 595440: movl 0x4(%esp), %eax | 595444: testl %eax, %eax | 595446: pushl %ebp | 595447: pushl %esi | 595448: pushl %edi | 595449: movl %edx, %edi | 59544b: movl %ecx, %esi | 59544d: jne 0x595454 <.text+0x194454> | 59544f: movl $0x5c87a8, %eax # imm = 0x5C87A8 | 595454: movl %edi, %ecx | 595456: shll $0x9, %ecx | 595459: leal (%ecx,%esi), %ebp | 59545c: pushl $0x200 # imm = 0x200" -0x00596da0,0x00596da0,multiplayer_transport_submit_profile_key_query_bundle,497,cdecl,fcn.00596da0(uint_least32_t arg_4h);,2,0x00596faa@0x00596fa0:multiplayer_transport_submit_profile_key_query_bundle_with_context; 0x00596fc7@0x00596fc0:multiplayer_transport_submit_profile_key_query_bundle_default,13,0x00596eb6->0x0058ec50:multiplayer_transport_submit_getkey_command_and_wait; 0x00596f7a->0x0058ef20:multiplayer_transport_submit_setchankey_pair_list_command_and_wait; 0x00596e68->0x0058f380:tracked_heap_alloc_with_header; 0x00596f03->0x0058f380:tracked_heap_alloc_with_header; 0x00596ebf->0x0058f3c0:tracked_heap_free_with_header; 0x00596f83->0x0058f3c0:tracked_heap_free_with_header; 0x00596e56->0x0058f8f0:fcn.0058f8f0; 0x00596edf->0x0058f8f0:fcn.0058f8f0; 0x00596df0->0x0058f9c0:hashed_entry_table_lookup; 0x00596e22->0x0058f9c0:hashed_entry_table_lookup; 0x00596e36->0x0058f9c0:hashed_entry_table_lookup; 0x00596e8a->0x0058fa00:generic_callback_list_for_each; 0x00596f21->0x0058fa00:generic_callback_list_for_each,9,"0x00596e85->0x00596c80; 0x00596f1c->0x00596c80; 0x00596eaf->0x00596c90; 0x00596f67->0x00596ce0; 0x00596f6e->0x005e1e1c; 0x00596e1a->0x005e2260:""b_flags""; 0x00596f4d->0x005e2260:""b_flags""; 0x00596de8->0x005e22e8:""username""; 0x00596f32->0x005e22e8:""username"""," 596d80: calll 0x596b90 <.text+0x195b90> | 596d85: addl $0x4, %esi | 596d88: decl %ebx | 596d89: jne 0x596d70 <.text+0x195d70> | 596d8b: popl %edi | 596d8c: popl %esi | 596d8d: popl %ebp | 596d8e: popl %ebx | 596d8f: retl $0x18 | 596d92: nop | 596d93: nop | 596d94: nop | 596d95: nop | 596d96: nop | 596d97: nop | 596d98: nop | 596d99: nop | 596d9a: nop | 596d9b: nop | 596d9c: nop | 596d9d: nop | 596d9e: nop | 596d9f: nop | 596da0: subl $0x10, %esp | 596da3: pushl %ebp | 596da4: pushl %edi | 596da5: movl %eax, %edi | 596da7: movl 0x390(%esi,%edi,4), %eax | 596dae: xorl %ebp, %ebp | 596db0: cmpl %ebp, %eax | 596db2: jne 0x596dc1 <.text+0x195dc1> | 596db4: cmpl %ebp, 0x384(%esi,%edi,4) | 596dbb: je 0x596f89 <.text+0x195f89>" -0x00596fa0,0x00596fa0,multiplayer_transport_submit_profile_key_query_bundle_with_context,19,cdecl,fcn.00596fa0(int32_t arg_4h);,1,0x0059f935,1,0x00596faa->0x00596da0:multiplayer_transport_submit_profile_key_query_bundle,0,," 596f80: decl %esp | 596f81: andb $0x18, %al | 596f83: calll 0x58f3c0 <.text+0x18e3c0> | 596f88: popl %ebx | 596f89: popl %edi | 596f8a: popl %ebp | 596f8b: addl $0x10, %esp | 596f8e: retl $0x4 | 596f91: nop | 596f92: nop | 596f93: nop | 596f94: nop | 596f95: nop | 596f96: nop | 596f97: nop | 596f98: nop | 596f99: nop | 596f9a: nop | 596f9b: nop | 596f9c: nop | 596f9d: nop | 596f9e: nop | 596f9f: nop | 596fa0: pushl %esi | 596fa1: movl %edx, %eax | 596fa3: movl 0x8(%esp), %edx | 596fa7: pushl %edx | 596fa8: movl %ecx, %esi | 596faa: calll 0x596da0 <.text+0x195da0> | 596faf: popl %esi | 596fb0: retl $0x4 | 596fb3: nop | 596fb4: nop | 596fb5: nop | 596fb6: nop | 596fb7: nop | 596fb8: nop | 596fb9: nop | 596fba: nop | 596fbb: nop | 596fbc: nop | 596fbd: nop | 596fbe: nop | 596fbf: nop" -0x00596fc0,0x00596fc0,multiplayer_transport_submit_profile_key_query_bundle_default,14,cdecl,fcn.00596fc0();,2,0x00595499@0x00595440:multiplayer_transport_init_selector_slot; 0x0059fbb5,1,0x00596fc7->0x00596da0:multiplayer_transport_submit_profile_key_query_bundle,0,," 596fa0: pushl %esi | 596fa1: movl %edx, %eax | 596fa3: movl 0x8(%esp), %edx | 596fa7: pushl %edx | 596fa8: movl %ecx, %esi | 596faa: calll 0x596da0 <.text+0x195da0> | 596faf: popl %esi | 596fb0: retl $0x4 | 596fb3: nop | 596fb4: nop | 596fb5: nop | 596fb6: nop | 596fb7: nop | 596fb8: nop | 596fb9: nop | 596fba: nop | 596fbb: nop | 596fbc: nop | 596fbd: nop | 596fbe: nop | 596fbf: nop | 596fc0: pushl %esi | 596fc1: movl %edx, %eax | 596fc3: pushl $0x0 | 596fc5: movl %ecx, %esi | 596fc7: calll 0x596da0 <.text+0x195da0> | 596fcc: popl %esi | 596fcd: retl | 596fce: nop | 596fcf: nop | 596fd0: movl 0x4(%esp), %eax | 596fd4: pushl %esi | 596fd5: movl %edx, %esi | 596fd7: movl 0x398(%eax), %edx | 596fdd: testl %edx, %edx | 596fdf: pushl %edi" -0x00596fd0,0x00596fd0,multiplayer_transport_dispatch_status_route_event,219,cdecl,data.00596fd0(int32_t arg_4h);,0,,6,0x00597017->0x0058bce0:fcn.0058bce0; 0x00597054->0x0058bce0:fcn.0058bce0; 0x00597029->0x0058cd40:fcn.0058cd40; 0x0059703f->0x0058cd40:fcn.0058cd40; 0x0059706d->0x0058cd40:fcn.0058cd40; 0x00597084->0x0058cd40:fcn.0058cd40,3,"0x00597008->0x005970ac; 0x00597001->0x005970c4; 0x0059704d->0x005ce1c8:""openstaging"""," 596fb0: retl $0x4 | 596fb3: nop | 596fb4: nop | 596fb5: nop | 596fb6: nop | 596fb7: nop | 596fb8: nop | 596fb9: nop | 596fba: nop | 596fbb: nop | 596fbc: nop | 596fbd: nop | 596fbe: nop | 596fbf: nop | 596fc0: pushl %esi | 596fc1: movl %edx, %eax | 596fc3: pushl $0x0 | 596fc5: movl %ecx, %esi | 596fc7: calll 0x596da0 <.text+0x195da0> | 596fcc: popl %esi | 596fcd: retl | 596fce: nop | 596fcf: nop | 596fd0: movl 0x4(%esp), %eax | 596fd4: pushl %esi | 596fd5: movl %edx, %esi | 596fd7: movl 0x398(%eax), %edx | 596fdd: testl %edx, %edx | 596fdf: pushl %edi | 596fe0: je 0x597077 <.text+0x196077> | 596fe6: movl 0xb44(%eax), %edx | 596fec: testl %edx, %edx | 596fee: je 0x596ff9 <.text+0x195ff9>" -0x005973d0,0x005973d0,multiplayer_transport_try_connect_status_route,170,cdecl,fcn.005973d0(int32_t arg_4h);,2,0x0058daf1@0x0058dae0:fcn.0058dae0; 0x005965be@0x005965a0:multiplayer_transport_try_connect_status_route_once,4,0x00597460->0x0058bc90:fcn.0058bc90; 0x0059743c->0x0058c9b0:fcn.0058c9b0; 0x0059742d->0x0058cc40:fcn.0058cc40; 0x005973e7->0x00597350:multiplayer_transport_release_status_route,7,0x0059740f->0x00596fd0; 0x0059740a->0x005970e0; 0x00597405->0x00597180; 0x00597400->0x005971b0; 0x005973fb->0x00597270; 0x005973f6->0x005972c0; 0x0059745b->0x00597330," 5973b0: pushl %esi | 5973b1: movl %ecx, %esi | 5973b3: movl 0x1ecc(%esi), %ecx | 5973b9: testl %ecx, %ecx | 5973bb: je 0x5973cc <.text+0x1963cc> | 5973bd: calll 0x58cfd0 <.text+0x18bfd0> | 5973c2: movl $0x0, 0x1ecc(%esi) | 5973cc: popl %esi | 5973cd: retl | 5973ce: nop | 5973cf: nop | 5973d0: pushl %ebx | 5973d1: pushl %esi | 5973d2: movl %ecx, %esi | 5973d4: movl 0xaf0(%esi), %eax | 5973da: testl %eax, %eax | 5973dc: pushl %edi | 5973dd: leal 0xaf0(%esi), %edi | 5973e3: movl %edx, %ebx | 5973e5: je 0x5973ec <.text+0x1963ec> | 5973e7: calll 0x597350 <.text+0x196350> | 5973ec: cmpl $-0x1, %ebx | 5973ef: movl 0xb34(%esi), %eax" +0x004333f0,0x004333f0,shell_setup_build_file_list_records_from_current_root_and_pattern,676,cdecl,"fcn.004333f0(int32_t arg_8h, int32_t arg_c30h);",1,0x004336b8@0x004336a0:shell_setup_file_list_construct_and_scan_dataset,14,0x004334de->0x00433260:fcn.00433260; 0x004335b7->0x00433260:fcn.00433260; 0x00433409->0x004839b0:shell_setup_query_file_list_uses_map_extension_pattern; 0x0043344c->0x004839e0:shell_setup_query_file_list_root_dir_name; 0x00433433->0x00518de0:fcn.00518de0; 0x0043345e->0x00518de0:fcn.00518de0; 0x0043348b->0x00518de0:fcn.00518de0; 0x004334ae->0x00518de0:fcn.00518de0; 0x0043355a->0x00518de0:fcn.00518de0; 0x0043357d->0x00518de0:fcn.00518de0; 0x00433638->0x0051c920:localization_lookup_display_label_by_stem_or_fallback; 0x00433682->0x0051dc60:fcn.0051dc60; 0x004335f7->0x0051df90:fcn.0051df90; 0x0043350c->0x005a125d:fcn.005a125d,8,"0x004334b3->0x005c8190; 0x0043347f->0x005c9d08:""%s%s""; 0x0043354e->0x005c9d08:""%s%s""; 0x00433452->0x005c9d10; 0x0043342e->0x005c9d14:""*.gm*""; 0x00433427->0x005c9d1c:""*.smp""; 0x00433402->0x006cec74; 0x00433438->0x006cec74"," 4333d0: movl %ds, %edi | 4333d2: strw -0x29da1732(%ebx) | 4333d9: ltrw -0x75(%esi) | 4333dd: ldsl 0x5b(%ebp), %ebx | 4333e0: popl %edi | 4333e1: addl $0x404f4, %esp # imm = 0x404F4 | 4333e7: retl $0x4 | 4333ea: nop | 4333eb: nop | 4333ec: nop | 4333ed: nop | 4333ee: nop | 4333ef: nop | 4333f0: subl $0xcf8, %esp # imm = 0xCF8 | 4333f6: pushl %ebx | 4333f7: pushl %ebp | 4333f8: movl %ecx, %ebp | 4333fa: pushl %esi | 4333fb: movl $0x0, (%ebp) | 433402: movl 0x6cec74, %ecx | 433408: pushl %edi | 433409: calll 0x4839b0 <.text+0x829b0> | 43340e: testl %eax, %eax" diff --git a/artifacts/exports/rt3-1.06/analysis-context.md b/artifacts/exports/rt3-1.06/analysis-context.md index adbcb38..26e4dc8 100644 --- a/artifacts/exports/rt3-1.06/analysis-context.md +++ b/artifacts/exports/rt3-1.06/analysis-context.md @@ -5,685 +5,108 @@ ## Function Targets -### `0x00595440` -> `0x00595440` `multiplayer_transport_init_selector_slot` +### `0x004333f0` -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` -- Size: `100` +- Size: `676` - Calling convention: `cdecl` -- Signature: `fcn.00595440(int32_t arg_4h, int32_t arg_39ch, int32_t arg_59bh);` +- Signature: `fcn.004333f0(int32_t arg_8h, int32_t arg_c30h);` Entry excerpt: ```asm - 595420: movl $0x89ffff98, %esp # imm = 0x89FFFF98 - 595425: movl $0x9a4, %esi # imm = 0x9A4 - 59542a: popl %edi - 59542b: popl %esi - 59542c: addl $0x190, %esp # imm = 0x190 - 595432: retl - 595433: nop - 595434: nop - 595435: nop - 595436: nop - 595437: nop - 595438: nop - 595439: nop - 59543a: nop - 59543b: nop - 59543c: nop - 59543d: nop - 59543e: nop - 59543f: nop - 595440: movl 0x4(%esp), %eax - 595444: testl %eax, %eax - 595446: pushl %ebp - 595447: pushl %esi - 595448: pushl %edi - 595449: movl %edx, %edi - 59544b: movl %ecx, %esi - 59544d: jne 0x595454 <.text+0x194454> - 59544f: movl $0x5c87a8, %eax # imm = 0x5C87A8 - 595454: movl %edi, %ecx - 595456: shll $0x9, %ecx - 595459: leal (%ecx,%esi), %ebp - 59545c: pushl $0x200 # imm = 0x200 + 4333d0: movl %ds, %edi + 4333d2: strw -0x29da1732(%ebx) + 4333d9: ltrw -0x75(%esi) + 4333dd: ldsl 0x5b(%ebp), %ebx + 4333e0: popl %edi + 4333e1: addl $0x404f4, %esp # imm = 0x404F4 + 4333e7: retl $0x4 + 4333ea: nop + 4333eb: nop + 4333ec: nop + 4333ed: nop + 4333ee: nop + 4333ef: nop + 4333f0: subl $0xcf8, %esp # imm = 0xCF8 + 4333f6: pushl %ebx + 4333f7: pushl %ebp + 4333f8: movl %ecx, %ebp + 4333fa: pushl %esi + 4333fb: movl $0x0, (%ebp) + 433402: movl 0x6cec74, %ecx + 433408: pushl %edi + 433409: calll 0x4839b0 <.text+0x829b0> + 43340e: testl %eax, %eax ``` Callers: -- `0x00593841` in `0x00593790` `multiplayer_transport_handle_names_query_response` -- `0x00593b25` in `0x00593b00` `multiplayer_transport_handle_selector_update_response` +- `0x004336b8` in `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` Caller xref excerpts: -#### `0x00593841` +#### `0x004336b8` ```asm - 593821: movl $0x1000000, %esp # imm = 0x1000000 - 593826: addb %al, (%eax) - 593828: addb %ch, %bl - 59382a: orb %bh, %al - 59382c: xchgb %al, 0xb(%eax) - 59382f: addb %al, (%eax) - 593831: addl %eax, (%eax) - 593833: addb %al, (%eax) - 593835: movl 0x20(%edi), %edx - 593838: pushl %ebx - 593839: pushl %edx - 59383a: movl $0x2, %edx - 59383f: movl %esi, %ecx - 593841: calll 0x595440 <.text+0x194440> - 593846: movl 0x1c(%esp), %eax - 59384a: cmpl %ebp, %eax - 59384c: jle 0x59387f <.text+0x19287f> - 59384e: movl 0x20(%esp), %ebx - 593852: movl 0x24(%esp), %ebp - 593856: subl %ebx, %ebp - 593858: movl %eax, 0x28(%esp) - 59385c: leal (%esp), %esp - 593860: movl (%ebx,%ebp), %eax -``` - -#### `0x00593b25` - -```asm - 593b05: andb $0x20, %al - 593b07: movl 0x38(%esi), %eax - 593b0a: testl %eax, %eax - 593b0c: movl (%esi), %ebx - 593b0e: pushl %edi - 593b0f: movl %edx, %edi - 593b11: movl %edi, 0xc(%esp) - 593b15: jne 0x593b93 <.text+0x192b93> - 593b17: testl %edi, %edi - 593b19: movl 0x1c(%esi), %edx - 593b1c: movl %ebx, %ecx - 593b1e: je 0x593b67 <.text+0x192b67> - 593b20: pushl $0x5c87a8 # imm = 0x5C87A8 - 593b25: calll 0x595440 <.text+0x194440> - 593b2a: movl 0x18(%esp), %eax - 593b2e: testl %eax, %eax - 593b30: jle 0x593b6e <.text+0x192b6e> - 593b32: movl 0x1c(%esp), %edi - 593b36: pushl %ebp - 593b37: movl 0x24(%esp), %ebp - 593b3b: subl %edi, %ebp - 593b3d: movl %eax, 0x28(%esp) - 593b41: movl (%edi,%ebp), %eax - 593b44: movl 0x1c(%esi), %ecx + 433698: nop + 433699: nop + 43369a: nop + 43369b: nop + 43369c: nop + 43369d: nop + 43369e: nop + 43369f: nop + 4336a0: movl 0x4(%esp), %eax + 4336a4: pushl %esi + 4336a5: movl %ecx, %esi + 4336a7: pushl %eax + 4336a8: movl %eax, 0x4(%esi) + 4336ab: movl $0x0, 0x8(%esi) + 4336b2: movl $0x0, (%esi) + 4336b8: calll 0x4333f0 <.text+0x323f0> + 4336bd: movl %esi, %eax + 4336bf: popl %esi + 4336c0: retl $0x4 + 4336c3: nop + 4336c4: nop + 4336c5: nop + 4336c6: nop + 4336c7: nop + 4336c8: nop + 4336c9: nop + 4336ca: nop + 4336cb: nop + 4336cc: nop + 4336cd: nop + 4336ce: nop + 4336cf: nop + 4336d0: movl %ecx, %eax + 4336d2: xorl %ecx, %ecx + 4336d4: movl %ecx, 0x4cae(%eax) ``` Direct internal callees: -- `0x00595490` -> `0x005951f0` `multiplayer_transport_service_status_pump` -- `0x00595499` -> `0x00596fc0` `multiplayer_transport_submit_profile_key_query_bundle_default` -- `0x0059547f` -> `0x005a18a0` `string_copy_bounded_zerofill` +- `0x004334de` -> `0x00433260` `fcn.00433260` +- `0x004335b7` -> `0x00433260` `fcn.00433260` +- `0x00433409` -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` +- `0x0043344c` -> `0x004839e0` `shell_setup_query_file_list_root_dir_name` +- `0x00433433` -> `0x00518de0` `fcn.00518de0` +- `0x0043345e` -> `0x00518de0` `fcn.00518de0` +- `0x0043348b` -> `0x00518de0` `fcn.00518de0` +- `0x004334ae` -> `0x00518de0` `fcn.00518de0` +- `0x0043355a` -> `0x00518de0` `fcn.00518de0` +- `0x0043357d` -> `0x00518de0` `fcn.00518de0` +- `0x00433638` -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x00433682` -> `0x0051dc60` `fcn.0051dc60` +- `0x004335f7` -> `0x0051df90` `fcn.0051df90` +- `0x0043350c` -> `0x005a125d` `fcn.005a125d` Data refs: -- `0x0059544f` -> `0x005c87a8` - -### `0x00596da0` -> `0x00596da0` `multiplayer_transport_submit_profile_key_query_bundle` - -- Size: `497` -- Calling convention: `cdecl` -- Signature: `fcn.00596da0(uint_least32_t arg_4h);` - -Entry excerpt: - -```asm - 596d80: calll 0x596b90 <.text+0x195b90> - 596d85: addl $0x4, %esi - 596d88: decl %ebx - 596d89: jne 0x596d70 <.text+0x195d70> - 596d8b: popl %edi - 596d8c: popl %esi - 596d8d: popl %ebp - 596d8e: popl %ebx - 596d8f: retl $0x18 - 596d92: nop - 596d93: nop - 596d94: nop - 596d95: nop - 596d96: nop - 596d97: nop - 596d98: nop - 596d99: nop - 596d9a: nop - 596d9b: nop - 596d9c: nop - 596d9d: nop - 596d9e: nop - 596d9f: nop - 596da0: subl $0x10, %esp - 596da3: pushl %ebp - 596da4: pushl %edi - 596da5: movl %eax, %edi - 596da7: movl 0x390(%esi,%edi,4), %eax - 596dae: xorl %ebp, %ebp - 596db0: cmpl %ebp, %eax - 596db2: jne 0x596dc1 <.text+0x195dc1> - 596db4: cmpl %ebp, 0x384(%esi,%edi,4) - 596dbb: je 0x596f89 <.text+0x195f89> -``` - -Callers: -- `0x00596faa` in `0x00596fa0` `multiplayer_transport_submit_profile_key_query_bundle_with_context` -- `0x00596fc7` in `0x00596fc0` `multiplayer_transport_submit_profile_key_query_bundle_default` - -Caller xref excerpts: - -#### `0x00596faa` - -```asm - 596f8a: popl %ebp - 596f8b: addl $0x10, %esp - 596f8e: retl $0x4 - 596f91: nop - 596f92: nop - 596f93: nop - 596f94: nop - 596f95: nop - 596f96: nop - 596f97: nop - 596f98: nop - 596f99: nop - 596f9a: nop - 596f9b: nop - 596f9c: nop - 596f9d: nop - 596f9e: nop - 596f9f: nop - 596fa0: pushl %esi - 596fa1: movl %edx, %eax - 596fa3: movl 0x8(%esp), %edx - 596fa7: pushl %edx - 596fa8: movl %ecx, %esi - 596faa: calll 0x596da0 <.text+0x195da0> - 596faf: popl %esi - 596fb0: retl $0x4 - 596fb3: nop - 596fb4: nop - 596fb5: nop - 596fb6: nop - 596fb7: nop - 596fb8: nop - 596fb9: nop - 596fba: nop - 596fbb: nop - 596fbc: nop - 596fbd: nop - 596fbe: nop - 596fbf: nop - 596fc0: pushl %esi - 596fc1: movl %edx, %eax - 596fc3: pushl $0x0 - 596fc5: movl %ecx, %esi - 596fc7: calll 0x596da0 <.text+0x195da0> -``` - -#### `0x00596fc7` - -```asm - 596fa7: pushl %edx - 596fa8: movl %ecx, %esi - 596faa: calll 0x596da0 <.text+0x195da0> - 596faf: popl %esi - 596fb0: retl $0x4 - 596fb3: nop - 596fb4: nop - 596fb5: nop - 596fb6: nop - 596fb7: nop - 596fb8: nop - 596fb9: nop - 596fba: nop - 596fbb: nop - 596fbc: nop - 596fbd: nop - 596fbe: nop - 596fbf: nop - 596fc0: pushl %esi - 596fc1: movl %edx, %eax - 596fc3: pushl $0x0 - 596fc5: movl %ecx, %esi - 596fc7: calll 0x596da0 <.text+0x195da0> - 596fcc: popl %esi - 596fcd: retl - 596fce: nop - 596fcf: nop - 596fd0: movl 0x4(%esp), %eax - 596fd4: pushl %esi - 596fd5: movl %edx, %esi - 596fd7: movl 0x398(%eax), %edx - 596fdd: testl %edx, %edx - 596fdf: pushl %edi - 596fe0: je 0x597077 <.text+0x196077> - 596fe6: movl 0xb44(%eax), %edx -``` - -Direct internal callees: -- `0x00596eb6` -> `0x0058ec50` `multiplayer_transport_submit_getkey_command_and_wait` -- `0x00596f7a` -> `0x0058ef20` `multiplayer_transport_submit_setchankey_pair_list_command_and_wait` -- `0x00596e68` -> `0x0058f380` `tracked_heap_alloc_with_header` -- `0x00596f03` -> `0x0058f380` `tracked_heap_alloc_with_header` -- `0x00596ebf` -> `0x0058f3c0` `tracked_heap_free_with_header` -- `0x00596f83` -> `0x0058f3c0` `tracked_heap_free_with_header` -- `0x00596e56` -> `0x0058f8f0` `fcn.0058f8f0` -- `0x00596edf` -> `0x0058f8f0` `fcn.0058f8f0` -- `0x00596df0` -> `0x0058f9c0` `hashed_entry_table_lookup` -- `0x00596e22` -> `0x0058f9c0` `hashed_entry_table_lookup` -- `0x00596e36` -> `0x0058f9c0` `hashed_entry_table_lookup` -- `0x00596e8a` -> `0x0058fa00` `generic_callback_list_for_each` -- `0x00596f21` -> `0x0058fa00` `generic_callback_list_for_each` - -Data refs: -- `0x00596e85` -> `0x00596c80` -- `0x00596f1c` -> `0x00596c80` -- `0x00596eaf` -> `0x00596c90` -- `0x00596f67` -> `0x00596ce0` -- `0x00596f6e` -> `0x005e1e1c` -- `0x00596e1a` -> `0x005e2260` "b_flags" -- `0x00596f4d` -> `0x005e2260` "b_flags" -- `0x00596de8` -> `0x005e22e8` "username" -- `0x00596f32` -> `0x005e22e8` "username" - -### `0x00596fa0` -> `0x00596fa0` `multiplayer_transport_submit_profile_key_query_bundle_with_context` - -- Size: `19` -- Calling convention: `cdecl` -- Signature: `fcn.00596fa0(int32_t arg_4h);` - -Entry excerpt: - -```asm - 596f80: decl %esp - 596f81: andb $0x18, %al - 596f83: calll 0x58f3c0 <.text+0x18e3c0> - 596f88: popl %ebx - 596f89: popl %edi - 596f8a: popl %ebp - 596f8b: addl $0x10, %esp - 596f8e: retl $0x4 - 596f91: nop - 596f92: nop - 596f93: nop - 596f94: nop - 596f95: nop - 596f96: nop - 596f97: nop - 596f98: nop - 596f99: nop - 596f9a: nop - 596f9b: nop - 596f9c: nop - 596f9d: nop - 596f9e: nop - 596f9f: nop - 596fa0: pushl %esi - 596fa1: movl %edx, %eax - 596fa3: movl 0x8(%esp), %edx - 596fa7: pushl %edx - 596fa8: movl %ecx, %esi - 596faa: calll 0x596da0 <.text+0x195da0> - 596faf: popl %esi - 596fb0: retl $0x4 - 596fb3: nop - 596fb4: nop - 596fb5: nop - 596fb6: nop - 596fb7: nop - 596fb8: nop - 596fb9: nop - 596fba: nop - 596fbb: nop - 596fbc: nop - 596fbd: nop - 596fbe: nop - 596fbf: nop -``` - -Callers: -- `0x0059f935` - -Caller xref excerpts: - -#### `0x0059f935` - -```asm - 59f915: - 59f917: testl %eax, %eax - 59f919: je 0x59f92e <.text+0x19e92e> - 59f91b: movl 0x10(%esp), %edx - 59f91f: movl 0x8(%esp), %eax - 59f923: pushl %edx - 59f924: pushl %eax - 59f925: movl %edi, %edx - 59f927: movl %esi, %ecx - 59f929: calll 0x594b60 <.text+0x193b60> - 59f92e: movl 0x18(%esp), %edx - 59f932: pushl %edi - 59f933: movl %esi, %ecx - 59f935: calll 0x596fa0 <.text+0x195fa0> - 59f93a: movl 0x18(%esp), %edx - 59f93e: pushl %edi - 59f93f: movl %esi, %ecx - 59f941: calll 0x592ee0 <.text+0x191ee0> - 59f946: cmpl $0x2, 0x18(%esp) - 59f94b: jne 0x59f9b1 <.text+0x19e9b1> - 59f94d: movl 0xb54(%esi), %eax - 59f953: testl %eax, %eax -``` - -Direct internal callees: -- `0x00596faa` -> `0x00596da0` `multiplayer_transport_submit_profile_key_query_bundle` - -Data refs: -- none - -### `0x00596fc0` -> `0x00596fc0` `multiplayer_transport_submit_profile_key_query_bundle_default` - -- Size: `14` -- Calling convention: `cdecl` -- Signature: `fcn.00596fc0();` - -Entry excerpt: - -```asm - 596fa0: pushl %esi - 596fa1: movl %edx, %eax - 596fa3: movl 0x8(%esp), %edx - 596fa7: pushl %edx - 596fa8: movl %ecx, %esi - 596faa: calll 0x596da0 <.text+0x195da0> - 596faf: popl %esi - 596fb0: retl $0x4 - 596fb3: nop - 596fb4: nop - 596fb5: nop - 596fb6: nop - 596fb7: nop - 596fb8: nop - 596fb9: nop - 596fba: nop - 596fbb: nop - 596fbc: nop - 596fbd: nop - 596fbe: nop - 596fbf: nop - 596fc0: pushl %esi - 596fc1: movl %edx, %eax - 596fc3: pushl $0x0 - 596fc5: movl %ecx, %esi - 596fc7: calll 0x596da0 <.text+0x195da0> - 596fcc: popl %esi - 596fcd: retl - 596fce: nop - 596fcf: nop - 596fd0: movl 0x4(%esp), %eax - 596fd4: pushl %esi - 596fd5: movl %edx, %esi - 596fd7: movl 0x398(%eax), %edx - 596fdd: testl %edx, %edx - 596fdf: pushl %edi -``` - -Callers: -- `0x00595499` in `0x00595440` `multiplayer_transport_init_selector_slot` -- `0x0059fbb5` - -Caller xref excerpts: - -#### `0x00595499` - -```asm - 595479: addb %al, (%eax) - 59547b: addb %al, (%eax) - 59547d: addb %al, (%eax) - 59547f: calll 0x5a18a0 <.text+0x1a08a0> - 595484: addl $0xc, %esp - 595487: movl %esi, %ecx - 595489: movb $0x0, 0x59b(%ebp) - 595490: calll 0x5951f0 <.text+0x1941f0> - 595495: movl %edi, %edx - 595497: movl %esi, %ecx - 595499: calll 0x596fc0 <.text+0x195fc0> - 59549e: popl %edi - 59549f: popl %esi - 5954a0: popl %ebp - 5954a1: retl $0x4 - 5954a4: nop - 5954a5: nop - 5954a6: nop - 5954a7: nop - 5954a8: nop - 5954a9: nop - 5954aa: nop - 5954ab: nop - 5954ac: nop - 5954ad: nop - 5954ae: nop - 5954af: nop - 5954b0: pushl %ebx - 5954b1: pushl %esi - 5954b2: pushl %edi - 5954b3: movl %edx, %edi - 5954b5: movl %ecx, %esi - 5954b7: movl 0x384(%esi,%edi,4), %eax -``` - -#### `0x0059fbb5` - -```asm - 59fb95: movl (%edi,%esi), %ecx - 59fb98: movl 0x20(%esp), %edx - 59fb9c: pushl %ecx - 59fb9d: pushl %edx - 59fb9e: movl (%esi), %edx - 59fba0: movl %ebp, %ecx - 59fba2: calll 0x594f20 <.text+0x193f20> - 59fba7: addl $0x4, %esi - 59fbaa: decl %ebx - 59fbab: jne 0x59fb95 <.text+0x19eb95> - 59fbad: popl %edi - 59fbae: popl %esi - 59fbaf: movl 0x18(%esp), %edx - 59fbb3: movl %ebp, %ecx - 59fbb5: calll 0x596fc0 <.text+0x195fc0> - 59fbba: movl 0x18(%esp), %edx - 59fbbe: movl %ebp, %ecx - 59fbc0: calll 0x592fc0 <.text+0x191fc0> - 59fbc5: popl %ebx - 59fbc6: popl %ebp - 59fbc7: retl $0x10 - 59fbca: nop - 59fbcb: nop - 59fbcc: nop - 59fbcd: nop - 59fbce: nop - 59fbcf: nop - 59fbd0: pushl %esi - 59fbd1: movl 0x14(%esp), %esi -``` - -Direct internal callees: -- `0x00596fc7` -> `0x00596da0` `multiplayer_transport_submit_profile_key_query_bundle` - -Data refs: -- none - -### `0x00596fd0` -> `0x00596fd0` `multiplayer_transport_dispatch_status_route_event` - -- Size: `219` -- Calling convention: `cdecl` -- Signature: `data.00596fd0(int32_t arg_4h);` - -Entry excerpt: - -```asm - 596fb0: retl $0x4 - 596fb3: nop - 596fb4: nop - 596fb5: nop - 596fb6: nop - 596fb7: nop - 596fb8: nop - 596fb9: nop - 596fba: nop - 596fbb: nop - 596fbc: nop - 596fbd: nop - 596fbe: nop - 596fbf: nop - 596fc0: pushl %esi - 596fc1: movl %edx, %eax - 596fc3: pushl $0x0 - 596fc5: movl %ecx, %esi - 596fc7: calll 0x596da0 <.text+0x195da0> - 596fcc: popl %esi - 596fcd: retl - 596fce: nop - 596fcf: nop - 596fd0: movl 0x4(%esp), %eax - 596fd4: pushl %esi - 596fd5: movl %edx, %esi - 596fd7: movl 0x398(%eax), %edx - 596fdd: testl %edx, %edx - 596fdf: pushl %edi - 596fe0: je 0x597077 <.text+0x196077> - 596fe6: movl 0xb44(%eax), %edx - 596fec: testl %edx, %edx - 596fee: je 0x596ff9 <.text+0x195ff9> -``` - -Callers: -- none - -Direct internal callees: -- `0x00597017` -> `0x0058bce0` `fcn.0058bce0` -- `0x00597054` -> `0x0058bce0` `fcn.0058bce0` -- `0x00597029` -> `0x0058cd40` `fcn.0058cd40` -- `0x0059703f` -> `0x0058cd40` `fcn.0058cd40` -- `0x0059706d` -> `0x0058cd40` `fcn.0058cd40` -- `0x00597084` -> `0x0058cd40` `fcn.0058cd40` - -Data refs: -- `0x00597008` -> `0x005970ac` -- `0x00597001` -> `0x005970c4` -- `0x0059704d` -> `0x005ce1c8` "openstaging" - -### `0x005973d0` -> `0x005973d0` `multiplayer_transport_try_connect_status_route` - -- Size: `170` -- Calling convention: `cdecl` -- Signature: `fcn.005973d0(int32_t arg_4h);` - -Entry excerpt: - -```asm - 5973b0: pushl %esi - 5973b1: movl %ecx, %esi - 5973b3: movl 0x1ecc(%esi), %ecx - 5973b9: testl %ecx, %ecx - 5973bb: je 0x5973cc <.text+0x1963cc> - 5973bd: calll 0x58cfd0 <.text+0x18bfd0> - 5973c2: movl $0x0, 0x1ecc(%esi) - 5973cc: popl %esi - 5973cd: retl - 5973ce: nop - 5973cf: nop - 5973d0: pushl %ebx - 5973d1: pushl %esi - 5973d2: movl %ecx, %esi - 5973d4: movl 0xaf0(%esi), %eax - 5973da: testl %eax, %eax - 5973dc: pushl %edi - 5973dd: leal 0xaf0(%esi), %edi - 5973e3: movl %edx, %ebx - 5973e5: je 0x5973ec <.text+0x1963ec> - 5973e7: calll 0x597350 <.text+0x196350> - 5973ec: cmpl $-0x1, %ebx - 5973ef: movl 0xb34(%esi), %eax -``` - -Callers: -- `0x0058daf1` in `0x0058dae0` `fcn.0058dae0` -- `0x005965be` in `0x005965a0` `multiplayer_transport_try_connect_status_route_once` - -Caller xref excerpts: - -#### `0x0058daf1` - -```asm - 58dad1: addb %bl, -0x3e(%esi) - 58dad4: orb %al, (%eax) - 58dad6: nop - 58dad7: nop - 58dad8: nop - 58dad9: nop - 58dada: nop - 58dadb: nop - 58dadc: nop - 58dadd: nop - 58dade: nop - 58dadf: nop - 58dae0: movb 0x60(%ecx), %al - 58dae3: testb %al, %al - 58dae5: jne 0x58daec <.text+0x18caec> - 58dae7: xorl %eax, %eax - 58dae9: retl $0x4 - 58daec: movl 0x4(%esp), %eax - 58daf0: pushl %eax - 58daf1: calll 0x5973d0 <.text+0x1963d0> - 58daf6: negl %eax - 58daf8: sbbl %eax, %eax - 58dafa: negl %eax - 58dafc: retl $0x4 - 58daff: nop - 58db00: movb 0x60(%ecx), %al - 58db03: testb %al, %al - 58db05: je 0x58db16 <.text+0x18cb16> - 58db07: movl $0x1, 0xb44(%ecx) -``` - -#### `0x005965be` - -```asm - 59659e: nop - 59659f: nop - 5965a0: movl 0xb40(%ecx), %eax - 5965a6: testl %eax, %eax - 5965a8: je 0x5965af <.text+0x1955af> - 5965aa: xorl %eax, %eax - 5965ac: retl $0x4 - 5965af: movl 0x4(%esp), %eax - 5965b3: pushl %eax - 5965b4: movl $0x1, 0xb40(%ecx) - 5965be: calll 0x5973d0 <.text+0x1963d0> - 5965c3: negl %eax - 5965c5: sbbl %eax, %eax - 5965c7: negl %eax - 5965c9: retl $0x4 - 5965cc: nop - 5965cd: nop - 5965ce: nop - 5965cf: nop - 5965d0: testl %edx, %edx - 5965d2: pushl %esi - 5965d3: movl %ecx, %esi - 5965d5: je 0x5965dc <.text+0x1955dc> - 5965d7: calll 0x597350 <.text+0x196350> - 5965dc: movl 0xb40(%esi), %eax -``` - -Direct internal callees: -- `0x00597460` -> `0x0058bc90` `fcn.0058bc90` -- `0x0059743c` -> `0x0058c9b0` `fcn.0058c9b0` -- `0x0059742d` -> `0x0058cc40` `fcn.0058cc40` -- `0x005973e7` -> `0x00597350` `multiplayer_transport_release_status_route` - -Data refs: -- `0x0059740f` -> `0x00596fd0` -- `0x0059740a` -> `0x005970e0` -- `0x00597405` -> `0x00597180` -- `0x00597400` -> `0x005971b0` -- `0x005973fb` -> `0x00597270` -- `0x005973f6` -> `0x005972c0` -- `0x0059745b` -> `0x00597330` +- `0x004334b3` -> `0x005c8190` +- `0x0043347f` -> `0x005c9d08` "%s%s" +- `0x0043354e` -> `0x005c9d08` "%s%s" +- `0x00433452` -> `0x005c9d10` +- `0x0043342e` -> `0x005c9d14` "*.gm*" +- `0x00433427` -> `0x005c9d1c` "*.smp" +- `0x00433402` -> `0x006cec74` +- `0x00433438` -> `0x006cec74` diff --git a/artifacts/exports/rt3-1.06/function-map.csv b/artifacts/exports/rt3-1.06/function-map.csv index 772e002..ab808c9 100644 --- a/artifacts/exports/rt3-1.06/function-map.csv +++ b/artifacts/exports/rt3-1.06/function-map.csv @@ -5,7 +5,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00401940,152,company_reset_linked_transit_caches_and_reseed_empty_train_routes,simulation,thiscall,inferred,objdump + callsite inspection + linked-transit correlation,2,"Small linked-transit reset helper beneath the broader company service family. The function clears the two company-side linked-transit cache timestamps at `[this+0x0d3e]` and `[this+0x0d3a]`, immediately re-enters `company_service_linked_transit_site_caches` `0x00409720`, and then walks the live train collection `0x006cfcbc` for company-owned trains. For owned trains in operating modes `0x0a` or `0x13` it removes every existing route-list entry through `train_route_list_remove_entry_and_compact` `0x004b3000`; when the route list is empty it then re-enters `train_try_append_linked_transit_autoroute_entry` `0x00409770`. Current grounded meaning is a local linked-transit cache reset plus empty-route reseed pass rather than a broader train-service sweep.","objdump + callsite inspection + linked-transit correlation + train-route-reset correlation" 0x004019e0,611,company_service_periodic_city_connection_finance_and_linked_transit_lanes,simulation,thiscall,inferred,objdump + callsite inspection + caller correlation + RT3.lng strings,2,"Broader periodic company-side service pass above the currently grounded city-connection, finance, and linked-transit lanes. The helper first rejects inactive or special-case companies through `[this+0x3f]` and `0x00425b90`, clears the transient company-side latches at `[this+0x0d17]`, `[this+0x0d18]`, and `[this+0x0d56]`, and temporarily mirrors one locomotive-derived byte from `[this+0x0d17]` into scenario field `[0x006cec78+0x4c74]` while the earlier route-building side of the body runs, restoring the original scenario value on exit. Current evidence now bounds those byte latches more narrowly: `[this+0x0d17]` is this transient route-search preference override, currently seeded only when `company_select_preferred_available_locomotive_id` `0x004078a0` resolves one locomotive whose engine-type dword `[record+0x10]` equals `2`; wider engine-type evidence now makes that best-read as the electric lane, since the linked approval helper around `0x0041d550` dispatches the same `0/1/2` field across three scenario opinion slots while the local language family `706..709` and help text `3848` bound the player-facing triplet as `Steam`, `Diesel`, and `Electric`. The route-search side is tighter now too: this mirrored byte is not just reusing a display preference slot abstractly, it feeds the same initial path-sweep branch in `route_entry_collection_run_initial_candidate_path_sweep` `0x0049bd40` that explicit route-policy byte `4` uses, selecting the larger `1.8` quality multiplier instead of `1.4` before the later acceptance checks. `[this+0x0d18]` is the city-connection announcement-side latch reused by `company_evaluate_and_publish_city_connection_bonus_news` `0x00406050`; and `[this+0x0d56]` is the linked-transit train-service latch later set by the train-add, train-upgrade, and route-builder-side cache-refresh family around `0x00409830`, `0x00409300`, and `0x0040457e -> 0x004093d0`. The ordering matters too: this owner clears those latches up front, runs the city-connection and linked-transit branches first, and only later enters `company_evaluate_annual_finance_policy_and_publish_news` `0x00401c50`, so the finance helper is reading same-cycle side-channel state rather than stale long-lived flags. It then gates and schedules several narrower service families: the city-connection announcement side through `simulation_try_select_and_publish_company_start_or_city_connection_news` `0x00404ce0` and `company_evaluate_and_publish_city_connection_bonus_news` `0x00406050`; the acquisition-side sibling through `company_try_buy_unowned_industry_near_city_and_publish_news` `0x004014b0`; the linked-transit train side through `company_balance_linked_transit_train_roster` `0x00409950`; the broader annual finance and governance helper through `company_evaluate_annual_finance_policy_and_publish_news` `0x00401c50`; and the linked-transit cache refresh tail through either `company_rebuild_linked_transit_site_peer_cache` `0x004093d0` or `company_rebuild_linked_transit_autoroute_site_score_cache` `0x00407bd0` depending on current scenario mode byte `[0x006cec78+0x0f]`. This name stays intentionally conservative: it is the broader periodic owner above those lanes, not a fully split policy map yet.","objdump + callsite inspection + caller correlation + RT3.lng strings + linked-transit correlation + city-connection correlation + acquisition correlation + latch correlation + sequencing correlation + temporary-route-preference correlation + locomotive-choice correlation + engine-type correlation + route-search-threshold correlation" 0x004078a0,815,company_select_preferred_available_locomotive_id,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Selects one preferred locomotive id for the current company from the live locomotive collection at `0x006ada84`. The helper iterates the live locomotive records, applies company-and-chairman availability gating through the linked approval family around `0x0041d550`, accumulates one weighted preference score from locomotive fields `[record+0x20]`, `[+0x28]`, `[+0x18]`, `[+0x1c]`, `[+0x0c]`, and the linked class or era record at `[record+0x72]`, and keeps the strongest surviving locomotive id, falling back to `locomotive_collection_select_best_era_matched_non_electric_fallback_id` `0x00461cd0` when no scored candidate survives. Current grounded callers are the periodic company service pass `0x004019e0`, the temporary route-side mode chooser around `0x00402d5f`, the linked-transit train-upgrade news helper `0x00409300`, and the linked-transit train-add helper `0x00409830`. Current evidence now also bounds one route-policy side effect above it: `0x004019e0` only arms its temporary `[company+0x0d17] -> [0x006cec78+0x4c74]` override when the chosen locomotive record carries engine-type value `2` in `[record+0x10]`, which now best aligns with the electric lane rather than an unnamed class slot.","objdump + caller xrefs + callsite inspection + locomotive-collection correlation + preferred-choice correlation + engine-type correlation" -0x00401c50,3016,company_evaluate_annual_finance_policy_and_publish_news,simulation,thiscall,inferred,objdump + callsite inspection + RT3.lng strings,2,"Large annual company finance-policy helper beneath the broader periodic service pass at `0x004019e0`. The earliest creditor-pressure or bankruptcy lane is now bounded more tightly: it requires scenario mode `0x0c`, the bankruptcy toggle `[0x006cec78+0x4a8f]` to be clear, at least `13` years since the last bankruptcy stamp at `[this+0x163]`, and at least `4` years since founding year `[this+0x157]`. It then scans the last three years of derived finance lanes through `company_read_year_or_control_transfer_metric_value` `0x0042a5d0`, accumulating the net-profits lane `0x2b`, counting one three-year failure condition from the revenue aggregate `0x2c`, selecting one negative cash-and-debt stress ladder `-600000 / -1100000 / -1600000 / -2000000` from the current slot-`0x2c` band split at roughly `120000 / 230000 / 340000`, requiring the current support-adjusted share-price scalar from `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0` to be at least `15` or `20` depending on whether all three years failed, checking the current fuel-cost lane in slot `0x09` against `0.08` times that ladder, and requiring both `edi >= 2` plus the three-year slot-`0x2b` accumulator to clear one final `-60000` threshold before it commits bankruptcy through `company_declare_bankruptcy_and_halve_bond_debt` `0x00425a90` and formats RT3.lng `2881` `%1 has declared bankruptcy!`. The helper also has one later deep-distress fallback bankruptcy lane on the no-action fallthrough before the build-`1.03+` stock-issue branch: with the same bankruptcy toggle clear, current cash below `-300000`, at least `3` years since founding, no recent automatic finance action already chosen, the first three recent net-profits lanes each at or below `-20000`, and at least `5` years since the last bankruptcy stamp, it commits the same bankruptcy path and news family again. The later debt-capital restructuring family mutates the live company through `company_repay_bond_slot_and_compact_debt_table` `0x00423d70`, `company_issue_bond_and_record_terms` `0x004275c0`, `company_repurchase_public_shares_and_reduce_capital` `0x004273c0`, and `company_issue_public_shares_and_raise_capital` `0x00427450`, then formats the RT3.lng `2882..2886` headlines `%1 has refinanced %2 of debt.`, `%1 has refinanced %2 of debt and borrowed %3 on top of that.`, `%1 has refinanced %2 and paid off a further %3 of debt.`, `%1 has paid off %2 of its debt.`, and `%1 has borrowed %2 in debt.` The message-side tail is tighter now too: it accumulates total retired principal in one counter and total newly issued principal in another, then chooses the debt headline family by comparing those two totals directly: equal -> `2882` refinance only, issued greater -> `2883` refinance plus extra borrowing, retired greater -> `2884` refinance plus additional payoff, issued zero -> `2885` debt payoff only, and retired zero with issued positive -> `2886` straight new borrowing. The middle annual bond lane is tighter now too: when the bond toggle `[+0x4a8b]` is clear, it first simulates full bond repayment through repeated `company_repay_bond_slot_and_compact_debt_table` `0x00423d70`, then uses the resulting cash-side window with the fixed `-250000` and `-30000` thresholds plus the broader linked-transit train-service latch `[this+0x0d56]` to decide whether to stage one or more `500000` principal, `30`-year bond issues through `company_issue_bond_and_record_terms` `0x004275c0`. The repurchase lane is distinct from the later share-issue path: when the city-connection announcement-side latch `[this+0x0d18]` is set, editor growth setting `2` does not suppress it, and the stock toggle `[+0x4a87]` is clear, it starts from one `1000`-share batch and one default factor `1.0`, can replace that with a linked-chairman personality scalar `([table byte * 39] + 300) / 400`, scales that factor by `1.6` when growth setting `[0x006cec78+0x4c7c] == 1`, uses the resulting factor in one `800000` stock-value gate and one support-adjusted share-price scalar times factor times `1000` times `1.2` affordability gate, requires enough unassigned shares through `company_count_unassigned_shares_after_active_chairman_holdings` `0x004261b0`, and then commits repeated `1000`-share repurchases through `company_repurchase_public_shares_and_reduce_capital` `0x004273c0`; this is the current strongest threshold owner behind RT3.lng `2887`. The repurchase tail also now reads cleanly: it accumulates the total repurchased public-share count in a dedicated counter and publishes `2887` from that total after the debt headline branch. The sequencing above this helper now bounds those two latch reads more clearly: `0x004019e0` clears them first, then the city-connection and linked-transit branches may set them earlier in the same periodic pass, so the bond and repurchase lanes are currently best read as same-cycle reaction policy rather than long-term company-state policy. The later stock-issue lane is tighter too: it only opens on build `1.03+`, only after the earlier bankruptcy, bond, and repurchase outcomes stay inactive, and with the bond and stock toggles `[+0x4a8b]` and `[+0x4a87]` clear, at least two bond slots live, and at least one year since founding. It derives one prospective equity tranche from roughly one-tenth of the current outstanding-share count, rounded down to `1000`-share lots with floor `2000`, trims that tranche downward until the support-adjusted share-price scalar times tranche no longer exceeds the `55000` proceeds gate, requires that scalar at least `22`, resolves the highest-coupon live bond slot through `company_query_highest_coupon_bond_slot_index` `0x0042a0e0`, and then uses current cash from stat-family `0x2329/0x0d` as a gating threshold against that slot's principal plus a small fixed buffer before the approval ladder proceeds. The actual approval ladder now reads like a valuation-versus-borrowing screen: it compares the chosen bond coupon against one normalized price-to-book-style ratio built from the same support-adjusted share-price scalar and current `Book Value Per Share` from stat-family `0x2329/0x1d`, using the piecewise ladder `0.07/1.3`, `0.08/1.2`, `0.09/1.1`, `0.10/0.95`, `0.11/0.8`, `0.12/0.62`, `0.13/0.5`, and `0.14/0.35`. On success it issues two same-sized public-share tranches through repeated `company_issue_public_shares_and_raise_capital` `0x00427450` calls and formats a separate equity-offering news family rooted at localized id `4053`, not the earlier `2882..2887` debt-or-buyback headlines. The dividend-side branch is now bounded too: it requires the dividend toggle `[0x006cec78+0x4a93]` to be clear, scenario mode `0x0c`, at least `1` year since `[this+0x0d2d]`, and at least `2` years since founding; it then converts a weighted `3/2/1` blend of the last three net-profits lanes `0x2b` into one tentative dividend-per-share target, supplements that target with current cash only on the tiny-unassigned-share branch below `1000`, and still folds in the map-editor building-density growth setting `[0x006cec78+0x4c7c]`. Current grounded postblend behavior is: growth setting `1` scales the existing dividend by `0.66`, growth setting `2` zeros it, computed deltas at or below `0.1` collapse to zero, larger deltas are quantized in tenths, and the final value is clamped against `company_compute_board_approved_dividend_rate_ceiling` `0x00426260`. The tail also refreshes `CompanyDetail.win` when the selected company matches `[0x006cfe4c]`. This now grounds the main finance verbs and most first-layer threshold constants under the annual policy pass, though some lower policy semantics still remain open.","objdump + callsite inspection + RT3.lng strings + finance-policy correlation + bankruptcy/debt-news correlation + repurchase-news correlation + equity-offering-news correlation + finance-mutator correlation + threshold correlation + latch correlation + sequencing correlation + stock-data-label correlation + highest-coupon-bond correlation + income-statement-row correlation + derived-report-metric correlation + valuation-vs-borrowing correlation + weighted-dividend-target correlation + deep-distress-bankruptcy correlation + debt-headline-tail correlation + repurchase-headline-tail correlation" +0x00401c50,3016,company_evaluate_annual_finance_policy_and_publish_news,simulation,thiscall,inferred,objdump + callsite inspection + RT3.lng strings,2,"Large annual company finance-policy helper beneath the broader periodic service pass at `0x004019e0`. The earliest creditor-pressure or bankruptcy lane is now bounded more tightly: it requires scenario mode `0x0c`, the bankruptcy toggle `[0x006cec78+0x4a8f]` to be clear, at least `13` years since the last bankruptcy stamp at `[this+0x163]`, and at least `4` years since founding year `[this+0x157]`. It then scans the last three years of derived finance lanes through `company_read_year_or_control_transfer_metric_value` `0x0042a5d0`, accumulating the net-profits lane `0x2b`, counting one three-year failure condition from the revenue aggregate `0x2c`, selecting one negative cash-and-debt stress ladder `-600000 / -1100000 / -1600000 / -2000000` from the current slot-`0x2c` band split at roughly `120000 / 230000 / 340000`, requiring the current support-adjusted share-price scalar from `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0` to be at least `15` or `20` depending on whether all three years failed, checking the current fuel-cost lane in slot `0x09` against `0.08` times that ladder, and requiring both `edi >= 2` plus the three-year slot-`0x2b` accumulator to clear one final `-60000` threshold before it commits bankruptcy through `company_declare_bankruptcy_and_halve_bond_debt` `0x00425a90` and formats RT3.lng `2881` `%1 has declared bankruptcy!`. The helper also has one later deep-distress fallback bankruptcy lane on the no-action fallthrough before the build-`1.03+` stock-issue branch: with the same bankruptcy toggle clear, current cash below `-300000`, at least `3` years since founding, no recent automatic finance action already chosen, the first three recent net-profits lanes each at or below `-20000`, and at least `5` years since the last bankruptcy stamp, it commits the same bankruptcy path and news family again. The later debt-capital restructuring family mutates the live company through `company_repay_bond_slot_and_compact_debt_table` `0x00423d70`, `company_issue_bond_and_record_terms` `0x004275c0`, `company_repurchase_public_shares_and_reduce_capital` `0x004273c0`, and `company_issue_public_shares_and_raise_capital` `0x00427450`, then formats the RT3.lng `2882..2886` headlines `%1 has refinanced %2 of debt.`, `%1 has refinanced %2 of debt and borrowed %3 on top of that.`, `%1 has refinanced %2 and paid off a further %3 of debt.`, `%1 has paid off %2 of its debt.`, and `%1 has borrowed %2 in debt.` The message-side tail is tighter now too: it accumulates total retired principal in one counter and total newly issued principal in another, then chooses the debt headline family by comparing those two totals directly: equal -> `2882` refinance only, issued greater -> `2883` refinance plus extra borrowing, retired greater -> `2884` refinance plus additional payoff, issued zero -> `2885` debt payoff only, and retired zero with issued positive -> `2886` straight new borrowing. The middle annual bond lane is tighter now too: when the bond toggle `[+0x4a8b]` is clear, it first simulates full bond repayment through repeated `company_repay_bond_slot_and_compact_debt_table` `0x00423d70`, then uses the resulting cash-side window with the fixed `-250000` and `-30000` thresholds plus the broader linked-transit train-service latch `[this+0x0d56]` to decide whether to stage one or more `500000` principal, `30`-year bond issues through `company_issue_bond_and_record_terms` `0x004275c0`. The repurchase lane is distinct from the later share-issue path: when the city-connection announcement-side latch `[this+0x0d18]` is set, editor growth setting `2` does not suppress it, and the stock toggle `[+0x4a87]` is clear, it starts from one `1000`-share batch and one default factor `1.0`, can replace that with a linked-chairman personality scalar `([table byte * 39] + 300) / 400`, scales that factor by `1.6` when growth setting `[0x006cec78+0x4c7c] == 1`, uses the resulting factor in one `800000` stock-value gate and one support-adjusted share-price scalar times factor times `1000` times `1.2` affordability gate, requires enough unassigned shares through `company_count_unassigned_shares_after_active_chairman_holdings` `0x004261b0`, and then commits repeated `1000`-share repurchases through `company_repurchase_public_shares_and_reduce_capital` `0x004273c0`; this is the current strongest threshold owner behind RT3.lng `2887`. The repurchase tail also now reads cleanly: it accumulates the total repurchased public-share count in a dedicated counter and publishes `2887` from that total after the debt headline branch. The sequencing above this helper now bounds those two latch reads more clearly: `0x004019e0` clears them first, then the city-connection and linked-transit branches may set them earlier in the same periodic pass, so the bond and repurchase lanes are currently best read as same-cycle reaction policy rather than long-term company-state policy. The later stock-issue lane is now tighter in exact order, not just broad shape: it only opens on build `1.03+`, only after the earlier bankruptcy, bond, and repurchase outcomes stay inactive, and with the bond and stock toggles `[+0x4a8b]` and `[+0x4a87]` clear, at least two bond slots live, and at least one year since founding. It derives one prospective equity tranche from roughly one-tenth of the current outstanding-share count, rounded down to `1000`-share lots with floor `2000`, trims that tranche downward until the pressured support-adjusted share-price scalar times tranche no longer exceeds the `55000` proceeds cap, recomputes the same share-price scalar under the negative tranche pressure term, clamps `Book Value Per Share` from stat-family `0x2329/0x1d` to a minimum `1.0`, and forms the normalized price-to-book ratio before any approval tests. The tested gates then run in a fixed order: share-price floor `>= 22`, pressured proceeds floor `>= 55000`, current cash from `0x2329/0x0d` against the highest-coupon live bond principal plus the fixed `5000` buffer, one later issue-cooldown or last-issue timestamp gate from `[this+0x16b..]`, and only then the piecewise coupon-versus-price-to-book ladder `0.07/1.3`, `0.08/1.2`, `0.09/1.1`, `0.10/0.95`, `0.11/0.8`, `0.12/0.62`, `0.13/0.5`, and `0.14/0.35`. On success it issues two same-sized public-share tranches through repeated `company_issue_public_shares_and_raise_capital` `0x00427450` calls and formats a separate equity-offering news family rooted at localized id `4053`, not the earlier `2882..2887` debt-or-buyback headlines. The dividend-side branch is now bounded too: it requires the dividend toggle `[0x006cec78+0x4a93]` to be clear, scenario mode `0x0c`, at least `1` year since `[this+0x0d2d]`, and at least `2` years since founding; it then converts a weighted `3/2/1` blend of the last three net-profits lanes `0x2b` into one tentative dividend-per-share target, supplements that target with current cash only on the tiny-unassigned-share branch below `1000`, and still folds in the map-editor building-density growth setting `[0x006cec78+0x4c7c]`. Current grounded postblend behavior is: growth setting `1` scales the existing dividend by `0.66`, growth setting `2` zeros it, computed deltas at or below `0.1` collapse to zero, larger deltas are quantized in tenths, and the final value is clamped against `company_compute_board_approved_dividend_rate_ceiling` `0x00426260`. The tail also refreshes `CompanyDetail.win` when the selected company matches `[0x006cfe4c]`. This now grounds the main finance verbs and first-layer threshold ordering under the annual policy pass, though some lower helper semantics still remain open.","objdump + callsite inspection + RT3.lng strings + finance-policy correlation + bankruptcy/debt-news correlation + repurchase-news correlation + equity-offering-news correlation + finance-mutator correlation + threshold correlation + latch correlation + sequencing correlation + stock-data-label correlation + highest-coupon-bond correlation + income-statement-row correlation + derived-report-metric correlation + valuation-vs-borrowing correlation + weighted-dividend-target correlation + deep-distress-bankruptcy correlation + debt-headline-tail correlation + repurchase-headline-tail correlation + stock-issue-ordering correlation" 0x00402c90,19,placed_structure_resolve_linked_candidate_record,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,2,"Tiny placed-structure-to-candidate resolver over the global candidate collection at `0x0062b268`. The helper reads one candidate id from `[this+0x173]`, re-enters the shared indexed-collection record resolver at `0x00518140`, and returns the resulting candidate record pointer. Current grounded caller is the BuildingDetail-side branch at `0x00506441`, where it is used immediately after resolving one placed-structure record from `0x0062b2fc`. This now looks like the direct placed-structure linked-candidate accessor rather than another anonymous local helper.","objdump + caller xrefs + callsite inspection + collection-resolver correlation" 0x00402cb0,3457,city_connection_try_build_route_with_optional_direct_site_placement,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Shared heavy route-builder and optional direct-placement helper beneath the city-connection route and news family. The function starts at a clean prologue at `0x00402cb0`, seeds one builder-state latch band at `[this+0xf5]`, `[this+0xf6]`, `[this+0xf8]`, `[this+0xfa]`, `[this+0xfc]`, and `[this+0x10a]`, and then splits into three grounded internal lanes. The first is an early route-entry search or synthesis lane through `route_entry_collection_try_build_path_between_optional_endpoint_entries` `0x004a01a0` over the global route-entry store `0x006cfca8`, which can seed the builder-state block and succeed without placing a new site. The second is a single-endpoint direct-placement lane around `0x00403d92..0x00403ef3`: it scans the live placed-structure collection `0x0062b2fc` for `Maintenance` and `ServiceTower` stems, projects one candidate placement through `0x00417840`, validates it through `0x004197e0`, and then commits through the first direct placement branch `0x00403ed5 -> placed_structure_collection_allocate_and_construct_entry` `0x004134d0` -> `placed_structure_finalize_creation_or_rebuild_local_runtime_state` `0x0040ef10`. The third is a later paired-endpoint fallback lane around `0x00403f41..0x00404489`: it seeds two endpoint candidates from the same `Maintenance` and `ServiceTower` stem scan, builds one temporary route-entry candidate list, iterates that list against span and year-scaled step terms, projects trial placements through `0x00417840`, and on success commits through the second direct placement branch `0x0040446b -> 0x004134d0 -> 0x0040ef10` before clearing a small exclusion window in the temporary list. Outside those lanes it also re-enters geometry, region, and route-store helpers around `0x004423a0`, `0x00482e00`, `0x004931e0`, `0x00494310`, and the global route-entry stores `0x006cfcb4` / `0x006cfca8`, and it can still unwind through route-state cleanup without committing new placed structures. Current grounded external callers are still entirely in the city-connection family: the compact region-entry wrapper `city_connection_bonus_try_compact_route_builder_from_region_entry` `0x00404640`, the peer-route candidate builder `city_connection_bonus_build_peer_route_candidate` `0x004046a0`, the direct region-entry pair wrapper `city_connection_try_build_route_between_region_entry_pair` `0x00404c60`, and the direct retry paths inside `simulation_try_select_and_publish_company_start_or_city_connection_news` `0x00404ce0`. This now bounds the old unresolved `0x00403xxx..0x00404631` placement chooser as one shared city-connection route or placement helper with a cleaner internal policy split, even though some lower helper semantics remain open.","objdump + caller xrefs + callsite inspection + placement-correlation + route-builder correlation + Maintenance/ServiceTower scan correlation + route-entry search correlation" 0x004046a0,1388,city_connection_bonus_build_peer_route_candidate,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Reusable candidate builder beneath the city-connection bonus news and status family. The helper starts from one region or city entry in the collection at `0x0062bae0`, samples that entry's two derived coordinate terms through `0x00455800` and `0x00455810`, then re-enters `city_connection_bonus_select_first_matching_peer_site` at `0x00420280` with both selector flags forced on so it can recover one representative connected peer site. When a peer is found it samples the peer's derived coordinates through `0x0047df30` and `0x0047df50`; when an explicit caller-owned route anchor is present it first tries the heavier route builder at `0x00402cb0`, otherwise it falls back to the smaller helper at `0x00404640`. If neither early path succeeds the function collects one local candidate band from the two global route-entry stores at `0x006cfcb4` and `0x006cfca8`, filters those entries against the current city id and several route-state predicates, computes one compact bounding window around each surviving candidate, and then chooses the best remaining candidate by smallest span before retrying `0x00402cb0`. Current grounded callers are the wider company-side city-connection bonus sweep at `0x00406050` and one neighboring branch at `0x00406b73`, which together make this look like the shared peer-route candidate builder above the city bonus peer-selector family rather than a direct UI formatter.","objdump + caller xrefs + callsite inspection + peer-selector correlation + route-builder correlation" @@ -21,19 +21,20 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00409300,200,company_publish_train_upgrade_news,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection + RT3.lng strings,3,"Formats and publishes the linked-transit train-upgrade news item. After one scenario gate through `[0x006cec78+0x4a97]`, the helper chooses one preferred locomotive id through `0x004078a0`, resolves the caller-supplied train id through the live train collection `0x006cfcbc`, formats the old and new locomotive names through the locomotive collection `0x006ada84` and the name helper at `0x00461ca0`, and then emits RT3.lng id `2897` `%1 has just upgraded a %2 to a %3.` through the shell news helper at `0x004554e0`. It finally sets the byte latch at `[company+0x0d56]`. Current grounded callers are the train-roster balancer at `0x00409950` and one neighboring branch at `0x00409b52`, so this now reads as the shared company-side train-upgrade headline helper rather than an anonymous news formatter.","objdump + caller xrefs + callsite inspection + RT3.lng strings + train-upgrade news correlation" 0x004093d0,837,company_rebuild_linked_transit_site_peer_cache,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Per-company fast refresh over the placed-structure-side linked-transit peer cache. The helper stamps the current scenario tick from `[0x006cec78+0x15]` into `[this+0x0d3e]`, then walks the live placed-structure collection at `0x006cec20`. For each site it resolves the company-specific cache cell from the site's pointer table `[site+0x5bd][company_id]`, marks the cell present, clears its eligible byte, and frees any prior peer-record buffer at `+0x06`. It then marks a site eligible when it passes the station-or-transit gate `0x0047fd50`, the linked-instance class test `0x0047de00 -> 0x0040c990 == 1`, and either already belongs to this company through `placed_structure_query_linked_company_id` `0x0047efe0` or survives the neighboring route-anchor reachability gate `0x004801a0` plus the minimum-distance threshold built from `company_query_min_linked_site_distance_to_xy` `0x00405920`. In the second pass each eligible site receives a zeroed `(eligible_count*0x0d)+1` byte peer buffer at cache offset `+0x06`, and the helper fills one `0x0d`-byte record per eligible peer: byte `+0x00` is a route-side reachability flag, dword `+0x01` stores the peer site id, dword `+0x05` stores the returned route-step count from `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` `0x004a6630`, and float `+0x09` stores the normalized continuity share computed from that step count and the companion mismatch-count output of the same helper. The function then tails into the heavier company-side follow-on at `0x00407bd0`. Current grounded callers are the company-side world or service wrapper `0x00409742`, the mode-gated company pass at `0x00401c23`, the route-builder-side company refresh at `0x0040457e`, and the active-company collection sweep `0x00429c5b`.","objdump + caller xrefs + callsite inspection + linked-transit cache correlation + placed-structure cache-cell correlation + route-step-count correlation + continuity-ratio correlation" 0x00409720,80,company_service_linked_transit_site_caches,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Timed service wrapper above the two company-side linked-transit cache lanes. The helper refreshes the fast peer cache through `company_rebuild_linked_transit_site_peer_cache` `0x004093d0` when `[this+0x0d3e]` is zero or older than `0x7ff80` ticks, and otherwise refreshes the slower follow-on lane at `0x00407bd0` when `[this+0x0d3a]` is zero or older than `0x31380` ticks. Current grounded direct callers are `0x004097b8`, which re-enters it after one larger local mode change, and several neighboring company-side service paths. This now looks like the bounded timed owner for the company-side linked-transit cache family rather than another anonymous small wrapper.","objdump + caller xrefs + callsite inspection + timed-service correlation" -0x00409770,88,train_try_append_linked_transit_autoroute_entry,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Attempts to append one linked-transit autoroute entry onto a live train route list. After validating the train-side state and one current route-kind gate through `0x004a8840`, the helper clears one local staging byte, re-enters `company_service_linked_transit_site_caches` `0x00409720` on the owning company, and then asks `company_build_linked_transit_autoroute_entry` `0x00408380` for a single staged `0x33`-byte route-list record using the current anchor site id at `[this+0x0a0]`. On success it either appends that record through `train_route_list_insert_staged_entry_at_index` `0x004b3160` and refreshes the new trailing selection through `train_route_list_select_entry_and_refresh_linked_site_state` `0x004b2f00`, or when the list is already at the local two-entry cap it rotates the target slot via `[this+0x08] mod [this+0x04]` and overwrites that `0x33`-byte entry in place. Current grounded caller is the company-side service sweep at `0x004019cc`, so this now reads as the single-entry train-side autoroute append helper rather than a two-entry seeding pass.","objdump + caller xrefs + callsite inspection + linked-transit autoroute correlation + train-route-list correlation" -0x00409830,274,company_try_add_linked_transit_train_and_publish_news,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection + RT3.lng strings,3,"Local add-train branch beneath the linked-transit company train-roster balancer. The helper first respects scenario gate `[0x006cec78+0x4aa3]`, clears and seeds one staged route-entry buffer through `0x004b2ba0`, services the owning company's linked-transit caches, asks `company_build_linked_transit_autoroute_entry` `0x00408380` for two route-list entries, inserts those entries through `train_route_list_insert_staged_entry_at_index` `0x004b3160`, chooses one preferred locomotive id through `0x004078a0`, and then hands the staged route plus locomotive choice into the train-construction helper at `0x004b2140`. On success it emits RT3.lng id `2896` `%1 has added a new train (%2) at %3` through `0x004554e0` and sets the byte latch at `[company+0x0d56]`. Current grounded callers are the local add branches inside `company_balance_linked_transit_train_roster` `0x00409950`, while multiplayer callers package opcode `0x75` instead.","objdump + caller xrefs + callsite inspection + RT3.lng strings + linked-transit train-add correlation" +0x00409770,88,train_try_append_linked_transit_autoroute_entry,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Attempts to append one linked-transit autoroute entry onto a live train route list. After validating the train-side state and one current route-kind gate through `0x004a8840`, the helper clears one local staging byte, re-enters `company_service_linked_transit_site_caches` `0x00409720` on the owning company, and then asks `company_build_linked_transit_autoroute_entry` `0x00408380` for a single staged `0x33`-byte route-list record using the current anchor site id at `[this+0x0a0]`. On success it either appends that record through `train_route_list_insert_staged_entry_at_index` `0x004b3160` and refreshes the new trailing selection through `train_route_list_select_entry_and_refresh_linked_site_state` `0x004b2f00`, or when the list is already at the local two-entry cap it rotates the target slot via `[this+0x08] mod [this+0x04]` and overwrites that `0x33`-byte entry in place. The weighted linked-transit cache lanes stay indirect here too: this helper inherits ranked site and peer choice only through `0x00408380`, not by reading cache `+0x0e/+0x16` itself. Current grounded caller is the company-side service sweep at `0x004019cc`, so this now reads as the single-entry train-side autoroute append helper rather than a two-entry seeding pass.","objdump + caller xrefs + callsite inspection + linked-transit autoroute correlation + train-route-list correlation + weighted-consumer-boundary correlation" +0x00409830,274,company_try_add_linked_transit_train_and_publish_news,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection + RT3.lng strings,3,"Local add-train branch beneath the linked-transit company train-roster balancer. The helper first respects scenario gate `[0x006cec78+0x4aa3]`, clears and seeds one staged route-entry buffer through `0x004b2ba0`, services the owning company's linked-transit caches, asks `company_build_linked_transit_autoroute_entry` `0x00408380` for two route-list entries, inserts those entries through `train_route_list_insert_staged_entry_at_index` `0x004b3160`, chooses one preferred locomotive id through `0x004078a0`, and then hands the staged route plus locomotive choice into the train-construction helper at `0x004b2140`. On success it emits RT3.lng id `2896` `%1 has added a new train (%2) at %3` through `0x004554e0` and sets the byte latch at `[company+0x0d56]`. The weighted linked-transit cache lanes stay indirect here too: this add-train path inherits ranked site and peer choice only through the two `0x00408380` builder calls, while the separate roster-pressure decision above it still comes from raw cache `+0x12` through `0x00408f70`. Current grounded callers are the local add branches inside `company_balance_linked_transit_train_roster` `0x00409950`, while multiplayer callers package opcode `0x75` instead.","objdump + caller xrefs + callsite inspection + RT3.lng strings + linked-transit train-add correlation + weighted-consumer-boundary correlation" 0x00409950,923,company_balance_linked_transit_train_roster,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Balances one company's linked-transit train roster against the linked-site cache family. The helper first requires at least one linked transit site through `company_count_linked_transit_sites` `0x00426590`, then computes one aggregate train-pressure target through `company_compute_owned_linked_transit_site_score_total` `0x00408f70` and counts currently owned trains through `company_count_owned_trains` `0x004264c0`. It walks the live train collection `0x006cfcbc`, keeps only trains owned by the current company, derives one year-dependent age scalar from current scenario year `[0x006cec78+0x0d]`, and applies that scaled age against two thresholds. Very old trains above the upper band are either removed outright through the train collection vtable when the roster already exceeds target, or upgraded in place through `company_publish_train_upgrade_news` `0x00409300` when the target still needs capacity. Mid-age trains above the lower band can trigger one narrower upgrade branch when the roster is still below target. After pruning, it computes the remaining deficit between the aggregate target and the owned-train count, then repeatedly either packages multiplayer opcode `0x75` through `0x00469d30` or locally re-enters `company_try_add_linked_transit_train_and_publish_news` `0x00409830` until that deficit collapses, with one later add-train retry branch when the residual target is still high enough. Current grounded callers are the company-side service sweep at `0x00401b9d` and a neighboring company wrapper at `0x004097b8`, so this now looks like the live train-balance owner above the linked-transit autoroute and news helpers rather than an unnamed local maintenance pass.","objdump + caller xrefs + callsite inspection + linked-transit train-balance correlation + linked-transit consumer correlation" 0x004264c0,96,company_count_owned_trains,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Counts the live trains owned by the current company. The helper walks the train collection at `0x006cfcbc`, compares each record's owning company byte at `[train+0x51]` against `[this+0x00]`, and returns the number of matches. Current grounded callers are the linked-transit train-roster balancer at `0x00409950` and the `LoadScreen.win` company train-list page at `0x004e7670`, where the count gates the no-trains fallback before the detailed roster rows are built.","objdump + caller xrefs + callsite inspection + company-owned train count correlation" 0x00426590,135,company_count_linked_transit_sites,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Counts the live linked placed structures for this company that also pass the station-or-transit gate. The helper walks the placed-structure collection at `0x006cec20`, keeps only peers whose linked company id from `placed_structure_query_linked_company_id` at `0x0047efe0` matches `[this+0x00]`, requires the linked-instance class byte through `0x0047de00 -> 0x0040c990 == 1`, and optionally enforces the narrower station-or-transit predicate through `0x0047fd50` when the caller passes a nonzero stack flag. The current grounded caller is `company_evaluate_and_publish_city_connection_bonus_news` at `0x00406050`, where the helper contributes the current linked transit-site count used in the bonus-value ladder and later building-density caps.","objdump + caller xrefs + callsite inspection + connection-bonus count correlation" -0x00427590,47,company_connection_bonus_lane_is_unlocked,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Small boolean gate above `company_compute_connection_bonus_value_ladder` at `0x00425320`. The helper rejects immediately when the scenario-state flag at `0x006cec78+0x4a8b` is set or when the company age-like counter at `[this+0x5b]` has reached `0x14`; otherwise it computes the zero-argument connection-bonus value ladder through `0x00425320` and returns true only when the resulting integer value is at least `5`. Current grounded callers are `company_evaluate_and_publish_city_connection_bonus_news` at `0x00406050` and the later mid-function gate around `0x004064a9`, so current best meaning is one unlock or eligibility gate for the stronger city-connection bonus lane rather than a generic support predicate.","objdump + caller xrefs + callsite inspection + connection-bonus correlation" -0x0040a590,892,simulation_service_periodic_boundary_work,simulation,cdecl,inferred,objdump + analysis-context,3,"Periodic simulation-maintenance dispatcher inside the world-step family. It switches on the local calendar or phase byte at [this+0x0f] routes one heavy mode through the larger recurring service branch at 0x0040a160 falls back to the simpler one-step advance at 0x00409e80 for other modes and runs several global manager sweeps across 0x0062be10 0x006ceb9c 0x006cfcbc 0x006cec20 and 0x0062bae0 before handing control back to the enclosing stepper. The route-style lane is tighter here now too: one recurring branch at `0x0040a91f` re-enters `placed_structure_collection_refresh_quarter_subset_route_style_state` `0x00413580`, which refreshes every fourth live placed structure for route-style candidate scoring and peer-link emission. One conditional branch also re-enters shell_map_file_world_bundle_coordinator at 0x00445de0 which keeps the save-or-package family connected to the live simulation cadence.",objdump + analysis-context + caller xrefs -0x0040ab50,339,simulation_advance_to_target_calendar_point,simulation,cdecl,inferred,objdump + analysis-context,3,Advances the active world state toward one caller-selected packed calendar target while guarded by the recursion counter at 0x0062b240. The helper compares the current local tuple fields [this+0x0d] [this+0x0f] [this+0x11] and [this+0x14] against a target resolved through 0x0051d550 and 0x0051d5f0 then either recurses in larger 0x168-sized chunks or advances through the smaller periodic step family rooted at 0x00409e80 and 0x0040a9c0. Each successful step notifies the live world root at 0x0062c120 through 0x00450030. Grounded callers include the frame-time accumulator at 0x00439140 the larger fast-forward helper at 0x00437b20 and one shell UI command path.,objdump + analysis-context + caller xrefs +0x00427590,47,company_credit_rating_score_meets_threshold_5,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Small boolean gate over the bounded company credit-rating score at `0x00425320`. The helper rejects immediately when scenario-state flag `0x006cec78+0x4a8b` is set or when the company-side count or age-like field `[this+0x5b]` has reached `0x14`; otherwise it computes the zero-argument credit-rating score and returns true only when the resulting integer value is at least `5`. Current grounded callers are `company_evaluate_and_publish_city_connection_bonus_news` at `0x00406050` and the neighboring branch around `0x004064a9`, so this is currently safest as a small reusable threshold gate over the same debt-market or company-strength score rather than a dedicated shell-only bond predicate.","objdump + caller xrefs + callsite inspection + credit-rating correlation + threshold-gate correlation" +0x00409e80,192,world_set_selected_year_and_refresh_calendar_presentation_state,simulation,thiscall,inferred,objdump + caller inspection + local disassembly,3,"Small world-side year setter beneath the periodic step family and the later world-entry staged-profile rehydrate band. The helper stores the caller-supplied selected absolute calendar counter at `[this+0x15]`, resolves the paired mixed-radix calendar-point tuple through `0x0051d460` into `[this+0x0d/+0x11]`, recomputes several derived year-fraction or presentation scalars rooted at `[this+0x0bfa]`, refreshes the live shell controller at `0x006d4024` through `0x0051f070`, `0x00527c70`, and `0x00527c20`, and updates the controller's cached doubled-year field at `[controller+0x2c]`. When the unpacked year field at `[this+0x0d]` actually changes it also re-enters `world_refresh_selected_year_bucket_scalar_band` `0x00433bd0`. Current grounded callers are the smaller periodic-step wrapper at `0x0040a150`, the larger simulation-advance family through `0x0040a590/0x0040ab50`, and the late staged-profile rehydrate lane inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, so this is the safest current read for the shared selected-year/calendar refresh helper rather than a one-off world-entry setter.","objdump + caller inspection + local disassembly + periodic-step correlation + world-entry rehydrate correlation + year-bucket-companion correlation + calendar-counter model correlation" +0x0040a590,892,simulation_service_periodic_boundary_work,simulation,cdecl,inferred,objdump + analysis-context,3,"Periodic simulation-maintenance dispatcher inside the world-step family. It switches on the local calendar or phase byte at [this+0x0f] routes one heavy mode through the larger recurring service branch at 0x0040a160 falls back to the simpler one-step advance at 0x00409e80 for other modes and runs several global manager sweeps across 0x0062be10 0x006ceb9c 0x006cfcbc 0x006cec20 and 0x0062bae0 before handing control back to the enclosing stepper. Its scenario-runtime handoff is now explicit too: the grounded calls at `0x0040a276`, `0x0040a55f`, `0x0040a6cb`, and `0x0040a7a3` re-enter `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` `0x00432f40` with trigger kinds `1`, `0`, `3`, and `2` respectively. The route-style lane is tighter here now too: the neighboring recurring branch at `0x0040a91f` re-enters `placed_structure_collection_refresh_quarter_subset_route_style_state` `0x00413580`, then later drives the same runtime-effect collection loop with trigger kinds `5` and `4` at `0x0040a930` and `0x0040a9ac`. One conditional branch also re-enters shell_map_file_world_bundle_coordinator at 0x00445de0 which keeps the save-or-package family connected to the live simulation cadence.",objdump + analysis-context + caller xrefs + runtime-effect trigger-kind correlation +0x0040ab50,339,simulation_advance_to_target_calendar_point,simulation,cdecl,inferred,objdump + analysis-context,3,"Advances the active world state toward one caller-selected mixed-radix calendar target while guarded by the recursion counter at `0x0062b240`. The helper compares the current local calendar-point tuple fields `[this+0x0d]`, `[this+0x0f]`, `[this+0x11]`, and `[this+0x14]` against a target resolved through `0x0051d550` and `0x0051d5f0`, then either recurses in larger `0x168`-sized chunks or advances through the smaller periodic step family rooted at `0x00409e80` and `0x0040a9c0`. Current tuple evidence now bounds this as the same mixed-radix counter family used by `0x0051d3c0/0x0051d460`: a packed year-plus-subfield calendar point rather than a plain year or month-only target. Each successful step notifies the live world root at `0x0062c120` through `0x00450030`. Grounded callers include the frame-time accumulator at `0x00439140`, the larger fast-forward helper at `0x00437b20`, and one shell UI command path.","objdump + analysis-context + caller xrefs + calendar-counter model correlation" 0x0040e360,235,placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime,map,thiscall,inferred,objdump + caller inspection + local disassembly,2,"Subtype-specific local-runtime follow-on beneath `0x0040eba0` and `0x0040ee10`. The helper resolves the current placed structure's candidate from `[this+0x3cc]` through `0x0062b2fc` and `0x0062b268`, requires subtype byte `[candidate+0x32] == 1` plus candidate class byte `[candidate+0x8c] == 3`, then requires a linked site id at `[this+0x2a8]`. When the linked peer exists and its route-entry anchor at `[peer+0x08]` is live in collection `0x006cfca8`, the helper samples one anchor-side float through `0x0048aab0`, subtracts the fixed offset at `0x005c8738`, combines that result with the current placed structure's coordinate pair through `0x00455810` and `0x00455800`, and publishes the resulting triplet through the shared position setter `0x00530720`. Current grounded caller is the broader local side helper `0x0040ee10`, plus the heavier subtype-driven refresh path at `0x0040eba0`, so this is now the safest current read for the linked-site anchor position-triplet refresh beneath the placed-structure local-runtime family rather than a generic route query.","objdump + caller inspection + local disassembly + linked-site-anchor correlation + local-runtime correlation" 0x0040e450,131,placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem,map,thiscall,inferred,objdump + caller inspection + local disassembly,2,"Small wrapper that rebuilds one placed structure's cloned local-runtime record from its current candidate stem and cached profile slot. The helper copies the current stem string from the candidate referenced by `[this+0x3cc]`, resolves the matching live candidate id through `indexed_collection_resolve_live_entry_id_by_stem_string` `0x00416e20`, seeds the projected-rectangle profile-slot cache from `[this+0x252]` through `placed_structure_cache_projected_rect_profile_slot_id` `0x00414470`, and then re-enters `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` `0x00418a60` with the current placed-structure pointer. It stores the returned cloned record into `[this+0x24e]`, refreshes the local cached profile slot from `[record+0x732]` into `[this+0x252]`, and ties the clone back to the owning placed structure through `[record+0x73a] = this`. Current grounded caller is the collection-wide wrapper `0x004133b0`, so this now reads as the cloned local-runtime rebuild helper for one live placed structure rather than an unowned stem lookup.","objdump + caller inspection + local disassembly + local-runtime-clone correlation + projected-rect-profile correlation" 0x0040eba0,620,placed_structure_set_world_coords_and_refresh_local_runtime_side_state,map,thiscall,inferred,objdump + caller inspection + local disassembly,2,"Heavier placed-structure world-coordinate mutation helper above the local-runtime side refresh family. The function updates the current record's world position through `0x00455860`, recomputes cached grid coordinates `[this+0x388]` and `[this+0x38c]`, and rewrites the world-grid owner mapping through `0x0042c9f0` and `0x0042c9a0`. On the candidate subtype-`4` branch it also removes and then re-appends the current site to the nearby-transit proximity bucket family through `placed_structure_collection_remove_site_id_from_all_proximity_bucket_lists` `0x004814c0` and `placed_structure_collection_append_site_into_all_proximity_bucket_lists` `0x00481480`. After that it rebuilds the same local position or scalar triplet family later serviced by `0x0040ee10`, caches the accepted scalar pair in `[this+0x392]` and `[this+0x396]`, publishes the chosen triplet through the shared setter `0x00530720`, optionally refreshes the linked peer route-entry anchor through `0x00480710`, and finally tails into `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` `0x0040e360`. Current grounded callers include the broader rebuild paths `0x0040ef10` and `0x0040f6d0`, later site-mutation branches `0x00419110`, `0x0046ef40`, `0x004707da`, and `0x00473bf0`, plus shell-side subject updates around `0x00507cf0` and `0x00508bb0`, so this is now the safest current owner for world-coordinate updates plus local-runtime side-state refresh rather than a generic movement helper.","objdump + caller inspection + local disassembly + world-coordinate mutation correlation + local-runtime correlation + proximity-bucket correlation" 0x0040ee10,248,placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon,map,thiscall,inferred,objdump + caller inspection + local disassembly,2,"Small placed-structure local-runtime side refresh over one live record. The helper samples the current structure coordinate pair through `0x00455800` and `0x00455810`, converts that pair through the basis at `0x006d4024`, `0x0051f090`, and `0x00534490` into one base scalar, and then conditionally adjusts that scalar when the linked candidate-side structure record keeps nonzero byte `[candidate+0xba]` via the rounded world-grid sampler `0x0044ae40` and the fixed subtractive offset at `0x005c8840`. When the auxiliary preview owner gate `shell_has_auxiliary_preview_owner` `0x00434050` is active, it rounds that scalar to an integer float. It then publishes the resulting position triplet through the shared setter `0x00530720` and tails into `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` `0x0040e360`. Current grounded callers are the collection-wide local-runtime refresh wrapper `0x004133b0` and the connected-component recursion tail `placed_structure_recursive_collect_connected_component_tile_bounds` `0x00415f20`, so this is now the strongest current owner for the per-site local-runtime position-triplet refresh rather than a generic coordinate helper.","objdump + caller inspection + local disassembly + local-runtime correlation + connected-component correlation" -0x0040ef10,1984,placed_structure_finalize_creation_or_rebuild_local_runtime_state,map,thiscall,inferred,objdump + caller inspection + placement and mutation correlation,3,"Broad placed-structure post-create or post-edit rebuild above the narrower route-style lane. The helper validates several linked-site and world-state preconditions before keeping the current site live, increments the global live-site count at `0x0062be40`, seeds runtime mode and year fields at `[this+0x390]`, `[this+0x3d4]`, and `[this+0x3d5]`, refreshes the adjacent site-status or overlay family through `0x0040d2d0`, and rebuilds one larger local owner or service bundle through `0x00418be0`, `0x0040eba0`, and the scalar-staging family `0x00475ed0` / `0x00474fe0` / `0x00475010` / `0x00475030` into fields such as `[this+0x24e]`, `[this+0x252]`, `[this+0x25a]`, and `[this+0x25e]`. Later in the same body it re-enters `0x0040db30`, and when the local latch at `[this+0x29e]` is still zero it also re-enters `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` `0x004101e0` with stack flag `1`. Current grounded callers include the placement-side builders at `0x00403ef3` and `0x00404489`, later site-mutation paths at `0x0046f073` and `0x004707ff`, and one train-side site operation at `0x005098eb`, so this now looks like the broad post-create or post-edit runtime rebuild above route-style scoring and peer-link emission rather than a route-style-only helper.","objdump + caller inspection + placement and mutation correlation + route-style rebuild correlation" +0x0040ef10,1984,placed_structure_finalize_creation_or_rebuild_local_runtime_state,map,thiscall,inferred,objdump + caller inspection + placement and mutation correlation,3,"Broad placed-structure post-create or post-edit rebuild above the narrower route-style lane. The helper validates several linked-site and world-state preconditions before keeping the current site live, increments the global live-site count at `0x0062be40`, seeds runtime mode and year fields at `[this+0x390]`, `[this+0x3d4]`, and `[this+0x3d5]`, refreshes the adjacent site-status or overlay family through `0x0040d2d0`, and rebuilds one larger local owner or service bundle through `0x00418be0`, `0x0040eba0`, and the scalar-staging family `0x00475ed0` / `0x00474fe0` / `0x00475010` / `0x00475030` into fields such as `[this+0x24e]`, `[this+0x252]`, `[this+0x25a]`, and `[this+0x25e]`. Later in the same body it re-enters `0x0040db30`, and when the local latch at `[this+0x29e]` is still zero it also re-enters `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` `0x004101e0` with stack flag `1`. The tail is tighter now too: when creation-mode byte `[this+0x3d4]` equals `1`, the branch at `0x0040f692` triggers `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` `0x00432f40` with kind `6` just before the local live-site follow-on at `0x433b80`. Current grounded callers include the placement-side builders at `0x00403ef3` and `0x00404489`, later site-mutation paths at `0x0046f073` and `0x004707ff`, and one train-side site operation at `0x005098eb`, so this now looks like the broad post-create or post-edit runtime rebuild above route-style scoring and peer-link emission rather than a route-style-only helper.","objdump + caller inspection + placement and mutation correlation + route-style rebuild correlation + runtime-effect trigger-kind correlation" 0x0040f6d0,891,placed_structure_construct_entry_from_candidate_and_world_args,map,thiscall,inferred,objdump + constructor inspection + caller correlation,3,"Lower constructor beneath the shared placed-structure allocator at `0x004134d0`. The helper writes the new placed-structure id into `[this+0x2a4]`, clears a large band of local runtime fields, copies the candidate stem or label payload from the caller-supplied construction scratch record, initializes local world geometry through `0x0040cd70`, `0x0045b9b0`, `0x00455750`, and `0x00455720`, quantizes the input coordinates into the cached grid terms at `[this+0x388]` and `[this+0x38c]`, seeds the current scenario year into `[this+0x3d5]`, and initializes the class-weight lanes near `[this+0x28a]` from the linked candidate vtable owner. It then zeroes the local route-style and service-score bands, conditionally builds the first local owner or service record through `0x00418be0` and `0x0040eba0`, resolves the initial linked site id at `[this+0x2a8]` through `0x00481390` when the backing candidate subtype byte `[candidate+0x32]` is `1`, seeds region linkage through `0x0044a800` and `0x0041f7e0`, optionally re-enters `0x0040db30` for subtype `4`, and finally seeds the trailing random-like dwords at `[this+0x3d9]` and `[this+0x3dd]` from `0x518d70`. Current grounded caller is `placed_structure_collection_allocate_and_construct_entry` `0x004134d0`, so this is now the concrete placed-structure constructor rather than an anonymous lower helper beneath the placement-side builders.","objdump + constructor inspection + caller correlation + placed-structure runtime-state correlation" 0x0040fbe0,224,placed_structure_endpoint_pair_has_shared_route_entry_key,map,thiscall,inferred,objdump + caller inspection + world-grid chain comparison,3,"Boolean peer-test between one placed structure and one caller-supplied peer site id. The helper converts the current site and the peer site into their derived world-grid owner records through `0x00455800`, `0x00455810`, the world-grid tables rooted at `[0x0062c120+0x2129]`, and the placed-structure resolver `0x0040fa50`. It then compares the two route-entry chains rooted at `[cell+0x0ef]`, using the chain lengths at `[cell+0x0eb]`, and returns `1` on the first shared leading `u16` route-entry key; otherwise it returns `0`. Current grounded callers are the route-link emitter at `0x0040fef0`, where it blocks duplicate endpoint pairing before `placed_structure_route_link_allocate_site_pair_for_candidate_class` `0x00467f50`, and the neighboring cleanup sweep at `0x0040d2aa`, where it decides whether an existing site-owned route-link should be erased. This now looks like the shared duplicate-or-overlap test for the route-link family rather than a generic proximity check.","objdump + caller inspection + world-grid chain comparison + route-link duplicate-check correlation" 0x0040fef0,752,placed_structure_try_emit_best_route_style_peer_link_for_candidate_class,map,thiscall,inferred,objdump + caller inspection + placed-structure sweep inspection,3,"Scans the live placed-structure collection for one best peer site and emits a missing route-link for one caller-selected candidate class when a qualifying endpoint pair survives. The helper first derives one distance cap from the current placed-structure population size at `0x0062b26c`, scales that cap by the caller-supplied float, and then walks the live placed-structure ids in a wrapped pseudo-random order. Candidate peers must have a positive class-specific weight in the placed-structure lane `[peer+class*4+0x27e]`, differ from the source site, pass the linked-instance class gate `0x0040c990 == 1`, and lie inside the chosen distance window after the coordinate and span checks built from `0x00455800`, `0x00455810`, `0x00455f60`, and nearby math helpers. The strongest surviving peer is kept through a weighted comparison, and if one remains the helper re-enters `placed_structure_endpoint_pair_has_shared_route_entry_key` `0x0040fbe0`; only when that duplicate check fails does it call `placed_structure_route_link_allocate_site_pair_for_candidate_class` `0x00467f50` with the source site id from `[this+0x2a4]`, the chosen peer id, and the same candidate-class argument. Current grounded callers are the larger per-site world pass around `0x00410665` and the route-style grid contribution branch at `0x0042cafe`, so this now looks like the current peer-selection emitter for site-owned route-style links rather than a low-level allocator wrapper.","objdump + caller inspection + placed-structure sweep inspection + route-link emission correlation" @@ -72,6 +73,9 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004133b0,132,placed_structure_collection_refresh_local_runtime_records_and_position_scalars,map,thiscall,inferred,objdump + caller inspection + local disassembly,2,"Collection-wide wrapper above the placed-structure local-runtime clone and side-refresh helpers. The function first drains the queued placed-structure id list rooted at `0x0062ba64/0x0062ba6c/0x0062ba70` by reading the queue count through `placed_structure_local_runtime_site_id_queue_count` `0x00414480` and popping ids through `placed_structure_local_runtime_site_id_queue_pop_next` `0x00413f50`; for each popped id it resolves the owning placed structure through collection `0x0062b26c` and re-enters `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` `0x0040e450`. It then pumps the scenario-side service at `0x004834e0`, walks every live placed structure in `0x0062b26c`, and re-enters `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` `0x0040ee10` on each one. The current grounded caller is no longer just an anonymous raw callsite: it sits inside the `Setting up Players and Companies...` `319` lane of `world_run_post_load_generation_pipeline` immediately after the auxiliary route-entry tracker collection refresh on `0x006cfcb4` through `0x004a41b0`, and immediately before the flagged world-grid cleanup sweep through `0x00448af0/0x00533fe0` plus the later route-entry post-pass `0x00491c20` on `0x006cfca8`. That makes this the clearest current owner for refreshing cloned local-runtime records plus the per-site position-scalar side pass rather than an anonymous collection sweep.","objdump + caller inspection + local disassembly + local-runtime-queue correlation + collection-refresh correlation + post-load-pipeline correlation" 0x00413f50,47,placed_structure_local_runtime_site_id_queue_pop_next,map,cdecl,inferred,objdump + caller inspection + local disassembly,3,"Pop-next helper over the temporary placed-structure id queue rooted at `0x0062ba64/0x0062ba6c/0x0062ba70`. When queue storage exists and the current count at `0x0062ba64` is positive, the helper returns the current head dword from `0x0062ba70`, advances that cursor by four bytes, and decrements the count; otherwise it returns `-1`. Current grounded caller is `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` `0x004133b0`, where the popped ids are resolved through collection `0x0062b26c` before cloned local-runtime records are rebuilt.","objdump + caller inspection + local disassembly + local-runtime-queue correlation" 0x00414480,6,placed_structure_local_runtime_site_id_queue_count,map,cdecl,inferred,objdump + caller inspection + local disassembly,3,"Tiny count getter over the temporary placed-structure id queue used by the local-runtime refresh family. The helper simply returns the current queue count at `0x0062ba64`. Current grounded caller is `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` `0x004133b0`, where the returned count bounds the queue-drain loop before the later all-sites side refresh.","objdump + caller inspection + local disassembly + local-runtime-queue correlation" +0x0041e8e0,63,structure_candidate_collection_write_filter_and_year_visible_summary_blocks,map,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Small packed-state write wrapper over the live structure-candidate collection at `0x0062ba8c`. The helper opens two tagged packed blocks through `0x00531360` with ids `0x6979` and `0x697a`, forwards the caller's packed-state sink plus side flag into `0x00518680`, and returns the combined emitted size. Current grounded caller is the later world-entry or restore-side branch at `0x00444375`, immediately after the candidate-count refresh family has run, so this is the safest current read for the candidate-summary packed-state write sibling rather than a direct count recompute helper.","objdump + local disassembly + caller correlation + packed-state correlation" +0x0041e930,48,structure_candidate_collection_read_filter_and_year_visible_summary_blocks,map,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Small packed-state read wrapper over the same structure-candidate summary family at `0x0062ba8c`. The helper opens the tagged blocks `0x6979` and `0x697a` through `0x00531340`, forwards the caller's packed-state source plus side flag into `0x00517d90`, and returns after both reads complete. Current grounded caller is the neighboring world-entry-side branch at `0x00445226`, which uses this read-side companion after shell service and before later post-load status updates, so this is the safest current read for the candidate-summary packed-state import sibling rather than a direct filter refresh helper.","objdump + local disassembly + caller correlation + packed-state correlation" +0x0041e970,121,structure_candidate_collection_refresh_filter_and_year_visible_counts,map,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Collection-wide counter refresh over the live structure-candidate pool at `0x0062ba8c`. The helper clears aggregate counts `[this+0x242]` and `[this+0x31a]`, then walks all `0x35` candidate slots through the collection accessors. For each live slot it stores the cargo-economy or editor-filter flag `[entry+0x56]` into one per-slot band rooted at `[this+0x246]`, increments `[this+0x31a]` when that flag is nonzero, re-enters `structure_candidate_is_enabled_for_current_year` `0x0041e220`, stores that result into the paired per-slot band rooted at `[this+0x16e]`, and increments `[this+0x242]` when the year-visible gate succeeds. Current grounded callers include the periodic boundary-service path at `0x0040a56a`, the post-fast-forward setup tail at `0x00437192`, the cargo-economy filter refresh family at `0x0041eac0/0x0041f584`, the later staged-profile rehydrate band inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, and one neighboring locomotive-side bridge at `0x00464aa8`, so this is the safest current read for the shared candidate-collection filter and year-visible count rebuild rather than a one-off world-entry helper.","objdump + local disassembly + caller correlation + candidate-count correlation + year-visible correlation" 0x0041ea50,179,world_setup_building_collection_phase,map,cdecl,inferred,objdump + strings + callsite inspection,3,"Post-load world-generation subphase inside world_run_post_load_generation_pipeline. The helper iterates the building-related collection at `0x0062ba8c`, chooses either the full pass or one modulo-selected bucket from the current world byte at `[0x006cec78+0x0f]`, resolves each entry through `0x00518380` and `0x00518140`, and then dispatches the selected record into the lower setup worker at `0x0041e2b0`. Current grounded callsite is the early collection sweep inside world_run_post_load_generation_pipeline immediately before the localized progress update `Setting up Players and Companies...`, so this looks like the collection-owned building-setup staging phase rather than one of the later player-speed or shell-frame loops.",objdump + caller context + RT3.lng strings 0x0041e220,52,structure_candidate_is_enabled_for_current_year,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Common live-availability gate for one structure-candidate record. The helper first requires the cargo-economy or editor filter flag at `[this+0x56]` to be nonzero, then compares the current scenario year against the candidate threshold at `[this+0x21]`, using either `[0x006cec78+0x05]` or `[+0x0d]` depending on the runtime branch latched at `[0x006cec78+0x46c38]`. Current grounded callers include the collection counter refresh at `0x0041e970`, the placed-structure cargo-bitset sweep at `0x0042c690`, and several later shell or world-side candidate-selection branches, so this now looks like the shared year-and-filter gate beneath the editor's cargo-economy path rather than a setup-only helper.","objdump + caller xrefs + callsite inspection + cargo-economy filter correlation" 0x0041e650,142,structure_candidate_query_route_style_or_local_availability_metric,map,thiscall,inferred,objdump + caller xrefs + callsite inspection + collection-correlation,3,"Returns one candidate-side float metric whose meaning splits on the route-style byte at `[this+0x46]`. When that byte is zero the helper simply returns the cached local float at `[this+0x5a]`. When it is nonzero it resolves one grouped routing-class value from candidate field `[this+0x3e]` through the structure-candidate collection side table at `0x0062ba8c+0x9a`, then walks collection `0x006ada90` through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140` to count entries whose class byte at `[entry+0x10]` matches, whose state byte at `[entry+0x12]` carries bit `0x2`, and whose word at `[entry+0x08]` is zero. It returns that matched count divided by the fixed float constant at `0x005c8554`. Current grounded callers include two sortable-value branches inside `shell_load_screen_render_map_cargo_list_panel` at `0x004e9460` and one neighboring shell renderer around `0x004f46d0`, so this now looks like the shared route-style-versus-local availability metric beneath candidate cargo summaries rather than a generic price reader.","objdump + caller xrefs + callsite inspection + collection-correlation + route-style-byte correlation" @@ -103,10 +107,15 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x0041f9b0,125,world_region_count_structure_profiles_before_year_for_category,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Counts region-subcollection structure profiles whose backing candidate resolves through `0x00412b70`, passes the availability gate at `0x0041f998`, matches one caller-selected category byte, and has threshold year `[profile+0x26]` less than or equal to the caller-supplied year. Current grounded callers include the region stats path at `0x004cbd41`, where category `2` feeds the localized `Industry Weightings` report, and the deeper per-region worker at `0x004235c0`, where the same count bounds demand for the weighted category-2 profile family.",objdump + caller xrefs + callsite inspection + RT3.lng strings 0x0041fa30,133,world_region_find_named_structure_profile_weight,map,thiscall,inferred,objdump + strings + caller xrefs,3,"Looks up one named structure profile in the current region subcollection `[region+0x37f]`. The helper linearly compares the caller-supplied text against each profile label and returns the float-like weight at `[profile+0x1e]` for the first exact match, otherwise `0.0`. The same region-subcollection string block is now partially grounded from nearby `.rdata` as labels such as `House`, `Hotel`, `Iron Mine`, `Furniture Factory`, `Fertilizer Factory`, and `farm`. Current grounded callers sit in world-side UI or telemetry branches around `0x004cbb74`, `0x004cc054`, and `0x004ccc54`.","objdump + caller xrefs + rdata strings" 0x0041fac0,60,world_region_read_structure_profile_label_and_weight_by_index,map,thiscall,inferred,objdump + caller xrefs + strings,4,"Reads one 1-based structure-profile entry from the current region subcollection `[region+0x37f]`. It copies the profile label string into the caller buffer and writes the float-like weight at `[profile+0x1e]` into the caller-provided out-slot. This is the label/value helper used beneath the region structure-demand worker and the adjacent UI or telemetry callers. The grounded profile-name block around `0x005c9100` now includes labels such as `House`, `Hotel`, `Iron Mine`, `Furniture Factory`, and `Fertilizer Factory`.","objdump + caller xrefs + rdata strings" +0x00422320,1320,world_region_normalize_cached_structure_balance_scalars,map,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Collection-wide region normalization pass over the live region manager `0x0062bae0`. The helper first early-outs in sandbox/editor-side mode through `[0x006cec7c+0x82]` and the active-mode latch `[0x006cec78+0x4aef]`, then runs one per-region prepass through `0x00420d40`, and finally performs two cohort sweeps split by region live byte `[region+0x23e]`. Across those sweeps it accumulates the cached scalar bands `[region+0x2b2/+0x2b6/+0x2ba/+0x2be/+0x2c2/+0x2c6]`, derives bounded normalization ratios, and writes the resulting cached growth-balance band back to `[region+0x2e2/+0x2e6/+0x2ea/+0x2ee]`. The player-facing meaning is tighter now from the editor growth report at `0x004d1d60`: `[region+0x2e2]` is the cached weighted-profit-margin scalar and `[region+0x2ee]` is the cached annual-density-adjust scalar later formatted as a percent, while `[region+0x2e6]` and `[region+0x2ea]` are the intermediate normalized-delta and clamped companion slots beneath that final annual-density adjust. The helper also uses world_region_count_linked_placed_structures_by_category `0x004228b0` as the direct category-count companion during the writeback sweep, and it applies one final live-value adjustment into `[region+0x25e]` when the shell latch `[0x006cec78+0x46c38]` is clear. Current grounded caller is the recurring simulation-maintenance branch at `0x0040a265` inside `simulation_service_periodic_boundary_work` `0x0040a590`, so this is now the safest current read for the region cached growth-balance normalization pass rather than a one-time setup helper.","objdump + local disassembly + caller inspection + recurring-maintenance correlation + editor-growth-report correlation" +0x004228b0,68,world_region_count_linked_placed_structures_by_category,map,thiscall,inferred,objdump + local disassembly,3,"Counts linked placed-structure records in the current region entry whose category byte matches one caller-supplied value. The helper walks the placed-instance chain rooted at `[region+0x383]` through the global registry `0x0062b26c`, resolves each live record's category byte through the vtable `+0x80` object view, and increments one simple match count without applying the heavier cap or availability filters used by `0x00422be0`. The current grounded local caller is the broader region-side worker around `0x00422320`, where this helper is used as the direct category-count companion to the later aggregate and placement passes rather than as a full demand-balancing gate.","objdump + local disassembly + local caller correlation" 0x00422900,352,world_region_accumulate_structure_category_totals,map,thiscall,inferred,objdump + callsite inspection,3,"Aggregates the current structure-category totals for one region entry. The helper walks the placed-instance chain rooted at `[region+0x383]` through the global registry `0x0062b26c`, resolves each live record's category byte through the vtable `+0x80` object view, and returns both counts and accumulated weight-like totals across four categories via the caller-provided out-pointers. Current grounded caller is world_region_balance_structure_demand_and_place_candidates at `0x004235c0`, where the outputs feed the later demand-balancing logic for the region-owned building-population pass.","objdump + callsite inspection" +0x00422a70,355,world_region_validate_and_commit_candidate_placement,map,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Shared placement-validation and commit gate beneath the region candidate-placement family. The helper takes one region entry in `ECX`, one candidate or profile id on the stack, one candidate world-coordinate pair, one caller-controlled side flag, one direct-versus-staged commit flag, and one optional out-pointer for the created placed-structure id. It first clears the optional out-slot, conditionally snaps the candidate coordinate pair to integers under the preview gate `0x434050 -> 0x46d2b0`, then validates projected placement through `placed_structure_validate_projected_candidate_placement` `0x004197e0`. On the direct-commit lane it additionally resolves the candidate world cell through `0x0044a800` and requires that cell's region id to match `[region+0x23a]`. When placement is allowed and the shell-side latch `[0x006cec78+0x46c3c]` is clear, one branch emits the staged side path through `0x0046d260`; otherwise it commits directly through `placed_structure_collection_allocate_and_construct_entry` `0x004134d0` and stores the resulting placed-structure id in the caller's out-slot. Current grounded callers are `world_region_try_place_candidate_structure` `0x00422ee0` and the world-side randomized batch helper `world_try_place_random_structure_batch_from_compact_record` `0x00430270`, so this is best read as the shared region-side candidate-placement validator and commit gate rather than as one region-worker-private helper.","objdump + local disassembly + caller correlation + placement-validator correlation" 0x00422be0,768,world_region_count_placed_structures_for_category,map,thiscall,inferred,objdump + callsite inspection,3,"Counts already-placed structures in one requested category for the current region entry. It walks the placed-instance chain rooted at `[region+0x383]` through `0x0062b26c`, filters live records by the requested category byte, and applies several additional placement gates including one cap on `[record+0x276]`, one disable byte at `[record+0x390]`, and special handling for category `2`. Current grounded caller is world_region_balance_structure_demand_and_place_candidates at `0x004235c0`, where the result is subtracted from the region's computed category demand before more candidates are chosen.","objdump + callsite inspection" 0x00422ee0,884,world_region_try_place_candidate_structure,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Attempts one candidate-structure placement for the current region entry and requested category. It derives one region-ranking bucket from `[region+0x256]` and `[region+0x25e]`, uses the region count at `0x0062bae0` to index the weighting table at `0x005ee1e0`, chooses one trial budget of `10` or `15` depending on the setup latch at `[0x006cec78+0x46c3c]`, and then repeatedly evaluates candidates from the global site pool `0x0062b268`. The chooser matches candidate names and scores against region subcollection entries, rejects over-cap or already-satisfied sites through the placed-instance registry `0x0062b26c`, and when successful either dispatches one direct placement through `0x004134d0` or routes the selected site into the shell-facing side path through `0x004337c0`. Current grounded callers are the region building worker at `0x004235c0` and the separate world-side branch at `0x004d1871`, so this now looks like the core candidate-placement helper beneath the region-owned building-population family.","objdump + caller xrefs + callsite inspection" -0x004235c0,1887,world_region_balance_structure_demand_and_place_candidates,map,thiscall,inferred,objdump + callsite inspection,4,"Core per-region worker beneath world_region_collection_run_building_population_pass. It first checks the broader shell-state master flag at `[0x006cec74+0x68]` and diverts into a separate alternate path when that flag is nonzero. The same flag now aligns with the editor-map `.gmp` family in the shell file coordinators, so the ordinary demand-balancing and placement flow currently looks grounded for the non-editor world mode while the alternate branch likely belongs to the editor-map side. In that ordinary path it aggregates existing category counts and weights through world_region_accumulate_structure_category_totals at `0x00422900`, samples the current region subcollection size through `0x0041f6a0`, and computes target demand for three structure categories by comparing those totals against caller-provided scale and mode inputs plus several randomized clamps. The three grounded category families are now narrower: category `0` uses the fixed fallback label `House` from `0x005c9114`; category `2` is the year-gated weighted region-profile family read through world_region_read_structure_profile_label_and_weight_by_index at `0x0041fac0` and bounded by world_region_count_structure_profiles_before_year_for_category at `0x0041f9b0`, which also feeds the localized `Industry Weightings` report in the region stats UI; and category `3` reaches world_region_pick_commercial_profile_label_by_region_rank at `0x00412ca0`, whose fallback token is `Commercial` but whose aligned region-stats label slot is localized as `City Support`. After subtracting already-placed coverage through world_region_count_placed_structures_for_category at `0x00422be0`, the worker tries placements through world_region_try_place_candidate_structure at `0x00422ee0` until demand is exhausted or the attempt budget runs out. This makes the worker a region structure-demand balancing and placement pass over houses, weighted region profiles, and the broader city-support branch rather than a generic setup loop.","objdump + callsite inspection + region stats disassembly + RT3.lng strings + rdata strings + file-flow correlation" +0x004235c0,1887,world_region_balance_structure_demand_and_place_candidates,map,thiscall,inferred,objdump + callsite inspection,4,"Core per-region worker beneath world_region_collection_run_building_population_pass. It first checks the broader shell-state master flag at `[0x006cec74+0x68]` and diverts into a separate alternate path when that flag is nonzero. The same flag now aligns with the editor-map `.gmp` family in the shell file coordinators, so the ordinary demand-balancing and placement flow currently looks grounded for the non-editor world mode while the alternate branch likely belongs to the editor-map side. In that ordinary path it aggregates existing category counts and weights through world_region_accumulate_structure_category_totals at `0x00422900`, samples the current region subcollection size through `0x0041f6a0`, queries projected structure-count scalars through `world_region_query_projected_structure_count_scalar_by_category` `0x004234e0`, and then computes target demand for three structure categories by comparing those projected totals against live placed counts plus several randomized clamps. The three grounded category families are now narrower: category `0` uses the fixed fallback label `House` from `0x005c9114`; category `2` is the year-gated weighted region-profile family read through world_region_read_structure_profile_label_and_weight_by_index at `0x0041fac0` and bounded by world_region_count_structure_profiles_before_year_for_category at `0x0041f9b0`, which also feeds the localized `Industry Weightings` report in the region stats UI; and category `3` reaches world_region_pick_commercial_profile_label_by_region_rank at `0x00412ca0`, whose fallback token is `Commercial` but whose aligned region-stats label slot is localized as `City Support`. After subtracting already-placed coverage through world_region_count_placed_structures_for_category at `0x00422be0`, the worker tries placements through world_region_try_place_candidate_structure at `0x00422ee0` until demand is exhausted or the attempt budget runs out. This makes the worker a region structure-demand balancing and placement pass over houses, weighted region profiles, and the broader city-support branch rather than a generic setup loop.","objdump + callsite inspection + region stats disassembly + RT3.lng strings + rdata strings + file-flow correlation + projected-demand correlation" +0x004234e0,211,world_region_query_projected_structure_count_scalar_by_category,map,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Returns one projected structure-count scalar for the requested region and category family. On the live-region branch `[region+0x23e] != 0`, the helper indexes the category table at `0x005ee1b0` by `(live_region_class, category)`, scales it by scenario difficulty and the normalized region-density field `[region+0x25e]`, then multiplies by the cached building-count slot `[region+0x242]`. On the fallback branch it instead derives one region bucket from `[region+0x25e]`, combines the two static tables `0x005ee138` and `0x005ee1b0`, and applies the alternate scenario-difficulty scale before returning the final float. Current grounded callers are the per-region placement worker `0x004236dc`, the map-editor city-count stats report `0x004d0420`, and the shell-side stats formatter around `0x004cc816`, where categories `2`, `3`, and `0` are aggregated into the projected starting industry and non-industry totals. This is therefore the shared projected region structure-count accessor rather than another placement mutator.","objdump + local disassembly + caller correlation + city-count-stats correlation" +0x00423d30,51,world_region_refresh_cached_category_totals_and_weight_slots,map,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Refreshes one small cached region summary band rooted at `[this+0x27a]`. The helper forwards three out-pointers `+0x27a/+0x27e/+0x282` plus one return slot `+0x286` into world_region_accumulate_structure_category_totals `0x00422900`, forcing the remaining category outputs and optional aggregate pointers to zero. Current grounded caller is the post-load seeding-burst tail around `0x00437bdc`, which sweeps the live region collection `0x0062bae0` after simulation_run_chunked_fast_forward_burst `0x00437b20`. This is therefore the narrow cached-category-summary refresher beneath that region-side setup and maintenance family rather than a company debt-table helper.","objdump + local disassembly + caller inspection + post-load caller correlation" 0x00423d70,176,company_repay_bond_slot_and_compact_debt_table,simulation,thiscall,inferred,objdump + caller inspection,4,"Repays and removes one indexed bond entry from the live company debt table. The helper validates the requested slot against the current bond count at `[this+0x5b]`, compacts the remaining 12-byte entries rooted at `[this+0x5f]`, and then recomputes the dependent finance accumulators through `0x0042a040` and `0x0042a080`. Current grounded shell caller is the repay-bond branch beneath `CompanyDetail.win`, which makes this the company-side debt-table mutator rather than a territory-access helper.","objdump + caller inspection + finance-field correlation" 0x00423ec0,33,company_adjust_available_track_laying_capacity_with_floor_zero,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,2,"Small saturating company-side counter adjuster over `[this+0x7680]`. When that field is not `-1`, the helper adds the caller-supplied delta, clamps the result at zero on underflow, and writes it back. The surrounding lifecycle is tighter now too: nearby company initialization around `0x004285c0` seeds `[this+0x7680]` to `50` when scenario byte `[0x006cec78+0x4aaf]` is enabled and to sentinel `-1` otherwise, while the companion getter `0x004240a0` returns either the live counter or fixed fallback `29999`. Current language-table correlation now gives that scenario byte a stronger player-facing read: it is the live gate behind RT3.lng `2576` `Company track laying is limited...` and event variable label `2358` `Company Track Pieces Buildable`. Current grounded caller is `route_entry_collection_create_endpoint_entry_from_coords_and_policy` `0x00493cf0`, where company-bound endpoint synthesis passes either `-1` or `-2` through this helper before the new route-entry payload is committed. That makes this the strongest current match for available track-laying capacity consumption rather than a generic finance counter.","objdump + caller xrefs + callsite inspection + route-build-capacity correlation + capacity-lifecycle correlation + RT3.lng correlation" 0x004240a0,28,company_query_available_track_laying_capacity_or_unlimited,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,2,"Returns the current company's available track-laying capacity. When scenario byte `[0x006cec78+0x4aaf]` is enabled, the helper returns the live company counter at `[this+0x7680]`; otherwise it returns fixed fallback `29999`, which currently reads as an effectively-unlimited path. Current language-table correlation now ties that scenario byte to RT3.lng `2576` `Company track laying is limited...` and event variable label `2358` `Company Track Pieces Buildable`, so this helper is best read as the live getter beneath that scenario rule rather than only as an internal company counter accessor. Current grounded callers include `placed_structure_validate_projected_candidate_placement` `0x004197e0`, `route_entry_collection_create_endpoint_entry_from_coords_and_policy` `0x00493cf0`, and `route_entry_collection_search_path_between_entry_or_coord_endpoints` `0x0049d380`, where the returned value is used as the company-side track-laying-capacity gate for route synthesis and station-attachment placement.","objdump + caller xrefs + callsite inspection + track-laying-capacity correlation + RT3.lng correlation" @@ -116,13 +125,13 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00424030,22,company_set_territory_access_rights_byte,simulation,thiscall,inferred,objdump + caller inspection,4,"Stores one territory-access byte for the requested company and territory id. The helper writes the supplied byte value into the same per-territory access table rooted at `[this + territory*0x38d + 0x1d9f]`. Current grounded shell caller is the immediate commit path inside `shell_company_detail_buy_territory_access_rights_flow` at `0x004c5fc9`, where the purchase path writes value `1` after the access-rights dialog is accepted.","objdump + caller inspection + territory-access table correlation" 0x004241e0,23,company_sum_control_transfer_offer_policy_fields_raw,simulation,thiscall,inferred,objdump + caller inspection,4,"Returns the raw sum of two company-side floating fields at `[this+0x124f]` and `[this+0x12a7]`. Current grounded callers are the merger-offer builder around `0x004eb5a9` and adjacent control-transfer offer-side stat readers, where the returned value is paired with surrounding formatter setup for mode `0x0b` but is not itself passed an issue argument. This now looks like a narrow raw control-transfer offer policy total rather than a generic finance calculation.","objdump + caller inspection + merger-offer dialog correlation" 0x00424200,37,company_sum_control_transfer_offer_policy_fields_scaled_tenths,simulation,thiscall,inferred,objdump + caller inspection,4,"Returns the same `[this+0x124f] + [this+0x12a7]` company-side policy total as `company_sum_control_transfer_offer_policy_fields_raw`, but scaled by the `0.1` constant at `0x005c9b50`. Current grounded callers are the merger and chairmanship-takeover offer builders at `0x004eb588` and `0x0050c7cb`, where the scaled result is immediately paired with surrounding formatter setup for mode `0x0b`. The helper itself does not consume an issue id, so this now reads as the scaled control-transfer offer policy total rather than a broader vote-weight function.","objdump + caller inspection + takeover and merger dialog correlation" -0x004248d0,759,company_compute_cached_recent_per_share_performance_subscore,simulation,thiscall,inferred,objdump + caller inspection,3,"Builds one cached company-side per-share performance subscore from recent yearly stock-data history and current scenario difficulty. When the company is inactive via `[this+0x3f]` it returns the fixed negative fallback at `0x005c8598`; otherwise it reuses the cache in `[this+0x0cfb]` and `[this+0x0cff]` when the current year at `[0x006cec78+0x15]` matches. On a cold pass it first walks up to five recent years above founding year `[this+0x157]`, weighting yearly `Revenue Per Share` from slot `0x1e` and yearly `Earnings Per Share` from slot `0x1f` through `0x0042a5d0`. It then runs a second trend pass over `Dividend Per Share` slot `0x20`, rewarding surviving years where the sampled value does not fall below the previous year. The tail blends those weighted yearly lanes with current `Book Value Per Share` from slot `0x1d`, applies one difficulty-table scalar under `0x005f33b8`, applies a post-bankruptcy smoothing factor from the years since `[this+0x163]`, stores one bounded intermediate subscore into `[this+0x0d19]`, and finally caches the resulting float in `[this+0x0cff]` with the current year in `[this+0x0cfb]`. Current grounded caller is `company_compute_public_support_adjusted_share_price_scalar` at `0x00424fd0`, where this helper now reads as the recent per-share performance feeder rather than a generic governance-support history walker.","objdump + caller inspection + cache-field correlation + stock-data-family correlation + per-share-panel correlation" +0x004248d0,759,company_compute_cached_recent_per_share_performance_subscore,simulation,thiscall,inferred,objdump + caller inspection,3,"Builds one cached company-side per-share performance subscore from recent yearly stock-data history and current scenario difficulty. When the company is inactive via `[this+0x3f]` it returns the fixed negative fallback at `0x005c8598`; otherwise it reuses the cache in `[this+0x0cfb]` and `[this+0x0cff]` when the current year at `[0x006cec78+0x15]` matches. On a cold pass it first walks up to five recent years above founding year `[this+0x157]`, weighting yearly `Earnings Per Share` from slot `0x1f` and yearly `Revenue Per Share` from slot `0x1e` through `0x0042a5d0`; the current partial year uses weight `(5 * [world+0x0f]) - 5`, while the prior four full years use `48`, `36`, `24`, and `12`. That yields two normalized history lanes: `EPS * 10` into the first lane and `Revenue Per Share` into the second. It then runs a second trend pass over `Dividend Per Share` slot `0x20`, rewarding adjacent year pairs where the newer dividend does not fall below the previous year's value; that pairwise ladder uses weights `9`, `8`, `7`, and `6` from newest to oldest surviving comparison. The third lane is a dividend-strength score derived from that rewarded ratio, the previous-year dividend, and the constants `0.5`, `0.6`, `30`, and `230`, then floored to `1.13 * min(max(EPS lane, 1.0), revenue lane, current Book Value Per Share slot 0x1d)`. The fourth lane is current `Book Value Per Share` from slot `0x1d`. Negative lanes are clamped to zero. Base lane weights come from `0x005ee208` as `40/10/20/30`, and for company age under five years they are ramped through the four-dword rows at `0x005ee218`: `0/0/0/100`, `25/25/35/100`, `50/50/65/100`, `75/75/85/100`, and `100/100/100/100`. The strongest lane then gets weight `*1.25` while the weakest gets `*0.8`, and the resulting weighted blend ratio is stored as bounded intermediate `[this+0x0d19]` after multiplying by `((difficulty_table[[world+0x2d]] + 1.0) / 2.0)` and flooring at `0.5`. The final cached score recomputes that same base blend, multiplies it by the raw difficulty scalar table at `0x005f33b8` (`0.8/0.9/1.0/1.1/1.2/0.9/0.95/1.0`), applies post-bankruptcy smoothing for companies within ten years of `[this+0x163]` as `score * ((0.025 * years_since_bankruptcy) + 0.5)`, floors the result at `1.0`, and finally caches the float in `[this+0x0cff]` with the current year in `[this+0x0cfb]`. Current grounded caller is `company_compute_public_support_adjusted_share_price_scalar` at `0x00424fd0`, where this helper now reads as the recent per-share performance feeder rather than a generic governance-support history walker.","objdump + caller inspection + cache-field correlation + stock-data-family correlation + per-share-panel correlation + weight-ladder correlation + dividend-trend correlation + age-ramp-table correlation + difficulty-table correlation" 0x00425a90,194,company_declare_bankruptcy_and_halve_bond_debt,simulation,thiscall,inferred,objdump + RT3.lng strings + caller inspection,4,"Runs the grounded company bankruptcy commit path. The helper walks the live bond table rooted at `[this+0x5f]`, halves each outstanding principal, recomputes finance metrics through `0x0042a040` and `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0`, reduces the company value field at `[this+0x47]`, and stamps the current year into `[this+0x163]` as the localized bankruptcy-cooldown anchor. Current grounded shell caller is `shell_company_detail_bankruptcy_flow` on the `CompanyDetail.win` path.","objdump + RT3.lng strings + caller inspection + finance-field correlation" 0x004261b0,74,company_count_unassigned_shares_after_active_chairman_holdings,simulation,thiscall,inferred,objdump + caller inspection,4,"Returns the current company share pool at `[this+0x47]` minus the positive holdings found in each active chairman profile record under `0x006ceb9c`. The helper uses the company collection index from `[this+0x00]` to read per-profile holdings from `[profile + company_index*4 + 0x15d]`, sums only positive entries, and subtracts that total from the company share count. Current grounded callers are the takeover and merger vote resolvers, which stage the result into `0x006d1a04` and `0x006d1104` before the lower public-vote support formulas run.","objdump + caller inspection + takeover and merger vote correlation" 0x00426260,607,company_compute_board_approved_dividend_rate_ceiling,simulation,thiscall,inferred,objdump + caller inspection,4,"Computes one nonnegative per-share dividend ceiling for the selected company. The helper starts from the current support or governance lane `0x2329/0x0d`, normalizes that value by the current outstanding-share band at `[this+0x47]`, then scans a bounded recent-year window relative to the founding year `[this+0x157]` and current scenario year `[0x006cec78+0x0d]`, taking minima from the shareholder-facing slots `0x2b` and `0x2c`. In the early-company path it also folds in `[this+0x57]` and the previous-year slot `0x1c`, applies several scale constants, and clamps the result at zero before returning the final per-share ceiling. Current grounded shell caller is `shell_company_detail_handle_change_dividend_rate_dialog_message` at `0x004c5140`, where this is the direct board-approval limit behind localized id `991` when the player tries to raise the dividend too far.","objdump + caller inspection + dividend-ceiling correlation" 0x004273c0,132,company_repurchase_public_shares_and_reduce_capital,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Repurchases one caller-supplied quantity of public shares and reduces company capital accordingly. The helper converts the share count into one cash-side total through the current support-adjusted share-price scalar from `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0` and fixed market-scale constants, posts the resulting negative amount into company stat slots `0x0c` and `0x0d` through `0x0042a080` and `0x0042a040`, and subtracts the same share count from the outstanding-share field `[this+0x47]`. Current grounded callers are the `CompanyDetail.win` stock-buyback flow at `0x004c46d0` and the annual finance-policy helper at `0x00401c50`, where it contributes the RT3.lng `2887` repurchase headline.","objdump + caller xrefs + callsite inspection + stock-buyback correlation + annual-finance correlation" -0x00427450,224,company_issue_public_shares_and_raise_capital,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Issues one caller-supplied quantity of public shares and increases company capital. When the optional pricing flag is clear, the helper derives one implied share-price scalar from `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0`, the current stock-valuation helper at `0x00425320`, and fixed underwriting constants; when the flag is set it reuses the caller-supplied scalar instead. It then posts the resulting proceeds into company stat slot `0x0c`, records the issued-share quantity in stat slot `0x0d`, optionally snapshots the prior year and tick into `[this+0x16b..0x177]`, and increases the outstanding-share field `[this+0x47]` by the issued quantity. Current grounded callers are the `CompanyDetail.win` stock-issue flow at `0x004c3f30` and the annual finance-policy helper at `0x00401c50`, where it contributes the debt-refinance-plus-borrowing and straight new-borrow capital side.","objdump + caller xrefs + callsite inspection + stock-issue correlation + annual-finance correlation" -0x00427540,76,company_compute_bond_interest_rate_quote,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Computes one company-specific bond interest-rate quote from the requested term and current support or credit state. When the company is active it combines the zero-argument value ladder from `0x00425320`, the current rating helper at `0x00424580`, and one term-dependent adjustment from the caller-supplied year span, then returns the resulting float rate; otherwise it falls back to `1.0`. Current grounded caller is `company_issue_bond_and_record_terms` `0x004275c0`, where this helper supplies the quoted rate when the caller does not already provide one.","objdump + caller xrefs + callsite inspection + bond-rate correlation" +0x00427450,224,company_issue_public_shares_and_raise_capital,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Issues one caller-supplied quantity of public shares and increases company capital. When the optional pricing flag is clear, the helper derives one implied share-price scalar from `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0`, the current company credit-rating score at `0x00425320`, and fixed underwriting constants; when the flag is set it reuses the caller-supplied scalar instead. It then posts the resulting proceeds into company stat slot `0x0c`, records the issued-share quantity in stat slot `0x0d`, snapshots the prior current-issue packed calendar tuple from `[this+0x16b/+0x16f]` into `[this+0x173/+0x177]`, writes the active world tuple from `[0x006cec78+0x0d/+0x11]` back into `[this+0x16b/+0x16f]` when taking the derived-pricing lane, and increases the outstanding-share field `[this+0x47]` by the issued quantity. Current grounded callers are the `CompanyDetail.win` stock-issue flow at `0x004c3f30` and the annual finance-policy helper at `0x00401c50`, where it contributes the debt-refinance-plus-borrowing and straight new-borrow capital side.","objdump + caller xrefs + callsite inspection + stock-issue correlation + annual-finance correlation + calendar-tuple-stamp correlation" +0x00427540,76,company_compute_bond_interest_rate_quote,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Computes one company-specific bond interest-rate quote from the requested term and current credit or rate state. When the company is active it combines the current company credit-rating score from `0x00425320`, the prime-rate helper `company_compute_prime_rate_from_issue39_scenario_baseline` `0x00424580`, and one term-dependent adjustment from the caller-supplied year span, then returns the resulting float rate; otherwise it falls back to `1.0`. Current grounded caller is `company_issue_bond_and_record_terms` `0x004275c0`, where this helper supplies the quoted rate when the caller does not already provide one.","objdump + caller xrefs + callsite inspection + bond-rate correlation + credit-rating correlation + prime-rate correlation" 0x004275c0,255,company_issue_bond_and_record_terms,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Issues one new bond and appends its term record to the live company debt table. The helper first rejects companies already at the `0x14` bond-slot cap, computes or accepts one quoted interest rate through `company_compute_bond_interest_rate_quote` `0x00427540`, posts the bond proceeds into company stat slot `0x0c`, posts the principal into stat slot `0x12`, posts the coupon rate into stat slot `0x0d`, and then writes one new three-dword bond record into the next 12-byte entry rooted at `[this+0x5f]`: principal, maturity year, and quoted rate. It increments the bond count at `[this+0x5b]` and returns success. Current grounded callers are the `CompanyDetail.win` bond-issue flow at `0x004c3890` and the annual finance-policy helper at `0x00401c50`, where it supplies both straight new borrowing and refinance-plus-borrow follow-ons.","objdump + caller xrefs + callsite inspection + bond-issue correlation + annual-finance correlation" 0x00426890,68,company_find_collection_index_by_company_id,simulation,thiscall,inferred,objdump + caller inspection,4,"Finds one live company collection index by comparing the requested company id against the first dword of each entry in the company manager at `0x0062be10`. The helper returns the zero-based index on a match or `-1` when no live company record matches. Current grounded callers are the takeover and merger vote resolvers, which use that index before reading profile-side per-company holdings from `0x006ceb9c`.","objdump + caller inspection + company collection correlation" 0x00426be0,53,company_can_purchase_territory_access_rights,simulation,thiscall,inferred,objdump + caller inspection + RT3.lng strings,4,"Returns whether the current company may purchase territory-access rights for one requested territory id. The helper first rejects territories where the company already has access through the byte table at `[this + territory*0x38d + 0x1d9f]`, then resolves the territory through `0x006cfc9c` and only returns `1` when the territory-side mode byte at `[territory+0x2d]` equals `1`. Current grounded callers are the `CompanyDetail.win` territory-access summary helper at `0x004c1b60` and the buy-rights flow at `0x004c5fc9`, where this is the direct gate between localized ids `947` and `948` plus the actionable `961` purchase prompt.","objdump + caller inspection + RT3.lng strings + territory-flag correlation" @@ -143,19 +152,34 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x0042ce00,1394,placed_structure_rebuild_candidate_local_service_tables,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Large per-site rebuild over the live candidate collection at `0x0062ba8c`. The helper walks every candidate with live runtime state at `[collection+0x16e]` and no remap entry at `[collection+0x9a]`, decays positive floats in the aligned per-candidate table rooted at `[this+0x107]`, and commits those float updates back through `0x0041e1b0`. It then combines that float table with two aligned per-candidate word tables rooted at `[this+0x02]` and `[this+0x6c]`, the direct-supply cargo bitset at `[this+0x0df]`, the site-side latch at `[this+0x0d4]`, and the branch predicate `0x0042cbb0` to choose among several normalized scoring transforms before writing the quantized result back into the destination word table. Current grounded callers now put this directly under the local wrapper at `0x0042d580`, so this looks like the first real site-side candidate service-score rebuild above the editor-driven cargo runtime lane rather than another candidate-only helper.","objdump + caller xrefs + callsite inspection + table-layout correlation" 0x0042d580,26,placed_structure_refresh_local_service_score_bundle,map,thiscall,inferred,objdump + caller xrefs + wrapper inspection,4,"Composite local-service refresh for one placed-structure or site record. The helper first runs `placed_structure_rebuild_candidate_local_service_tables` at `0x0042ce00`, then immediately chains into the neighboring local post-passes at `0x0042cc50`, `0x0042c1b0`, and `0x0042cb30` before returning. Current grounded caller is the world-grid sweep at `0x00450110`, which uses this as the stronger per-site local-service refresh after the lighter cargo-service-state pass at `0x00450003`.","objdump + caller xrefs + wrapper inspection" 0x00428a10,22,company_clear_selected_chairman_if_current_profile,simulation,thiscall,inferred,objdump + caller inspection,4,"Clears the linked chairman for the current company when the supplied profile id matches `[this+0x3b]`. On a match the helper zeroes the incoming profile id and tail-calls `0x00427c70`; otherwise it returns without changing company state. Current grounded shell caller is `shell_company_detail_resign_chairmanship_flow`, which uses this as the commit step behind the localized resignation confirmation.","objdump + caller inspection + chairman-link correlation" -0x00424fd0,751,company_compute_public_support_adjusted_share_price_scalar,simulation,thiscall,inferred,objdump + caller inspection,3,"Computes one bounded investor-support and share-price scalar used by stock-capital policy, cached share-price readouts, and adjacent governance or control-transfer vote lanes. The helper starts from `company_compute_cached_recent_per_share_performance_subscore` at `0x004248d0`, blends that score with the company-side field `[this+0x57]`, applies extra startup or age smoothing when the current year is still within five years of `[this+0x157]`, and interprets the first caller argument as one normalized share-count pressure term against current outstanding shares `[this+0x47]`, clamping that delta into a small bounded band. When the caller supplies nonzero control arguments it can also refresh the mutable support field `[this+0x4f]` from that staged pressure term. The tail then folds in company value and share-count state, one profile or company affinity term from `0x00436590`, the current linked chairman id `[this+0x3b]`, and one difficulty table under `0x005f33b8`, clamps the final float into a bounded positive range, and optionally snapshots it into the cached share-price field `[this+0x0d7b]` when the second control argument is nonzero. Current grounded callers include the cached share-price accessor `0x00423eb0`, the stock buyback and stock issue mutators `0x004273c0` and `0x00427450`, the bankruptcy recompute path `0x00425a90`, the merger vote resolver at `0x004ebd10`, the company-side takeover and policy family, and the annual creditor-pressure or shareholder-policy lane that surfaces localized ids `300..304`. The direct scenario-state issue lane here uses issue id `0x37`, which still looks like the broader company-management or public-sentiment slot rather than the narrower merger-only management-attitude slot.","objdump + caller inspection + support-field correlation + issue-id correlation + governance-string correlation + stock-buyback correlation + stock-issue correlation + share-price-cache correlation + per-share-performance correlation" +0x00425320,607,company_compute_credit_rating_score,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection + RT3.lng strings,4,"Computes the bounded company credit-rating score reused by the debt-side shell and several adjacent company-policy gates. The helper returns a fixed floor when the company-active flag at `[this+0x3f]` is clear; otherwise it starts from a weighted four-year net-profits-minus-fuel ladder over slots `0x2b` and `0x09`, blends in the current debt total from stat-family `0x2329/0x12`, folds in the weighted average bond interest rate through `company_compute_weighted_average_bond_interest_rate` `0x00423e40`, conditionally adds the prime-rate baseline and raw issue-39 total through `company_compute_prime_rate_from_issue39_scenario_baseline` `0x00424580`, then derives several debt- or liquidity-side ratios from derived stat slots `0x30` and `0x31` before applying company-age smoothing. The tail then adds the raw issue-38 total through `scenario_state_sum_issue_opinion_terms_raw` `0x00436710`, rounds the result, and uses that bounded score both for the CompanyDetail credit row and for bond-offer gating. Current grounded callers are the city-connection news owner `0x00406050`, the bond-interest quote wrapper `0x00427540`, the bond-side boolean gate `0x00427590`, the generic derived-metric reader at `0x0042a2e0` for the credit-rating-style slot, the CompanyDetail debt-credit-rate summary panel `0x004c23a0`, and the CompanyDetail bond-issue flow `0x004c3890`. The surrounding text anchors are explicit: shell localized id `952` is `Credit Rating:`, and localized id `974` says new bonds require a strong enough credit rating. This is therefore the safest current read for the debt-market or creditworthiness score, distinct from the issue-39 prime-rate lane and from the broader issue-37 equity-support lane.","objdump + caller xrefs + callsite inspection + RT3.lng strings + credit-rating correlation + bond-dialog correlation + prime-rate contrast + issue-38 correlation" +0x00424fd0,751,company_compute_public_support_adjusted_share_price_scalar,simulation,thiscall,inferred,objdump + caller inspection,3,"Computes one bounded investor-support and share-price scalar used by stock-capital policy, cached share-price readouts, and adjacent governance or control-transfer vote lanes. The helper starts from `company_compute_cached_recent_per_share_performance_subscore` at `0x004248d0`. If the older company-side support field `[this+0x57]` is still at least as strong as that fresh score and the company is within five years of founding year `[this+0x157]`, it interpolates the two through a capped startup-progress term derived from the current world calendar counter `[0x006cec78+0x15]`, the company stamp `[this+0x0d07]`, and the founding year, with the progress side capped at `50`; otherwise it keeps the fresh per-share score directly. The first caller argument is then normalized by current outstanding shares `[this+0x47]` and clamped into the narrow pressure band `[-0.2, 0.2]`. When the caller supplies nonzero control arguments, that pressure term can also refresh the mutable support field `[this+0x4f]` by blending the prior field with the staged delta. The later share-price body is tighter now too: it derives a share-count growth term from outstanding shares through the power helper `0x005a1b60` on `(shares / 20000)^0.33`, scales that by `1.4`, folds it back against current shares, and then runs a piecewise compression or clamp ladder over the resulting support scalar at thresholds `0.6`, `0.45`, `0.3`, `1.7`, `2.5`, `4.0`, and `6.0`. After that it multiplies by the scenario issue-opinion multiplier from `scenario_state_compute_issue_opinion_multiplier` `0x00436590` using issue id `0x37`, rounds through `0x005a10d0`, floors the rounded result at `0.0001`, and optionally snapshots it into the cached share-price field `[this+0x0d7b]` when the second control argument is nonzero. Current grounded callers include the cached share-price accessor `0x00423eb0`, the stock buyback and stock issue mutators `0x004273c0` and `0x00427450`, the bankruptcy recompute path `0x00425a90`, the merger vote resolver at `0x004ebd10`, the company-side takeover and policy family, and the annual creditor-pressure or shareholder-policy lane that surfaces localized ids `300..304`. The surrounding finance split is now tighter too: `company_compute_credit_rating_score` `0x00425320` feeds the explicit `Credit Rating` shell rows and bond-offer rejection flow, while `company_compute_prime_rate_from_issue39_scenario_baseline` `0x00424580` feeds the explicit `Prime Rate` row and cash interest helpers. That leaves issue `0x37` as the broader equity-market or investor-confidence lane behind company or chairman performance. The strongest direct text anchors are still localized ids `300/301` `Shareholders revolt against poor management`, `1217` `Investors are somewhat pleased with the chairman's performance.`, and `3048/3049` `Investors are %1 your performance./the chairman's performance.`. A deeper follow-up now rules out three tempting label shortcuts: the nearby `0x460a90..0x460c53` and `0x473620..0x47366a` registration families are camera-view and related shell-command bindings, not finance issue owners; the editor-side `Stock Prices` label belongs to the separate float-tuning block `[state+0x0bde..0x0bf6]`, not the issue table behind `0x37`; and the extracted `CompanyDetail.win` shell resource from `rt3_2WIN.PK4` does not expose any separate plain-English investor or finance caption for this lane, which matches the owner-side read that section-0 is a dynamic text widget (`0x947f`) fed by `shell_format_company_governance_and_economy_status_panel` `0x004e5cf0` rather than a fixed label row.","objdump + caller inspection + support-field correlation + issue-id correlation + governance-string correlation + stock-buyback correlation + stock-issue correlation + share-price-cache correlation + per-share-performance correlation + pressure-band correlation + startup-interpolation correlation + power-helper correlation + credit-vs-prime-rate correlation + negative-label-owner correlation + shell-resource extraction negative-result" 0x00424580,82,company_compute_prime_rate_from_issue39_scenario_baseline,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Small company-side rate helper that produces the current prime-rate-style baseline from scenario state plus issue `0x39`. It first reads one normalized scenario baseline through `0x00433740` on active scenario state `0x006cec78`, then adds the scaled raw issue-39 total from `scenario_state_sum_issue_opinion_terms_raw` at `0x00436710` using the current company id `[this+0x00]`, linked chairman id `[this+0x3b]`, and no territory argument. Current grounded callers now bound the player-facing meaning more tightly: the bond-interest quote wrapper at `0x00427540`, the negative and positive cash interest helpers at `0x00425880` and `0x004258c0`, and the CompanyDetail capital summary row labeled `954` `Prime Rate:` at `0x004c23a0`. This now reads as the shared prime-rate or market-rate helper rather than a generic company-support scalar.","objdump + caller xrefs + callsite inspection + issue-39 correlation + prime-rate correlation + bond-quote correlation" 0x004246b0,544,company_compute_five_year_weighted_shareholder_return,simulation,thiscall,inferred,objdump + caller inspection + RT3.lng strings,3,"Computes the stock-data lane surfaced as `5 Year Weighted Return`. Inactive companies fall back to the fixed scalar at `0x005c8598`; otherwise the helper walks up to five recent years above founding year `[this+0x157]`, samples yearly `Share Price` from slot `0x1c`, measures year-over-year price appreciation against the prior sample, blends that with the paired historical shareholder-payout lane from slot `0x23`, and weights recent years more heavily through the same scenario-side year weighting byte at `[0x006cec78+0x0f]`. Current evidence now bounds that paired lane more tightly: slot `0x23` falls back to direct company field `[this+0x53]` on the current-company path and is only consumed here, so the strongest current read is the historical dividend-per-share or shareholder-payout component paired with yearly price appreciation. The tail normalizes the accumulated weighted return by the accumulated weights and returns one bounded annualized-style float. Current grounded caller is `company_read_control_transfer_metric_slot` at `0x0042a2e0` for slot `0x21`, which matches the stock-data label `942` `5 Year Weighted Return:` and tooltip `936`.","objdump + caller inspection + RT3.lng strings + stock-data-label correlation + weighted-return correlation + shareholder-payout-lane correlation" 0x00425880,64,company_compute_negative_cash_balance_interest_rate,shell,thiscall,inferred,objdump + LoadScreen report correlation + localized string correlation,4,"Small company-side rate helper used only by the shared `LoadScreen.win` report-history renderer at `0x004e9b20`. The helper reads one control-transfer or yearly metric through `company_read_year_or_control_transfer_metric_value` at `0x0042a5d0` using family `0x2329` and slot `0x22`, combines that with the prime-rate helper `company_compute_prime_rate_from_issue39_scenario_baseline` at `0x00424580`, normalizes the result through two fixed constants, and returns one bounded float formatted as the first `%1` insert in localized strings `2815` and `2816`. Current grounded meaning is the company's negative-cash borrowing interest rate, i.e. the rate the company currently pays on negative cash balances in the Income Statement and Balance Sheet help rows.","objdump + LoadScreen report correlation + localized string correlation + helper call inspection + prime-rate correlation" 0x004258c0,396,company_compute_positive_cash_balance_interest_rate,shell,thiscall,inferred,objdump + LoadScreen report correlation + localized string correlation,4,"Company-side rate helper paired with `company_compute_negative_cash_balance_interest_rate` beneath the shared `LoadScreen.win` report-history renderer at `0x004e9b20`. The helper starts from the same prime-rate helper at `0x00424580`, subtracts one baseline constant, then reads the company cash metric through `company_read_year_or_control_transfer_metric_value` at `0x0042a5d0` using family `0x2329` and slot `0x0d`. It applies a piecewise threshold ladder over that cash or liquidity lane, clamps the result into several fixed bands, and returns the second `%2` insert for localized strings `2815` and `2816`. Current grounded meaning is the company's positive-cash deposit interest rate, i.e. the rate the company currently earns on positive cash balances in the Income Statement and Balance Sheet help rows.","objdump + LoadScreen report correlation + localized string correlation + helper call inspection + piecewise-threshold correlation + prime-rate correlation" -0x00425320,607,company_compute_connection_bonus_value_ladder,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Builds one bounded company-side value scalar beneath the city-connection bonus lane. The helper returns `0` when the company-active flag at `[this+0x3f]` is clear; otherwise it walks a four-step recent-year window relative to the current scenario year at `0x006cec78+0x0d` and the company founding year at `[this+0x157]`, reads one pair of slots through `company_read_year_or_control_transfer_metric_value` at `0x0042a5d0` with ids `0x2b` and `0x09`, accumulates their weighted differences with descending weights `4..1`, averages that ladder, blends in the current stat-family `0x2329` mode `0x12` term, and then scales the result by the weighted average bond interest rate from `company_compute_weighted_average_bond_interest_rate` `0x00423e40`. When the current support lane `0x2329` mode `0x0d` is high enough, it also folds in the current prime-rate baseline from `company_compute_prime_rate_from_issue39_scenario_baseline` `0x00424580` together with the active scenario issue-39 total. Wider xrefs now tighten `0x2b` into the rolling net-profits lane reused by the annual finance checks and CompanyDetail per-share/history formatter, while the report-history descriptor table aligns `0x09` with the Income Statement fuel-cost lane surfaced by tooltip `1309`. So the ladder is currently best read as recent net profits minus recent fuel burden, then adjusted by current company borrowing conditions rather than by a vague governance-pressure term. The tail then clamps the result through a bounded piecewise ladder with extra startup smoothing across roughly the first five years after founding. Current grounded callers are `company_evaluate_and_publish_city_connection_bonus_news` at `0x00406050`, the smaller wrapper at `0x00427540`, and the boolean unlock gate at `0x00427590`, so current best meaning is the company-side connection-bonus value ladder rather than a generic public-support scalar.","objdump + caller xrefs + callsite inspection + issue-slot correlation + connection-bonus correlation + income-statement-row correlation + derived-report-metric correlation + average-interest correlation + prime-rate correlation" 0x00429c70,976,company_read_derived_financial_report_metric_slot,simulation,thiscall,inferred,objdump + caller inspection + shell-label correlation,3,"Reads one derived company metric from the higher report-style slot family rooted at `0x2b`. The jump-table body now has one safe finance-side core: slot `0x2c` sums raw slots `0x01..0x04` into the broader revenue aggregate, slot `0x2d` combines the neighboring expense-side derived lanes, and slot `0x2b` then combines `0x2c` and `0x2d` into the net-profits-style lane reused by shell labels `1212` `Profits`, `925` `Profits:`, and the annual finance policy. The same helper also owns several later derived ratios and aggregates, including one asset-side pair around `0x30/0x31` and the per-unit revenue lanes that divide the revenue aggregate `0x2c` by count or distance slots such as `0x24`, `0x16`, and `0x17`. Current grounded callers arrive indirectly through `company_read_year_or_control_transfer_metric_value` `0x0042a5d0`, so this is the shared derived financial-report metric reader beneath CompanyDetail, LoadScreen, and annual finance rather than a shell-only formatter helper.","objdump + caller inspection + shell-label correlation + derived-metric correlation + income-statement correlation" 0x00429990,86,company_collection_get_nth_active_company_id,simulation,thiscall,inferred,objdump + caller inspection,4,"Returns the company id of one requested active-company ordinal within the live company collection rooted at `0x0062be10`. The helper linearly walks collection slots through `0x00518380`, tests the active company-state flag at `[entry+0x3f]`, decrements the caller-supplied ordinal only for active entries, and returns the first company id whose active ordinal matches zero. Current grounded callers use it as the forward mapping between active-company page indices and concrete company ids in shell-side roster, detail, and picker flows.","objdump + caller inspection + active-company roster correlation" 0x004299f0,84,company_collection_count_active_companies_before_company_id,simulation,thiscall,inferred,objdump + caller inspection,4,"Counts how many active companies precede one requested company id in the live company collection at `0x0062be10`. The helper linearly walks collection slots through `0x00518380`, stops when the entry id matches the requested company id, and increments the return counter only for active entries whose state flag at `[entry+0x3f]` is nonzero. Current grounded callers use this as the inverse mapping for shell-side company paging and company-relative selector paths before converting back through `company_collection_get_nth_active_company_id` at `0x00429990`.","objdump + caller inspection + active-company roster correlation" 0x00429a50,62,company_collection_count_active_companies,simulation,thiscall,inferred,objdump + caller inspection,4,"Counts active companies in the live company collection rooted at `0x0062be10`. The helper walks collection slots through `0x00518380`, resolves each record through `0x00518140`, and increments the total only when the active-state flag at `[entry+0x3f]` is nonzero. Current grounded callers use this as the active-company roster size for shell-side company browsing and neighboring selector math.","objdump + caller inspection + active-company roster correlation" -0x00433130,169,scenario_event_collection_refresh_runtime_records_from_packed_state,scenario,thiscall,inferred,objdump + caller xrefs + local disassembly,3,"Collection-wide runtime materialization pass over the live event collection at `0x0062be18`. The helper stages one small packed header read from the caller-supplied state or stream object, walks every live event record in the collection through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140`, and re-enters `scenario_event_refresh_runtime_record_from_packed_state` `0x0042db20` on each resolved record. When the sweep completes it clears the collection-side reentrancy or dirty latch at `[this+0x88]`. Current grounded callers are the `Setting up Players and Companies...` `319` lane of `world_run_post_load_generation_pipeline` at `0x00444959` and one neighboring world-build path at `0x00448020`, so this now reads as the event-side runtime refresh pass beneath post-load world setup rather than an anonymous collection walk.","objdump + caller xrefs + local disassembly + event-collection correlation + post-load-pipeline correlation" +0x00430270,225,world_try_place_random_structure_batch_from_compact_record,map,cdecl,inferred,objdump + local disassembly + caller correlation,3,"Shared world-side retry loop that tries to place multiple structures from one compact spawn record. The caller supplies one small record whose fields now read most safely as a structure or profile token at `+0x00`, requested placement count at `+0x11`, center coordinates at `+0x12/+0x14`, and placement radius or extent at `+0x16`. The helper translates the token through the static table at `0x0061039c` into the live structure-profile collection `0x0062b268`, increments the region-manager reentrancy counter at `[0x0062bae0+0x88]`, and then runs up to `200` randomized attempts while placements remain. Each attempt samples a candidate coordinate inside the requested radius, rejects points outside the live world bounds at `[0x0062c120+0x2155/+0x2159]`, resolves the owning region through `0x0044a800` and `0x0062bae0`, adapts the candidate through `0x00412880`, and finally re-enters `world_region_validate_and_commit_candidate_placement` `0x00422a70`. Successful placements decrement the remaining batch count and reset the local retry counter. Current grounded caller is the world-side dispatch branch at `0x00431b43`, where only compact record classes in the `0x1f7..0x265` table range enter this batch placer. This is therefore the strongest current read for the world-side randomized structure-batch placement loop rather than a region-worker-private helper.","objdump + local disassembly + caller correlation + placement-batch correlation" +0x00430b50,624,scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets,scenario,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Builds one runtime-effect record in the live scenario event collection from a compact source record plus the caller's currently resolved targets. The helper first allocates a new runtime-effect entry through `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` `0x00432ea0`, then seeds several per-record control bytes and target selectors in the new object, including mode byte `[record+0x7ef]`, optional gating bytes `[record+0x7f4/+0x7f9/+0x7fa]`, a primary selector at `[record+0x7f0]`, and optional comparison ids at `[record+0x82c/+0x830]`. Current grounded callers are the compact runtime-effect dispatcher `0x00431b20`, where fallback branches synthesize follow-on runtime effects from one compact linked record, and the shell-side branch at `0x004d60fd`, where the same builder is reached with a caller-owned output slot. This is therefore the current safest read for the runtime-effect follow-on record builder rather than a generic collection insert wrapper.","objdump + local disassembly + caller correlation + runtime-effect-builder correlation" +0x00431b20,399,world_apply_compact_runtime_effect_record_to_resolved_targets,map,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Dispatches one linked compact runtime-effect record against the caller-resolved target context. The record token at `[*record+0x00]` is translated through the static table at `0x0061039c`; when the translated class lies in the `0x1f7..0x265` range the helper immediately re-enters `world_try_place_random_structure_batch_from_compact_record` `0x00430270`. Otherwise it jumps through the local class table at `0x004320b4/0x004320fc` into a mixed effect family that now includes: shell-state modifier branches over `0x006cec78`, signed scalar adjustments on resolved company/profile/territory targets through the `0x004d6611/0x004d6617` numeric readers, territory-access writes through `company_set_territory_access_rights_byte` `0x00424030`, selected-profile updates through `0x00434890/0x004348c0`, and several collection-side erase or follow-on branches. Current grounded caller is the outer loop at `0x00432317`, which walks linked compact records via `[record+0x24]` and supplies optional resolved company, chairman-profile, and adjacent owner context before each dispatch. This is therefore the current safest read for the wider compact runtime-effect dispatcher above the separate world-side structure-batch placement branch rather than as a placement-only helper.","objdump + local disassembly + caller correlation + effect-dispatch correlation" +0x004323a0,842,scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects,scenario,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Per-record service pass over one live runtime-effect record in the scenario event collection. The helper first enforces several activation gates over the record's local control bytes and shell-side preview state, including one one-shot latch at `[this+0x81f]`, mode byte `[this+0x7ef]`, optional preview-policy byte `[this+0x7f4]`, and shell-side state at `0x006cec78/0x006cec74`. Once active it formats the optional status line through shell news helper `0x004554e0`, derives a target-availability bitmask through `0x0042d700`, resolves optional company/chairman/territory target pools, and then walks the linked compact effect chain rooted at `[this+0x00]`. Each linked record is dispatched through `world_apply_compact_runtime_effect_record_to_resolved_targets` `0x00431b20`, while fallback branches synthesize follow-on runtime-effect records through `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` `0x00430b50`. When any effect fires it may refresh company share-price caches through `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0`, and records with nonzero `[this+0x7f5]` set the one-shot latch `[this+0x81f]`. Current grounded caller is the collection-wide service loop `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` `0x00432f40`. This is therefore the current safest read for the runtime-effect record service and linked-effect dispatcher rather than a low-level target iterator.","objdump + local disassembly + caller correlation + runtime-effect-service correlation" +0x00433130,169,scenario_event_collection_refresh_runtime_records_from_packed_state,scenario,thiscall,inferred,objdump + caller xrefs + local disassembly,3,"Collection-wide runtime materialization pass over the live event collection at `0x0062be18`. The helper stages one small packed header read from the caller-supplied state or stream object, walks every live event record in the collection through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140`, and re-enters `scenario_event_refresh_runtime_record_from_packed_state` `0x0042db20` on each resolved record. When the sweep completes it clears the collection-side reentrancy or dirty latch at `[this+0x88]`. Current grounded callers are the `Setting up Players and Companies...` `319` lane inside `world_entry_transition_and_runtime_bringup` `0x00443a50` and one neighboring world-build path at `0x00448020`, so this now reads as the event-side runtime refresh pass beneath post-load world setup rather than an anonymous collection walk.","objdump + caller xrefs + local disassembly + event-collection correlation + post-load-pipeline correlation" +0x00432ea0,103,scenario_event_collection_allocate_runtime_effect_record_from_compact_payload,scenario,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Allocates and initializes one live runtime-effect record in the scenario event collection at `0x0062be18` from a compact payload source. The helper allocates one temporary `0x88f` payload object, inserts a new collection entry through the generic collection allocator path, resolves the inserted live entry, and then initializes that entry from the caller-supplied compact payload through `0x0042d670` before freeing the temporary object. Current grounded callers are `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` `0x00430b50` and the shell-side branch at `0x004db9f1`, where the returned live entry id is stored back into the caller object. This is therefore the current safest read for the scenario event collection's runtime-effect allocator rather than a generic collection clone helper.","objdump + local disassembly + caller correlation + runtime-effect-allocation correlation" +0x00432f40,267,scenario_event_collection_service_runtime_effect_records_for_trigger_kind,scenario,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Collection-wide service loop over the live scenario event collection at `0x0062be18` for one caller-selected trigger kind byte. The helper first rejects fast-forward and editor-map gates through `0x006cec78+0x46c38`, `[0x006cec7c+0x82]`, and `[0x006cec74+0x68]` unless the trigger kind is `9`, then walks every live runtime-effect record through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140`. Each resolved record is serviced through `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` `0x004323a0` with the selected trigger kind and optional text sink. When any record fires, the helper refreshes every active company's cached share price through `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0`; when the collection dirty latch at `[this+0x88]` is raised it clears that latch and immediately reruns the whole pass with trigger kind `0x0a`. The caller split is now tighter too: recurring simulation maintenance drives kinds `1`, `0`, `3`, and `2` through `0x0040a276`, `0x0040a55f`, `0x0040a6cb`, and `0x0040a7a3`, while the neighboring route-style follow-on at `0x0040a91f` drives kinds `5` and `4` through `0x0040a930` and `0x0040a9ac`; world or startup-side company creation branches at `0x00407682`, `0x0047d293`, `0x0047d42b`, and `0x0047d6de` drive kind `7`; the kind-`6` branch is now tighter too, covering the placed-structure post-create tail at `0x0040f69e`, the build-version-gated company-startup or roster-refresh tail at `0x00428406`, and the route-entry post-change sweep at `0x004a3eae`; the kind-`8` world-entry one-shot gate now sits inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, where it fires after the post-load company or route setup passes and then clears shell-profile latch `[0x006cec7c+0x97]`; and the `LoadScreen.win` briefing page at `0x004e520b` drives kind `9`. This is therefore the current safest read for the scenario event collection's collection-wide runtime-effect service loop rather than a generic text-query helper.","objdump + local disassembly + caller correlation + collection-service correlation + trigger-kind callsite decode" +0x00433bd0,546,world_refresh_selected_year_bucket_scalar_band,simulation,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Shared selected-year companion beneath `world_set_selected_year_and_refresh_calendar_presentation_state` `0x00409e80`. The helper reads the packed world year at `[this+0x0d]`, bins it against the threshold table at `0x005f3978/0x005f3980`, derives one interpolated bucket fraction when the current year falls inside a nontrivial range, and writes the resulting float band into `[this+0x65]`, `[this+0x69]`, `[this+0x6d]`, and `[this+0x4ca2]` after one build-version-sensitive clamp through `0x00482e00`. Current grounded callers are the year-step path in `simulation_service_periodic_boundary_work` around `0x0040a123`, the post-fast-forward setup tail around `0x00437168`, and the later staged-profile rehydrate band inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, so this is the safest current read for the shared year-bucket scalar rebuild helper rather than a world-entry-only follow-on.","objdump + local disassembly + caller inspection + year-bucket-table correlation + world-entry correlation" 0x00434050,11,shell_has_auxiliary_preview_owner,shell,cdecl,inferred,objdump + caller inspection + side-owner correlation,4,"Tiny presence probe over the auxiliary preview or side owner rooted at `0x006cd8d8`. The helper returns `1` when that owner pointer is nonnull and `0` otherwise. Current grounded callers include the `.gmt` save-side branch in `shell_map_file_world_bundle_coordinator` `0x00445de0`, the shell-state frame service pass `0x00482160`, the `BuildingDetail.win` subject-sync and tutorial gate lane around `0x004b9e10` and `0x004bb9e0`, and adjacent train-side branches that round route scalars or finalize auxiliary route buffers only when this side owner is live.","objdump + caller inspection + side-owner correlation + caller xrefs" +0x00434080,80,scenario_state_query_cached_available_locomotive_rating_clamped_for_shell,map,thiscall,inferred,objdump + caller inspection + local disassembly,3,"Small read-side helper over cached scenario-state float `[this+0x4cbe]`. The helper returns that cached available-locomotive rating in `st(0)` when it stays under the local threshold, and otherwise falls back to one fixed shell-side float constant before returning. Current grounded caller is the shell-side formatter band around `0x004b11c5`, where this cached value is optionally rounded to an integer and then compared against display thresholds `40/50/70/85/100`. This is therefore the safest current read for the query-side companion of the later locomotive-rating refresh rather than a broader world-state getter.","objdump + caller inspection + local disassembly + shell-threshold correlation + display-bucket correlation" 0x00434300,881,world_runtime_release_global_services,map,cdecl,inferred,objdump + analysis-context,3,Releases or clears a broad set of world-runtime global services owned by the current map object before a new world entry or sibling save branch continues. The helper walks the owner collection at [this+0x66b2] and then touches many global manager slots including 0x0062b244 0x0062cfcbc 0x0062be10 0x0062c120 0x0062ba8c 0x0062ba88 0x0062b2fc 0x0062b268 0x006cea4c and 0x006acd34 through repeated release-style calls and nulling writes. Current grounded callers are the heavier world-entry branch at 0x00443a50 the sibling .smp world-state branch at 0x00446d40 and shell_transition_mode at 0x00482ec0.,objdump + analysis-context + caller xrefs +0x00434d40,100,placed_structure_collection_seed_candidate_subtype2_runtime_latch,map,cdecl,inferred,objdump + local disassembly + caller correlation,3,"Shared post-setup sweep over the live placed-structure collection at `0x0062b26c`. The helper walks every live placed structure through the indexed-collection accessors, resolves each linked candidate or structure descriptor through vtable slot `+0x80`, and when the resolved record's subtype byte `[candidate+0x32]` equals `2` it writes `1` to runtime dword `[candidate+0x7b0]`. Local field evidence is now tight enough to keep the name structural: the same dword is zeroed during candidate runtime materialization around `0x00412112`, read as a one-shot guard in the world-side placement branch around `0x00423c43`, and also written there after the guarded follow-on fires. Current grounded callers are the post-fast-forward setup tail at `0x00437bf9` and the late `0x197` checkpoint inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, so this is the safest current read for the shared subtype-`2` candidate-runtime latch seeder rather than a one-off world-entry patch.","objdump + local disassembly + caller correlation + candidate-runtime-latch correlation" +0x004354a0,355,world_publish_shell_controller_progress_scalar_from_year_thresholds_or_selector_overrides,map,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Shared shell-facing scalar publisher beneath selected-year changes, shell-state selector updates, and the late world-entry reactivation band. The helper always resolves the current shell presentation object through controller `0x006d4024 -> [controller+0x18]` and writes one clamped `0..255` integer into `[object+0x15]` through `0x00523d60`. Its source split is now bounded enough to name conservatively: when tutorial flag `0x006d3b4c` is live it forces `0`; otherwise it first honors the temporary shell-state selector pair `[0x006cec74+0x1df/+0x1e3]`, then the persisted selector pair `[0x006cec74+0x23b/+0x23f]` when sandbox bit `[0x006cec7c+0x82]` is set, and only when no selector override is active does it derive one interpolated scalar from the current year `[this+0x15]` against the ensured threshold band `[this+0x51/+0x55/+0x59/+0x5d/+0x61]` plus the base value at `[this+0x3a]`, re-entering `scenario_state_ensure_derived_year_threshold_band` `0x00435603` before the year-band path needs it. Current grounded callers are the simulation year-advance path at `0x0040ab39`, the shell-state setter at `0x00482878`, the startup-side branch at `0x005173d3`, and the late `0x197` checkpoint inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, so this is the safest current read for the shared shell-controller progress-scalar publisher rather than a world-entry-only helper.","objdump + local disassembly + caller correlation + shell-controller correlation + year-threshold-band correlation" +0x00434ea0,124,scenario_state_query_named_candidate_availability_record_value,map,thiscall,inferred,objdump + caller xrefs + local disassembly,3,"Read-side lookup over the scenario-side named candidate-availability collection at `[this+0x66b2]`. The helper normalizes the first byte of the caller-supplied candidate name, walks the live collection through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140`, and matches full names through `0x005a57cf` after a first-byte fast reject on `[entry+0x00]`. When a matching record is found it returns the dword at `[entry+0x1e]`; otherwise it returns zero. The insert sibling `0x00434f20` shows the exact record shape now too: each collection entry is a zero-initialized `0x22`-byte blob with a fixed zero-terminated name slot at `[entry+0x00..+0x1d]` and one trailing availability dword at `[entry+0x1e]`. Current grounded callers are the runtime refresh pass `0x00412c10`, the editor-side detail and summary formatters at `0x004cc209`, `0x004cdfa3`, `0x004d14b8`, and `0x004d1684`, and the same startup-side candidate filter family that later writes `[candidate+0x7ac]`. This is therefore the current safest read for the candidate-side lookup sibling of the named availability helpers rather than a generic string-table query.","objdump + caller xrefs + local disassembly + scenario-state collection correlation + candidate-filter refresh correlation + record-layout correlation" +0x00434f20,272,scenario_state_upsert_named_candidate_availability_record_and_refresh_runtime_filters,map,thiscall,inferred,objdump + caller xrefs + local disassembly,3,"Upserts one named candidate-availability record into the scenario-side collection at `[this+0x66b2]` and then refreshes dependent runtime candidate filters. The helper normalizes the first byte of the caller-supplied name buffer, walks the live collection through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140`, and matches candidate names through the shared string compare at `0x005a57cf` after the same first-byte fast reject on `[entry+0x00]`. When a matching record already exists it rewrites the candidate-availability dword at `[entry+0x1e]`; otherwise it allocates a new collection entry through the collection vtable, zero-initializes one fixed `0x22`-byte record, copies the supplied zero-terminated candidate name into `[entry+0x00..+0x1d]`, and seeds that same trailing dword. When the live candidate pool `0x0062b268` exists it then re-enters the neighboring runtime refresh at `0x00412c10`, where the returned value is stored into `[candidate+0x7ac]`. The write-side caller set is now tight enough to close the remaining semantic gap too: the grounded startup prepasses at `0x00437743` and `0x00436ad7` and the editor-side `Industry (Overall)` handler `0x004cf430` all supply only boolean values, so `[entry+0x1e]` now reads safely as a real candidate-availability override bit rather than a wider mode enum.","objdump + caller xrefs + local disassembly + scenario-state collection correlation + candidate-filter refresh correlation + record-layout correlation + callsite-argument correlation" +0x00435030,124,scenario_state_query_named_locomotive_availability_record_value,map,thiscall,inferred,objdump + caller xrefs + local disassembly,3,"Read-side lookup over the scenario-side named locomotive-availability collection at `[this+0x66b6]`. The helper normalizes the first byte of the caller-supplied locomotive name, walks the live collection through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140`, and matches full names through `0x005a57cf` after a first-byte fast reject on `[entry+0x00]`. When a matching record is found it returns the dword at `[entry+0x3d]`; otherwise it returns zero. The insert sibling `0x004350b0` shows the exact record shape now too: each collection entry is a zero-initialized `0x41`-byte blob with a fixed zero-terminated locomotive-name slot at `[entry+0x00..+0x3c]` and one trailing availability dword at `[entry+0x3d]`. Current grounded callers are the shell-side `Locomotives` availability page constructor `map_editor_locomotive_availability_panel_construct` `0x004cd680`, the locomotive-side stats and summary branches at `0x004d0e5f` and `0x00461ed5`, and the neighboring startup or restore-side upsert family at `0x00438d6b` and `0x004478ea`. This is therefore the safest current read for the locomotive-side lookup sibling of the named availability helpers rather than a generic string-table query.","objdump + caller xrefs + local disassembly + scenario-state collection correlation + locomotive-availability correlation + record-layout correlation" +0x004350b0,249,scenario_state_upsert_named_locomotive_availability_record_and_refresh_runtime_usage,map,thiscall,inferred,objdump + caller xrefs + local disassembly,3,"Upserts one named locomotive-availability record into the scenario-side collection at `[this+0x66b6]` and then refreshes dependent runtime locomotive usage state. The helper normalizes the first byte of the caller-supplied locomotive name, walks the live collection through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140`, and matches existing names through `0x005a57cf` after the same first-byte fast reject on `[entry+0x00]`. When a matching record already exists it rewrites the locomotive-availability dword at `[entry+0x3d]`; otherwise it allocates a new collection entry through the collection vtable, zero-initializes one fixed `0x41`-byte record, copies the supplied zero-terminated locomotive name into `[entry+0x00..+0x3c]`, and seeds that same trailing dword. When the live locomotive pool `0x006ada84` exists it then re-enters `0x00461e00`, where the queried value is later stored into `[loco+0x7b]`. The write-side caller set is now tight enough to close the remaining semantic gap here too: the grounded startup or restore-side seeding lanes at `0x00438d6b`, `0x004478ea`, and `0x00461eab` and the shell-side `Locomotives` availability handler family at `0x004cf178`, `0x004cf1fe`, `0x004cf2f9`, and `0x004cf3fc` all supply only boolean values, so `[entry+0x3d]` now reads safely as a real locomotive-availability override bit rather than a broader policy enum.","objdump + caller xrefs + local disassembly + scenario-state collection correlation + locomotive-runtime-refresh correlation + record-layout correlation + callsite-argument correlation" +0x00436af0,384,scenario_state_refresh_cached_available_locomotive_rating,map,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Shared scenario-side refresh over cached float `[this+0x4cbe]` after selected-year or locomotive-availability changes. The helper seeds one year-dependent baseline from the current scenario year at `[0x006cec78+0x0d]`, then, when the live locomotive pool `0x006ada84` exists, walks every live locomotive record, filters them through the locomotive-era policy gate `0x0041d550` plus the named-availability lane rooted at `[loco+0x7b]`, and keeps the strongest surviving locomotive-side rating scalar from `[loco+0x20]`. It then normalizes and clamps that winning value into `[this+0x4cbe]`, where the shell-side read helper later buckets it against display thresholds `40/50/70/85/100`. Current grounded callers are the periodic year-step path around `0x0040a317`, the post-fast-forward setup tail at `0x004371ad`, the later staged-profile rehydrate band inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, and the tail of `locomotive_collection_refresh_runtime_availability_overrides_and_usage_state` `0x00461e00`, so this is the safest current read for the cached available-locomotive rating refresh rather than a world-entry-only helper.","objdump + local disassembly + caller inspection + locomotive-availability correlation + selected-year correlation + cached-scalar correlation + display-bucket correlation" 0x0043cb00,295,world_view_step_heading_quadrant,shell,thiscall,inferred,objdump + caller xrefs,3,Applies one discrete heading-step command to the live world-view owner at 0x0062be68. The helper quantizes the current heading-like field [this+0x10] into one of four wrapped sectors derives the neighboring sector selected by the signed caller step and writes the resulting snapped heading back before rebuilding the dependent view state through 0x0043a750 0x0052d640 and 0x0043bde0. Current grounded callers are the paired shell UI command branches at 0x004de83d and 0x004de857 so this looks like the discrete rotate-view command family rather than free camera drag.,objdump + caller xrefs + callsite inspection 0x0043cc30,437,world_view_step_zoom_bucket,shell,thiscall,inferred,objdump + caller xrefs,3,Applies one discrete zoom or view-height bucket step to the live world-view owner at 0x0062be68. It derives a seven-entry threshold table under 0x005ee4dc and 0x0062be4c compares the current view-height field [this+0x18] against those thresholds chooses the neighboring bucket selected by the signed caller step clamps the result into the supported range and then rebuilds the dependent view state through 0x0043c610 0x00439820 and 0x0043bde0. Current grounded callers are the signed shell UI command pair at 0x004de871 and 0x004de88b and the keyboard-owned smoothing branch inside world_view_service_shell_input_pan_and_hover at 0x0043dca4.,objdump + caller xrefs + callsite inspection 0x0043d050,111,world_view_set_focus_position_xyz,shell,thiscall,inferred,objdump + caller xrefs,4,Stores one new world-view focus position into the owner at 0x0062be68 by updating [this+0x04] [this+0x08] and [this+0x0c] as the requested X Y and Z coordinates then rebuilding the dependent view state through 0x0043cec0 0x0043a750 0x0052d640 0x00439820 and 0x0043b0e0. The helper also clamps the view-height or distance field at [this+0x18] before recomputing the derived pitch-like field at [this+0x14]. Current grounded callers are the screen-delta wrapper at 0x0043d0c0 the relative pan helper at 0x0043d130 and two larger world-view service branches at 0x0043ee76 and 0x0043f32d.,objdump + caller xrefs @@ -194,6 +218,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00514620,110,shell_open_or_focus_train_detail_window,shell,thiscall,inferred,objdump + caller inspection + strings correlation,4,"Shared opener or focus path for the shell-side `TrainDetail.win` singleton. When the caller supplies one valid train id present in the train collection at `0x006cfcbc`, the helper can seed the selected train subject through `0x004a7390`; when a live `TrainDetail.win` singleton already exists at `0x006d3b20` and the current shell runtime subject matches the incoming one, it simply refreshes that window and pings the shell runtime. Current grounded direct caller is the surrounding shell command path at `0x0046cbda`, and the existing constructor edge at `0x004ddda1` confirms that this opener sits above the same `TrainDetail.win` family rather than the neighboring `Trainbuy.win` singleton.","objdump + caller inspection + strings correlation + singleton correlation" 0x00514690,1920,shell_train_detail_window_handle_message,shell,thiscall,inferred,objdump + caller inspection + control-flow inspection + RT3.lng strings,4,"Primary message dispatcher for the shell-side `TrainDetail.win` family rooted at `0x006d3b20`. The handler processes shell messages `0`, `0xca`, `0xcb`, and the recurring service message `0x3e9`; routes the top-level side-toggle, list-selection, and metric-row controls through a dispatch table over resources `0x659c..0x6947`; repeatedly reuses the currently selected train via the helper family at `0x005130f0..0x00513220`; and fans out into several now-bounded train verbs. Current explicit branches include one selected-train engine-replacement or trainbuy handoff lane that checks scenario gate `[0x006cec78+0x4a97]`, raises localized ids `593` `That action is not allowed in this scenario.` and `594` `You can not replace the engine while the train is broken-down.` on failure, and otherwise re-enters `shell_open_or_focus_trainbuy_window` at `0x00512c50` or the neighboring local follow-on path at `0x00436820`; one selected-train retirement lane that checks `[0x006cec78+0x4a9b]`, rejects blocked states through ids `595` and `597`, confirms through id `596`, and then either tears the train down locally through the train collection plus `shell_detail_panel_transition_manager` mode `2` or packages multiplayer opcode `0x37`; plus one tighter route-edit lane over the shared `0x33`-stride route-entry family, where removal re-enters `train_route_list_remove_entry_and_compact` at `0x004b3000` and staged insertion re-enters `train_route_list_insert_staged_entry_at_index` at `0x004b3160`, then validates the resulting route through `train_route_list_validate_reachability_and_station_pair` at `0x004b2c10` and commits the follow-on train state through `train_set_route_operating_mode_and_scalar` at `0x004ab980`, with multiplayer opcode mirrors `0x3d`, `0x3f`, and `0x41`. It also consumes the family refresh path through `shell_train_detail_window_refresh_controls` at `0x00514160`. Current evidence is broad enough to treat this as the full `TrainDetail.win` message owner even though several deeper per-action verbs remain semantically open.","objdump + caller inspection + control-flow inspection + dispatch-table inspection + selected-train helper correlation + RT3.lng strings" 0x004a01a0,789,route_entry_collection_try_build_path_between_optional_endpoint_entries,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Heavy route-entry collection method over the global route store at `0x006cfca8`. The helper accepts up to two optional endpoint-entry pointers or ids, two endpoint coordinate pairs, a route-policy or mode byte, and optional output slots for the chosen endpoint-entry ids. It first resolves any supplied route-entry ids through `0x00518140` and projects them back to compact coordinate pairs through `0x0048a170`, rejects early when either endpoint lands on an invalid world tile through `0x00449980`, and computes one span scalar through `0x004952f0`. When the leading endpoint entry is absent it can synthesize one fresh route entry from the supplied coordinates and policy arguments through `0x00493cf0`; after that it resolves the chosen entry, copies four `3*dword` route-shape or bounding blocks from that entry into the collection-owned builder-state area at `[this+0x139]..[this+0x167]` through `0x005394b0`, stores the chosen endpoint coordinates at `[this+0x11d]` and `[this+0x121]`, latches one active-builder flag at `[this+0x118]`, and stages one linked entry field from `[entry+0x202]` into `[this+0x125]`. On one newly synthesized-entry path and policy bytes `1/2` it also touches the auxiliary route-entry family at `0x006cfcb4` through `0x004a42b0`, `0x00494f00`, and `0x004a4340`. Current caller evidence now narrows one more policy case: both the later world-side caller at `0x00480cd0` and the linked-site refresh helper `placed_structure_refresh_linked_site_display_name_and_route_anchor` `0x00480bb0` enter this helper with both optional endpoint-entry ids unset and literal policy byte `2`, so the strongest current read for that byte is a full linked-site route-anchor rebuild between optional endpoint entries rather than the narrower direct endpoint-anchor creation or replacement lane carried by literal byte `1` in `0x00493cf0`. The helper then resets the collection's transient path-search state through `0x00495480`, re-enters the deeper route-search core at `0x0049d380`, optionally writes the chosen endpoint-entry ids back through the caller-supplied output pointers on success, and finally tears down the transient search state through `0x00495540` and `0x0049ad90`. Current grounded callers are the early route-search lane inside `city_connection_try_build_route_with_optional_direct_site_placement` `0x00402cb0`, two neighboring retry branches at `0x004030d0` and `0x00403330`, a paired startup-connection branch at `0x00403ac0`, that later world-side caller at `0x00480cd0`, and the linked-site refresh helper at `0x00480bb0`. This now looks like the shared route-entry search or synthesis owner above the deeper path-search core rather than a generic route-store mutator.","objdump + caller xrefs + callsite inspection + route-entry search correlation + builder-state correlation + partial-mode-byte correlation + linked-site refresh correlation + linked-site policy-byte split correlation" +0x004a3db0,272,route_entry_collection_service_recent_entry_state_promotions_and_followon_refreshes,map,thiscall,inferred,objdump + caller inspection + local disassembly,3,"Collection-wide post-change sweep over the global route-entry store at `0x006cfca8`. The helper first snapshots collection field `[this+0x90]` into `[this+0x94]`, then, when shell-state gate `[0x006cec74+0x94]` is set, walks every live route entry through `indexed_collection_slot_count` `0x00517cf0`, `indexed_collection_get_nth_live_entry_id` `0x00518380`, and `indexed_collection_resolve_live_entry_by_id` `0x00518140`. The current changed-entry lane is now bounded: for entries newer than collection threshold `[this+0x102]` via `[entry+0x240]` and still carrying state byte `[entry+0x216] == 1`, it promotes that state through `0x0048b830(entry, 2)` and then releases any queued side list at `[entry+0x244]` through `0x00489f40`. After that sweep it drains the collection-owned linked list at `[this+0x98]`, resets `[this+0x88] = -1`, and, when shell runtime `0x006d401c` is live while collection latch `[this+0xed]` is clear, posts shell status id `0xbb` through `0x00538e00`. When any entry was promoted it also re-enters `0x004358d0` on the active mode object at `0x006cec78`, triggers `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` `0x00432f40` with kind `6`, and then tails into `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` `0x004682c0` on `0x006ada90`. Current grounded callers include the city-connection route-builder tail at `0x00404564`, the linked-site route-anchor refresh tail at `0x00480d1c`, and TrackLay-side follow-ons at `0x0050d7ed` and `0x0050db24`, so this is now the safest current read for the route-entry collection's recent-entry state-promotion and follow-on refresh sweep rather than a generic collection walk.","objdump + caller inspection + local disassembly + route-entry collection correlation + state-promotion correlation + runtime-effect trigger-kind correlation + route-link followon correlation" 0x00489f80,11,route_entry_assign_aux_tracker_group_id,map,thiscall,inferred,objdump + caller xrefs + field-layout inspection,3,"Tiny route-entry helper that writes the caller-supplied auxiliary tracker id into route-entry field `+0x212`. Current grounded callers include the synthesis-side lane in `route_entry_collection_try_build_path_between_optional_endpoint_entries` `0x004a01a0`, the route-search core `0x0049d380`, the broader regrouping pass `0x004a45f0`, and neighboring tracker-update branches at `0x004996e0`, `0x004a4380`, `0x004a4ce0`, and `0x004a4ff0`. This now looks like the direct route-entry aux-tracker group-id assignment helper rather than a generic field store.","objdump + caller xrefs + field-layout inspection + tracker-family correlation" 0x00493cf0,456,route_entry_collection_create_endpoint_entry_from_coords_and_policy,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Creates one fresh route-entry endpoint record from caller-supplied coordinates and a small policy tuple. The helper rejects when either coordinate pair falls outside the live world bounds in `0x0062c120`, optionally validates the supplied company id through `0x0062be10` and `company_query_available_track_laying_capacity_or_unlimited` `0x004240a0`, allocates a new route-entry-like record from the current collection through `0x00518900` with type `0x257`, applies one company-side setup branch through `company_adjust_available_track_laying_capacity_with_floor_zero` `0x00423ec0` when the company id is nonzero, and then commits the detailed endpoint payload through `0x00490ac0`. It can also re-enter `0x00491e60` when the created record or the owning collection keeps one follow-on latch set, and if the collection field `[this+0x88]` is still unset it seeds that field from the created record's word at `+0x240`. Current mode-byte evidence is still partial but tighter now. Literal policy byte `1` is the strongest current match for direct linked-site endpoint-anchor creation or replacement, because the linked-site constructor and its nearby repair branches at `0x00480463`, `0x00480a77`, and `0x00480b69` all pass that byte before rebinding one chosen anchor through `0x0048abc0`. The TrackLay-side callers at `0x0050df1e` and `0x0050eec6` are tighter now too: they derive the passed policy byte from the shared TrackLay mode `0x00622b0c` through `route_entry_collection_map_track_lay_mode_to_endpoint_policy_byte` `0x004955b0`, which currently gives the strongest read `policy 1 = single-track endpoint synthesis` and `policy 4 = double-track endpoint synthesis`. Bytes `1/2` are also the ones later reused by `0x004a01a0` to enable the auxiliary tracker lane, while the company-side charge split is no longer vague: when a company id is present, ordinary company-bound synthesis passes `-1` into `0x00423ec0`, while byte `4` instead passes `-2`, so the current strongest read is that policy byte `4` consumes a larger company-side available-track-laying-capacity unit rather than skipping the company setup branch outright. The older builder-state path at `0x0046f2d1` still passes a dynamic byte from `[esi+0x05]`. The function returns the newly created route-entry id or `-1` on failure. Current grounded callers include `route_entry_collection_try_build_path_between_optional_endpoint_entries` `0x004a01a0`, those neighboring route-building branches, and the TrackLay-side callers at `0x0050df1e` and `0x0050eec6`, so this now looks like the shared endpoint-entry synthesis helper rather than a generic collection allocator.","objdump + caller xrefs + callsite inspection + route-entry creation correlation + partial-mode-byte correlation + caller-pattern correlation + route-build-capacity correlation + linked-site policy-byte split correlation + TrackLay mode correlation" 0x00494e40,61,aux_route_entry_tracker_reset,map,thiscall,inferred,objdump + caller xrefs + field-layout inspection,2,"Zeroes or reinitializes one small auxiliary route-entry tracker record. The helper seeds the two endpoint-entry ids at `+0x04` and `+0x08` to `-1`, clears the small refcount at `+0x10`, clears the cached route-key and class-signature words at `+0x18` and `+0x1e`, resets the boolean latch at `+0x1c` to `0`, and clears the trailing payload band through `+0x42`. Current grounded callers are the tracker allocator paths at `0x004a42b0` and several neighboring `0x006cfcb4` setup sites, so this is the clearest current initializer for the auxiliary route-entry tracker family.","objdump + caller xrefs + field-layout inspection + tracker-family correlation" @@ -241,6 +266,8 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00518140,89,indexed_collection_resolve_live_entry_by_id,simulation,thiscall,inferred,objdump + caller inspection + collection-layout inspection,4,"Shared indexed-collection record resolver over the same common collection layout. The helper rejects nonpositive, out-of-range, or tombstoned ids through the `[this+0x14]` bound and `[this+0x34]` bitset, then returns one live record pointer from the payload rooted at `[this+0x30]`. When collection flag dword `[this+0x04]` is nonzero it treats that payload as a flat `stride=[this+0x08]` record array and returns `base + stride*id`; otherwise it treats the payload as an array of record pointers stored in `stride=[this+0x08]` slots and returns the pointer loaded from `base + stride*id`. Current grounded callers include the company, profile, train, and structure-candidate families, where it is the common bridge from one positive collection id to one concrete live record pointer.","objdump + caller inspection + collection-layout inspection + direct-vs-indirect payload correlation" 0x00518380,364,indexed_collection_get_nth_live_entry_id,simulation,thiscall,inferred,objdump + caller inspection + collection-layout inspection,4,"Shared nth-live-entry selector over the same indexed-collection layout. With traversal mode `0` it walks slot ids in forward order, skipping tombstoned ids through the bitset at `[this+0x34]`, and returns the positive entry id whose zero-based live ordinal matches the caller-supplied index; recent results are memoized in the small cache bands rooted at `[this+0x68]` and `[this+0x78]`. With nonzero traversal mode it reuses the auxiliary link banks rooted at `[this+0x38]`, `[this+0x48]`, and `[this+0x58]` to step through one alternate live-order chain before returning the resulting id. Current grounded callers across company, profile, structure-candidate, and placed-structure families mostly use traversal mode `0`, where this is the shared bridge from one zero-based live ordinal to one positive collection entry id.","objdump + caller inspection + collection-layout inspection + cache-band inspection + alternate-chain correlation" 0x0051c920,223,localization_lookup_display_label_by_stem_or_fallback,shell,thiscall,inferred,objdump + caller inspection + language-table correlation + static-table inspection,4,"Shared shell-side label helper that turns one ASCII stem string into one player-facing display label. The helper case-folds the first letter, scans the static `(stem, string-id)` table rooted at `0x006243c8`, compares candidate stems case-insensitively, and returns the localized text for the first matching string id through `0x005193f0` when that localized entry is nonempty. The current table correlation already grounds entries such as `Alcohol`, `Aluminum Mill`, `Automobiles`, `Bauxite`, and `Big Boy` against RT3.lng ids `3202..3220`. When no table entry matches, the helper falls back to localized id `3866` `Could not find a translation table entry for '%1'`. Current grounded callers include `shell_building_detail_refresh_subject_cargo_and_service_rows` `0x004ba3d0`, where it sits directly above candidate field `[record+0x04]`, and several neighboring list and detail renderers that need one display label from the same stem family.","objdump + caller inspection + language-table correlation + static-table inspection + RT3.lng correlation" +0x0051d3c0,44,calendar_point_pack_tuple_to_absolute_counter,support,fastcall,inferred,objdump + caller inspection + local arithmetic correlation,3,"Tiny packed-calendar helper that converts one local tuple rooted at the caller pointer in `ECX` into the same absolute calendar counter family later stored at `[world+0x15]`. It reads one year word plus four packed calendar subfields from `[tuple+0x00/+0x02/+0x04/+0x05/+0x06]`, combines them as one mixed-radix `12 x 28 x 3 x 60` progression, and returns the resulting scalar for direct subtraction against `[0x006cec78+0x15]`. That is now the strongest current read for the world-side calendar model: a packed year-plus-subfield point converted into one absolute counter rather than a plain year or month stamp. Current grounded finance caller is the stock-issue cooldown gate inside `company_evaluate_annual_finance_policy_and_publish_news` `0x00401c50`, where it converts the current issue tuple at `[company+0x16b/+0x16f]` before comparing that scalar against the active world counter.","objdump + caller inspection + local arithmetic correlation + finance-cooldown correlation + world-calendar-counter correlation + mixed-radix decode" +0x0051d460,131,calendar_point_unpack_absolute_counter_to_tuple,support,fastcall,inferred,objdump + caller inspection + local arithmetic correlation,3,"Inverse packed-calendar helper for the absolute counter family rooted at `[world+0x15]`. It accepts one absolute calendar counter in `ECX`, decomposes it back into the same mixed-radix year-plus-subfield tuple, and returns the reconstructed pair of dwords in `EAX:EDX` for storage into fields such as `[world+0x0d]` and `[world+0x11]`. Current local arithmetic now bounds the inverse against the same `12 x 28 x 3 x 60` model as `0x0051d3c0`, which keeps this tuple in the world-side calendar-point family rather than as an unrelated packed timestamp. Current grounded callers are `world_set_selected_year_and_refresh_calendar_presentation_state` `0x00409e80`, which refreshes `[world+0x0d/+0x11]` from the selected absolute counter at `[world+0x15]`, plus the target-resolution wrappers `0x0051d550` and `0x0051d5f0` used by `simulation_advance_to_target_calendar_point` `0x0040ab50`.","objdump + caller inspection + local arithmetic correlation + world-calendar-tuple correlation + target-resolution correlation + mixed-radix decode" 0x004f2e80,14,shell_has_live_overview_window,shell,cdecl,inferred,objdump + caller inspection + nearby-family correlation,4,"Tiny presence probe for the shell-side `Overview.win` singleton rooted at `0x006d12bc`. The helper returns `1` when that live overview object pointer is nonnull and `0` otherwise. Current grounded callers include the post-step shell-window ladder inside `simulation_frame_accumulate_and_step_world` `0x00439140`, where it sits beside other shell-window probes, and the overview family itself around `0x004f3a10`, which uses the same singleton to suppress duplicate opens.","objdump + caller inspection + nearby-family correlation + singleton correlation" 0x004f2e90,11,shell_mark_overview_window_dirty,shell,cdecl,inferred,objdump + caller inspection + nearby-family correlation,4,"Tiny dirty-latch setter paired with `shell_has_live_overview_window`. The helper stores `1` into `0x006d12cc`, which current nearby call patterns treat as the `Overview.win` refresh or service request latch once the live overview singleton at `0x006d12bc` exists. Current grounded caller is the same post-step shell-window ladder inside `simulation_frame_accumulate_and_step_world` `0x00439140`.","objdump + caller inspection + nearby-family correlation + singleton correlation" 0x004f38a0,67,shell_overview_window_construct,shell,thiscall,inferred,objdump + caller inspection + strings correlation,4,"Constructs the shell-side `Overview.win` object later published at `0x006d12bc`. The constructor seeds the local vtable at `0x005d1368`, binds the shell window resource through `0x0053fa50`, clears the selected subject field at `[this+0x7c]`, and installs the shared control callback `0x004f3880` on control `0x88bf`. Current grounded caller is `shell_open_or_focus_overview_window` at `0x004f3a10`, and current string-table correlation leaves `Overview.win` as the strongest owner name for this singleton family.","objdump + caller inspection + strings correlation + singleton correlation" @@ -260,12 +287,15 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004baef0,2793,shell_building_detail_window_refresh_controls,shell,thiscall,inferred,objdump + caller inspection + control-range inspection,4,"Primary refresh path for the shell-side `BuildingDetail.win` family. The helper rebuilds the top-level control bands under `0x7d02..0x8051`, including the paired mode switch `0x7d02/0x7d03` from subject flag `0x40`, the smaller special-service toggles `0x7d0f/0x7d10` from subject bits `0x20` and `0x10`, the current-selection status widget around `0x7d0d/0x7d0e`, the selected-building cargo or service rows through `shell_building_detail_refresh_subject_cargo_and_service_rows` at `0x004ba3d0`, the paired subject-value rows through `shell_building_detail_refresh_subject_pair_value_rows` at `0x004bad20`, and the flagged service or capability rows through `shell_building_detail_refresh_flagged_service_capability_rows` at `0x004b9a20`. Current control-building correlation now makes the leading special-row bands explicit too: the short-label triplet `0x7dc8..0x7dca`, its adjacent asset/icon triplet `0x7e90..0x7e92`, and the popup/selectable triplet `0x7f58..0x7f5a` are the fixed express-side branch before the broader ordinary candidate rows. Current branch structure is tighter too: when subject bit `0x40` is set the refresh ends on the selected-subject cargo/service family rooted at `0x004ba3d0`, while the clear branch instead ends on the flagged capability-selector family rooted at `0x004b9a20`. It also hides or shows the larger control ranges `0x7dc8..0x7f57`, `0x7f58..0x801f`, and `0x8020..0x8051` through the shared shell control toggles at `0x53fe00`. Current grounded callers are the main constructor-side and focus refreshes at `0x004bbace`, `0x004bc0cc`, and `0x004bc0de`, and the message dispatcher at `0x004bb9e0`.","objdump + caller inspection + control-range inspection + subject-flag correlation + helper-family correlation + branch-end correlation + control-family triplet correlation" 0x004bc0a0,71,shell_building_detail_window_construct,shell,thiscall,inferred,objdump + caller inspection + strings correlation,4,"Constructs the shell-side `BuildingDetail.win` object later published at `0x006cfe00`. The constructor seeds the local vtable at `0x005d05e0`, binds the window resource through `0x0053fa50`, and immediately refreshes the visible subject and control bands through `0x004baef0`. Current grounded caller is `shell_open_or_focus_building_detail_window` at `0x004bc100`, and current string-table correlation leaves `BuildingDetail.win` as the strongest owner name for this singleton family.","objdump + caller inspection + strings correlation + singleton correlation" 0x004bc100,203,shell_open_or_focus_building_detail_window,shell,cdecl,inferred,objdump + caller inspection + strings correlation,4,"Shared opener for the shell-side `BuildingDetail.win` singleton. The caller supplies the building-detail list helper in `ECX`, one current building subject in `EDX`, and one selected ordinal on the stack. The helper seeds the shared family globals at `0x006cfe04`, `0x006cfe08`, and `0x00621df4`, validates that the supplied building subject resolves to one live world object through the placed-structure collection at `0x006cec20`, allocates a `0x78`-byte shell object when no detail window is live, constructs it through `shell_building_detail_window_construct` at `0x004bc0a0`, publishes it through the shell runtime at `0x006d401c`, and tears it back down on return while clearing `0x006cfe00`. Current grounded callers include the world-side branch around `0x004bbace`, which updates the current building subject before opening this detail family. Current string-table correlation leaves `BuildingDetail.win` as the strongest owner name for this singleton family.","objdump + caller inspection + strings correlation + publish-path inspection + singleton correlation" -0x004384d0,570,world_run_post_load_generation_pipeline,map,cdecl,inferred,objdump + strings + caller xrefs,4,"Large post-load world-generation pipeline reached after world entry and shell-side file-load success paths. It increments the world-root generation counter at `[0x0062c120+0x2205]`, can run one preliminary branch through `0x00437743`, and then advances through a more bounded staged setup sequence with shell progress updates through `0x004834e0`. The visible banner order is now grounded from the direct string ids in the function body: id `318` `Computing Transportation and Pricing...` is posted first and remains active while the pipeline runs world_compute_transport_and_pricing_grid at `0x0044fb70`, the early collection pass world_setup_building_collection_phase at `0x0041ea50`, and the conditional region pair world_region_collection_seed_default_regions at `0x00421b60` plus world_region_border_overlay_rebuild at `0x004882e0`; only after those complete does the pipeline post id `319` `Setting up Players and Companies...`. That `319` lane is no longer just gate plumbing: the primary grounded work there is still the chairman-profile pair world_seed_default_chairman_profile_slots at `0x004377a0` plus world_build_chairman_profile_slot_records at `0x00437220`, and current neighboring setup flow also exposes one conditional company-side helper at `0x0047d440` under sandbox or non-editor shell-state conditions. The later interior ordering of the same `319` lane is tighter now too: after the route-entry collection refresh on `0x006cfca8` through `0x00493be0`, the pipeline refreshes the auxiliary route-entry tracker collection `0x006cfcb4` through `0x004a41b0`, then re-enters `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` `0x004133b0`, runs a flagged world-grid cleanup sweep through `0x00448af0/0x00533fe0`, and only after that re-enters the route-entry post-pass `0x00491c20` before continuing into later persona, route-style, region, and world-manager setup families. Current evidence is tighter on the remaining gates too: `[0x006cec74+0x68]` now aligns with the editor-map `.gmp` mode in the shell file coordinators and acts as the broader master editor-mode flag that suppresses both later world-generation branches and diverts region-side calculations into alternate paths; `[0x006cec74+0x174]` is the direct building-population gate above id `320` `Setting Up Buildings...` and world_region_collection_run_building_population_pass at `0x00421c20`; `[0x006cec74+0x178]` is the direct seeding-burst gate above id `321` `Seeding Economy...` and simulation_run_chunked_fast_forward_burst at `0x00437b20`; and id `322` `Calculating Heights...` finishes through `0x0044d410`. The body fans into the live world root at `0x0062c120`, manager collections `0x0062ba8c`, `0x0062bae0`, `0x006cfca8`, `0x006cfcb4`, and `0x006cfc9c`. Current grounded callers are the world-entry side around `0x004390ea` and the shell file-load side around `0x004dccfc`.","objdump + RT3.lng strings + caller xrefs + callsite inspection + file-flow correlation + post-load-stage-order correlation" +0x004384d0,570,world_run_post_load_generation_pipeline,map,cdecl,inferred,objdump + strings + caller xrefs,4,"Large post-load world-generation pipeline reached after world entry and shell-side file-load success paths. It increments the world-root generation counter at `[0x0062c120+0x2205]` and, on the caller-selected setup path, first runs the preliminary candidate-availability prepass at `0x00437743` before the visible progress phases begin. The visible phase order is now grounded directly from the function body instead of only from scattered callers: id `318` `Computing Transportation and Pricing...` is posted first and remains active while the pipeline runs `world_compute_transport_and_pricing_grid` `0x0044fb70`, the early collection pass `world_setup_building_collection_phase` `0x0041ea50`, and the conditional region pair `world_region_collection_seed_default_regions` `0x00421b60` plus `world_region_border_overlay_rebuild` `0x004882e0`; if shell-state gate `[0x006cec74+0x174]` is set, id `320` `Setting Up Buildings...` then drives `world_region_collection_run_building_population_pass` `0x00421c20`; if `[0x006cec74+0x178] > 0`, id `321` `Seeding Economy...` then drives `simulation_run_chunked_fast_forward_burst` `0x00437b20`; only after those setup-side gates does the pipeline post id `319` `Setting up Players and Companies...`; and id `322` `Calculating Heights...` finally tails into `0x0044d410`. That `319` lane is no longer just gate plumbing: the primary grounded work there is still the chairman-profile pair `world_seed_default_chairman_profile_slots` `0x004377a0` plus `world_build_chairman_profile_slot_records` `0x00437220`, and current neighboring setup flow also exposes one conditional company-side helper at `0x0047d440` under sandbox or non-editor shell-state conditions. The later interior ordering of the same `319` lane is tighter now too: after the route-entry collection refresh on `0x006cfca8` through `0x00493be0`, the pipeline refreshes the auxiliary route-entry tracker collection `0x006cfcb4` through `0x004a41b0`, then re-enters `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` `0x004133b0`, runs a flagged world-grid cleanup sweep through `0x00448af0/0x00533fe0`, and only after that re-enters the route-entry post-pass `0x00491c20` before continuing into later persona, route-style, region, and world-manager setup families. Current evidence is tighter on the remaining gates too: `[0x006cec74+0x68]` now aligns with the editor-map `.gmp` mode in the shell file coordinators and acts as the broader master editor-mode flag that suppresses both later world-generation branches and diverts region-side calculations into alternate paths. The body fans into the live world root at `0x0062c120`, manager collections `0x0062ba8c`, `0x0062bae0`, `0x006cfca8`, `0x006cfcb4`, and `0x006cfc9c`. Current grounded callers are the world-entry side around `0x004390ea` and the shell file-load side around `0x004dccfc`.","objdump + RT3.lng strings + caller xrefs + callsite inspection + file-flow correlation + post-load-stage-order correlation" +0x00437743,93,world_preseed_named_candidate_availability_records_from_live_pool,map,cdecl,inferred,objdump + local disassembly + caller correlation,3,"Preliminary post-load candidate-availability prepass reached only from `world_run_post_load_generation_pipeline` `0x004384d0` when the caller requests the fuller setup path. The helper iterates the live candidate pool at `0x0062b268` in reverse order, derives one small boolean mode from candidate bytes `[candidate+0xba]` and `[candidate+0x32]`, and then re-enters `scenario_state_upsert_named_candidate_availability_record_and_refresh_runtime_filters` `0x00434f20` on the active scenario state `0x006cec78` using the candidate name at `+0x04`. The whole pass is skipped once global threshold `0x00620e94` reaches `0x26ad`. Current evidence is therefore strongest for an early scenario-side named candidate-availability seeding pass rather than another visible progress phase.","objdump + local disassembly + caller correlation + candidate-pool correlation" +0x00438890,644,shell_active_mode_run_profile_startup_and_load_dispatch,map,thiscall,inferred,objdump + caller xrefs + debugger comparison,4,"Large active-mode startup and profile-dispatch owner rooted at the live mode object in `0x006cec78`. At entry it clears local state at `[this+0x00]` and `[this+0x4c80]`, posts several shell progress or status updates through `0x5193f0/0x540120`, enumerates one shell-managed list off `0x006d4020+0x429b0`, and then switches over the runtime-profile selector at `[0x006cec7c+0x01]`, which is now clearly a separate seven-way startup selector rather than the shell mode id itself. The jump table has four grounded branch bodies: selector values `1` and `7` share the tutorial map lane at `0x00438f67`, which writes `[0x006cec74+0x6c]=2` and calls shell_map_file_entry_coordinator `0x00445ac0` with `Tutorial_2.gmp` or `Tutorial_1.gmp`; selector `2` is a world-root initialization lane at `0x00438fbe` that allocates `0x0062c120` when absent, runs `0x0044faf0`, and then forces the selector to `3`; selector `4` is the setup-side world reset or regeneration lane at `0x00439038`, which tears down and reallocates `0x0062c120` from setup globals `0x006d14cc/0x006d14d0`, then runs `0x00535100` and `0x0040b830`; and selector values `3`, `5`, and `6` collapse into the same profile-seeded file-load lane at `0x004390b0..0x004390ea`. The write side is tighter now too: `Campaign.win` writes selector `6` at `0x004b8a2f`; `Multiplayer.win` writes selector `3` on one pending-status branch at `0x004f041e`; and the larger `Setup.win` dispatcher around `0x005033d0..0x00503b7b` writes selectors `2`, `3`, `4`, and `5` on several validated launch branches, including the setup-size path through `0x0050394c`, the generation branch at `0x00503a12`, and the profile-file validation branch at `0x00503a74/0x00503a7d`. The shared file-load lane is therefore no longer anonymous: selector `6` is the grounded campaign-side variant and selectors `3/5` are grounded setup or multiplayer variants, while selector `6` is also the only variant that first writes `[0x006cec74+0x6c]=1` before all three values call shell_map_file_entry_coordinator `0x00445ac0` with `([0x006cec7c]+0x11, 4, &out_success)`, re-enter shell service `0x004834e0`, conditionally run world_run_post_load_generation_pipeline `0x004384d0` when `out_success != 0`, drain the counter object at `0x00ccbb20` through `0x0053f310`, and service `0x004834e0` again. The caller split above that branch is tighter now too: `0x004830ca` is the shell startup or `LoadScreen.win` lane and calls this owner as `(1, 0)` after publishing `0x006cec78`, while `0x00443b57` world entry and `0x00446d7f` saved-runtime restore both enter with `(0, 0)` immediately after dismissing the current detail panel and servicing `0x004834e0(0, 0)`. `0x0046b8bc` remains the distinct multiplayer-preview relaunch owner, also entering as `(0, 0)` before a later staged `0x00445ac0` call.","objdump + caller xrefs + manual-load breakpoint comparison + owner-tail disassembly + caller-shape comparison + selector-jump-table decode + tutorial-string correlation + selector-writer correlation" +0x00435603,10,scenario_state_ensure_derived_year_threshold_band,map,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Tiny guard wrapper over one derived scenario-state year-threshold band rooted at `[this+0x3a/+0x51/+0x55/+0x59/+0x5d/+0x61]`. When the small mode or threshold byte at `[this+0x3a]` is already `>= 2` the helper returns immediately; otherwise it falls back into the heavier rebuild body at `0x004351c0`, which refreshes those companion thresholds from the current year and shell-controller-side values before continuing. Current grounded callers are the post-fast-forward selected-year tail at `0x00437170`, the later staged-profile rehydrate band inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, the compact runtime-effect side branch at `0x00431e03`, and the shell-command lane at `0x004661c0/0x004661e9`, so this is the safest current read for the small year-threshold ensure wrapper rather than a generic boolean probe.","objdump + local disassembly + caller correlation + year-threshold-band correlation" 0x00435630,648,scenario_state_rebuild_port_warehouse_cargo_recipe_runtime_tables,map,thiscall,inferred,objdump + caller xrefs + state-layout inspection,4,"Rebuilds the runtime port-or-warehouse cargo-line tables from the scenario-side recipe-book state rooted at `[this+0x0fe7]`. The helper first biases into the recipe-book payload at `[this+0x13d4]`, then iterates all `12` recipe-book blocks in `0x4e1`-byte steps. For each book it clamps the shared maximum annual production float that precedes the first line, counts active lines across five repeated `0x30`-byte line records, and then imports those five lines into one parallel runtime array of `0xbc`-byte descriptors. The importer treats every line slot symmetrically rather than special-casing any row index: each slot reads one mode dword, one annual amount, and two cargo-token strings, resolves nonempty cargo strings through the global cargo collection at `0x0062ba8c`, and builds paired runtime halves for the mode families `2/3` and `1/3`. Current mode gating is now tight enough to treat the polarity as grounded rather than provisional: the source token at `line+0x08` is the supplied-cargo field because it is the branch activated for `Supply Only` and `Production Demand->Supply`, while the source token at `line+0x1c` is the demanded-cargo field because it is the branch activated for `Demand Only` and `Production Demand->Supply`. The constructor and handler now tighten the amount semantics too: `line+0x04` is the per-line annual-demand field only in mode `1`, but it becomes the annual-supply field in modes `2/3`. The importer matches that split by copying `line+0x04` directly into the supply-side runtime half for modes `2/3`, while the production-mode demand half is normalized to `1.0` rather than reusing the entered amount. That makes the five editor-side row entries look like generic cargo-line slots rather than five fixed named production roles. Current grounded callers include the scenario-state initializer at `0x00436ee0`, world-load or map-entry side branches at `0x00443ebc`, `0x00444ac1`, and `0x00448126`, plus the live editor page constructor at `0x004cf935`.","objdump + caller xrefs + state-layout inspection + cargo-collection correlation + mode-table correlation + constructor correlation" 0x00437b20,218,simulation_run_chunked_fast_forward_burst,simulation,thiscall,inferred,objdump,3,"Shell-mediated burst advance helper above simulation_advance_to_target_calendar_point. It marks a local fast-forward latch at `[this+0x46c38]`, derives one loop count from shell-state `0x006cec74+0x178` and active-mode flag `[0x006cec78+0x4af7]`, then repeatedly advances the world toward fixed target `0x05a0` through simulation_advance_to_target_calendar_point while pumping the shell-side service helper at `0x004834e0` between chunks. After the burst it clears the latch, sweeps the world collection at `0x0062bae0`, and tails into the neighboring cleanup path at `0x00434d40`. The current grounded owner is world_run_post_load_generation_pipeline at `0x004384d0`, where the helper sits behind shell-state gate `[0x006cec74+0x178]` under the localized `Seeding Economy...` phase after the earlier transportation-pricing and building-setup work has already run. This keeps the helper on the map or scenario setup side rather than the ordinary player-facing speed-control path.","objdump + caller context + RT3.lng strings + phase ordering" 0x00434680,435,world_set_game_speed_mode,simulation,thiscall,inferred,objdump + strings,3,"Primary game-speed setter for the live world object. It clamps the requested mode against the normal `0..5` range or the wider `0..9` range when shell-state gate `[0x006cec74+0x2c8]` is active, stores the current mode at `[this+0x19]`, preserves the nonzero resume mode at `[this+0x1d]`, updates the shell detail control `0x74` when `0x006d0818` is live, and can format the localized status line `Game Speed: %1` using speed labels `Paused` through `Very Fast` and the hidden `Ultra Fast 6..9` strings. When the caller requests propagation and the multiplayer preview path is active it also routes the new speed through the multiplayer-side handoff around `0x00407870`, which matches the localized restriction `Only the host may change the game speed.`","objdump + RT3.lng strings + multiplayer handoff" 0x00434850,19,world_adjust_game_speed_mode_delta,simulation,thiscall,inferred,objdump,3,"Small relative front end over world_set_game_speed_mode. It adds the signed caller delta to the current mode at `[this+0x19]` and then re-enters world_set_game_speed_mode with both notification and propagation flags enabled.","objdump + callee inspection" -0x00437220,279,world_build_chairman_profile_slot_records,map,thiscall,inferred,objdump + strings + caller xrefs,4,"Post-load chairman-profile materialization pass reached under banner id `319` `Setting up Players and Companies...`. The helper first refreshes one local occupancy map through `0x0047bc80`, optionally waits on the multiplayer preview owner at `0x006cd8d8`, then walks the 16 selector bytes at `[0x006cec7c+0x87]` together with the per-slot staging table rooted at `[this+0x69d8]`. Current slot-field semantics are tighter now: `[slot+0x00]` is the staged chairman profile id, `[slot+0x01]` is the Optional-versus-Mandatory byte with nonzero=`Optional` and zero=`Mandatory`, `[slot+0x02]` is the ordinary seat-enable byte that combines with the separate per-slot gate at `[this+0x0bc3+slot*9]` to surface `Human`, `Computer`, and `Human or Computer`, `[slot+0x03]` is the special occupied-seat byte, and `[slot+0x04]` is the numeric tuning field copied into the resolved profile. Zero selectors take the random unused-profile path; nonzero selectors map directly onto one persona index; and campaign mode at `[0x006cec7c+0xc5]` can override back through the scenario slot table. Each resolved profile record is pulled from the global persona collection at `0x006ceb9c`, formatted through `0x0050a16f`, and seeded from the static persona table at `0x005f2d28`, whose localized ids include `2730` `Unassigned`, the named-chairman range `2731+`, and the adjacent biography range `2495+`. Both this helper and the neighboring selector seeder treat either `[slot+0x02]` or `[slot+0x03]` as enough to keep a slot live, but current grounded writes only seed `[slot+0x03]` on slot zero and later move it solely by whole-record compaction. That makes `[slot+0x03]` the strongest current anchor for the distinguished primary-human-seat marker rather than a generic role byte. The helper leaves one per-slot record family live in the resolved persona objects, stores per-profile numeric tuning from `[slot+0x04]` into `[profile+0x154]` and `[profile+0x158]`, and finishes by writing the selected profile id to `[this+0x25]` plus the linked owner-company id from `[profile+0x1dd]` to `[this+0x21]`. Current grounded callers are the main post-load generation pipeline at `0x004384d0` and the saved-runtime restore side around `0x00444b79`.","objdump + RT3.lng strings + caller xrefs + table inspection + shell editor cross-check" +0x00437220,279,world_build_chairman_profile_slot_records,map,thiscall,inferred,objdump + strings + caller xrefs,4,"Post-load chairman-profile materialization pass reached under banner id `319` `Setting up Players and Companies...`. The helper first refreshes one local occupancy map through `0x0047bc80`, optionally waits on the multiplayer preview owner at `0x006cd8d8`, then walks the 16 selector bytes at `[0x006cec7c+0x87]` together with the per-slot staging table rooted at `[this+0x69d8]`. Current slot-field semantics are tighter now: `[slot+0x00]` is the staged chairman profile id, `[slot+0x01]` is the Optional-versus-Mandatory byte with nonzero=`Optional` and zero=`Mandatory`, `[slot+0x02]` is the ordinary seat-enable byte that combines with the separate per-slot gate at `[this+0x0bc3+slot*9]` to surface `Human`, `Computer`, and `Human or Computer`, `[slot+0x03]` is the special occupied-seat byte, and `[slot+0x04]` is the numeric tuning field copied into the resolved profile. Zero selectors take the random unused-profile path; nonzero selectors map directly onto one persona index; and campaign mode at `[0x006cec7c+0xc5]` can override back through the scenario slot table. Each resolved profile record is pulled from the global persona collection at `0x006ceb9c`, formatted through `0x0050a16f`, and seeded from the static persona table at `0x005f2d28`, whose localized ids include `2730` `Unassigned`, the named-chairman range `2731+`, and the adjacent biography range `2495+`. Both this helper and the neighboring selector seeder treat either `[slot+0x02]` or `[slot+0x03]` as enough to keep a slot live, but current grounded writes only seed `[slot+0x03]` on slot zero and later move it solely by whole-record compaction. That makes `[slot+0x03]` the strongest current anchor for the distinguished primary-human-seat marker rather than a generic role byte. The helper leaves one per-slot record family live in the resolved persona objects, stores per-profile numeric tuning from `[slot+0x04]` into `[profile+0x154]` and `[profile+0x158]`, and finishes by writing the selected profile id to `[this+0x25]` plus the linked owner-company id from `[profile+0x1dd]` to `[this+0x21]`. Current grounded callers are the main post-load generation pipeline at `0x004384d0` and the saved-runtime tail inside `world_entry_transition_and_runtime_bringup` `0x00443a50`.","objdump + RT3.lng strings + caller xrefs + table inspection + shell editor cross-check" 0x004377a0,693,world_seed_default_chairman_profile_slots,map,thiscall,inferred,objdump + caller xrefs + strings,4,"Seeds the 16 scenario-side chairman selector bytes at `[0x006cec7c+0x87]` from the local chairman-slot table rooted at `[this+0x69d8]` before the later profile-record materialization pass runs. In editor-map mode the helper first compacts the 16 local 9-byte slot records so occupied slots bubble forward whenever a later slot has either the ordinary seat-enable byte `[slot+0x02]` or the special occupied-seat byte `[slot+0x03]` set and an earlier slot has neither; it then clears selectors for empty slots and assigns deterministic defaults for occupied ones, using selector `1` for the first occupied slot and selector `0x64+n` for later occupied slots. The same slot layout is now bounded more tightly by the editor window family around `0x004cc2d0`: `[slot+0x00]` is the staged chairman profile id, `[slot+0x01]` is the Optional-versus-Mandatory flag with nonzero=`Optional` and zero=`Mandatory`, `[slot+0x02]` is the ordinary seat-enable byte, `[slot+0x03]` is the special occupied-seat byte, and `[slot+0x04]` is the numeric tuning field. Current grounded writes seed `[slot+0x03]` on slot zero and the compaction pass moves it only by swapping whole 9-byte records, which matches the selector policy: one distinguished first slot gets selector `1`, and the remaining occupied slots get the `0x64+n` opponent range. After the selector seeding pass it walks the selector array, resolves each chosen persona through the global collection at `0x006ceb9c`, constructs or refreshes the per-profile record through `0x00476140`, copies the numeric tuning field from `[slot+0x04]` into `[profile+0x154]` and `[profile+0x158]`, and finally seeds the scenario-state summary pair from the first persona entry: `[this+0x25]` becomes the selected profile id while `[this+0x21]` becomes the linked owner-company id through `[profile+0x1dd]`. Current grounded caller is the neighboring world bring-up path around `0x00438692`, where this helper runs after the setup-side burst branch and immediately before the localized `Calculating Heights...` progress update.","objdump + caller xrefs + RT3.lng strings + slot-table inspection + shell editor cross-check" 0x00434870,23,scenario_state_get_selected_chairman_company_record,map,thiscall,inferred,objdump + global-state inspection,4,"Returns the currently selected company record for the shell-side scenario state object at `0x006cec78`. The helper reads `[this+0x21]` as a company id and resolves that id through the live company collection at `0x0062be10`; zero or negative ids return null. This is the clearest direct accessor yet for the summary field written by the post-load chairman-profile lane.","objdump + global-state inspection + caller correlation" 0x00434890,35,scenario_state_set_selected_chairman_profile,map,thiscall,inferred,objdump + global-state inspection,4,"Sets the currently selected chairman profile on the shell-side scenario state object at `0x006cec78`. The helper stores the incoming persona id into `[this+0x25]`, resolves that persona through the global profile collection at `0x006ceb9c`, and then copies the linked owner-company id from `[profile+0x1dd]` into `[this+0x21]`. This grounds the summary pair used by the post-load chairman-profile setup lane: `[state+0x25]` is the selected chairman profile id and `[state+0x21]` is the corresponding owning company id.","objdump + global-state inspection + caller correlation" @@ -274,25 +304,92 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004768c0,53,chairman_profile_owns_all_company_shares,simulation,thiscall,inferred,objdump + caller inspection,4,"Boolean ownership predicate over one chairman profile and company id. The helper resolves the requested company through the live company collection at `0x0062be10`, reads the company's full outstanding-share count from `[company+0x47]`, and compares it against the current profile's holding slot for that same company at `[profile + company_id*4 + 0x15d]`. It returns `1` only when the profile holds the full outstanding-share band and `0` otherwise. Current grounded caller is the CompanyDetail section-0 overview formatter at `0x004e5cf0`, where this is the decision point between the wholly-owned text family `3046/3047` and the investor-attitude text family `3048/3049`.","objdump + caller inspection + ownership-predicate correlation" 0x00436710,163,scenario_state_sum_issue_opinion_terms_raw,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Raw additive companion to `scenario_state_compute_issue_opinion_multiplier` on the active scenario or shell state rooted at `0x006cec78`. The helper starts from the base issue term at `[this + issue*4 + 0x8a]`, then optionally adds the company override term at `[company + issue*4 + 0x35b]`, the chairman-profile override term at `[profile + issue*4 + 0x2ab]`, and the territory override term at `[territory + issue*4 + 0x3b5]` without normalizing or clamping the result into a multiplier. When the profile argument is omitted but a valid company is supplied, it implicitly reuses that company's linked chairman id from `[company+0x3b]`. Current grounded callers include the city-connection bonus lane through `company_compute_issue39_opinion_bias_scalar` at `0x00424580` and several neighboring policy or setup branches that treat the returned integer as one raw issue-opinion total rather than a finished probability or vote scalar.","objdump + caller xrefs + callsite inspection + issue-table correlation + raw-sum correlation" 0x00437a60,41,world_toggle_pause_or_restore_game_speed,simulation,thiscall,inferred,objdump + strings,3,"Pause or resume toggle over the world game-speed fields. When the current mode at `[this+0x19]` is above zero it re-enters world_set_game_speed_mode with target `0` to pause; otherwise it restores the saved nonzero resume mode from `[this+0x1d]`. This matches the player-facing speed-control family rooted in `Paused` through `Very Fast` and their tooltips in `RT3.lng` ids `1795..1800`.","objdump + RT3.lng strings" -0x00443a50,1073,world_entry_transition_and_runtime_bringup,map,cdecl,inferred,objdump + analysis-context,4,First grounded gameplay-world entry coordinator reached from shell_map_file_entry_coordinator. It stages the selected file path into 0x0062bee0 dismisses the shell detail-panel controller at 0x006d0818 drives shell_transition_mode through 0x00482ec0 and shell_state_service_active_mode_frame then marks shell state for the transition and resets the previous world bundle through world_runtime_release_global_services and the neighboring allocator branch at 0x00438890. After the transition wait it builds temporary bundle payloads from %1\\%2 and %1.tmp allocates or serializes several world-entry records through 0x00530c80 0x00531150 and 0x00531360 allocates the new world root at 0x0062c120 from the staged filename through 0x0044e910 notifies the shell owner at 0x0062be68 and then initializes multiple world-facing global managers including 0x0062ba8c 0x0062b2fc 0x0062b26c and 0x006ada90. This now looks like the first real shell-to-gameplay world-entry bring-up path rather than shell-only staging.,objdump + analysis-context + caller xrefs + strings +0x00448aa0,28,world_sample_companion_float_grid_value_by_cell,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny float-raster sampler over the companion world grid rooted at `[this+0x1605]`. The helper uses width field `[this+0x15d9]`, flattens the caller-supplied cell coordinates with an extra `+1` row stride, reads one `float` from that raster, and returns it in `st(0)`. Current grounded callers include `world_compute_transport_and_pricing_grid` `0x0044fb70`, the flagged-cell sample collector `world_grid_count_flagged_cells_and_collect_float_samples` `0x00414fa0`, the projected-rectangle helper `world_grid_refresh_projected_rect_sample_band_and_flag_mask` `0x00418610`, and several neighboring shell or presentation branches, so this is the safest current read for the shared companion float-grid sampler rather than a transport-only helper.","objdump + caller inspection + field correlation + float-raster correlation" +0x00448af0,206,world_query_compact_grid_flag_bitset_membership_by_mode,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Boolean compact-bitset query over three neighboring world-grid flag banks. The helper uses dimensions `[this+0x215d/+0x2161]` to flatten the caller-supplied cell coordinates into one bit index, rejects out-of-bounds cells, and then checks one or more compact bitset banks depending on the caller mode argument: mode `0` checks both `[this+0x2139]` and `[this+0x213d]`, mode `1` checks `[this+0x213d]` only, mode `2` checks `[this+0x2139]` only, and mode `3` checks `[this+0x2141]` only. It returns `1` when any selected bank contains the bit and `0` otherwise. Current grounded callers include the post-load `319` cleanup lane inside `world_run_post_load_generation_pipeline` `0x004384d0`, the placement validator `placed_structure_validate_projected_candidate_placement` `0x004197e0`, the projected-runtime scratch builder `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` `0x00416ec0`, several neighboring world-scan or presentation branches around `0x004512b5..0x00451393`, and later world-side routes or scenario handlers, so this is the safest current read for the shared compact grid-flag-bitset membership query rather than one specific road- or route-only gate.","objdump + caller inspection + field correlation + compact-bitset correlation + post-load-cleanup correlation" +0x00448c20,132,world_secondary_raster_reclass_cell_to_low3bit_1_or_4_and_clear_primary_companion_plane,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small secondary-raster mutator over one world cell. After rejecting cells whose current secondary class already lies in subset `1/4` through `world_secondary_raster_query_cell_class_in_set_1_4` `0x00534e50`, the helper clears the primary companion byte plane at `[this+0x1655]` for that cell and rewrites the low 3 class bits of the packed secondary record at `[this+0x165d]` to `4` when the old class was `2`, or to `1` otherwise. It then notifies the shell-side world presentation through `0x00534270` with mode `6`. Current grounded callers are the `.smp` restore path inside `world_load_saved_runtime_state_bundle` `0x00446d40` and several shell-side map-editing or painting branches around `0x004f9c17` and `0x004fbcc9`, so this is the safest current read for the shared class-`1/4` demotion helper rather than a more player-facing terrain brush.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00448cb0,132,world_secondary_raster_reclass_cell_to_low3bit_3_or_5_and_clear_primary_companion_plane,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Sibling of world_secondary_raster_reclass_cell_to_low3bit_1_or_4_and_clear_primary_companion_plane for the `3/5` class family. After rejecting cells already in subset `3/5` through `world_secondary_raster_query_cell_class_in_set_3_5` `0x00534f00`, the helper clears the primary companion byte plane at `[this+0x1655]` for that cell and rewrites the low 3 class bits of the packed secondary record at `[this+0x165d]` to `5` when the old class was `2`, or to `3` otherwise. It then emits the same shell-presentation refresh through `0x00534270` with mode `6`. Current grounded callers are the `.smp` restore path inside `world_load_saved_runtime_state_bundle` `0x00446d40` and shell-side world-editing branches around `0x004f9c05` and `0x004fbce4`.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00448d40,78,world_secondary_raster_write_primary_companion_plane_byte_and_clear_low3bit_class_tag,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Writes one caller-supplied byte into the primary companion plane at `[this+0x1655]` for the selected world cell, then clears the low 3 class bits in the parallel packed secondary record at `[this+0x165d]`. The written byte comes from `0x00532a30` in the grounded callers, and the helper finishes by notifying the shell-side world presentation through the virtual owner at `0x0062be68`. Current grounded callers are shell-side painting and editing branches around `0x004f9c0e` and `0x004fbcfa`, so this is the safest current read for the shared primary-companion-byte write helper rather than a player-facing terrain label.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00448d90,43,world_secondary_raster_set_cell_byte2_bit0x10,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small write-side companion to world_secondary_raster_query_cell_byte2_bit0x10_set `0x00448f30`. The helper resolves one packed secondary cell record at `[this+0x165d]`, sets bit `0x10` in byte `2`, and then notifies the shell-side world presentation. Current grounded callers are the `.smp` restore path inside `world_load_saved_runtime_state_bundle` `0x00446d40` and one shell-side scan branch around `0x004fc45d`.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00448dc0,43,world_secondary_raster_clear_cell_byte2_bit0x10,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Clear-side companion to world_secondary_raster_set_cell_byte2_bit0x10. The helper resolves one packed secondary cell record at `[this+0x165d]`, clears bit `0x10` in byte `2`, and then notifies the shell-side world presentation. Current grounded caller is the shell-side scan branch around `0x004fc464`.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00448df0,33,world_secondary_raster_query_cell_byte2_low_nibble,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny nibble query over byte `2` of the packed secondary cell record rooted at `[this+0x165d]`. The helper flattens the caller-supplied coordinates, reads byte `2`, masks to the low nibble, and returns that `0..15` value. Current grounded callers are shell-side editing branches around `0x004faab3`, `0x004fabff`, `0x004faf9c`, `0x004fb007`, `0x004fb021`, and `0x004fca0e`, where the nibble is compared against small brush-state counts before the sibling write helper runs.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00448e20,47,world_secondary_raster_xor_cell_byte2_low_nibble_mask,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small low-nibble update helper over byte `2` of the packed secondary cell record rooted at `[this+0x165d]`. The helper XORs the caller-supplied low-nibble mask with the current low nibble and writes the merged result back without disturbing the upper nibble. Current grounded callers are shell-side editing branches around `0x004faba7` and `0x004fac18`.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00448e60,30,world_secondary_overlay_vector_x_byte_plane_set_cell_value,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small write helper for the signed X-component byte plane rooted at `[this+0x1661]`. It flattens one world-cell coordinate through width `[this+0x15dd]` and stores the caller byte directly. Current grounded callers are the `.smp` restore path inside `world_load_saved_runtime_state_bundle` `0x00446d40` and shell-side editing branches around `0x004faa59`. Later world-side rebuild logic in `0x00536710` treats this plane together with `[this+0x1665]` as a 2D signed vector field rather than a generic scratch buffer.","objdump + caller inspection + field correlation + vector-plane correlation" +0x00448e90,30,world_secondary_overlay_vector_y_byte_plane_set_cell_value,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Write-side sibling of world_secondary_overlay_vector_x_byte_plane_set_cell_value over the signed Y-component byte plane rooted at `[this+0x1665]`. The helper flattens one world-cell coordinate through width `[this+0x15dd]` and stores the caller byte directly. Current grounded callers are the `.smp` restore path inside `world_load_saved_runtime_state_bundle` `0x00446d40` and shell-side editing branches around `0x004faa6e`, while the later rebuild pass `0x00536710` consumes this plane together with `[this+0x1661]` as a paired local vector field.","objdump + caller inspection + field correlation + vector-plane correlation" +0x00448ec0,27,world_secondary_overlay_vector_x_byte_plane_query_cell_value,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny signed-byte accessor for the X-component overlay vector plane rooted at `[this+0x1661]`. Current grounded callers include neighboring world-side presentation or setup branches around `0x00446458` and shell-side editing branches around `0x004fa9cc`, so this is the safest current read for the X-component vector-plane cell query.","objdump + caller inspection + field correlation + vector-plane correlation" +0x00448ee0,27,world_secondary_overlay_vector_y_byte_plane_query_cell_value,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny signed-byte accessor for the Y-component overlay vector plane rooted at `[this+0x1665]`. Current grounded callers include neighboring world-side presentation or setup branches around `0x00446478` and shell-side editing branches around `0x004fa9e0`, so this is the safest current read for the Y-component vector-plane cell query rather than a generic companion-byte accessor.","objdump + caller inspection + field correlation + vector-plane correlation" +0x00448f00,40,world_secondary_raster_query_cell_low3bit_tag_nonzero,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny predicate over the secondary 3-byte raster rooted at `[this+0x165d]`. The helper flattens the caller-supplied cell coordinates through width `[this+0x15dd]`, reads the first byte of the 3-byte cell record, masks its low 3 bits, and returns `1` when that low-bit tag is nonzero and `0` otherwise. Current grounded callers consistently treat the zero case as the countable or eligible path: the region-border overlay count rebuild `0x004881b0`, the map-editor stats reports at `0x004d0472` and `0x004d1bd3`, and several neighboring world-side scans or scoring branches around `0x00403550`, `0x00450ffc`, and `0x00454599`.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00448f30,42,world_secondary_raster_query_cell_byte2_bit0x10_set,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small companion predicate over the same secondary 3-byte raster rooted at `[this+0x165d]`. The helper flattens the caller-supplied cell coordinates through width `[this+0x15dd]`, reads byte `2` of the 3-byte cell record, and returns `1` when bit `0x10` is set and `0` otherwise. Current grounded callers include neighboring world-side setup or presentation branches around `0x00446498` and `0x00451090`, plus one shell-side scan at `0x004fc43c`, so this is the safest current read for the shared secondary-raster bit-`0x10` predicate rather than a more player-facing terrain label.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x004490f0,18,world_query_sidecar_plane_cell_count,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny size helper for the sidecar byte-plane family hanging off the live world object. It returns `([this+0x15d9]+1)*([this+0x15d5]+1)`, which is the per-plane cell count used by the four-plane sidecar raster copies. Current grounded callers include the shell-side plane-copy branches around `0x004f5ad6..0x004f5cc7`, so this is the safest current read for the shared sidecar-plane cell-count query rather than a generic world-size helper.","objdump + caller inspection + field correlation + sidecar-plane correlation" +0x00448f60,114,world_load_four_sidecar_byte_planes_from_runtime_bundle,map,thiscall,inferred,objdump + caller inspection + bundle-tag correlation,4,"Loads four sidecar byte-plane buffers tied to the live world raster from one runtime bundle owner. The helper opens chunk family `0x9471..0x9472` through `0x00531360`, computes one plane size through `world_query_sidecar_plane_cell_count` `0x004490f0`, resolves four destination plane pointers through `world_query_sidecar_byte_plane_ptr_by_index` `0x00533b40` from `[this+0x1631 + index*4]`, and fills those four buffers through repeated `0x00531150` reads before closing the chunk family. Current grounded callers are the `.smp` restore path inside world_load_saved_runtime_state_bundle `0x00446d40` and the neighboring world-side bundle-load branch at `0x0044d350`, so this is the safest current read for the shared four-plane runtime-bundle load helper rather than a generic deserializer.","objdump + caller inspection + bundle-tag correlation + sidecar-plane correlation" +0x00448fe0,108,world_serialize_four_sidecar_byte_planes_into_runtime_bundle,map,thiscall,inferred,objdump + caller inspection + bundle-tag correlation,4,"Save-side sibling of world_load_four_sidecar_byte_planes_from_runtime_bundle. The helper opens chunk family `0x9471..0x9472` for output through `0x00531340`, computes the same one-plane size through `world_query_sidecar_plane_cell_count` `0x004490f0`, resolves four source plane pointers through `world_query_sidecar_byte_plane_ptr_by_index` `0x00533b40` from `[this+0x1631 + index*4]`, and writes those four buffers through repeated `0x00531030` calls before closing the chunk family. Current grounded callers are the `.smp` serializer inside world_runtime_serialize_smp_bundle `0x00446240` and the neighboring world-side bundle-save branch at `0x00449714`, so this is the safest current read for the shared four-plane runtime-bundle serializer rather than a generic writer.","objdump + caller inspection + bundle-tag correlation + sidecar-plane correlation" +0x00444dc5,11,world_query_global_stage_counter_reached_late_reactivation_threshold,map,cdecl,inferred,objdump + caller inspection + threshold correlation,3,"Tiny signed compare helper over the shared stage counter at `0x00620e94`. It returns the raw comparison against threshold `0x9901`, so current callers only test whether the counter is still below that later reactivation threshold. Grounded callers are the two late world-entry checkpoints at `0x00444044` and `0x00444a83` inside `world_entry_transition_and_runtime_bringup` `0x00443a50`, where a negative result clears `[world+0x39]`. Nearby evidence also shows the same global is seeded to `0x26ad` by `map_bundle_open_reference_databases` `0x00444dd0`, copied into save-side payload state around `0x00441ec5`, and reused as the earlier preseed cutoff by `world_preseed_named_candidate_availability_records_from_live_pool` `0x00437743`, so the safest current read is a shared stage-threshold comparator rather than a one-off world-field helper.","objdump + caller inspection + threshold correlation + global-stage-counter correlation" +0x0044c670,2544,world_service_secondary_grid_marked_cell_overlay_cache,map,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Recurring world-side service pass over the secondary raster rooted at `[this+0x2135]` after `world_scan_secondary_grid_marked_cell_bounds` `0x0044ce60` has cached min/max/count bounds into `[this+0x21c6..+0x21d6]`. The helper first requires shell-state gate `[0x006cec78+0x4af3]`, then consumes the cached bounds to normalize the marked-cell band and rewrite per-cell bits in the same secondary raster. Its later overlay side is tighter now too: after resolving scaled surface dimensions through `shell_world_presentation_query_scaled_surface_dimensions` `0x00534c50`, it walks one local 3-by-32 sample lattice through the static offset tables at `0x00624b28/0x00624b48`, keeps only secondary-raster classes `4..0x0d`, folds several interpolated samples through repeated `0x0051db80` evaluation into one strongest local score, writes packed overlay pixels into the staged surface buffer, and only then publishes that staged overlay through `shell_world_presentation_publish_staged_overlay_surfaces_and_release_buffer` `0x00534af0`. The lower helper cluster beneath that owner is now explicit too: `0x00533e70` clears coarse overlay chunks in a rectangle, `0x00534160` ensures one coarse chunk and seeds local marks, and `0x00534e90` is the neighboring marked-bit predicate over the same 3-byte raster family. Current grounded callers are the recurring simulation-maintenance route-style branch at `0x0040a9f4` inside `simulation_service_periodic_boundary_work` `0x0040a590` and one startup-side world branch at `0x00448168`, so this is the safest current read for the shared secondary-grid marked-cell overlay-cache service rather than a one-shot startup helper or a fully player-facing panel renderer.","objdump + local disassembly + caller inspection + secondary-raster correlation + recurring-maintenance correlation + staged-overlay publish correlation" +0x00443a50,4979,world_entry_transition_and_runtime_bringup,map,cdecl,inferred,objdump + analysis-context,4,"First grounded gameplay-world entry coordinator reached from `shell_map_file_entry_coordinator` `0x00445ac0`. The function boundary is now grounded as the full `0x00443a50..0x00444dc2` bringup span rather than just the early transition head. It stages the selected file path into `0x0062bee0`, dismisses the shell detail-panel controller at `0x006d0818`, drives `shell_transition_mode` through `0x00482ec0`, and resets the previous world bundle through `world_runtime_release_global_services` plus the neighboring startup-profile owner `0x00438890`. After the transition wait it builds temporary bundle payloads from `%1\\%2` and `%1.tmp`, allocates or serializes world-entry records through `0x00530c80`, `0x00531150`, and `0x00531360`, allocates the new world root at `0x0062c120` from the staged filename through `0x0044e910`, notifies the shell owner at `0x0062be68`, and then continues through the larger post-load generation pipeline instead of returning immediately. The later `319` tail is tighter now too: before the final world and shell reactivation it runs one post-bundle status-and-runtime-refresh phase that posts shell progress ids `0x196` and `0x197` through `0x005193f0/0x00540120` with paired `0x004834e0` follow-ons, refreshes event runtime records through `scenario_event_collection_refresh_runtime_records_from_packed_state` `0x00433130`, rebuilds the scenario-side port-or-warehouse cargo recipe runtime tables through `scenario_state_rebuild_port_warehouse_cargo_recipe_runtime_tables` `0x00435630`, runs the named-candidate availability preseed through `world_preseed_named_candidate_availability_records_from_live_pool` `0x00437743`, and then enters one later staged-profile or availability rehydrate band before the broader reactivation sweep. That rehydrate band posts progress ids `0x32dc/0x3714/0x3715`, reads one `0x108`-byte packed profile block through `0x00531150`, conditionally copies staged runtime-profile bytes from the loaded bundle back into `0x006cec7c` when latch `[profile+0x97]` is set, mirrors the grounded campaign-scenario bit `[profile+0xc5]` and sandbox bit `[profile+0x82]` into world bytes `[world+0x66de]` and `[world+0x66f2]`, restores the selected year or profile choice lane through `[profile+0x77]` into `[world+0x05/+0x09/+0x15]`, and then rehydrates the named locomotive-availability collection at `[world+0x66b6]` before the later world-wide service passes continue. That later reactivation tail is narrower now too: it includes `world_clear_and_reseed_region_center_world_grid_flag_bit` `0x0044c4b0`, then `world_rebuild_all_grid_cell_candidate_cargo_service_bitsets` `0x0044c450`, then `world_scan_secondary_grid_marked_cell_bounds` `0x0044ce60`, then the recurring secondary-raster overlay-cache service `world_service_secondary_grid_marked_cell_overlay_cache` `0x0044c670`, before the later route-style rebuild, shell-window, and briefing branches. Only after that later tail does it re-enter the one-shot world-entry runtime-effect service through `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` `0x00432f40` with kind `8`, after which shell-profile latch `[0x006cec7c+0x97]` is cleared. This is therefore the current safest read for the full shell-to-gameplay world-entry transition and runtime bringup owner rather than only the front half of file staging and world allocation.","objdump + analysis-context + caller xrefs + strings + post-load-pipeline correlation + late-tail phase-order correlation + staged-profile-rehydrate correlation" +0x00442400,930,shell_setup_load_selected_profile_bundle_into_payload_record,shell,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Setup-side payload loader beneath `shell_setup_window_publish_selected_profile_labels_and_preview_surface` `0x00502220`. The helper takes one staged profile-path seed in `ECX`, one destination payload record in `EDX`, and one small caller flag on the stack; clears the full `0x100f2`-byte payload record; builds one rooted input path from either the default setup file-root query at `0x004839e0` or the caller's alternate root override; opens that bundle through `0x00530c80`; and then branches on `shell_setup_query_file_list_uses_map_extension_pattern` `0x004839b0` to read the structured chunk families through `0x00531150` and `0x00531360`. The ordinary saved-profile side reads the smaller startup payload and preview-surface chunks rooted at ids `0x0001` and `0x03c2`, while the map-style side reads the larger setup payload chunks rooted at ids `0x0004`, `0x2ee0`, and `0x2ee1`, with the exact chunk mix gated by the parsed bundle-header word in the local scratch. Current grounded caller is `0x00502220`, which immediately follows this helper by copying payload fields `+0x14/+0x3b2/+0x3ba/+0x20` into the staged runtime profile through `0x0047be50`.","objdump + local disassembly + caller inspection + chunk-family correlation" +0x004425d0,139,shell_setup_validate_selected_profile_bundle_and_stage_launch_profile,shell,cdecl,inferred,objdump + local disassembly + caller inspection,3,"Validated setup-profile launch helper above shell request `0x0cc`. It allocates one large local scratch block, re-enters `shell_setup_load_selected_profile_bundle_into_payload_record` `0x00442400` on the caller path seed, and only proceeds when the loaded payload carries a nonzero leading byte. On success it force-stages runtime-profile byte `[0x006cec7c+0xc5] = 1`, copies payload byte `+0x22` into profile `+0xc4`, copies payload byte `+0x33` into profile `+0x7d`, mirrors the payload token block `+0x23..+0x32` into profile `+0xc6..+0xd5`, and then issues shell request `0x0cc` through `0x0054e790`. Current grounded callers are the validated setup launch controls inside `shell_setup_window_handle_message` `0x005033d0`, where selector-`3` and selector-`5` siblings share this same staging bridge before the later startup-profile owner runs.","objdump + local disassembly + caller inspection + setup-launch correlation + runtime-profile-staging correlation" +0x0044c450,96,world_rebuild_all_grid_cell_candidate_cargo_service_bitsets,map,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Late world-reactivation sweep inside `world_entry_transition_and_runtime_bringup` `0x00443a50`. The helper walks the full live world grid rooted at `[this+0x2129]` through dimensions `[this+0x2145/+0x2149]`, resolves each cell pointer, and re-enters `placed_structure_rebuild_candidate_cargo_service_bitsets` `0x0042c690` on every cell record. Current grounded caller is the later world-entry tail at `0x444b24`, immediately after `world_clear_and_reseed_region_center_world_grid_flag_bit` `0x0044c4b0` and before the route-style link rebuild at `0x468300`, so this is the current safest read for the world-wide grid-cell cargo-service-bitset refresh wrapper rather than another generic world-grid loop.","objdump + local disassembly + caller inspection + world-grid correlation + cargo-service correlation" +0x0044c4b0,192,world_clear_and_reseed_region_center_world_grid_flag_bit,map,cdecl,inferred,objdump + local disassembly + caller inspection,3,"Late world-reactivation helper inside `world_entry_transition_and_runtime_bringup` `0x00443a50`. The first sweep walks the full live world grid rooted at `[0x0062c120+0x2129]` through dimensions `[+0x2145/+0x2149]` and clears bit `0x10` in each cell byte `[cell+0xe6]`. It then walks the live region collection at `0x0062bae0`, keeps only regions whose class byte `[region+0x23e]` is zero, resolves one representative center cell through `world_region_resolve_center_world_grid_cell` `0x00455f60`, and sets that same bit on the resolved cell. Current grounded caller is the later world-entry tail at `0x444b19`, between the post-bundle runtime refresh phase and the later shell or company-cache follow-ons, so this is the current safest read for the region-center world-grid flag reseed pass rather than another generic grid scrub.","objdump + local disassembly + caller inspection + region-grid correlation" +0x0044ce60,272,world_scan_secondary_grid_marked_cell_bounds,map,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Secondary world-raster bounds scan beneath the later world-entry reactivation tail. The helper clears cached fields `[this+0x21c6/+0x21ca/+0x21ce/+0x21d2/+0x21d6]`, requires the shell-state gate `[0x006cec78+0x4af3]` to be nonzero, and then scans the byte raster rooted at `[this+0x2135]` through dimensions `[this+0x2155/+0x2159]`. Every cell whose byte has any bits in mask `0x3e` contributes to the cached min-X, min-Y, max-X, max-Y, and marked-cell-count slots at those same `0x21c6..0x21d6` fields. Current grounded callers are the later world-entry tail at `0x444c36`, one neighboring startup-side world branch at `0x448168`, and the small count accessor at `0x42f8d8`, so this is the safest current read for the shared marked-cell bounding-box scan over the secondary world raster rather than a fully player-facing overlay owner.","objdump + local disassembly + caller inspection + secondary-raster correlation" 0x00444dd0,3301,map_bundle_open_reference_databases,map,cdecl,inferred,ghidra-headless,3,Opens and registers a broad reference-database bundle for the active map path. The routine formats %1\\%2 paths allocates bundle state through 0x00530c80 and wires many global datasets including gpdLabelDB gpdCityDB and related city geographic and map reference tables before later shell and map loaders continue.,ghidra + rizin + llvm-objdump + strings 0x00445ac0,790,shell_map_file_entry_coordinator,map,cdecl,inferred,objdump + analysis-context,4,"Broad shell-side file-open and restore coordinator reached from tutorial launch shell UI editor-panel flows and scenario batch processing. It accepts either an incoming filename seed or a generated Quicksave base name and then chooses between the heavier world-entry branch at 0x00443a50 and the sibling saved-runtime restore branch at 0x00446d40. Bit 0x1 in its flag argument now grounds the Quicksave path from the shared string table at 0x005ca9cc. The non-Quicksave interactive path is tighter now too: it routes through shell_file_request_dialog_collect_target_path at 0x004dd010 using load mode 4=.gmp when EditorPanel.win is live and the paired non-editor open modes 8=.gms 9=.gmc and 10=.gmx. The shell-state master flag `[0x006cec74+0x68]` now reinforces that same mapping on the direct Quicksave branch too: when it is nonzero the coordinator appends the `.gmp` token immediately instead of choosing among the scenario families, which makes the flag the strongest current shell-side anchor for editor-map mode rather than a generic post-load toggle. Current surrounding shell evidence now makes the non-editor trio much less anonymous: `.gmx` aligns with sandbox mode because the sibling shell branch at 0x004dc923 gates on 0x006cec7c+0x82 and surfaces string 3898 `The briefing is not available in sandbox games`; `.gmc` aligns with campaign scenarios because 0x004dc9cd gates on 0x006cec7c+0xc5 and surfaces string 3018 about resigning back to the campaign screen; the remaining default `.gms` branch is therefore the standalone scenario family. When a live runtime world is already active the helper appends .smp instead of the non-runtime extensions before the restore branch continues.",objdump + analysis-context + caller xrefs + strings + mode-table inspection + string correlation + Quicksave branch inspection 0x00445de0,1115,shell_map_file_world_bundle_coordinator,map,cdecl,inferred,objdump + analysis-context,4,"Broad shell-side file-save and package coordinator used by direct shell commands scenario batch processing and neighboring shell-editor callers. It accepts either an incoming filename seed a generated Quicksave base name from flag bit 0x1 or the localized `Autosave` seed from flag bit 0x2 string id 387. Its non-Quicksave interactive path is now tighter: it routes through shell_file_request_dialog_collect_target_path at 0x004dd010 using save mode 3=.gmp for the editor-map package path 0=.gms for standalone scenarios 1=.gmc for campaign-scenario saves and 2=.gmx for sandbox saves plus one auxiliary 11=.gmt branch reached only through the separate 0x00434050 check on the side owner at 0x006cd8d8. The shell-state master flag `[0x006cec74+0x68]` now reinforces that editor mapping on the direct save and Quicksave side too: when it is nonzero the coordinator chooses the `.gmp` package mode immediately before the scenario-family checks, which makes the flag the strongest current shell-side anchor for editor-map mode rather than a generic setup toggle. That `.gmt` path no longer looks like another scenario family: when the auxiliary owner is present the coordinator packages the chosen path into the owner-local request block near 0x006cd8d8+0x8f48 and submits it through 0x00469d30; only when that owner is absent does it fall back to map_bundle_open_reference_databases at 0x00444dd0. The campaign mapping is now backed by the numbered `%s%02d.gmc` helper at 0x00517c70 which formats one campaign-progress slot from 0x006cec7c+0xc4 before re-entering this coordinator, while the sandbox mapping is backed by the neighboring shell restriction string 3898 on 0x006cec7c+0x82. When a live runtime world is active the mainline branch still appends .smp and invokes world_runtime_serialize_smp_bundle at 0x00446240. This makes the helper the save-side sibling of shell_map_file_entry_coordinator rather than another restore dispatcher, with `.gmt` now bounded as an auxiliary preview-surface side path instead of a fourth gameplay save family.",objdump + analysis-context + caller xrefs + strings + mode-table inspection + string correlation + side-owner branch inspection + direct save branch inspection -0x00446240,2807,world_runtime_serialize_smp_bundle,map,cdecl,inferred,objdump + analysis-context,3,Serializes the current live world state into the `.smp` branch used by shell_map_file_world_bundle_coordinator. After dismissing the shell detail controller and running one shell-state service step it allocates a bundle through 0x00530c80 seeds many typed records through repeated 0x00531030 and 0x00531340 calls walks world collections under 0x0062c120 and 0x006ada80 and emits runtime-state payloads through helpers such as 0x00534e50 0x00534ec0 0x00534f00 and 0x00534f40 before finalizing through 0x00530a00. Current grounded caller is 0x00445de0 on the `.smp` path so this looks like the live-world save or package serializer rather than the restore path.,objdump + analysis-context + caller xrefs + strings -0x00446d40,5401,world_load_saved_runtime_state_bundle,map,cdecl,inferred,objdump + analysis-context,4,Loads one saved runtime world-state bundle from the `.smp` branch selected by shell_map_file_entry_coordinator. The helper dismisses the shell detail controller releases the prior world runtime drives shell mode and status transitions builds a bundle through 0x00530c80 and repeated 0x00531150 reads allocates a new world root at 0x0062c120 through 0x0044cf70 and then fills that root through repeated grid and object writes including 0x0044dca0 0x00448c20 0x00448cb0 0x00448d90 0x00448e60 0x00448e90 and 0x0044de30. This is the first grounded gameplay save-load restore dispatcher for `.smp` content rather than the broader reference-database map-entry flow.,objdump + analysis-context + caller xrefs + strings +0x00455f60,96,world_region_resolve_center_world_grid_cell,map,thiscall,inferred,objdump + local disassembly + caller inspection,3,"Small region-to-grid resolver that converts one region's cached center coordinate pair into a pointer into the live world-grid cell table rooted at `[0x0062c120+0x2129]`. It reads the cached floats at `[this+0x1ea]` and `[this+0x1e2]`, scales and rounds them through `0x005a10d0`, multiplies the Y-like term by world width `[0x0062c120+0x2145]`, adds the X-like term, and returns the corresponding grid-cell pointer. Current grounded callers include the world-entry region-center flag reseed pass `0x0044c4b0` and several older site- or route-style world-grid query helpers, so this is now the safest current read for the shared region-center world-grid-cell resolver.","objdump + local disassembly + caller inspection + world-grid correlation" +0x00446240,2807,world_runtime_serialize_smp_bundle,map,cdecl,inferred,objdump + analysis-context,3,"Serializes the current live world state into the `.smp` branch used by shell_map_file_world_bundle_coordinator. After dismissing the shell detail controller and running one shell-state service step it allocates a bundle through 0x00530c80 seeds many typed records through repeated 0x00531030 and 0x00531340 calls walks world collections under 0x0062c120 and 0x006ada80 and emits runtime-state payloads through helpers such as 0x00534e50 0x00534ec0 0x00534f00 and 0x00534f40; the raster side is tighter now too, because the serializer writes the two one-byte overlay mask planes separately through chunk ids `0x2cee` for `[world+0x1655]` and `0x2d51` for `[world+0x1659]`, then re-enters world_serialize_four_sidecar_byte_planes_into_runtime_bundle `0x00448fe0` to write four additional byte planes under chunk family `0x9471..0x9472` from the world-owned pointer band at `[world+0x1631 + index*4]` before finalizing through 0x00530a00. Current grounded caller is 0x00445de0 on the `.smp` path so this looks like the live-world save or package serializer rather than the restore path.","objdump + analysis-context + caller xrefs + strings + sidecar-plane correlation + mask-plane bundle-tag correlation" +0x00446d40,5401,world_load_saved_runtime_state_bundle,map,cdecl,inferred,objdump + analysis-context,4,"Loads one saved runtime world-state bundle from the `.smp` branch selected by shell_map_file_entry_coordinator. The helper dismisses the shell detail controller releases the prior world runtime drives shell mode and status transitions builds a bundle through 0x00530c80 and repeated 0x00531150 reads allocates a new world root at 0x0062c120 through 0x0044cf70 and then fills that root through repeated grid and object writes, including the secondary-raster class mutators world_secondary_raster_reclass_cell_to_low3bit_1_or_4_and_clear_primary_companion_plane `0x00448c20` and world_secondary_raster_reclass_cell_to_low3bit_3_or_5_and_clear_primary_companion_plane `0x00448cb0`, the byte2-flag and companion-byte writers `0x00448d90`, `0x00448e60`, and `0x00448e90`, and the broader restore-side world-cell helper `0x0044de30`; the raster side is tighter now too, because the loader restores the two one-byte overlay mask planes separately from chunk ids `0x2cee` into `[world+0x1655]` and `0x2d51` into `[world+0x1659]`, and then, for versioned bundles at `>= 0x3ec`, re-enters world_load_four_sidecar_byte_planes_from_runtime_bundle `0x00448f60` to restore four extra byte planes under chunk family `0x9471..0x9472` into the world-owned pointer band `[world+0x1631 + index*4]`. This is the first grounded gameplay save-load restore dispatcher for `.smp` content rather than the broader reference-database map-entry flow.","objdump + analysis-context + caller xrefs + strings + sidecar-plane correlation + mask-plane bundle-tag correlation" 0x0044fb70,1117,world_compute_transport_and_pricing_grid,map,cdecl,inferred,objdump + strings + callsite inspection,3,"Post-load world-generation subphase inside world_run_post_load_generation_pipeline. Reached directly under the localized progress update `Computing Transportation and Pricing...`, the helper iterates the active world grid through dimensions and bounds rooted at `[0x0062c120+0x2145]`, `[+0x2149]`, `[+0x2155]`, `[+0x2159]`, and `[+0x2129]`, samples neighborhood offsets from `0x00624b28` and `0x00624b48`, combines local terrain or transport values through repeated calls to `0x00534e50` and `0x00448aa0`, and writes bounded 16-bit results back into the grid cells. This now looks like the map-wide transportation-cost or pricing-field computation pass rather than a recurring simulation-step loop.",objdump + caller context + RT3.lng strings -0x004882e0,199,world_region_border_overlay_rebuild,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Rebuilds the border-overlay companion for the numbered region set owned by `0x0062bae0`. After pumping shell progress through `0x004834e0` the helper seeds a companion record family on `0x006cfc9c`, counts active region entries, scans the active world grid at `0x0062c120`, compares neighboring cell-region ids, and emits border-segment geometry through `0x00536ea0` whenever adjacent cells belong to different mapped regions. Current grounded callsites are the post-load generation pipeline at `0x004384d0` and the broader world-build path around `0x00447560`, which makes this look like a region-border overlay rebuild rather than another generic player or company manager pass.","objdump + caller xrefs + RT3.lng strings + grid-neighbor inspection" +0x00487540,221,world_region_border_overlay_reset_companion_record,map,thiscall,inferred,objdump + caller xrefs + field-reset inspection,4,"Shared companion-record initializer under the region-border overlay family rooted at `0x006cfc9c`. The helper zeroes the live region id and accumulated contribution fields, seeds the enable and remap dwords at `[this+0x31]` and `[this+0x35]` to `1`, seeds the budget-like dword `[this+0x39]` to `0x186a0`, clears the paired float or score bands at `[this+0x45/+0x49/+0x4d/+0x51]` and `[this+0x1fd/+0x201/+0x205/+0x209]`, zeros the later summary slots at `[this+0xd51..+0xd69]`, resets `[this+0xd4d]` to `1`, and clears the two large tail arrays rooted at `[this+0x3b5]` and `[this+0xd6d]`. Current grounded callers are the plain wrapper `0x00487620` and the id-setting wrapper `0x00487650`, both used under world_region_border_overlay_rebuild.","objdump + caller xrefs + field-reset inspection" +0x00487650,16,world_region_border_overlay_reset_companion_record_and_assign_region_id,map,thiscall,inferred,objdump + caller xrefs + wrapper inspection,4,"Thin wrapper around world_region_border_overlay_reset_companion_record. After resetting the full companion record, the helper stores the caller-supplied live region id into `[this+0x00]` and returns. Current grounded callers are the region-border overlay setup loops at `0x00487d77` and `0x0048836e`.","objdump + caller xrefs + wrapper inspection" +0x004881b0,272,world_region_border_overlay_refresh_raw_region_cell_counts_from_world_grid,map,thiscall,inferred,objdump + caller xrefs + raster-count inspection,4,"Shared region-raster counting pass over the companion region set `0x006cfc9c`. The helper zeroes one `0x3e8`-entry local count table, sweeps the active world raster at `[0x0062c120+0x2131]` across `[world+0x2155/+0x2159]`, keeps only cells whose secondary-raster low-3-bit tag predicate `world_secondary_raster_query_cell_low3bit_tag_nonzero` `0x00448f00` returns `0`, and bins each surviving cell by the compact region id `cell_byte >> 3`. It then walks the companion region records, stores the corresponding raw cell count into `[entry+0x3d]`, and clears `[entry+0x41]` before later owners fold or reuse those totals. Current grounded callers are the region-border overlay rebuild at `0x004882e0`, the world-build paths around `0x004431ea`, `0x004476ad`, `0x0044f657`, and `0x0044fb43`, plus one shell-side caller at `0x004fcc05`.","objdump + caller xrefs + raster-count inspection + caller correlation + secondary-raster predicate correlation" +0x00487de0,752,world_region_border_overlay_emit_segment_geometry_from_region_grid,map,cdecl,inferred,objdump + caller xrefs + grid-neighbor inspection,4,"Heavy inner geometry pass under world_region_border_overlay_rebuild. The helper first clears or prepares the current overlay surface through `0x00533cf0` on the active world presentation rooted at `0x0062c120`, then walks the companion region-set family at `0x006cfc9c`, counting entries whose enable byte `[entry+0x31]` is nonzero or whose accumulated contribution pair `[entry+0x3d]+[entry+0x41]` stays positive. It seeds a local remap table from either the live region id `[entry+0x00]` or the fallback remap id `[entry+0x35]`, scans the world raster at `[world+0x2131]` across `[world+0x2155/+0x2159]` in two axis directions, compares neighboring mapped ids, and emits border-segment geometry through `0x00536ea0` whenever adjacent cells belong to different mapped regions. Current grounded caller is `0x004882c6` under world_region_border_overlay_rebuild.","objdump + caller xrefs + grid-neighbor inspection + geometry-emitter inspection" +0x004882e0,199,world_region_border_overlay_rebuild,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Rebuilds the border-overlay companion for the numbered region set owned by `0x0062bae0`. After pumping shell progress through `0x004834e0` the helper seeds or refreshes the companion record family at `0x006cfc9c`, using world_region_border_overlay_reset_companion_record_and_assign_region_id `0x00487650` to reset each resolved record before folding active contribution counts back into `[entry+0x3d]+[entry+0x41]`. It then refreshes the raw per-region cell-count band through world_region_border_overlay_refresh_raw_region_cell_counts_from_world_grid `0x004881b0`, and only after that hands the actual world-grid border-segment emission to `world_region_border_overlay_emit_segment_geometry_from_region_grid` `0x00487de0`. Current grounded callsites are the post-load generation pipeline at `0x004384d0` and the broader world-build path around `0x00447560`, which makes this look like a region-border overlay rebuild rather than another generic player or company manager pass.","objdump + caller xrefs + RT3.lng strings + grid-neighbor inspection" +0x00533cf0,180,world_region_border_overlay_clear_all_chunk_segment_queues,map,thiscall,inferred,objdump + caller xrefs + queue teardown inspection,4,"One-owner teardown helper under world_region_border_overlay_emit_segment_geometry_from_region_grid. The helper walks every coarse chunk bucket in the world-presentation table `[this+0x167d]`, and for each bucket with queued nodes it repeatedly pops the queued payload pointers through `0x00556ef0/0x00556f00`, frees those segment records through `0x005a1145`, and then resets the bucket through `0x005570b0`. Current grounded caller is `0x00487df8`, which uses it to clear the prior border-overlay segment queues before rebuilding them from the live region grid.","objdump + caller xrefs + queue teardown inspection" +0x00536ea0,96,world_region_border_overlay_allocate_and_queue_segment_record,map,thiscall,inferred,objdump + caller xrefs + intrusive-queue inspection,4,"One-owner record allocator under world_region_border_overlay_emit_segment_geometry_from_region_grid. The helper allocates one `0x31`-byte segment record through `0x005a125d`, copies the caller-supplied endpoint and orientation fields into that record, optionally expands cached float coordinates through repeated `0x00534490` calls when the final byte flag is nonzero, resolves one coarse bucket in `[this+0x167d]` from the segment midpoint, and appends the finished record to that bucket through `intrusive_queue_push_back` `0x00556e10`. Current grounded caller is `0x00488072` inside the border-overlay geometry emitter.","objdump + caller xrefs + intrusive-queue inspection + segment midpoint bucketing" +0x005331e0,592,world_rebuild_overlay_sample_triplet_cell_for_scale,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Scale-specific local reducer under the secondary-overlay multiscale support family. Given one selected cell plus one scale index, the helper clamps a local neighborhood to the live world bounds, walks the per-scale float surface rooted at `[this+0x15ed + scale*4]`, accumulates three float channels across that neighborhood, normalizes by sample count, rescales the local vector magnitude against shared constants, and writes one packed three-float sample record into the matching per-scale triplet buffer family rooted at `[this+0x15f1 + (scale-1)*4]`. Current grounded callers are `0x00533845` and `0x00533929`, both inside `world_rebuild_secondary_overlay_multiscale_support_surfaces_in_rect` `0x00533890`.","objdump + caller inspection + field correlation + multiscale-support correlation" +0x00532590,455,world_presentation_reset_overlay_runtime_state_and_pointer_roots,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Broad hard-reset owner beneath the world-presentation overlay family. The helper clears the live overlay-state bytes `[this+0x1588/+0x1599/+0x159b/+0x15b4]`, reseeds `[this+0x159a]` to `1`, resets scalar fields like `[this+0x154c/+0x155c/+0x15d9/+0x15d5]`, nulls the main pointer roots `[this+0x478]`, `[this+0x1558..+0x1570]`, `[this+0x159c/+0x15a0]`, `[this+0x15e1]`, the support-family roots `[this+0x1605/+0x15f1/+0x1619/+0x162d]`, the four sidecar byte planes `[this+0x1631..+0x163d]`, both mask planes `[this+0x1655/+0x1659]`, the packed raster `[this+0x165d]`, the vector byte planes `[this+0x1661/+0x1665]`, and the neighboring overlay tables `[this+0x1669..+0x1685]`, then zero-fills the local `0x100` slot band at `[this+0x08]` and the `0x1b`-entry companion slot table at `[this+0x40c]`. Current grounded callers are the local constructor at `0x00534f73` and the broader presentation reinitializer `0x00537e70`, so this is the safest current read for the shared overlay-family hard reset rather than a narrow resize helper.","objdump + caller inspection + field correlation + overlay-reset correlation" +0x00532d90,464,world_normalize_secondary_overlay_float_summary_plane_globally,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Global normalization pass over the base secondary-overlay float summary plane rooted at `[this+0x1605]`. The helper first scans the full live plane across `[this+0x15d9/+0x15d5]` to find one global maximum, clamps that maximum into a stable range, synthesizes a `0..100` weight table from the resulting scale factor, and then reruns the full plane to remap every positive cell through that table. Current grounded caller is `0x005385ea` inside the larger secondary-overlay rebuild owner around `0x00538360`, immediately before the companion radius-expansion pass `0x00532f60`.","objdump + caller inspection + field correlation + global-normalization correlation" +0x00532f60,403,world_expand_positive_secondary_overlay_float_summary_by_radius,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Radius-style expansion pass over the same base secondary-overlay float summary plane rooted at `[this+0x1605]`. Given one caller radius, the helper walks the full live plane, keeps only positive source cells, samples their local neighborhood with distance falloff, and writes back the strongest surviving propagated value into the same float plane. Current grounded caller is `0x005385fd` inside the larger secondary-overlay rebuild owner around `0x00538360`, immediately after `world_normalize_secondary_overlay_float_summary_plane_globally` `0x00532d90`.","objdump + caller inspection + field correlation + radius-expansion correlation" +0x00532ad0,81,world_presentation_allocate_overlay_slot_from_static_template,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small shared slot allocator over the local `0x100` overlay pointer band at `[this+0x08]`. The helper finds the first empty slot, forwards the caller-supplied static template row into `0x0053c1c0` together with the fixed tuple `(0, 0, 0x7f)`, stores the resulting object pointer into `[this+0x08 + slot*4]`, and increments live count `[this+0x04]`. Current grounded callers are the neighboring setup owners `0x00535070`, `0x005356e0`, and `0x00535890`, the broader reinitializer `0x00537e60`, and one earlier world-presentation branch at `0x00454f40`, so this is the safest current read for the shared static-template overlay-slot allocator rather than one narrow UI control helper.","objdump + caller inspection + field correlation + static-template correlation" +0x00532c80,529,world_allocate_base_secondary_overlay_planes_for_current_dimensions,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Lower secondary-overlay allocator or reset owner for the current world-grid dimensions. The helper clears shift field `[this+0x15e1]`, optionally overwrites live grid dimensions `[this+0x15d9/+0x15d5/+0x15dd]` from caller width and height, allocates the base float-summary plane `[this+0x1605]`, the four sidecar byte planes `[this+0x1631..+0x163d]`, the two one-byte mask planes `[this+0x1655]` and `[this+0x1659]`, and the packed secondary 3-byte raster `[this+0x165d]`, then seeds those planes with their default byte patterns: `0x02` for the primary mask plane, `0x01` for the secondary mask plane, and zero for the packed raster. Current grounded callers are the broader presentation reinitializer `0x00537e60` and the shell-side size-reset path around `0x00537f1a`, so this is the safest current read for the base secondary-overlay plane allocator rather than the wider multiscale support owner.","objdump + caller inspection + field correlation + mask-plane default correlation" +0x00533430,368,world_rebuild_overlay_float_plane_cell_for_scale,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Scale-specific float-plane sibling under the secondary-overlay multiscale support family. The helper clamps one local neighborhood around the selected cell, reads the contributing float samples from the per-scale plane rooted at `[this+0x1601 + (scale-1)*4]`, averages that neighborhood, and stores the resulting float into the companion per-scale summary plane family rooted at `[this+0x1605 + (scale-1)*4]` for the same cell. Current grounded callers are `0x0053384f` and `0x00533933`, both inside `world_rebuild_secondary_overlay_multiscale_support_surfaces_in_rect` `0x00533890`.","objdump + caller inspection + field correlation + multiscale-support correlation" +0x005335a0,320,world_rebuild_overlay_rank_u16_plane_cell_for_scale,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Scale-specific 16-bit smoothing sibling under the same multiscale support family. The helper reads one per-scale unsigned-word plane from the family rooted at `[this+0x1615 + (scale-1)*4]`, gathers the clamped eight-neighbor ring around the selected cell, averages those values, and stores the resulting word into the companion smoothed-plane family rooted at `[this+0x1619 + (scale-1)*4]`. Current grounded callers are `0x00533859` and `0x0053393d`, both inside `world_rebuild_secondary_overlay_multiscale_support_surfaces_in_rect` `0x00533890`.","objdump + caller inspection + field correlation + multiscale-support correlation" +0x00533890,224,world_rebuild_secondary_overlay_multiscale_support_surfaces_in_rect,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Rectangle-wide multiscale support-surface rebuild above the raw secondary-overlay byte planes. The helper clamps the caller rectangle to the live world bounds, then for scale levels `1..4` downshifts that rectangle and re-enters three scale-specific reducers: `world_rebuild_overlay_sample_triplet_cell_for_scale` `0x005331e0` refreshes the five-entry packed sample-triplet buffer family rooted at `[this+0x15f1..+0x1601]`, `world_rebuild_overlay_float_plane_cell_for_scale` `0x00533430` refreshes the five-entry float summary family rooted at `[this+0x1605..+0x1615]`, and `world_rebuild_overlay_rank_u16_plane_cell_for_scale` `0x005335a0` refreshes the five-entry smoothed unsigned-word family rooted at `[this+0x1619..+0x1629]`. Current grounded caller is `0x005375b2` inside the larger rect owner `0x005374d0`, and the same helper also has one tiny local wrapper at `0x00533845..0x00533859`, so this is the safest current read for the shared multiscale secondary-overlay support rebuild rather than another raw cell accessor.","objdump + caller inspection + field correlation + multiscale-support correlation" +0x00533970,7,world_query_world_grid_max_x_cell_index,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny dimension getter over the live world-grid family. The helper returns the cached maximum X cell index from `[this+0x15d9]` directly. Current grounded callers are shell-side presentation and staging branches around `0x0043b0ea`, `0x0044d893`, `0x00523edd`, `0x00524e9b`, `0x00525b4c`, `0x005266ae`, and `0x0056935e`, which consistently pair it with `world_query_world_grid_max_y_cell_index` `0x00533980` rather than treating it as a more player-facing world metric.","objdump + caller inspection + field correlation" +0x00533980,7,world_query_world_grid_max_y_cell_index,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Y-axis sibling of world_query_world_grid_max_x_cell_index. The helper returns the cached maximum Y cell index from `[this+0x15d5]` directly. Current grounded callers are the same shell-side presentation and staging branches that pair it with `0x00533970`, including `0x0043b101`, `0x0044d8af`, `0x00523eeb`, `0x00524ea6`, `0x00525b57`, `0x005273e9`, and `0x00569368`.","objdump + caller inspection + field correlation" +0x00533ae0,7,world_query_secondary_raster_root,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny root-pointer getter for the packed secondary 3-byte cell raster at `[this+0x165d]`. Current grounded callers include shell-side staging branches around `0x00524eb1` and `0x00569351`, while the same root is also consumed directly by the neighboring secondary-raster read/write helpers `0x00448eec..0x00448f57` and several world-side scans, so this is the safest current read for the raw secondary-raster base accessor.","objdump + caller inspection + field correlation + secondary-raster correlation" +0x00533af0,7,world_query_secondary_overlay_vector_x_byte_plane_root,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny root-pointer getter for the signed X-component overlay vector byte plane at `[this+0x1661]`. Current grounded callers are the shell-side staging path around `0x0056933d`, while neighboring byte read/write helpers at `0x00448e60` and `0x00448ec0` plus the rectangle rebuild pass `0x00536710` use the same root directly.","objdump + caller inspection + field correlation + vector-plane correlation" +0x00533b00,7,world_query_secondary_overlay_vector_y_byte_plane_root,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny root-pointer getter for the signed Y-component overlay vector byte plane at `[this+0x1665]`. Current grounded callers are the shell-side staging path around `0x00569347`, and the same root is consumed directly by `world_secondary_overlay_vector_y_byte_plane_query_cell_value` `0x00448ee0`, `world_secondary_overlay_vector_y_byte_plane_set_cell_value` `0x00448e90`, and the rectangle rebuild pass `0x00536710`.","objdump + caller inspection + field correlation + vector-plane correlation" +0x00533b10,7,world_query_companion_float_raster_root,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny root-pointer getter for the companion float raster family rooted at `[this+0x1605]`. Current grounded callers are shell-side presentation and staging branches around `0x00524e87`, `0x0052525b89`, `0x00526bb4`, `0x00528253`, `0x0052ae97`, `0x0052b4fa`, `0x0054dd60`, and `0x0056b2dd`, which consistently pair it with neighboring LUT or dimension getters rather than treating it as a gameplay scalar owner.","objdump + caller inspection + field correlation" +0x00533b20,7,world_query_overlay_normalized_x_coordinate_lut_ptr,map,thiscall,inferred,objdump + caller inspection + allocation-path inspection,3,"Tiny root-pointer getter for the X-axis normalized coordinate lookup table at `[this+0x15e9]`. The table is allocated in the world-presentation setup path around `0x00537b48` and then filled from the current grid width quarter-count in `0x00537c45..0x00537c5c`. Current grounded caller is the shell-side overlay staging branch at `0x00525b65`, which consumes it together with the Y-axis sibling and the companion sample tables.","objdump + caller inspection + allocation-path inspection + field correlation" +0x00533b30,7,world_query_overlay_normalized_y_coordinate_lut_ptr,map,thiscall,inferred,objdump + caller inspection + allocation-path inspection,3,"Y-axis sibling of world_query_overlay_normalized_x_coordinate_lut_ptr. The helper returns the normalized coordinate lookup table pointer from `[this+0x15ed]`. The table is allocated in the same setup path around `0x00537b28` and filled from the current grid height quarter-count in `0x00537c82..0x00537c99`. Current grounded caller is the same shell-side overlay staging branch at `0x00525b70`.","objdump + caller inspection + allocation-path inspection + field correlation" +0x00533b40,13,world_query_sidecar_byte_plane_ptr_by_index,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny indexed accessor over the four-plane sidecar byte-raster family rooted at `[this+0x1631]`. The helper treats the caller byte argument as an index `0..3` and returns the corresponding plane pointer from `[this+0x1631 + index*4]`. Current grounded callers include the four-plane bundle load/save siblings `0x00448f60` and `0x00448fe0`, plus shell-side plane-copy branches around `0x004f5ae6`, `0x004f5bfb`, `0x004f5cc7`, and `0x0052b0a4`, so this is the safest current read for the shared sidecar byte-plane pointer accessor rather than a more player-facing raster helper.","objdump + caller inspection + field correlation + sidecar-plane correlation" +0x00533b50,7,world_query_secondary_overlay_primary_mask_byte_plane_root,map,thiscall,inferred,objdump + caller inspection + allocation-path inspection,3,"Tiny root-pointer getter for the primary mask or occupancy byte plane at `[this+0x1655]`. The plane is allocated in the world-presentation setup path around `0x0053775e` and initialized to byte value `0x02`. Current grounded callers are the shell-side overlay staging branch at `0x00525b9f`, several world-side mutators around `0x00448c38`, `0x00448cc8`, and `0x00448d53`, the later vector-field rebuild path `0x00536710`, and the neighboring world-side scan around `0x005383f0`, which all treat nonzero cells in this plane as blocking, occupied, or already-classified samples.","objdump + caller inspection + allocation-path inspection + field correlation + mask-plane correlation" +0x00533b60,7,world_query_secondary_overlay_secondary_mask_byte_plane_root,map,thiscall,inferred,objdump + caller inspection + allocation-path inspection,3,"Tiny root-pointer getter for the second one-byte overlay mask plane at `[this+0x1659]`. The plane is allocated in the same setup path around `0x00537799` and initialized to byte value `0x01`. The only grounded getter caller is the shell-side overlay staging branch at `0x00525bad`, and that branch immediately discards the returned pointer before calling `0x005458a0`. Beyond that, current local evidence only grounds allocation, default-seed, bulk copy, bundle save-load, zero-fill, rectangle-clear, teardown, and existence-gate behavior on this plane, not a distinct semantic reader comparable to the primary mask plane at `[this+0x1655]`. Taken together with the asymmetry in `0x00538360`, the safest current read is that this is the separately persisted secondary mask-plane base accessor, not a second actively rebuilt runtime mask root.","objdump + caller inspection + allocation-path inspection + field correlation + negative-consumer correlation + persisted-sibling-plane correlation" +0x00536710,1660,world_rebuild_secondary_overlay_vector_byte_planes_in_rect,map,thiscall,inferred,objdump + caller inspection + field correlation,4,"Rectangle-wide rebuild pass over the secondary overlay byte-plane family. The helper clamps the caller rectangle to the live world bounds, scans the packed secondary raster at `[this+0x165d]` together with the primary mask plane `[this+0x1655]`, clears or preserves local state according to the low-3-bit class families, writes signed distance-scaled byte components into the paired vector planes `[this+0x1661]` and `[this+0x1665]`, and invalidates four neighboring sidecar byte planes at `[this+0x1631/+0x1635/+0x1639/+0x163d]` where needed. Current grounded callers are the post-build world-side rectangle refresh around `0x0044f6d7` and the two local owner passes at `0x005374bf` and `0x0053759b`, so this is the safest current read for the shared overlay-vector rebuild owner rather than another tiny cell helper.","objdump + caller inspection + field correlation + vector-plane correlation + sidecar-plane invalidation correlation" +0x00535070,138,world_presentation_ensure_primary_overlay_surface_or_fallback_template_slot,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small setup owner under the broader world-presentation reinitializer. The helper clears the local `0x100` overlay slot band `[this+0x08]`, resets live count `[this+0x04]`, and then splits on the shell presentation gate at `[0x006d4024+0x11422e]`: when that gate is armed it allocates one `0xec`-byte surface object, initializes it through `0x00541b00` and `0x005417e0` with the current shell root plus fixed `0x100 x 0x100` dimensions, stores the resulting object in slot `0`, and updates byte `[0x006d4024+0x1146eb]` on failure; otherwise it falls back to one static-template slot allocation through `world_presentation_allocate_overlay_slot_from_static_template` `0x00532ad0` using template row `0x005dd26c`. Current grounded caller is `world_presentation_apply_grid_dimensions_and_reinitialize_secondary_overlay_family` `0x00537e60`, so this is the safest current read for the primary overlay-surface-or-template setup owner rather than a more specific player-facing panel builder.","objdump + caller inspection + field correlation + static-template correlation" +0x005356e0,428,world_presentation_seed_first_overlay_slot_band_from_static_templates,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Static-template slot-band seeder under the broader world-presentation reinitializer. The helper allocates or reuses one anchor slot through `world_presentation_allocate_overlay_slot_from_static_template` `0x00532ad0` using template row `0x005dd2b0`, records that anchor index and running count in `[this+0x1568]` and `[this+0x156c]`, then seeds a contiguous slot band from template rows `0x005dd2a4` upward for ids `0x66..0x84`. After that first series it revisits the created slots, clears byte `[slot+0x05]`, runs `0x00542550` on the earlier series, and fills two trailing fallback slots from template rows `0x005dd298` and `0x005dd28c`, storing the resulting indices in `[this+0x1574]` and `[this+0x1578]`. Current grounded caller is `world_presentation_apply_grid_dimensions_and_reinitialize_secondary_overlay_family` `0x00537e60`, so this is the safest current read for the first template-driven overlay slot-band seeder rather than a stronger UI-label owner.","objdump + caller inspection + field correlation + static-template correlation" +0x00535890,177,world_presentation_seed_second_overlay_slot_band_from_static_templates,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Second static-template slot-band seeder under the broader world-presentation reinitializer. The helper allocates one anchor slot through `world_presentation_allocate_overlay_slot_from_static_template` `0x00532ad0` using template row `0x005dd2d0`, stores that anchor index in `[this+0x1560]`, then seeds a contiguous slot band from template rows rooted at `0x005dd2bc` for ids `2..0x20`, finally storing the terminal count `0x20` in `[this+0x1564]`. Current grounded caller is `world_presentation_apply_grid_dimensions_and_reinitialize_secondary_overlay_family` `0x00537e60`, so this is the safest current read for the second template-driven overlay slot-band seeder rather than a more player-facing overlay panel owner.","objdump + caller inspection + field correlation + static-template correlation" +0x00535430,687,world_presentation_rebuild_four_overlay_surface_slots_from_source_or_fallback,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Broader four-slot overlay-surface rebuild owner under the world-presentation reinitializer. The helper derives local dimensions through `0x005327a0`, increments the shared shell-side progress counter at `[0x006d4024+0x11427e]`, allocates one temporary RGBA buffer sized from the quarter-scaled dimensions in `[this+0x157c/+0x1580]`, and then fills that buffer either by resampling the caller-supplied source surface or by falling back to a global descriptor at `0x0062bed4` when present. It uses several shell-side resource and range queries through `0x00518de0` and `0x0053c930`, can stage a temporary source surface through `0x0053c1c0`, `0x00541930`, and `0x00541970`, and then emits up to four `0xec`-byte destination surface objects through `0x00543980`, storing them into the local overlay slot band starting at `[this+0x08 + [this+0x155c]*4]`. Current grounded callers are the broader world-presentation reinitializer `0x00537e60` and one neighboring owner at `0x00538060`, so this is the safest current read for the shared four-slot overlay-surface rebuild owner rather than a more specific UI panel constructor.","objdump + caller inspection + field correlation + temporary-surface correlation" +0x00535950,112,world_presentation_allocate_overlay_companion_record_from_static_template,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small allocator over the local `0x1b`-entry overlay companion slot table at `[this+0x40c]`. The helper finds the first empty companion slot, allocates one `0x141`-byte record, seeds it through `0x00554830` from the caller-supplied static template row, stores the resulting pointer into `[this+0x40c + slot*4]`, and increments live count `[this+0x408]`. Current grounded caller is `world_presentation_seed_default_overlay_companion_record_set` `0x005373b0`, which invokes it seven times with static template rows `0x005dd300..0x005dd378`, so this is the safest current read for the shared companion-record allocator rather than a broader overlay rebuild owner.","objdump + caller inspection + field correlation + static-template correlation" +0x00536044,468,world_presentation_release_secondary_overlay_support_buffers,map,thiscall,inferred,objdump + local inspection + field correlation,3,"Teardown owner for the secondary-overlay support family. The helper frees the five-entry packed sample-triplet family rooted at `[this+0x15f1..+0x1601]`, the five-entry float summary family rooted at `[this+0x1605..+0x1615]`, the five-entry smoothed unsigned-word family rooted at `[this+0x1619..+0x1629]`, the packed local-byte staging buffer `[this+0x162d]`, the four sidecar byte planes `[this+0x1631..+0x163d]`, the neighboring coarse-cell and support tables, both one-byte mask planes `[this+0x1655]` and `[this+0x1659]`, the packed secondary raster `[this+0x165d]`, and the signed vector byte planes `[this+0x1661]` and `[this+0x1665]`, then nulls the corresponding pointers. The body also re-enters several neighboring support-family destructors `0x00535b40/0x00535c70/0x00535d30/0x00535df0/0x00535a10/0x00535f20`, so this is the safest current read for the shared overlay-support teardown owner rather than another generic presentation reset.","objdump + local inspection + field correlation + multiscale-support correlation + teardown correlation" +0x005375c0,2144,world_presentation_ensure_secondary_overlay_support_buffers_and_seed_defaults,map,thiscall,inferred,objdump + caller inspection + allocation-path inspection,3,"Broad setup or ensure-owner above the secondary-overlay support family. When the caller-supplied enable byte is nonzero, the helper allocates and zero-fills the five-entry packed sample-triplet family rooted at `[this+0x15f1..+0x1601]`, the five-entry float summary family rooted at `[this+0x1605..+0x1615]`, the five-entry smoothed unsigned-word family rooted at `[this+0x1619..+0x1629]`, the packed local-byte staging buffer `[this+0x162d]`, the four neighboring sidecar byte planes `[this+0x1631..+0x163d]`, the packed secondary 3-byte raster `[this+0x165d]`, the signed vector byte planes `[this+0x1661]` and `[this+0x1665]`, the ranked-overlay and geographic-label coarse cell tables `[this+0x1685]` and `[this+0x1675]`, plus several neighboring support tables. The same body also allocates and seeds the two one-byte mask planes with different defaults: `[this+0x1655]` is filled with byte `0x02`, while `[this+0x1659]` is filled with byte `0x01`. Later in the same body it rebuilds the local support surfaces through `0x00536230`, `0x00536420`, `0x00537420`, and the neighbor object allocator `0x005337f0`. Current grounded callers are the shell world-mode branch at `0x00484e47`, the world-presentation resize or rebuild tail at `0x00537f44`, one neighboring world-side refresh at `0x00538629`, and the `.smp`-side restore or reload branch at `0x00553539`, so this is the safest current read for the shared secondary-overlay support-buffer ensure and default-seed owner rather than a narrower vector-field helper.","objdump + caller inspection + allocation-path inspection + multiscale-support correlation + mask-plane default correlation" +0x00537e60,503,world_presentation_apply_grid_dimensions_and_reinitialize_secondary_overlay_family,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Broader world-presentation reinitializer above the secondary-overlay family. The helper publishes one shell progress step, stores the incoming live grid dimensions into `[this+0x15d9/+0x15d5/+0x15dd]`, re-enters `world_allocate_base_secondary_overlay_planes_for_current_dimensions` `0x00532c80` when the dimensions are nonzero, then re-enters `world_presentation_ensure_secondary_overlay_support_buffers_and_seed_defaults` `0x005375c0` and several neighboring overlay initializers or constant-table publishers (`0x00535070`, `0x00535430`, `0x00532ad0`, `0x005356e0`, `0x00534fc0`, `0x00535890`, `0x005373b0`) before returning. Current grounded callers are the world-side reattach branch at `0x0044922a` and the `.smp` restore-side presentation rebuild path at `0x005532d7`, so this is the safest current read for the shared dimension-apply and secondary-overlay-family reinitializer rather than one narrow resize helper.","objdump + caller inspection + field correlation + overlay-reinitialization correlation" +0x00538360,732,world_rebuild_secondary_overlay_base_float_summary_and_primary_mask,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Broader rebuild owner for the base secondary-overlay float-summary plane rooted at `[this+0x1605]` and the paired one-byte mask planes `[this+0x1655]` and `[this+0x1659]`. The helper samples one caller-supplied coarse lookup field, writes one unclamped float score per live cell into the base summary plane, clears both mask planes across the same rectangle, and updates the packed secondary raster at `[this+0x165d]` as it goes. The later interior pass is the useful asymmetry: after the clear, the helper only repopulates the primary mask plane `[this+0x1655]` for low-3-bit class-`1` cells whose neighboring float-summary samples cross the positive threshold, while the second mask plane `[this+0x1659]` remains only reset or preserved for later owners. After that interior sweep it re-enters `world_normalize_secondary_overlay_float_summary_plane_globally` `0x00532d90`, then `world_expand_positive_secondary_overlay_float_summary_by_radius` `0x00532f60`, calls the neighboring refresh owner `0x0053c000`, and finally re-enters `world_presentation_ensure_secondary_overlay_support_buffers_and_seed_defaults` `0x005375c0`. This asymmetry now closes the local split: the helper actively rebuilds only the primary runtime mask, while the second plane stays as the separately persisted sibling for later setup, restore, or compatibility paths.","objdump + caller inspection + field correlation + mask-plane asymmetry correlation + local-split-closure correlation" +0x005373b0,112,world_presentation_seed_default_overlay_companion_record_set,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Seeds the default static overlay-companion record set after a broader presentation reinit. The helper zero-fills the local `0x1b`-entry companion slot table at `[this+0x40c]`, clears live count `[this+0x408]`, and then invokes `world_presentation_allocate_overlay_companion_record_from_static_template` `0x00535950` seven times with the static template rows `0x005dd300`, `0x005dd314`, `0x005dd328`, `0x005dd33c`, `0x005dd350`, `0x005dd364`, and `0x005dd378`. Current grounded caller is `0x0053804e` inside `world_presentation_apply_grid_dimensions_and_reinitialize_secondary_overlay_family` `0x00537e60`, so this is the safest current read for the shared default companion-record seeder rather than a later border-overlay rebuild owner.","objdump + caller inspection + field correlation + static-template correlation" +0x005374d0,240,world_refresh_secondary_overlay_support_surfaces_and_vector_field_in_rect,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Rectangle-wide owner above the secondary-overlay support family. The helper clamps the caller rectangle to the live world bounds, clears shift field `[this+0x15e1]`, runs `0x00536230` across the selected cells to refresh one packed three-float local sample field rooted at `[this+0x15f1]`, runs `0x00536420` across the same rectangle to rebuild one companion unsigned-word field rooted at `[this+0x1619]`, then rebuilds the signed vector byte planes through `world_rebuild_secondary_overlay_vector_byte_planes_in_rect` `0x00536710`, and finally regenerates the multiscale support surfaces through `world_rebuild_secondary_overlay_multiscale_support_surfaces_in_rect` `0x00533890`. Current grounded callers are the late world-side rectangle branch at `0x0044d45c` and the shell-side scan or brush branch at `0x004fc4bf`, so this is the safest current read for the shared secondary-overlay rectangle refresh owner rather than a one-shot startup allocator.","objdump + caller inspection + field correlation + multiscale-support correlation + vector-plane correlation" +0x00533b70,7,world_query_overlay_strip_offset_lut_ptr,map,thiscall,inferred,objdump + caller inspection + allocation-path inspection,3,"Tiny root-pointer getter for the overlay strip-offset lookup table at `[this+0x15e5]`. The table is allocated in the world-presentation setup path around `0x00537b68` and filled with `i * 0x5c` offsets in `0x00537cb0..0x00537ccc`. Current grounded callers are shell-side presentation and staging branches around `0x00524e92`, `0x00525b7e`, `0x0052ae90`, `0x0052b4ef`, and `0x0054dd50`, which consume it together with the normalized coordinate LUTs and sample-record roots.","objdump + caller inspection + allocation-path inspection + field correlation" +0x00533b90,7,world_query_overlay_sample_triplet_buffer_ptr,map,thiscall,inferred,objdump + caller inspection + allocation-path inspection,3,"Tiny root-pointer getter for the packed overlay sample-triplet buffer at `[this+0x15f1]`. The buffer is allocated in the world-presentation setup path around `0x00537616` at `3 * 4` bytes per entry, and the neighboring producer `0x005333eb` writes three floats per selected sample record into that buffer. Current grounded caller is the shell-side overlay staging branch at `0x00525b94`, which uses it alongside the normalized coordinate LUTs and strip-offset table rather than as a standalone geometry owner.","objdump + caller inspection + allocation-path inspection + field correlation" +0x00534f40,29,world_secondary_raster_resolve_cell_record_ptr,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small address resolver for the secondary 3-byte raster rooted at `[this+0x165d]`. The helper flattens the caller-supplied cell coordinates through width `[this+0x15dd]`, multiplies the linear index by `3`, and returns a direct pointer to that 3-byte cell record. Current grounded callers include neighboring world-side presentation or scan branches around `0x004464b8`, `0x00447120`, `0x0044be9c`, `0x00450f8b`, and `0x004fa7a2`, plus the `.smp` serializer `world_runtime_serialize_smp_bundle` `0x00446240`, so this is the safest current read for the shared secondary-raster cell-pointer resolver rather than a more player-facing overlay helper.","objdump + caller inspection + field correlation + secondary-raster correlation" 0x004c9da0,496,map_editor_chairman_slot_panel_format_slot_card,map,cdecl,inferred,objdump + RT3.lng strings + control-flow inspection,4,"Formats one selected chairman-slot card for the shell editor panel rooted under control group `0x5a6e`. The helper reads the 9-byte local slot record rooted at `[0x006cec78+slot*9+0x69d8]`, formats the staged chairman profile label from the static persona table at `0x005f2d28`, appends the localized `Optional` versus `Mandatory` suffix from ids `2997` and `2998` based on `[slot+0x01]` with nonzero=`Optional` and zero=`Mandatory`, then appends one of `Human` `Computer` or `Human or Computer` from ids `3001` `3000` and `2999` based on `[slot+0x02]` plus the separate per-slot gate at `[0x006cec78+slot*9+0x0bc3]`. It also formats the numeric tuning field from `[slot+0x04]` into the same card. Current grounded caller is the selection callback rooted at `0x004cc230`.","objdump + RT3.lng strings + UI callback inspection" 0x004ca010,432,map_editor_chairman_slot_panel_refresh_selected_slot,map,thiscall,inferred,objdump + RT3.lng strings + UI control inspection,4,"Refreshes the active detail controls for one selected chairman slot in the shell editor panel. It stores the selected slot index at `[this+0x80]`, publishes the staged profile id from `[slot+0x00]`, the persona icon byte from `0x005f2d29`, and the localized profile label from `0x005f2d47`, then updates the role and policy controls from the same local record. `[slot+0x01]` drives the Optional-versus-Mandatory control pair with nonzero=`Optional` and zero=`Mandatory`; `[slot+0x02]` plus the separate per-slot gate at `[0x006cec78+slot*9+0x0bc3]` drive the `Human`, `Computer`, and `Human or Computer` controls; and `[slot+0x04]` is surfaced through the numeric field editor. Current grounded caller is the list-selection callback at `0x004cc230`.","objdump + RT3.lng strings + UI control inspection" 0x004ca1c0,514,map_editor_chairman_slot_panel_refresh_slot_counters,map,thiscall,inferred,objdump + UI control inspection,3,"Recomputes the aggregate slot counters displayed by the chairman-slot editor panel. The helper walks the 16 local slot records rooted at `[0x006cec78+0x69d8]`, splits them by the Optional-versus-Mandatory byte `[slot+0x01]`, and separately counts slots whose live-seat markers come from the ordinary seat byte `[slot+0x02]` versus the special occupied-seat byte `[slot+0x03]`. It then formats the resulting `%1/%2` summaries through the shared pattern block at `0x005cfda8`, republishes those summaries to the panel controls under groups `0x5a6f`, `0x5a70`, and `0x5a71`, and stores the aggregate counts at `0x006cec78+0x6a68..0x6a7c` for neighboring shell validation. Current grounded callers are the panel constructor at `0x004cc2d0` and the role-policy update handlers in `0x004cecc0`.","objdump + UI control inspection + format-string inspection" 0x004ca540,304,map_editor_available_chairman_panel_construct,map,thiscall,inferred,objdump + RT3.lng strings + static-table inspection,4,"Constructs the shell-side `Player Pool` page in the map-editor control panel. The helper binds the row formatter `0x004ca450` and range callback `0x004ca430` on the shared panel root `0x5aa0`, walks the 40-entry persona table slice at `0x005f2d6e` in `0x27`-byte steps, publishes one localized chairman-name row for each persona, counts enabled scenario-side availability bytes in `[0x006cec78+0x6987..]`, and then republishes the `%1 out of %2 are selected.` summary from localized id `1035` through control `0x5aa4`. The neighboring localized page text `996` `Player Pool` plus help text `1016` `Control of which specific players (i.e. Jay Cooke) allowed in the scenario.` now make this the strongest current shell owner for the scenario's available-chairman pool rather than another generic persona browser.","objdump + RT3.lng strings + static-table inspection + UI callback inspection" 0x004ca670,280,map_editor_scenario_metadata_panel_refresh_briefing_mode,map,thiscall,inferred,objdump + RT3.lng strings + UI control inspection,4,"Refreshes the briefing-mode controls inside one shell-side map-editor scenario metadata panel. The helper uses the global selector `0x621f50` to choose whether the visible long-text editor is the ordinary scenario briefing or the multiplayer briefing, publishes the corresponding heading from localized ids `1491` `Briefing (dialog appears when scenario starts):` and `3586` `Multi-Player Briefing (dialog appears when scenario starts):` onto control `0x5b73`, flips the paired selector controls around `0x5b71` and `0x5b72`, and republishes the stored single-player and multiplayer briefing texts from `[0x006cec78+0x4f30]` and `[+0x5ae9]` into the paired edit controls `0x5b6d` and `0x5b6f`. Current grounded caller is the broader scenario metadata refresh at `0x004ca790`.","objdump + RT3.lng strings + UI control inspection + state-field correlation" -0x004ca790,384,map_editor_scenario_metadata_panel_refresh_controls,map,thiscall,inferred,objdump + RT3.lng strings + UI control inspection,4,"Refreshes the shell-side map-editor scenario metadata controls under the shared control band `0x5b69..0x5b74`. The helper first re-enters `map_editor_scenario_metadata_panel_refresh_briefing_mode` at `0x004ca670`, then republishes the scenario description from `[0x006cec78+0x672e]` to control `0x5b69`, the start-year trio from `[+0x66ca]`, `[+0x66d2]`, and `[+0x66ce]` into `0x5b6a`, `0x5b6c`, and `0x5b6b`, and the two boolean flags `[+0x66de]` and inverse `[+0x66f3]` into controls `0x5b6e` and `0x5b74`. The neighboring message dispatcher at `0x004cb4a0` clamps the three year fields to `1829..2100` and maintains `minimum <= default <= maximum`, which aligns this panel with the localized editor strings `Description:` `Minimum Start Year:` `Default Start Year:` `Maximum Start Year:` and the paired briefing labels in `RT3.lng` ids `1483..1492` and `3586`.","objdump + RT3.lng strings + UI control inspection + state-field correlation" +0x004ca790,384,map_editor_scenario_metadata_panel_refresh_controls,map,thiscall,inferred,objdump + RT3.lng strings + UI control inspection,4,"Refreshes the shell-side map-editor scenario metadata controls under the shared control band `0x5b69..0x5b74`. The helper first re-enters `map_editor_scenario_metadata_panel_refresh_briefing_mode` at `0x004ca670`, then republishes the scenario description from `[0x006cec78+0x672e]` to control `0x5b69`, the start-year trio from `[+0x66ca]`, `[+0x66d2]`, and `[+0x66ce]` into `0x5b6a`, `0x5b6c`, and `0x5b6b`, the direct campaign-designated byte `[+0x66de]` into control `0x5b6e`, and the inverse of the paired metadata byte `[+0x66f3]` into control `0x5b74`. The resource-side anchor is now explicit too: `editorDetail.win` contains one control record rooted at `0x5b6e` that carries localized ids `3160/3161` `Campaign Scenario` and `If checked, this map will be reserved as a campaign scenario.` before the next control record begins at `0x5b74`, which grounds `[+0x66de]` as the actual campaign-scenario flag rather than a generic metadata boolean. The neighboring message dispatcher at `0x004cb4a0` clamps the three year fields to `1829..2100` and maintains `minimum <= default <= maximum`, which aligns the rest of this panel with the localized editor strings `Description:` `Minimum Start Year:` `Default Start Year:` `Maximum Start Year:` and the paired briefing labels in `RT3.lng` ids `1483..1492` and `3586`.","objdump + RT3.lng strings + UI control inspection + state-field correlation + editorDetail.win resource record" 0x004ca910,474,map_editor_building_density_panel_refresh_controls,map,thiscall,inferred,objdump + RT3.lng strings + caller inspection + UI control inspection,4,"Refreshes the shell-side `Building Density` page in the map-editor control panel. The helper reads two scenario-state bytes at `[0x006cec78+0x4c78]` and `[+0x4c7c]` and reflects them into two separate three-choice control bands `0x5c3a..0x5c3c` and `0x5c44..0x5c46`, with both fields seeded to the middle state `1` by constructor-time defaults and persisted through the ordinary map-state bundle path. The localized field captions now make the page materially tighter: `[state+0x4c78]` is the `Starting Building Density Level:` selector from ids `1642` and `1643`, where the default middle state `1` corresponds to the documented `100%` baseline and the lower world-building branches later treat the stored ordinal as a real three-state numeric mode; `[state+0x4c7c]` is the paired `Building Density Growth:` selector from id `1644`, which combines with city or region-specific density changes as described by `1641` and is likewise consumed later as a three-state growth-mode byte rather than a pure UI label. Related localized report text such as `1037`, `1048`, and `1070` points back to this same pair as the map-wide starting-density and later growth controls.","objdump + RT3.lng strings + caller inspection + UI control inspection + save-load correlation" 0x004ca980,315,map_editor_economic_cost_slider_dispatch,map,thiscall,inferred,objdump + RT3.lng strings + .data descriptor table inspection,3,"Slider-update dispatcher for one shell-side map-editor economic tuning family. The helper handles the bounded slider event range `0xa433..0xa43d`, converts the incoming integer slider delta or position into normalized floats, writes six tuned values into the adjacent scenario-state block at `[0x006cec78+0x0be2]`, `[+0x0be6]`, `[+0x0bea]`, `[+0x0bee]`, `[+0x0bf2]`, and `[+0x0bf6]`, mirrors the first value into `[state+0x0bde]`, and then re-enters the live panel owner through `0x004cadf0` when `0x006cff84` is present. Current neighboring constructor evidence binds this callback to six visible controls under `0x5bcd..0x5bd7`, while the surrounding `.data` descriptor run at `0x00611c70..0x00612220` now bounds the wider editor lane as the live owner for `Prime Rate`, `Merger Premium`, and the construction and maintenance cost labels `Build Stations Cost` through `Steam Engine Cost` with help texts `2433..2437`, rather than leaving that help-text family orphaned.","objdump + slider jump-table inspection + state-field correlation + RT3.lng strings + .data descriptor table inspection" 0x004cadf0,751,map_editor_economic_cost_slider_panel_construct,map,thiscall,inferred,objdump + RT3.lng strings + caller inspection + .data descriptor table inspection,4,"Constructs one shell-side map-editor economic cost tuning panel. The helper registers `map_editor_economic_cost_slider_dispatch` at `0x004ca980` on the six slider controls `0x5bcd`, `0x5bcf`, `0x5bd1`, `0x5bd3`, `0x5bd5`, and `0x5bd7`, attaches the neighboring preview or formatter callback `0x004caaf0` on control `0x5be1`, and then republishes the current scenario-state tuning values from `[0x006cec78+0x0be2..0x0bf6]` back into those controls through the shared slider formatting helpers. Current surrounding evidence now grounds this as the live editor-side economic tuning subsystem that was previously only visible through the orphaned help-text family: the adjacent descriptor block at `0x00611c70..0x00612220` pairs the wider lane with localized fields `Prime Rate`, `Merger Premium`, and `Build Stations Cost` through `Steam Engine Cost`, plus help texts `2433..2437`. Current grounded caller is the larger editor-panel dispatcher at `0x004ce244`.","objdump + caller inspection + slider registration + state-field correlation + RT3.lng strings + .data descriptor table inspection" 0x004cb2b0,485,map_editor_scenario_special_conditions_panel_construct,map,thiscall,inferred,objdump + RT3.lng strings + static-table inspection,4,"Constructs the special-conditions side of the shell map-editor scenario setup page. The helper binds the row formatter `0x004cb1c0` and range callback `0x004cb1a0` on list control `0xa7fa` through `Setup_Options_Buttons.imb`, walks the 36-entry static toggle table at `0x005f3ab0`, counts enabled dword flags in `[0x006cec78+0x4a7f]`, formats each row from paired label/help ids such as `2535/2564` `Disable Stock Buying and Selling`, `2874/2875` `Use Bio-Accelerator Cars`, `3722/3723` `Disable Cargo Economy`, `3850/3851` `Disable Train Crashes`, `3852/3853` `Disable Train Crashes AND Breakdowns`, and `3920/3921` `AI Ignore Territories At Startup`, and republishes the `Special Conditions In Effect` summary from localized id `1053` through control `0xa7f8`. It then re-enters `map_editor_scenario_metadata_panel_refresh_controls` at `0x004ca790`, which makes this a bounded scenario special-conditions panel rather than a generic option list. Current grounded caller is the larger editor-panel dispatcher at `0x004ce28e`.","objdump + RT3.lng strings + static-table inspection + UI callback inspection" -0x004cb4a0,468,map_editor_scenario_metadata_panel_handle_message,map,thiscall,inferred,objdump + RT3.lng strings + UI dispatch inspection,4,"Message dispatcher for the adjacent map-editor scenario metadata controls. The helper handles the bounded event band `0xa497..0xa4a2`, writing the scenario description from the edit-control payload into `[0x006cec78+0x672e]`, the single-player and multiplayer briefing texts into `[+0x4f30]` and `[+0x5ae9]`, flipping the briefing selector at `0x621f50` between the single-player and multiplayer views, toggling the two boolean bytes `[+0x66de]` and `[+0x66f3]`, and committing the three start-year fields `[+0x66ca]`, `[+0x66ce]`, and `[+0x66d2]` after clamping each incoming value to `1829..2100`. Before returning it also normalizes the year trio so `minimum <= default <= maximum` and then re-enters `map_editor_scenario_metadata_panel_refresh_controls` at `0x004ca790`, which confirms that the shared control band `0x5b69..0x5b74` is the live scenario description, briefing, and start-year editor rather than another generic editor options block. Current grounded caller is the panel callback installation rooted at `0x004ce28e`.","objdump + RT3.lng strings + UI dispatch inspection + state-field correlation" +0x004cb4a0,468,map_editor_scenario_metadata_panel_handle_message,map,thiscall,inferred,objdump + RT3.lng strings + UI dispatch inspection,4,"Message dispatcher for the adjacent map-editor scenario metadata controls. The helper handles the bounded event band `0xa497..0xa4a2`, writing the scenario description from the edit-control payload into `[0x006cec78+0x672e]`, the single-player and multiplayer briefing texts into `[+0x4f30]` and `[+0x5ae9]`, flipping the briefing selector at `0x621f50` between the single-player and multiplayer views, toggling the direct campaign-scenario byte `[+0x66de]` plus the paired metadata byte `[+0x66f3]`, and committing the three start-year fields `[+0x66ca]`, `[+0x66ce]`, and `[+0x66d2]` after clamping each incoming value to `1829..2100`. The resource correlation is now explicit too: `editorDetail.win` ties control `0x5b6e` to localized ids `3160/3161` `Campaign Scenario` and `If checked, this map will be reserved as a campaign scenario.`, so the direct toggle path at `0x4cb519` is now grounded as the editor-side campaign-designation bit rather than a generic metadata checkbox. Before returning it also normalizes the year trio so `minimum <= default <= maximum` and then re-enters `map_editor_scenario_metadata_panel_refresh_controls` at `0x004ca790`, which confirms that the shared control band `0x5b69..0x5b74` is the live scenario description, briefing, and start-year editor rather than another generic editor options block. Current grounded caller is the panel callback installation rooted at `0x004ce28e`.","objdump + RT3.lng strings + UI dispatch inspection + state-field correlation + editorDetail.win resource record" 0x004cb6f0,496,map_editor_available_chairman_panel_handle_message,map,thiscall,inferred,objdump + RT3.lng strings + static-table inspection + UI dispatch inspection,4,"Message dispatcher for the shell-side `Player Pool` editor page. The helper handles the three bulk-selection buttons `0x5aa1..0x5aa3` by rewriting the scenario-side availability bytes rooted at `[0x006cec78+0x6987]` from preset-selection bytes embedded in the same `0x005f2d28` persona table family, and it also commits direct per-row toggle changes from the control range `0x5aaa..0x5b03` back into that byte array. After either path it re-enters `map_editor_available_chairman_panel_construct` at `0x004ca540`, which keeps the visible chairman-name list and the `selected out of total` summary in sync. The localized page text `996` `Player Pool` and help text `1016` now make this the live owner for the scenario's chairman-availability mask rather than a passive list callback block.","objdump + RT3.lng strings + static-table inspection + UI dispatch inspection + state-field correlation" 0x004cb8e0,271,map_editor_scenario_special_conditions_panel_handle_message,map,thiscall,inferred,objdump + static-table inspection + UI dispatch inspection,4,"Message dispatcher for the special-conditions side of the shell map-editor scenario setup page. The helper handles the bulk selection controls `0xa7fb` and `0xa7fc` by writing the whole special-condition dword array rooted at `[0x006cec78+0x4a7f]`, commits direct per-row state changes from the callback band `0xabe0..0xafc7` into that same array, and then re-enters `map_editor_scenario_special_conditions_panel_construct` at `0x004cb2b0` to refresh the visible list and the `Special Conditions In Effect` summary. Two row ids are also special-cased through immediate helper calls after commit, which marks this as the live state owner for the scenario rule-toggle matrix rather than only a passive list callback block.","objdump + static-table inspection + UI dispatch inspection + state-field correlation" 0x004cb9f0,134,map_editor_building_density_panel_handle_message,map,thiscall,inferred,objdump + RT3.lng strings + caller inspection + UI dispatch inspection,4,"Message dispatcher for the shell-side `Building Density` page. The helper handles the two three-choice control bands `0x5c3a..0x5c3c` and `0x5c44..0x5c46`, committing ordinal values `0`, `1`, or `2` into the scenario-state bytes `[0x006cec78+0x4c78]` and `[+0x4c7c]` respectively before re-entering the same page refresh path at `0x004ca910`. The localized captions now pin the semantics more directly: `[state+0x4c78]` is the map-wide `Starting Building Density Level:` selector whose default middle state is the documented `100%` baseline, while `[state+0x4c7c]` is the paired `Building Density Growth:` selector. Current downstream xrefs also show both stored bytes steering later world-generation and growth math as concrete three-state mode selectors rather than only UI summaries.","objdump + RT3.lng strings + caller inspection + UI dispatch inspection + state-field correlation" @@ -312,10 +409,10 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004cf910,1770,map_editor_port_warehouse_cargo_panel_construct,map,thiscall,inferred,objdump + RT3.lng strings + UI callback inspection,4,"Constructs the shell-side `Port/Warehouse Cargos` page in the map-editor control panel. The helper uses the selected recipe-book index latches at `0x006cffa0` and `0x006cffa4`, falls back across the per-book state blocks rooted at `[0x006cec78+0x0fe7+index*0x4e1]`, and populates the visible cargo-page controls under `0x59d8`, `0x5a0a`, and `0x5b74`. Current page-state work now bounds the structure more concretely too: the selected recipe-book index wraps modulo `12`, each recipe-book block stores the shared maximum annual production float at `book+0x3ed`, and the constructor then walks five fixed cargo-line entries starting at `book+0x3f1` with stride `0x30`. Each line now grounds as one row-owned mode dword at `+0x00`, one annual amount float at `+0x04`, one supplied-cargo token at `+0x08`, and one demanded-cargo token at `+0x1c`; the constructor resolves the two token strings against the global cargo collection and then reflects the resulting selector indices back into the page controls. The row-control mapping is now bounded too: the selector and label pair at `+0x14/+0x1e` is the supplied-cargo side because it is the pair enabled in modes `2/3`, while the pair at `+0x28/+0x0a` is the demanded-cargo side because it is the pair enabled in modes `1/3`. The same gating also tightens the single numeric field at `+0x46/+0x32`: it is labeled `Annual Demand:` only for mode `1`, but `Annual Supply:` for modes `2/3`. The localized page-title and help-text cluster now bounds the page much more tightly: `1001` `Port/Warehouse Cargos`, `1021` `Control over what ports and warehouses demand and supply.`, `1499` `Port/Warehouse Cargo Recipe Book:`, `1671` `Rename this cargo recipe book`, `1672` and `1673` for previous or next recipe-book cycling, `1674` and `1675` for the shared maximum annual production field, `1676` `Demanded:`, `1677` `Supplied:`, and `1678` for the per-cargo annual amount field. The same constructor also surfaces the four per-cargo mode labels `501` ``, `502` `Demand Only`, `503` `Supply Only`, and `504` `Production Demand->Supply`, publishes the annual demand or supply captions from `510` and `511`, formats rename and usage summaries through localized ids `507`, `508`, and `509`, and exposes the sandbox toggle text from id `3901` `Sandbox Allowed`. Current mode gating now makes the fourth mode tighter too: `Production Demand->Supply` is the only line state that clearly keeps both supplied-cargo and demanded-cargo branches active, while the shared numeric field stays on the supply side in that mode. That matches the wording around `1674`, `1675`, and `504` that ties it to one shared production-capacity pool and raw-material conversion into supplied output. It also emits the bounded high-production and high-load warnings from ids `505` and `506`, both of which explicitly reference ports or warehouses, which makes this the strongest current owner for the recipe-book or port-cargo editor lane rather than another generic detail page.","objdump + RT3.lng strings + UI callback inspection + recipe-book state correlation + mode-table correlation + control-gating correlation" 0x004d0040,1643,map_editor_port_warehouse_cargo_panel_handle_message,map,thiscall,inferred,objdump + RT3.lng strings + UI dispatch inspection,4,"Message dispatcher for the shell-side `Port/Warehouse Cargos` editor page. The helper routes selection and navigation traffic through the same recipe-book control bands rooted at `0x59d8`, `0x5a0a`, and `0x5b74`, opens the rename prompt from localized id `507`, and commits per-book cargo policy, sandbox-allowed state, and recipe-book text changes back into the scenario-state blocks at `[0x006cec78+0x0fe7+index*0x4e1]`. The edit-side dispatch is now tighter than before: the recipe-book selector wraps modulo `12`; the dedicated top-level numeric field under `0x59de` writes the shared maximum annual production float at `book+0x3ed`; and the per-line edit groups commit into five fixed cargo-line records beginning at `book+0x3f1` with stride `0x30`. Those line groups now ground as one mode dword at `+0x00`, one annual amount float at `+0x04`, one supplied-cargo token string at `+0x08`, and one demanded-cargo token string at `+0x1c`. The concrete control writes are now bounded too: the mode-`2/3` selector pair writes the supplied token through the `+0x14` control into `+0x08`, while the mode-`1/3` selector pair writes the demanded token through the `+0x28` control into `+0x1c`. The same handler keeps the single amount field on the demand side only for mode `1`; in modes `2/3` it writes that same `+0x04` field as annual supply, which matches the constructor captions `510` `Annual Demand:` versus `511` `Annual Supply:`. Current localized row text now makes the bounded edit surface much clearer: the page cycles among recipe books through `1672` and `1673`, renames them through `1671`, updates the shared maximum annual production field under `1674` and `1675`, and edits five fixed per-book line entries whose mode labels are `501` ``, `502` `Demand Only`, `503` `Supply Only`, and `504` `Production Demand->Supply` with annual amount captions `510` `Annual Demand:` and `511` `Annual Supply:` plus row labels `1676` `Demanded:` and `1677` `Supplied:`. The wording on `1675` also tightens the fourth mode specifically: `Production Demand->Supply` is the branch where the shared production-cap field is relevant and raw materials on hand are converted through production lines into supplied output, rather than only free-standing demand or free-standing supply. One bounded branch walks the city-or-region collection at `0x0062bae0` while rebuilding the usage summaries from localized ids `508` and `509`, and the warning branches re-use ids `505` and `506` when production-rate or supply-demand settings become too high for ports or warehouses. Before returning it re-enters `map_editor_port_warehouse_cargo_panel_construct` at `0x004cf910`, which makes this the live handler for the port or warehouse recipe-book page rather than a shared page-table callback.","objdump + RT3.lng strings + UI dispatch inspection + recipe-book state correlation + mode-table correlation + control-write correlation" 0x004cf700,370,map_editor_panel_dispatch_active_section_message,map,thiscall,inferred,objdump + caller inspection + UI dispatch inspection,4,"Top-level message dispatcher for the active map-editor control-panel section. The helper reuses the same page selector byte at `[this+0x78]` and routes incoming shell messages to the current page-local handlers, including the grounded city-or-region handler `0x004ce380`, territory handler `0x004ce820`, scenario metadata handler `0x004cb4a0`, available-chairman handler `0x004cb6f0`, special-conditions handler `0x004cb8e0`, the bounded dual tri-state handler `0x004cb9f0`, the grounded port-or-warehouse cargo handler `0x004d0040`, and the resolved report-page handlers rooted at `0x004d38c0`, `0x004d3d90`, and the neighboring editor report family. Current grounded caller and page-table evidence now make this the broad editor-side active-page dispatcher rather than another page-local callback block.","objdump + caller inspection + UI dispatch inspection + page-handler correlation" -0x004d0420,1618,map_editor_city_count_stats_report,map,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Formats the localized `City Count Stats` editor report. The helper aggregates land-cell and city counts from the active world and region collections, derives per-10K density ratios, and formats the visible summary through localized ids `1059..1070`, including `Total Land Cells`, `Total Cities`, `Average City Building Density`, `Average Region Building Density`, and the projected starting-industry and non-industry building counts. Current grounded caller is the neighboring report-page constructor at `0x004d30a0`.","objdump + RT3.lng strings + caller inspection + world and region count correlation" +0x004d0420,1618,map_editor_city_count_stats_report,map,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Formats the localized `City Count Stats` editor report. The helper aggregates land-cell and city counts from the active world and region collections, derives per-10K density ratios, and formats the visible summary through localized ids `1059..1070`, including `Total Land Cells`, `Total Cities`, `Average City Building Density`, `Average Region Building Density`, and the projected starting-industry and non-industry building counts. The projected-building side is tighter now too: it walks the live region collection `0x0062bae0`, sums world_region_query_projected_structure_count_scalar_by_category `0x004234e0` for categories `2`, `3`, and `0`, and then combines those projected category scalars with the live-region count byte `[region+0x242]` and density float `[region+0x25a]` to build the final industry and non-industry summary terms. Current grounded caller is the neighboring report-page constructor at `0x004d30a0`.","objdump + RT3.lng strings + caller inspection + world and region count correlation + projected-structure-scalar correlation" 0x004d0a90,3416,map_editor_general_validation_report,map,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Formats the localized `General Validation` editor report. The helper walks the current scenario and world state looking for high-level validation failures, including missing industry in a city or region, mismatches between available player slots and the current player-pool setup, missing briefing text, and missing scenario description, then emits the matching warning lines through localized ids such as `1071`, `1073`, `1074`, and `1075`. Current grounded caller is the page constructor at `0x004d3080`, which makes this the actual general-validation report rather than the tree-stats page previously grouped under that label.","objdump + RT3.lng strings + caller inspection + validation-string correlation" 0x004d1b80,536,map_editor_tree_stats_report,map,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Formats the localized `Tree Stats` editor report. The helper scans the active world grid through dimensions rooted at `0x0062c120`, accumulates total-tree and density counts into the neighboring global scratch slots at `0x006cffa8` and `0x006cffb8`, and then formats the visible report through localized id `1086`, which includes `Total Trees`, `Trees per any cell`, `Trees per land cell`, and the adjacent performance guidance text. Current grounded caller is the tree-stats page constructor at `0x004d3060`.","objdump + RT3.lng strings + caller inspection + world-grid scan correlation" -0x004d1d60,1679,map_editor_city_region_growth_stats_report,map,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Formats the localized `Stats - City/Region` growth report. The helper walks the city or region collection at `0x0062bae0`, reads display names from each entry, and formats the multi-column growth summary through localized ids `1087..1096`, including `Industry Bldg Count`, `Industry Revenue`, `Industry Profit`, `Modified Rail Revenue`, `Weighted Profit Margin`, `Annual Density Adjust`, `Start Density`, `Current Density`, `Start Bldg Count`, and `Current Bldg Count`. The neighboring constructor also publishes localized id `1114`, whose explanatory text says cities grow from industry profit margins plus modified rail revenue, so this now looks like the main city-region growth analytics page rather than a generic validation helper. Current grounded caller is `0x004d3020`.","objdump + RT3.lng strings + caller inspection + city-region stat correlation" +0x004d1d60,1679,map_editor_city_region_growth_stats_report,map,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Formats the localized `Stats - City/Region` growth report. The helper walks the city or region collection at `0x0062bae0`, reads display names from each entry, and formats the multi-column growth summary through localized ids `1087..1096`, including `Industry Bldg Count`, `Industry Revenue`, `Industry Profit`, `Modified Rail Revenue`, `Weighted Profit Margin`, `Annual Density Adjust`, `Start Density`, `Current Density`, `Start Bldg Count`, and `Current Bldg Count`. The column-to-field mapping is tighter now too: the report prints the weighted-profit-margin scalar from `[region+0x2e2]` as `%3.2f`, the annual-density-adjust scalar from `[region+0x2ee]` as `%3.1f%%`, the start/current density pair from `[region+0x25a/+0x25e]`, and the start/current building-count pair from `[region+0x286/+0x296]`. The neighboring constructor also publishes localized id `1114`, whose explanatory text says cities grow from industry profit margins plus modified rail revenue, so this now looks like the main city-region growth analytics page rather than a generic validation helper. Current grounded caller is `0x004d3020`.","objdump + RT3.lng strings + caller inspection + city-region stat correlation + column-field correlation" 0x004d2430,1597,map_editor_cargo_stats_report,map,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Formats the localized `Stats - Cargo` editor report. The helper iterates the cargo or building candidate pool at `0x0062b268`, groups entries by category, and emits the report columns from localized ids `1097..1113`, including `Category`, `Raw Producers`, `Factories`, `Total`, and the adjacent supply-demand and weighted-price summary fields. Current grounded caller is the neighboring page constructor at `0x004d3000`.","objdump + RT3.lng strings + caller inspection + cargo-pool correlation" 0x004d3000,32,map_editor_cargo_stats_panel_construct,map,thiscall,inferred,objdump + RT3.lng strings + UI callback inspection,4,"Constructs the shell-side `Stats - Cargo` page in the map-editor control panel. The helper binds the report callback `0x004d2430` and attaches the resulting page into the broader editor section owner. Current grounded neighboring labels and report fields align this page with the cargo analytics family rather than with general validation.","objdump + RT3.lng strings + UI callback inspection + page-constructor correlation" 0x004d3020,32,map_editor_city_region_growth_stats_panel_construct,map,thiscall,inferred,objdump + RT3.lng strings + UI callback inspection,4,"Constructs the shell-side `Stats - City/Region` page in the map-editor control panel. The helper binds the report callback `0x004d1d60`, and the surrounding page text includes localized id `1114`, whose explanatory note about city growth from industry profit margins and modified rail revenue matches the same report callback. Current grounded evidence therefore treats this as the city-region growth analytics page.","objdump + RT3.lng strings + UI callback inspection + page-constructor correlation" @@ -329,6 +426,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00456920,3247,unit_visual_init_weapon_airframe_and_exhaust_effects,bootstrap,thiscall,inferred,ghidra-headless,4,Initializes one armed-unit visual bundle spanning turret and cannon hardware exhaust emitters and aircraft airframe attachments. The routine creates static Turret Mantlet Cannon and MuzzleFlash assets at [this+0x31a] through [this+0x326] direct JetExhaust and PropExhaust sprite emitters at [this+0x2f6] and [this+0x2fa] a cannon-audio attachment at [this+0x32a] indexed WingL and WingR assets plus plane-audio state at [this+0x32e] through [this+0x346] and cached Aileron Elevator Rudder and Thrust vectors at [this+0x2d1] [this+0x2c5] [this+0x2b9] and [this+0x2dd].,ghidra + rizin + llvm-objdump + strings 0x00461650,120,map_load_geographic_label_database,map,cdecl,inferred,ghidra-headless,3,Loads the geographic-label database branch inside the broader reference-bundle setup. It stages resource ids 0x5209 through 0x520b binds the selected bundle through 0x517d90 iterates the loaded collection with 0x517cf0 0x518380 and 0x518140 and dispatches each record through vtable slot +0x44 using the current map path context.,ghidra + rizin + llvm-objdump + strings 0x00461cd0,298,locomotive_collection_select_best_era_matched_non_electric_fallback_id,simulation,thiscall,inferred,objdump + caller xrefs + callsite inspection + engine-type correlation,2,"Fallback locomotive chooser beneath `company_select_preferred_available_locomotive_id` `0x004078a0`. The helper walks the live locomotive collection, explicitly skips records whose engine-type dword `[record+0x10]` is `2`, and then scores the remaining records from the linked era record at `[record+0x72]`: the current grounded score uses the absolute distance from the current scenario year to the era start field `[era+0x105]`, adds `500` when the era has not started yet, adds `50` when the current year has passed the era-end field `[era+0x109]`, and adds `2000` when the linked approval helper `0x0041d550` rejects the era or engine family for the current context. The lowest-penalty locomotive id wins, so the current best read is an era-matched non-electric fallback rather than a general preferred-locomotive chooser. Current grounded caller is `company_select_preferred_available_locomotive_id` `0x004078a0`.","objdump + caller xrefs + callsite inspection + engine-type correlation + fallback-choice correlation" +0x00461e00,262,locomotive_collection_refresh_runtime_availability_overrides_and_usage_state,simulation,thiscall,inferred,objdump + caller xrefs + local disassembly,3,"Collection-wide runtime refresh over the live locomotive pool at `0x006ada84`. The helper guards itself with reentrancy latch `0x006ada88`, walks every live locomotive record, resolves the linked era record through `[loco+0x72]`, and combines the locomotive-side requirement bytes `[loco+0x30/+0x31/+0x32]` with the active scenario-state availability toggles at `[0x006cec78+0x4c97..+0x4c99]`. When the current locomotive or its linked era passes those gates it upserts one boolean availability override through `scenario_state_upsert_named_locomotive_availability_record_and_refresh_runtime_usage` `0x004350b0`; it then immediately queries the resulting named override through `scenario_state_query_named_locomotive_availability_record_value` `0x00435030` and stores that value into `[loco+0x7b]`. When the collection sweep finishes it tails into `0x00436af0` to rebuild the dependent locomotive-side scalar band. Current grounded callers are the world-entry rehydrate tail inside `world_entry_transition_and_runtime_bringup` `0x00443a50` and the startup or restore-side upsert family that also re-enters this helper through `0x004350b0`, so this is the safest current read for the collection-wide locomotive runtime-availability refresh rather than a single dialog-owned toggle helper.","objdump + caller xrefs + local disassembly + locomotive-availability correlation + scenario-state override correlation + reentrancy-latch correlation" 0x00464410,12679,shell_dispatch_ui_command,shell,cdecl,inferred,ghidra-headless,4,Large shell UI command dispatcher reached from shell-side event callbacks and direct command pushes. It switches over many command ids including 0x7530 through 0x7532 graphics-preset commands that route into 0x0051ebc0 0x00484590 and 0x004853c0; 0x7533 through 0x7534 TigerTank viewer actions; and 0x7540 through 0x7543 scenario-text report build and batch-processing commands that route into 0x00489830 0x004886e0 and 0x00489a20.,ghidra + rizin + llvm-objdump + strings 0x00474610,120,map_load_city_database,map,cdecl,inferred,ghidra-headless,3,Loads the city database branch in the same pattern as the geographic-label loader. It stages resource ids 0x61a9 through 0x61ab binds the selected bundle through 0x517d90 iterates the collection with 0x517cf0 0x518380 and 0x518140 and dispatches each record through vtable slot +0x44.,ghidra + rizin + llvm-objdump + strings 0x00474e20,336,effect_slot_create_attached_sprite_emitter,bootstrap,thiscall,inferred,ghidra-headless,3,Creates or clones one attached sprite emitter for an effect slot on the owning object. Depending on flag bit 0x400 it either clones through 0x00556ce0 or allocates a fresh 0x1fd template through 0x00556920 then attaches the emitter to the owner at [emitter+0x60] and optionally sets persistent flag [emitter+0xbc].,ghidra + rizin + llvm-objdump @@ -338,13 +436,16 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00478200,291,shell_queue_single_world_anchor_overlay,shell,cdecl,inferred,ghidra-headless,3,Builds one world-anchor overlay packet for the current owner object. It samples the owner transform through 0x00455800 and 0x00455810 derives projected half-height and half-width through 0x00477a10 world_anchor_measure_projected_half_height and world_anchor_measure_projected_half_width and then enqueues the finished marker through shell_queue_world_anchor_marker.,ghidra + rizin + llvm-objdump 0x00478330,2432,shell_queue_world_anchor_overlay_list,shell,cdecl,inferred,ghidra-headless,3,Builds and queues a repeated world-anchor overlay list for one owner-managed collection. The routine iterates several owner sublists and state branches repeatedly derives projected extents through 0x00477a10 0x004779c0 world_anchor_measure_projected_half_height and world_anchor_measure_projected_half_width and emits one shell_queue_world_anchor_marker packet per accepted overlay entry.,ghidra + rizin + llvm-objdump 0x0047d080,186,start_new_company_dialog_open,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Opens the shell-side `Start New Company...` dialog rooted at localized id `574`. The helper rolls one persona-dependent shell color or portrait token through a small static table, allocates the modal shell window through the constructor/callback pair `0x0047c590` and `0x0047c3a0`, increments the scenario-side start-company generation counter at `[0x006cec78+0x41]`, and enters the shared callback-driven modal path through `shell_open_custom_modal_dialog_with_callbacks` at `0x004c98a0`. Current grounded caller is the company-list window handler at `0x004c6f30`, which reaches this helper from the synthetic company-row id `0x7fff` after optional resignation confirmation through localized string `272` `You're currently chairman of the %1... Proceed?`. The older claim that this helper stored one live dialog owner at `0x006d3b4c` is no longer supported by direct disassembly; current stronger evidence treats `0x006d3b4c` as part of the broader shell tutorial state family instead.","objdump + RT3.lng strings + caller inspection + modal-path inspection + tutorial-state correction" -0x0047d120,509,start_new_company_dialog_commit_create_company,shell,cdecl,inferred,objdump + caller inspection + company-constructor inspection,4,"Commits the shell-side `Start New Company...` dialog and creates one fresh live company record rather than claiming one of the pre-seeded named railroads. After validating the dialog state it resolves the selected chairman-profile summary from `0x006cec78`, unlinks any existing company from that chairman through `0x00427c70`, allocates a new company id from the live company collection at `0x0062be10`, formats the dialog-owned company-name buffer at `0x006cebd8`, and initializes the new company through `0x00428420`. It then clamps one startup-funding lane against the new company's local limit fields, writes the chosen funding back to `0x006cec14`, updates one per-profile financing slot at `[profile+company_id*4+0x15d]`, applies the resulting debt through `0x00476050`, publishes the new selected company id through `0x00433790`, and triggers one shell refresh through `0x00432f40`. When the dialog instead diverts into the `0x3f2` side path, it packages the same staged company payload into the Multiplayer preview request owner at `0x006cd8d8` through `0x00469d30`.","objdump + caller inspection + company-constructor inspection + global-state correlation" -0x0047d320,280,start_new_company_request_create_company,map,thiscall,inferred,objdump + caller inspection + company-constructor inspection,4,"Creates one fresh company record from a compact startup-company request block. The request layout is now partly grounded: `[this+0x0]` is the chairman profile id in `0x006ceb9c`, `[this+0x4]` is the localized railroad-name id or equivalent name token, `[this+0x8]` plus `[this+0xc]` form the startup-funding total later divided by the new company rate lane, and `[this+0x10]` is the staged company-name buffer. The helper unlinks any existing company from the referenced chairman through `0x00427c70`, allocates a fresh company id from the live company collection at `0x0062be10`, initializes that company through `0x00428420`, and updates one per-profile financing slot at `[profile+company_id*4+0x15d]`. If the request chairman matches the current selected chairman summary from `0x006cec78`, it also publishes the new selected company id through `0x00433790`. Current grounded caller is the neighboring startup-company branch at `0x00470e48`, which reaches this helper when the request cannot be resolved to an existing company record.","objdump + caller inspection + company-constructor inspection + global-state correlation" +0x0047d120,509,start_new_company_dialog_commit_create_company,shell,cdecl,inferred,objdump + caller inspection + company-constructor inspection,4,"Commits the shell-side `Start New Company...` dialog and creates one fresh live company record rather than claiming one of the pre-seeded named railroads. After validating the dialog state it resolves the selected chairman-profile summary from `0x006cec78`, unlinks any existing company from that chairman through `0x00427c70`, allocates a new company id from the live company collection at `0x0062be10`, formats the dialog-owned company-name buffer at `0x006cebd8`, and initializes the new company through `0x00428420`. It then clamps one startup-funding lane against the new company's local limit fields, writes the chosen funding back to `0x006cec14`, updates one per-profile financing slot at `[profile+company_id*4+0x15d]`, applies the resulting debt through `0x00476050`, publishes the new selected company id through `0x00433790`, and triggers one shell refresh through `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` `0x00432f40` with trigger kind `7`. When the dialog instead diverts into the `0x3f2` side path, it packages the same staged company payload into the Multiplayer preview request owner at `0x006cd8d8` through `0x00469d30`.","objdump + caller inspection + company-constructor inspection + global-state correlation + runtime-effect trigger-kind correlation" +0x0047d320,280,start_new_company_request_create_company,map,thiscall,inferred,objdump + caller inspection + company-constructor inspection,4,"Creates one fresh company record from a compact startup-company request block. The request layout is now partly grounded: `[this+0x0]` is the chairman profile id in `0x006ceb9c`, `[this+0x4]` is the localized railroad-name id or equivalent name token, `[this+0x8]` plus `[this+0xc]` form the startup-funding total later divided by the new company rate lane, and `[this+0x10]` is the staged company-name buffer. The helper unlinks any existing company from the referenced chairman through `0x00427c70`, allocates a fresh company id from the live company collection at `0x0062be10`, initializes that company through `0x00428420`, and updates one per-profile financing slot at `[profile+company_id*4+0x15d]`. If the request chairman matches the current selected chairman summary from `0x006cec78`, it also publishes the new selected company id through `0x00433790`. The surrounding startup-company owner is tighter now too: the neighboring post-create branch at `0x0047d42b` immediately re-enters `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` `0x00432f40` with trigger kind `7`. Current grounded caller is the neighboring startup-company branch at `0x00470e48`, which reaches this helper when the request cannot be resolved to an existing company record.","objdump + caller inspection + company-constructor inspection + global-state correlation + runtime-effect trigger-kind correlation" 0x0047e240,240,placed_structure_query_candidate_local_service_metrics,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Queries one candidate-specific local service metric pair for the current placed-structure or site context. The helper first resolves the requested candidate index through the live structure collection at `0x0062ba8c` and rejects entries that fail `structure_candidate_is_enabled_for_current_year` at `0x0041e220`; on rejection it returns `0`, writes count `0` to the optional first out-pointer, and writes fallback float `1.0` to the optional second out-pointer. For live candidates it resolves the optional linked placed instance at `[this+0x04]`, passes that context through `0x00455f60`, and queries the base integer metric through `0x0042c960`; when the caller has a nonzero local sample list at `[this+0x38]` and `[this+0x34]`, it then accumulates matching per-cell float contributions from the world-grid table rooted at `[0x0062c120+0x2129]` into the second out-value. Current grounded callers include the shell or world-side branches at `0x0043f72e`, `0x0043f936`, `0x0047e365`, `0x0047ecd3`, `0x0047faff`, `0x004ba072`, `0x004bb51c`, and `0x00504d0f`, so this now looks like the first higher-level site query above the cargo-service bitset lane rather than another raw editor-runtime helper.","objdump + caller xrefs + callsite inspection + world-grid correlation" 0x0047e330,96,placed_structure_count_candidates_with_local_service_metrics,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Counts how many live structure candidates currently produce a valid local service-metric result for the current placed-structure or site context. The helper walks the full candidate collection at `0x0062ba8c`, resolves each entry id through `0x00518380`, and reuses `placed_structure_query_candidate_local_service_metrics` at `0x0047e240` with null out-pointers; it increments the return value only when that lower query succeeds. Current grounded callers keep this in the same site-query family as `0x0047e240`, so it now looks like the bounded count wrapper above the candidate-local service-metric lane.","objdump + caller xrefs + callsite inspection" 0x0047e390,656,placed_structure_query_cached_express_service_class_score,map,thiscall,inferred,objdump + caller xrefs + string correlation + callsite inspection,3,"Cached site-side query for one express-service class score. The helper special-cases request ids `0x384`, `0x385`, and `0x386` through three cached float-plus-timestamp pairs at `[this+0x14]/[+0x20]`, `[this+0x10]/[+0x1c]`, and `[this+0x0c]/[+0x18]`; when a cached value is younger than `0x0b40` ticks it returns immediately. On a cold path it scans all `0x35` live structure candidates, uses `0x0041e260` to keep only candidates that match the requested class, and then accumulates local per-cell contributions from the repeated sample list at `[this+0x34]` and the same world-grid tables under `[0x0062c120+0x2129]`. Nearby strings now strongly align the three class ids with the express cargo family `Passengers`, `Mail`, and `Troops`, but current grounded callers still treat this as a generic class-score query rather than a fully named UI lane. Current grounded callers include the shell or world-side branches at `0x00506c2d`, `0x00506c3d`, `0x00506e97`, and `0x00506ebf`.","objdump + caller xrefs + string correlation + callsite inspection + express-family correlation" +0x0047e620,112,placed_structure_get_nth_candidate_id_with_local_service_metrics,map,thiscall,inferred,objdump + caller xrefs + local disassembly + callsite inspection,3,"Resolves the `n`th live structure candidate that currently produces a valid local service-metric result for the current placed-structure or site context. The helper walks the full candidate collection at `0x0062ba8c`, resolves each entry id through `0x00518380`, reuses `placed_structure_query_candidate_local_service_metrics` at `0x0047e240`, and decrements the caller-supplied ordinal only on successful matches before returning the surviving candidate id. Current grounded callers keep this firmly on the read-side: `shell_station_detail_refresh_candidate_service_rows` `0x00505760` uses it to enumerate the visible service rows, while `company_rebuild_linked_transit_autoroute_site_score_cache` `0x00407bd0` uses it to walk the bounded candidate-local amount and scaling bands that feed the downstream site-ranking cache. That makes this the ordinal selector sibling above the local service-metric query rather than a mutation-side helper.","objdump + caller xrefs + local disassembly + callsite inspection + station-row correlation + company-score-cache correlation" +0x0047eb90,1048,placed_structure_refresh_candidate_local_service_comparison_cache_against_peer_site,map,thiscall,inferred,objdump + caller xrefs + local disassembly + callsite inspection,3,"Rebuilds one per-candidate local service comparison cache for a `(current site, peer site)` pair. The helper resolves both sites' linked placed instances through `0x00455f60`, scans the full candidate collection at `0x0062ba8c`, filters candidates through `0x0041e260` plus `placed_structure_query_candidate_local_service_metrics` `0x0047e240`, and then computes several bounded float bands in three stack-local `0x35`-entry arrays before blending the result back into the caller-owned cache at `[this+0x3e]`, `[this+0x112]`, and `[this+0x1e6]`. The grounded caller at `0x004adcf5` immediately follows this rebuild by reading directional route-summary state through `0x0047de50` and `0x0047de90`, which keeps this helper on the comparison or preview side of the site-service family rather than the mutation side.","objdump + caller xrefs + local disassembly + callsite inspection + peer-site comparison correlation + route-summary correlation" +0x0047f910,1080,placed_structure_select_best_candidate_id_by_local_service_score,map,thiscall,inferred,objdump + caller xrefs + local disassembly + callsite inspection,3,"Selects the strongest candidate id for the current placed-structure or site context under one caller-supplied candidate-class filter. The helper scans the live candidate collection at `0x0062ba8c`, keeps only candidates allowed by `0x0041e260`, and scores each survivor through either the direct local-service query `0x0047e240` or the heavier directional-route helper `0x0047e690` when route-backed state is present. It then applies the current shell or world-mode gates from `0x006cec74`, `0x006cec78`, and `0x006cec7c`, tracks the best candidate id and one parallel winner flag, and optionally writes the selected id or winner-state back through caller-owned out-pointers. Current grounded callers at `0x004ac8d6` and `0x004ac917` use it as a best-candidate selector inside a larger service-summary or preview family, which keeps it on the read-side selection path rather than the mutation path.","objdump + caller xrefs + local disassembly + callsite inspection + route-helper correlation + shell-gate correlation" 0x0047e690,784,placed_structure_query_candidate_directional_route_overlay_summary,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Builds the heavier directional route-summary channel used by the station-detail candidate-service overlay when the active candidate carries a nonzero route-style byte at `[candidate+0x46]`. The helper converts one caller-supplied distance or bucket limit into a capped step count up to `0x28`, resolves the requested candidate's grouped routing class from `0x0062ba8c+0x9a`, then walks the current placed structure's linked route list at `[this+0x466]` and follows each route-linked placed structure through the live instance collections at `0x0062b26c` and the route-link collection `0x006ada90`. For matching class entries it re-enters `0x004676a0` to measure one directional route value against the peer placed-structure argument, keeps the strongest bounded values in a sorted local lane, and finally accumulates those kept route values into the caller-owned out-pointers. Current grounded overlay callers at `0x0043f89a` and `0x0043f8ee` invoke it in both directions between the preview station and each scanned placed structure before `world_render_station_candidate_service_map_overlay` turns those two returned channels into the `Coming To` and `Going From` legend rows.","objdump + caller xrefs + callsite inspection + overlay-caller correlation + legend-correlation + route-link-collection correlation" -0x0047d440,845,world_conditionally_seed_named_starting_railroad_companies,map,cdecl,inferred,objdump + caller xrefs + global-state inspection,4,"Conditional company-side setup helper adjacent to the `Setting up Players and Companies...` lane. Current grounded callers are the neighboring bring-up flow after world_seed_default_chairman_profile_slots at `0x004377a0` and a second setup-side branch around `0x00438300`, both under the same sandbox or non-editor shell-state conditions: it runs only when the Multiplayer preview dataset owner at `0x006cd8d8` is absent and either sandbox flag `[0x006cec7c+0x82]` is set or shell-state flag `[0x006cec74+0x14c]` is set while editor-map mode `[0x006cec74+0x68]` is clear. The helper first realigns the selected company from the chosen chairman profile when the current summary pair points at a missing company, then iterates exactly three fixed localized railroad-name ids through `0x00428420`: `0x23f` `Missouri Pacific`, `0x240` `New York Central`, and `0x241` `Grand Trunk Railroad` from `RT3.lng` ids `575..577`. That makes the branch look like a seeded trio of named starting railroad companies rather than a generic company refresh. The first seeded company is tied to the selected chairman-profile summary from `0x006cec78`, tuned from that selected chairman's per-profile fields `[profile+0x154]` and `[profile+0x158]`, and then written back as the selected company id through `0x00433790`. The second company is narrower now too: it only binds when `profile_collection_count_active_chairman_records` at `0x00477820` reports at least two live chairman records, and it then links through `profile_collection_get_nth_active_chairman_record` at `0x00477860` with ordinal `1`, so the second railroad is specifically the second active chairman-owned company rather than an arbitrary extra bind. The third railroad currently gets no matching chairman-link branch in the grounded code and therefore remains an unchaired named company in the live roster. All three records are constructed or refreshed from the live company collection at `0x0062be10` through `0x00428420`, while chairman-to-company ownership links are applied through `0x00427c70` and neighboring writes to `[profile+0x1dd]`.","objdump + caller xrefs + global-state inspection + state-accessor correlation + RT3.lng strings + company-constructor inspection + profile-helper inspection" +0x0047d440,845,world_conditionally_seed_named_starting_railroad_companies,map,cdecl,inferred,objdump + caller xrefs + global-state inspection,4,"Conditional company-side setup helper adjacent to the `Setting up Players and Companies...` lane. Current grounded callers are the neighboring bring-up flow after world_seed_default_chairman_profile_slots at `0x004377a0` and a second setup-side branch around `0x00438300`, both under the same sandbox or non-editor shell-state conditions: it runs only when the Multiplayer preview dataset owner at `0x006cd8d8` is absent and either sandbox flag `[0x006cec7c+0x82]` is set or shell-state flag `[0x006cec74+0x14c]` is set while editor-map mode `[0x006cec74+0x68]` is clear. The helper first realigns the selected company from the chosen chairman profile when the current summary pair points at a missing company, then iterates exactly three fixed localized railroad-name ids through `0x00428420`: `0x23f` `Missouri Pacific`, `0x240` `New York Central`, and `0x241` `Grand Trunk Railroad` from `RT3.lng` ids `575..577`. That makes the branch look like a seeded trio of named starting railroad companies rather than a generic company refresh. The first seeded company is tied to the selected chairman-profile summary from `0x006cec78`, tuned from that selected chairman's per-profile fields `[profile+0x154]` and `[profile+0x158]`, and then written back as the selected company id through `0x00433790`. The second company is narrower now too: it only binds when `profile_collection_count_active_chairman_records` at `0x00477820` reports at least two live chairman records, and it then links through `profile_collection_get_nth_active_chairman_record` at `0x00477860` with ordinal `1`, so the second railroad is specifically the second active chairman-owned company rather than an arbitrary extra bind. The third railroad currently gets no matching chairman-link branch in the grounded code and therefore remains an unchaired named company in the live roster. All three records are constructed or refreshed from the live company collection at `0x0062be10` through `0x00428420`, while chairman-to-company ownership links are applied through `0x00427c70` and neighboring writes to `[profile+0x1dd]`. The tail is tighter now too: once at least three startup companies have been considered, the branch at `0x0047d6de` re-enters `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` `0x00432f40` with trigger kind `7`.","objdump + caller xrefs + global-state inspection + state-accessor correlation + RT3.lng strings + company-constructor inspection + profile-helper inspection + runtime-effect trigger-kind correlation" 0x0047efe0,28,placed_structure_query_linked_company_id,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Returns the owning company id for one placed structure when a linked placed-instance record is present. The helper resolves `[this+0x04]` through the live placed-instance collection at `0x0062b26c` and then returns the company-like field at `[instance+0x276]`; when no linked instance is present it falls back to `0`. Current grounded callers include the station candidate-service overlay at `0x0043fff7`, where the returned company id is compared against the active company selector before the overlay chooses whether a scanned site should carry the `Already Connected by Another Company` note.","objdump + caller xrefs + callsite inspection + overlay-owner correlation" 0x0047f010,195,placed_structure_append_unique_route_entry,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,4,"Appends one unique six-byte route-entry record onto the placed-structure route list rooted at `[this+0x462]` and `[this+0x466]`. The helper first scans the existing list for the incoming leading `u16` key and returns early on duplicates; otherwise it allocates a new `(count*6)+6` byte buffer, copies the existing records, writes the new `u16` key at offset `+0x0` and the caller-supplied `u32` payload at `+0x2`, frees the previous buffer, and increments the route-entry count. Current grounded callers include the placed-structure side at `0x0042c554`, which walks the linked instance chain through `[site+0x0d6]` and `[instance+0x2a2]` while appending entries, and the world-side branch at `0x0040db7d`, which appends one selected placed-structure id plus a companion payload from a route-like table. This is therefore the current reusable append-if-missing helper above the route-entry list later consumed by `placed_structure_query_candidate_directional_route_overlay_summary` at `0x0047e690`.","objdump + caller xrefs + callsite inspection + buffer-layout correlation" 0x00483f70,352,shell_service_pump_iteration,shell,thiscall,inferred,objdump + analysis-context,4,Executes one outer shell-service iteration on the shell state rooted at 0x006cec74. The helper can queue service event 0xcc through the shell bundle at 0x006d4018 polls that bundle through 0x00483ea0 refreshes active-mode or shell-state flags ensures the controller work pointer [0x006d4024+0x28] defaults to 0x0062be68 runs several global maintenance helpers and auxiliary cleanup then dispatches shell_state_service_active_mode_frame; when shell-state flag [this+0x501] is set it also marks the controller layout dirty through 0x0051f070 before returning the loop-continue result. bootstrap_init_shell_window_services calls it in the repeating shell loop that appears to own the observed shell lifetime before teardown.,objdump + analysis-context + caller xrefs @@ -378,7 +479,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004c1b60,462,shell_company_detail_refresh_selected_territory_access_summary,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Refreshes the selected-territory status summary in `CompanyDetail.win`. The helper caches the active territory id in `0x006cfe5c`, resolves the territory through `0x006cfc9c`, and formats one of three localized status texts for the current selected company: id `946` when the company already has access rights, id `947` when rights are unavailable but purchasable, or id `948` when the company cannot purchase rights at all. It also republishes the selected-territory control rooted at `0x948c`. Current grounded callers are the territory-summary callbacks at `0x004c1d30`, `0x004c1d70`, and `0x004c22e0`.","objdump + RT3.lng strings + caller inspection + territory-status correlation" 0x004c1ec0,587,shell_company_detail_render_bond_maturity_and_repay_panel,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"CompanyDetail-specific bond readout callback bound to controls `0x947d` and `0x947e`. The helper resolves the currently selected company through `0x006d0818`, indexes one 12-byte debt-record slot from the selected company near `[company+0x5f + slot*0xc]`, formats the maturity caption through localized id `949` `Due %1`, formats the current bond amount or value through the shared numeric formatter family at `0x0051c000`, and then renders the repay affordance through localized id `950` `Repay this bond.`. In the surrounding refresh path this panel is paired with `shell_company_detail_bind_bond_row_band_for_active_panel` at `0x004c1610`, so the two controls now read as the owners of twin repayable bond-slot row bands `0x94e8..0x950f` and `0x9510..0x9537` rather than as isolated text widgets. Current grounded owner is the CompanyDetail constructor `0x004c5540`, which binds this callback onto the adjacent debt-panel controls rather than onto the territory or finance-history lanes.","objdump + RT3.lng strings + caller inspection + debt-panel correlation + bond-row-band correlation" 0x004c22e0,56,shell_company_detail_sync_selected_territory_from_picker,shell,cdecl,inferred,objdump + caller inspection,4,"Small `CompanyDetail.win` territory-sync callback for control `0x948c`. The helper resolves the current territory-picker widget through the live CompanyDetail window at `0x006cfe4c`, reads the currently focused territory id from `[widget+0x117]` when a picker row is present, and then forwards that territory id into `shell_company_detail_refresh_selected_territory_access_summary` at `0x004c1b60`. When no picker row is active it falls back to territory id zero before refreshing the same summary.","objdump + caller inspection + picker-sync correlation" -0x004c23a0,1259,shell_company_detail_render_debt_credit_and_rate_summary_panel,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"CompanyDetail-specific summary callback bound to control `0x9488`. The helper resolves the currently selected company through `0x006d0818` and renders the player-facing debt and rate block under localized ids `951` `Total Debt:`, `952` `Credit Rating:`, `953` `Average Interest Rate:`, and `954` `Prime Rate:`. Current grounded logic now has concrete helper ownership for the rate rows: `company_compute_weighted_average_bond_interest_rate` `0x00423e40` feeds `Average Interest Rate`, `company_compute_prime_rate_from_issue39_scenario_baseline` `0x00424580` feeds `Prime Rate`, the credit-rating text table at `0x00620d00..0x00620d14` is chosen from the rounded city-connection bonus ladder at `0x00425320`, and the leading debt total comes from the current metric family through `company_read_year_or_control_transfer_metric_value` `0x0042a5d0` using stat-family `0x2329` and slot `0x12`. The CompanyDetail refresh path wires this callback onto the same read-side tab family as the bond and stock-summary panels.","objdump + RT3.lng strings + caller inspection + finance-summary correlation + average-interest correlation + prime-rate correlation + debt-total correlation" +0x004c23a0,1259,shell_company_detail_render_debt_credit_and_rate_summary_panel,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"CompanyDetail-specific summary callback bound to control `0x9488`. The helper resolves the currently selected company through `0x006d0818` and renders the player-facing debt and rate block under localized ids `951` `Total Debt:`, `952` `Credit Rating:`, `953` `Average Interest Rate:`, and `954` `Prime Rate:`. Current grounded logic now has concrete helper ownership for the rate rows: `company_compute_weighted_average_bond_interest_rate` `0x00423e40` feeds `Average Interest Rate`, `company_compute_prime_rate_from_issue39_scenario_baseline` `0x00424580` feeds `Prime Rate`, the credit-rating text table at `0x00620d00..0x00620d14` is chosen from the rounded company credit-rating score at `0x00425320`, and the leading debt total comes from the current metric family through `company_read_year_or_control_transfer_metric_value` `0x0042a5d0` using stat-family `0x2329` and slot `0x12`. The CompanyDetail refresh path wires this callback onto the same read-side tab family as the bond and stock-summary panels.","objdump + RT3.lng strings + caller inspection + finance-summary correlation + average-interest correlation + prime-rate correlation + debt-total correlation" 0x004c2720,1394,shell_company_detail_render_share_value_and_dividend_summary_panel,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"CompanyDetail-specific stock-summary callback bound to control `0x948a`. The helper resolves the currently selected company through `0x006d0818` and renders the player-facing share-value and payout block under localized ids `937` `Share Price:`, `724` `Shares Outstanding:`, `955` `Market Cap:`, `956` `Annual Dividend:`, and `957` `Annual Dividend Payments:`. Current grounded helper ownership is tighter now too: `company_query_cached_share_price_scalar` `0x00423eb0` feeds `Share Price`, the outstanding-share count comes from `[company+0x47]`, `Market Cap` multiplies those two lanes together, `Annual Dividend` comes from the current-year stat-family read `0x2329/0x20`, and `Annual Dividend Payments` multiplies that dividend-per-share lane by the outstanding-share count. The broader six-row per-share data family `938..942` instead sits in the shared stock-data formatter `shell_format_company_stock_data_panel` at `0x004c0160`. Current grounded owner is the CompanyDetail refresh path, which binds this panel beside the debt or credit or rate summary block rather than inside the action-message dispatcher.","objdump + RT3.lng strings + caller inspection + stock-summary correlation + share-price correlation + dividend-payout correlation" 0x004c3470,621,shell_company_detail_step_selected_active_company_delta,shell,cdecl,inferred,objdump + caller inspection,4,"CompanyDetail-specific company-navigation helper. The routine resolves the currently selected company id through the detail owner at `0x006d0818`, converts it to an active-company ordinal through `company_collection_count_active_companies_before_company_id` `0x004299f0`, wraps `ordinal + delta` modulo the active-company count from `company_collection_count_active_companies` `0x00429a50`, resolves the replacement company id through `company_collection_get_nth_active_company_id` `0x00429990`, writes it back through detail-manager setter `0x004dd8a0`, refreshes the visible panel through `shell_company_detail_window_refresh_controls` `0x004c2ca0`, notifies the detail manager through `0x004dd410`, and resets territory picker control `0x948c` through `0x00538e00`. Current grounded wrappers are the next and previous company selectors at `0x004c3540` and `0x004c3550`.","objdump + caller inspection + CompanyDetail navigation correlation" 0x004c3540,5,shell_company_detail_select_next_active_company,shell,cdecl,inferred,objdump + caller inspection,4,"Trivial CompanyDetail wrapper that seeds delta `+1` in `ecx` and tail-calls `shell_company_detail_step_selected_active_company_delta` `0x004c3470`. Current grounded callers include shell-side world and company-detail navigation paths.","objdump + caller inspection + wrapper correlation" @@ -470,6 +571,9 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004e9b20,1330,shell_load_screen_render_company_report_history_panel,shell,cdecl,inferred,objdump + caller inspection + page-jump-table correlation + RT3.lng correlation,4,"Shared multi-year company report-table renderer inside `LoadScreen.win`. The helper validates the selected company through the live company collection at `0x0062be10`, derives a bounded display-year window from current display year `[this+0x9c]` and company founding year `[company+0x157]`, clears and repopulates the shared row buffer at `[this+0x11c]`, and then renders one of three page-local report modes selected by its caller-supplied mode argument. The descriptor table rooted at `0x00622192..0x006221a4` now grounds those modes as page `4` `Income Statement`, page `5` `Balance Sheet`, and page `6` `Haulage Report`: mode `0` walks the revenue and expense family `1301..1315`, mode `1` walks the asset and liability family `2816`, `1317..1322`, and mode `2` walks the haulage and operating-stat family `1323..1335`. Ordinary rows read yearly values through `company_read_year_or_control_transfer_metric_value` at `0x0042a5d0`. The two special row families are tighter now too: they feed the `%1/%2` rate inserts for localized strings `2815` and `2816` through `company_compute_negative_cash_balance_interest_rate` at `0x00425880` and `company_compute_positive_cash_balance_interest_rate` at `0x004258c0`. Current grounded callers are the page `4`, `5`, and `6` arms of `shell_load_screen_render_active_page_panel` at `0x004ea060`, so ownership and page semantics are now both bounded.","objdump + caller inspection + page-jump-table correlation + selected-company validation correlation + report-table mode correlation + RT3.lng row-family correlation + descriptor-table decode + special-rate-row correlation" 0x004ea060,1403,shell_load_screen_render_active_page_panel,shell,thiscall,inferred,objdump + caller inspection + page-jump-table correlation + page-title-table decode,4,"Family-wide render dispatcher beneath the shell-side `LoadScreen.win` singleton `0x006d10b0`. The helper first formats the active page heading from the 13-byte page descriptor table rooted at `0x006220a0` using current page id `[this+0x78]`, specifically the title-string dword at record offset `+0x04`. It then lays out the common panel containers through the shell control family rooted at `[this+0x0b31]`, and conditionally exposes the selected-company header affordance on control `0x3f13` when the descriptor header-flag byte at record offset `+0x0c` is set and the current company `[this+0x88]` still resolves through the live company collection at `0x0062be10`. It then switches on the same page id `[this+0x78]` and dispatches into the active page body. Current grounded routes include page `0` through the localized fallback `1203` `Unable to display page`, page `1` through the broader company-overview wrapper around `0x004e5a70/0x004e5a80`, page `2` through `shell_load_screen_render_company_list_panel` at `0x004e68e0`, page `3` through `shell_load_screen_render_company_report_history_panel` at `0x004e9b20` in `Income Statement` mode, page `4` through the same renderer in `Balance Sheet` mode, page `5` through the same renderer in `Haulage Report` mode, page `6` through `shell_load_screen_render_company_stock_data_panel` at `0x004e5130`, page `7` through `shell_load_screen_render_player_list_panel` at `0x004e6ef0`, page `8` through `shell_load_screen_render_player_detail_stock_holdings_panel` at `0x004e5300`, page `9` through `shell_load_screen_render_game_status_briefing_panel` at `0x004e51ea`, page `0x0a` through `shell_load_screen_render_company_train_list_panel` at `0x004e7670`, page `0x0b` through the same localized `1203` fallback, page `0x0c` through `shell_load_screen_render_company_station_list_panel` at `0x004e8bb0`, page `0x0d` through the same localized `1203` fallback, page `0x0e` through `shell_load_screen_render_map_cargo_list_panel` at `0x004e9460`, and page `0x0f` through `shell_load_screen_render_company_industry_list_panel` at `0x004e8270`. That now makes the rendered title order concrete too: `XXX`, `COMPANY OVERVIEW`, `COMPANY LIST`, `INCOME STATEMENT`, `BALANCE SHEET`, `HAULAGE REPORT`, `STOCK DATA`, `PLAYER LIST`, `PLAYER DETAIL`, `GAME STATUS`, `TRAIN LIST`, `TRAIN DETAIL`, `STATION LIST`, `STATION DETAIL`, `CARGO LIST`, and `INDUSTRY LIST`. Current grounded click flow is narrower than that title table: list-page row activation now re-enters page `8` for player detail, but train, station, and industry rows jump out through the shell detail-panel manager instead of switching to page `0x0b` or `0x0d`; no current recovered opener targets `0x0b` or `0x0d`; and no current post-constructor selector path has been recovered for page `0`, whose descriptor remains kind `0`, title `1200` `XXX`, backlink `0`, and header flag `0`. The outer ownership is now clear: this is the shared active-page body renderer above the individual `LoadScreen.win` pages rather than just one more page-local helper.","objdump + caller inspection + page-jump-table correlation + page-table correlation + selected-company header correlation + page-mode decode + page-title-table decode + row-click-route correlation" 0x004ea620,219,shell_load_screen_window_construct,shell,thiscall,inferred,objdump + resource strings + constructor inspection,4,"Constructs the shell-side `LoadScreen.win` family later stored at singleton `0x006d10b0`. The constructor installs vtable `0x005d1194`, binds the random background image `LoadScreen%d.imb` through the format string at `0x005d1180`, binds `LoadScreen.win` through `0x0053fa50`, initializes current page `[this+0x78]` to `0`, stores the singleton at `0x006d10b0`, and seeds the first three visible page-strip controls starting at `0x84d3` through the generic control path at `0x00540120`. It also randomizes one background index into shell state byte `[0x006cec74+0x2c7]` while avoiding the immediately previous choice. Current neighboring helpers at `0x004ea720` and `0x004ea730` provide the live-singleton query and destructor for the same family, which makes this the broad owner-side constructor above the page dispatcher at `0x004e3a80` and the sibling renderers at `0x004e5300`, `0x004e5a80`, and `0x004e5cf0`.","objdump + resource strings + constructor inspection + singleton-state correlation + page-strip correlation" +0x004ea720,14,shell_load_screen_window_is_open,shell,cdecl,inferred,objdump + singleton inspection,4,"Tiny singleton-presence probe for `LoadScreen.win`. It returns `1` when global `0x006d10b0` is non-null and `0` otherwise, which matches the constructor and destructor pair at `0x004ea620` and `0x004ea730`.","objdump + singleton inspection + sibling correlation" +0x004ea730,53,shell_load_screen_window_destroy,shell,thiscall,inferred,objdump + singleton inspection,4,"Destructor for the `LoadScreen.win` singleton rooted at `0x006d10b0`. It restores the vtable header `0x005d1194`, clears the singleton global, releases the shared shell object rooted at `0x006cfd34` when present, and then tails into the common shell object destructor path. This is the destructor sibling of `shell_load_screen_window_construct` `0x004ea620` and is one of the explicit old-mode teardown branches reached from `shell_transition_mode`.","objdump + singleton inspection + destructor correlation" +0x004eb0b0,101,shell_open_grayscale_map_tga_picker_and_stage_selection,shell,cdecl,inferred,objdump + literal inspection + caller correlation,3,"Opens the small shell picker used by `Setup.win` to choose one grayscale source map from `TGA Files (*.tga)` rooted at `.\Data\GrayscaleMaps`. The helper forwards the caller-supplied output pointers in `ECX` and `EDX`, constructs the modal shell object family at `0x004ea940`, and on return copies the staged globals at `0x006d10b4` and `0x006d10b8` back into those outputs. It reports success only when the modal result equals control id `0x3f2`. Current grounded caller is the `Setup.win` branch at `0x0050394c`, which then writes startup selector `4` before shell request `0x0cc` continues. This makes the branch a grayscale-map/new-world picker rather than another saved-profile validator.","objdump + literal inspection + caller correlation + modal-result correlation" 0x004eb890,381,shell_present_merger_vote_outcome_dialog,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Single-player merger-vote outcome presenter used by the merger result path. The helper resolves the two merger companies from `0x006d10dc` and `0x006d10de`, chooses localized title id `729` `Merger Succeeds!!!` or `730` `Merger Fails!!!`, formats the vote tally labels `731` `Votes In Favor:` and `732` `Votes Against:`, and renders the final result dialog through the shell presentation callback rooted at `0x006d111c`. Current grounded caller is `shell_resolve_merger_vote_and_commit_outcome` at `0x004ebd10` on the single-player branch.","objdump + RT3.lng strings + caller inspection + merger-result dialog correlation" 0x004ebd10,1202,shell_resolve_merger_vote_and_commit_outcome,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Resolves the single merger vote, commits the outcome, and records cooldown state. The helper walks the active chairman profile collection at `0x006ceb9c`, computes weighted votes for and against the proposed merger between companies `0x006d10dc` and `0x006d10de`, accumulates the affirmative share count into `0x006d110c`, compares that total against half the target-company value, and then splits by single-player versus multiplayer. In single-player it presents the result through `shell_present_merger_vote_outcome_dialog` at `0x004eb890`; in multiplayer it formats localized id `3059` `Merger between '%1' and '%2' has %3.` with result strings `3060` or `3061` and routes the payload through the shell transport. On success it commits the merger through `0x00427e20`; on failure it stamps the current year into `[company+0x15f]` as the grounded merger-cooldown field.","objdump + RT3.lng strings + caller inspection + merger-vote resolution correlation" 0x004ec640,732,shell_company_detail_attempt_merger_flow,shell,cdecl,inferred,objdump + RT3.lng strings + caller inspection,4,"Runs the `CompanyDetail.win` merger-attempt flow. The helper rejects empty worlds through localized id `727`, rejects recent failed merger cooldown cases through id `728`, and then opens the merger offer or vote dialog family rooted at the local globals `0x006d10cc..0x006d1120`. The grounded single-player path checks the proposed premium against company cash through localized id `3889`, can open a premium-confirmation prompt through id `4067`, and on acceptance commits through the company merger helper at `0x00427e20` or the broader vote-resolution path at `0x004ebd10`. When the multiplayer-side shell owner is active it packages the same request through the asynchronous shell transport path rooted at `0x006cd8d8` instead of mutating company state immediately. Current grounded owner is the wider company-detail message dispatcher at `0x004c56a0`.","objdump + RT3.lng strings + caller inspection + merger-dialog correlation" @@ -504,6 +608,8 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004dc7f0,477,shell_file_options_dialog_handle_message,shell,thiscall,inferred,objdump + strings,4,Handles the fileopt.win command flow and selects exactly one downstream branch before the shared detail-panel completion dispatcher runs. Successful commands dismiss the dialog then set 0x006d07f8 for the load or restore side 0x006d07ec for the save or package side or 0x006d07f0 for the sibling settings-window escape. The settings branch gates on shell_has_settings_window at 0x004fe120 and lazily opens the shared SettingsWindow.win object through 0x00501e50 while sibling branches show prerequisite dialogs when the requested file operation is not currently allowed.,objdump + strings + caller xrefs 0x004dd010,890,shell_file_request_dialog_collect_target_path,shell,cdecl,inferred,objdump + strings,4,"Builds the modal filerqst.win request dialog and resolves one chosen target path back into the caller buffer. The helper treats dialog modes 0 1 2 3 and 11 as save-side requests and the paired modes 4 8 9 and 10 as load-side requests then swaps the button and prompt text between localized ids 249 250 and 251 252. On success it appends one extension from the static mode table at 0x005f3d58 where 0 or 8=.gms 1 or 9=.gmc 2 or 10=.gmx 3 or 4=.gmp and 11=.gmt. Current neighboring callers tighten that last mode too: the normal shell map coordinators use the `.gms/.gmc/.gmx/.gmp` families for scenario and editor flows, while save mode 11 is only consumed by the auxiliary `.gmt` preview-surface branch shared with the side owner at 0x006cd8d8. When a live runtime world is already active through 0x004839b0 the helper overrides that non-runtime table and appends .smp instead, which makes it the shared bridge between the broad shell coordinators and the runtime-state serializer or restore path rather than only a generic filename prompt.",objdump + strings + mode-table inspection + caller correlation 0x004ddbd0,1096,shell_detail_panel_transition_manager,shell,thiscall,inferred,objdump + analysis-context,3,Transitions the shell detail-panel controller rooted at 0x006d0818 between many window or panel states tracked in [this+0x8c] with optional selection ids cached at [this+0x78] through [this+0x90]. The manager tears down the prior child panel at [this+0x88] through 0x004dd950 updates selector or status UI through 0x004dd410 conditionally opens helper windows such as EditorPanel.win through 0x004d4500 and then allocates one of many shell-facing detail windows including TrainDetail.win TrainList.win and neighboring panel objects before publishing the new child through the shell runtime at 0x006d401c. shell_transition_mode reaches this manager on one branch but the current evidence keeps it on the shell-detail path rather than the first gameplay-world-entry coordinator.,objdump + analysis-context + strings +0x004dfbe0,393,shell_game_window_construct,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Constructs the shell-side `Game.win` detail window published at `0x006d0818`. The constructor seeds vtable `0x005d0eb8`, binds the `Game.win` resource through `0x0053fa50`, stores the singleton, creates the primary control strip rooted at ids `0x74`, `0x7d1`, `0x7d2`, `0x7d7`, `0x7f9`, `0x804`, `0x833`, and `0x837`, mirrors runtime booleans from `0x006cec7c+0x82`, `0x006cec74+0x2c3/+0x283`, and the active mode object at `0x006cec78`, and serves as the broad world-facing shell panel above the sibling `GameMessage.win` helper. `shell_transition_mode` now grounds this as its mode-`1` constructor family, while `0x004dfd70` is the paired old-mode teardown path and `0x004dfdf0` ensures the standalone `GameMessage.win` overlay on entry.","objdump + strings + caller xrefs + branch correlation" +0x004dfd70,57,shell_game_window_destroy,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Destructor for the shell-side `Game.win` detail window rooted at `0x006d0818`. It restores vtable `0x005d0eb8`, clears the singleton global, releases the child panel or selector object stored at `[this+0x8c]` through `0x004dd950`, and then tails into the common shell object destructor path. `shell_transition_mode` now uses this as the old-mode teardown branch when leaving mode `1`.","objdump + strings + caller xrefs + destructor correlation" 0x004dfdf0,84,shell_ensure_game_message_window,shell,cdecl,inferred,objdump + strings,4,Ensures the standalone GameMessage.win shell object rooted at 0x006d081c exists. When absent it allocates a 0x94-byte window object seeds the vtable at 0x005d0ed0 binds the GameMessage.win resource through 0x0053fa50 stores the result in 0x006d081c and publishes the object to the shell runtime through 0x00538e50.,objdump + strings + caller xrefs 0x004e0210,1217,game_message_window_service_frame,shell,thiscall,inferred,objdump + strings,4,Per-frame service pass for the GameMessage.win object rooted at 0x006d081c. It walks up to seven active message or notification records from the collection at 0x006acd34 populates the window slots around ids 0x8ca8 and neighboring controls chooses icon and portrait assets such as Portrait.imb note.imb smiley.imb and smalleye.imb maps selected message records into shell and world collections including 0x006ceb9c 0x0062be10 0x0062b26c and 0x0062bae0 and updates the visible action entries through repeated 0x00540120 calls. Current grounded caller is the simulation frame path through 0x004e0720.,objdump + strings + caller xrefs 0x004e0720,15,game_message_window_service_if_present,shell,cdecl,inferred,objdump + caller xrefs,4,Services the GameMessage.win branch only when the global object at 0x006d081c is live by tail-calling game_message_window_service_frame. The current grounded caller is simulation_frame_accumulate_and_step_world which keeps this world-facing message overlay inside the shell-owned recurring frame cadence.,objdump + caller xrefs @@ -516,6 +622,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004fe130,11,shell_mark_settings_window_dirty,shell,cdecl,inferred,objdump + global-state inspection + frame-caller inspection,4,"Tiny dirty-latch setter paired with `shell_has_settings_window`. The helper stores `1` into `0x006d1360`, which current nearby call patterns treat as the `SettingsWindow.win` refresh or service request latch once the live settings singleton at `0x006d1350` exists. Current grounded callers include the post-step shell-window service ladder inside `simulation_frame_accumulate_and_step_world` `0x00439140`, and the same latch is also cleared during settings-window open or rebuild paths near `0x00501e50`.","objdump + global-state inspection + frame-caller inspection + settings-window open-path correlation" 0x00500640,487,shell_settings_window_construct,shell,thiscall,inferred,objdump + strings,4,Constructs the shared SettingsWindow.win object later stored at 0x006d1350. The helper binds the SettingsWindow.win resource through 0x0053fa50 allocates a page-selection helper at 0x006d1358 walks the 13-entry category table rooted at 0x00622870 and populates the resulting shell control tree with the page labels and ordering data before the window is shown.,objdump + strings 0x00501e50,201,shell_open_settings_window,shell,cdecl,inferred,objdump + strings,4,Lazily allocates and shows the shared SettingsWindow.win shell object at 0x006d1350. When no settings window is live it allocates a 0x78-byte object constructs it through shell_settings_window_construct publishes it to the shell runtime through 0x00538f10 and then notifies the active shell owner at 0x0062be68. Current grounded callers are the direct shell command wrapper at 0x00482b00 the fileopt settings escape branch and one larger shell UI dispatcher branch near 0x0050366a.,objdump + strings + caller xrefs +0x00501f20,270,shell_query_registry_open_command_for_http_or_rtf_target,shell,cdecl,inferred,objdump + literal inspection,3,"Queries one shell-open command string from the registry and formats it into the shared command buffer at `0x006d14d8`. Selector `0` uses the literal `http\\shell\\open` and validates the returned command against the substrings `netsc` and the quoted percent-one placeholder; selector `1` uses `rtffile\\shell\\open`, truncates at the percent-one placeholder, and appends the literal `readme.rtf` through the format `%s %s`. The helper returns `0x006d14d8` on success or `0` on failure. Current grounded callers are the early `Setup.win` dispatcher buttons at `0x00503585/0x0050359f/0x005035c7/0x005035ce`, which then forward the formatted command through import `0x005c8088` instead of re-entering the normal setup launch-mode family.","objdump + literal inspection + caller correlation" 0x00468d00,222,multiplayer_update_semicolon_name_list,shell,cdecl,inferred,ghidra-headless,4,Adds or removes one player-name token in the semicolon-delimited moderation list rooted at `[ecx+0x905c]`. With mode `1` it appends the supplied token only when not already present writing `;` as the delimiter; with mode `0` it removes the matched token collapses the remainder left and skips an adjacent delimiter when present.,ghidra + rizin + llvm-objdump + strings 0x00468de0,14,multiplayer_session_event_forward_action1_request,shell,unknown,inferred,ghidra-headless,2,Session-event callback wrapper that always forwards request id `1` through multiplayer_set_pending_session_substate with a zero auxiliary payload. The callback clears EDX before the shared setter call and currently lands on a request id that does not yet map to a visible pending substate so this row remains structural.,ghidra + rizin + llvm-objdump 0x00468e00,188,multiplayer_session_event_publish_pair_chat_template,shell,unknown,inferred,ghidra-headless,3,Session-event callback that formats one two-string chat/status line through multiplayer_route_chat_line when the callback status in EDX is zero and the current live session count is not positive. A selector near `[esp+0x214]` chooses the template `%s* %s` `%s %s` or `%s > %s`; the helper length-checks both inputs against the local 0x1f4-byte buffer before formatting and returns without publishing when either string is null or too long.,ghidra + rizin + llvm-objdump + strings @@ -546,7 +653,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00469680,14,multiplayer_pump_session_event_status,shell,unknown,inferred,ghidra-headless,3,Thin session-event transport wrapper that immediately requests a status pump through multiplayer_transport_request_status_pump on the active transport object at `0x006cd970` and discards one stack argument. Current grounded callers use it after updating Multiplayer.win status text ids `0xe60` and `0xe61`.,ghidra + rizin + llvm-objdump 0x00469700,27,multiplayer_preview_dataset_stage_selected_path,shell,thiscall,inferred,objdump + caller xrefs,3,Small Multiplayer preview-dataset helper that copies one caller-supplied selected path string into the dataset-local staging buffer at `[this+0x8f48]`. Current grounded callers feed it the active session-entry path from the live session list before later preview or launch-side dataset work.,objdump + caller xrefs 0x00469720,221,multiplayer_preview_dataset_service_frame,shell,thiscall,inferred,objdump + caller xrefs,3,"Recurring shell-frame service for the Multiplayer preview dataset rooted at `0x006cd8d8`. When the gating global at `0x006cd910` and the dataset render target at `[this+0x9884]` are live it walks the active session list under `0x006d40d0`, formats one roster or status line per entry through the template at `0x005ce1ac`, and then pushes the accumulated text through the render/update helper at `0x005519f0` with fixed presentation parameters. The current grounded caller is `shell_state_service_active_mode_frame`, which makes this a shell-owned per-frame refresh path for multiplayer preview text rather than a transport I/O loop.",objdump + caller xrefs + strings -0x0046b780,368,multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync,shell,thiscall,inferred,objdump + caller xrefs + strings + callsite inspection,4,"Services one higher-level launch or preview transition slice on the Multiplayer preview dataset rooted at `0x006cd8d8`. At entry it checks global `0x006cd91c` and, when armed, formats localized id `3879` `Out of Sync` through `0x5193f0` and pushes it into the shell status presenter at `0x5386e0` with timeout `0xbb8`; this is the current grounded owner of that string and it is not part of the station-detail overlay. The same helper then gates on preview and launcher globals `0x006cd8dc`, `0x006ce9b8`, `0x006ce9c4`, and shell-state latches under `0x006cec78`, drives one modal shell branch through `0x482150`, timestamps `[this+0x9058]`, chains the internal dataset-side helpers at `0x46af70`, `0x46b0c0`, `0x46ad80`, `0x46aeb0`, `0x469b00`, and `0x46a590`, and can finally relaunch into `shell_map_file_entry_coordinator` at `0x00445ac0` through staged buffer `0x006ce630`. Current grounded callers include the multiplayer-side service loop around `0x004373c5` and `0x00437435`, plus later shell-side branches at `0x00483638`, `0x00483d79`, and `0x00484054`.","objdump + caller xrefs + strings + callsite inspection + multiplayer-preview correlation" +0x0046b780,368,multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync,shell,thiscall,inferred,objdump + caller xrefs + strings + callsite inspection,4,"Services one higher-level launch or preview transition slice on the Multiplayer preview dataset rooted at `0x006cd8d8`. At entry it checks global `0x006cd91c` and, when armed, formats localized id `3879` `Out of Sync` through `0x5193f0` and pushes it into the shell status presenter at `0x5386e0` with timeout `0xbb8`; this is the current grounded owner of that string and it is not part of the station-detail overlay. The same helper then gates on preview and launcher globals `0x006cd8dc`, `0x006ce9b8`, `0x006ce9c4`, and shell-state latches under `0x006cec78`, drives one modal shell branch through `0x482150`, timestamps `[this+0x9058]`, chains the internal dataset-side helpers at `0x46af70`, `0x46b0c0`, `0x46ad80`, `0x46aeb0`, `0x469b00`, and `0x46a590`, and now has a tighter launch-side tail: when `0x006ce9c4` is armed the inner branch at `0x0046b8bc` allocates or clears one active-mode object through `0x53b070/0x4336d0`, publishes it into `0x006cec78`, runs `shell_active_mode_run_profile_startup_and_load_dispatch` `0x00438890` with stack args `(0, 0)`, then clears `[0x006cec74+0x6c]` and only after that re-enters `shell_map_file_entry_coordinator` `0x00445ac0` through staged buffer `0x006ce630` plus flag dword `0x006ce9c0`. Current grounded callers include the multiplayer-side service loop around `0x004373c5` and `0x00437435`, plus later shell-side branches at `0x00483638`, `0x00483d79`, and `0x00484054`.","objdump + caller xrefs + strings + callsite inspection + multiplayer-preview correlation + launch-tail disassembly" 0x0046a6c0,307,multiplayer_session_event_publish_registration_field,shell,unknown,inferred,ghidra-headless + objdump,3,"Switch-driven session-event callback that publishes one Multiplayer.win registration or status field into the destination builder passed on the stack. Depending on selector `EDX` it now clearly includes the local executable version string through `runtime_query_cached_local_exe_version_string` `0x00482d80` on runtime root `0x006cec74`, the profile text at `0x006cd8d8+0x8e10`, the constant `0x2328`, the live session count from `0x006d40d0`, the field at `[0x006d1270+0x3b6]`, the active profile string at `[0x006cec7c+0x44]`, or fixed strings such as `Initializing...`, `openstaging`, and `closedplaying`; unsupported selectors fall back to the fixed token at `0x005c87a8`.","ghidra + rizin + llvm-objdump + strings + registration-field correlation" 0x0046a830,194,multiplayer_session_event_retry_with_random_player_name,shell,unknown,inferred,ghidra-headless,3,Registration-side callback that increments the retry counter at `0x006cd984` and on early retries formats a randomized `RT3Player%d` name into `0x006ae0c0` sanitizes it into a local notification object notifies the current Multiplayer.win owner and forwards that object through multiplayer_transport_set_local_name. On the first retry it also routes request id `5` or `6` through multiplayer_set_pending_session_substate depending on the incoming status flag; after 25 retries it resets `0x006cd984` and `0x006cd974` and calls multiplayer_transport_reset_and_maybe_shutdown instead.,ghidra + rizin + llvm-objdump + strings 0x0046a900,522,multiplayer_register_session_event_callbacks,shell,thiscall,inferred,ghidra-headless,4,Builds and registers the Multiplayer.win session-event callback table rooted at the local block on `[esp+0x28]`. The function seeds slots with multiplayer_session_event_forward_action1_request multiplayer_session_event_publish_pair_chat_template multiplayer_session_event_publish_action2_single_name multiplayer_session_event_publish_action2_pair multiplayer_session_event_forward_action4_request multiplayer_session_event_forward_action7_request multiplayer_session_event_noop_12byte_stub multiplayer_session_event_publish_registration_field multiplayer_session_event_publish_status_value multiplayer_session_event_publish_fixed_status_text multiplayer_session_event_seed_control_id_list multiplayer_session_event_query_session_count multiplayer_session_event_noop_8byte_stub multiplayer_session_event_latch_status_code multiplayer_session_event_notify_owner_and_queue_action8 multiplayer_init_session_event_transport_state and multiplayer_session_event_retry_with_random_player_name. It allocates the transport callback object under `0x006cd970` stages the session name into the local descriptor block and then finishes registration through multiplayer_transport_register_callback_table which in turn routes through multiplayer_transport_attach_callback_table_descriptor multiplayer_transport_enqueue_descriptor_block_record and multiplayer_transport_dispatch_callback_table_binding.,ghidra + rizin + llvm-objdump + strings @@ -577,12 +684,32 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x004ef090,365,multiplayer_select_preview_mode_and_refresh,shell,cdecl,inferred,ghidra-headless,3,Selects one of the top-level multiplayer preview modes identified by command ids 0xe10 through 0xe13 then refreshes the preview panel. The helper stores the requested mode at [this+0x7c] updates the four mode-button states through 0x00540120 handles the special 0xe12 branch with extra multiplayer refresh helpers and a direct multiplayer_refresh_map_preview_panel call for state 0xe15 emits a summary status field at 0xe55 falls back through multiplayer_refresh_map_preview_panel(-1) and finally refreshes the panel timestamp at [this+0x80] through 0x0051d890.,ghidra + rizin + llvm-objdump + strings 0x004ef200,1786,multiplayer_service_pending_status_state_machine,shell,cdecl,inferred,ghidra-headless,4,Services the pending Multiplayer.win status or transition state machine when the global flag at `0x006d1278` is set. The routine clears the pending flag switches over the queued step id at `0x006d1280` and now has several grounded branches: step `1` builds modal status `0xe4f` optionally appends owner text from `0x006d4118/0x006d411c` tears down the preview dataset at `0x006cd8d8` and refreshes control `0xcc`; step `2` clears `0x006cd920` destroys the preview dataset and opens status `0xe50`; step `3` gates on latch byte `0x006d1292` and warns with `0xe51`; step `4` requires `0x006cd920 != 0` and `0x006ae3c8 >= 3` or warns with `0xe52` otherwise it seeds a random `RT3Player%d` name into the staged-text controls through multiplayer_sync_staged_text_controls and sets `0x006ae3c4 = 2`; step `5` opens status `0xe54` then rebuilds the preview dataset through multiplayer_reset_preview_dataset_and_request_action. A second substate switch on `0x006d1284` formats statuses `0xe55..0xe5f` `0xe92` and `0xf53`; its `0x5` and `0x8` families either force preview mode `0xe13` or reseed the default player-name path before syncing the staged-text controls.,ghidra + rizin + llvm-objdump + strings 0x004ef960,1260,multiplayer_dispatch_requested_action,shell,cdecl,inferred,ghidra-headless,4,Dispatches the current requested Multiplayer.win action stored in `0x006d127c`. The switch drives six higher-level action cases that combine immediate mode changes through multiplayer_select_preview_mode_and_refresh with deferred pending-step writes into `0x006d1278` and `0x006d1280`. The grounded wrappers are now broader than before: action `1` either enters preview mode `0xe11` immediately or schedules pending step `1`; action `2` resets the local session-slot state through multiplayer_reset_local_session_slot_state copies the staged text buffers into the active dataset seeds one local open-slot marker refreshes the local player rows enters preview mode `0xe12` and rebuilds the open-slot markers; action `3` copies the staged text buffers back into the active multiplayer object and then uses the dataset mode at `[0x006cd8d8+0x0c]` to schedule pending steps `0xa` `0xb` `0xc` `0xe` or fallback `0x2` while its resolved-mode branch re-enters preview mode `0xe12` clears latches `0x006d1291/0x006d1292` and seeds the local player panel; action `4` promotes the committed staged text into preview mode `0xe13` or schedules pending step `5` or `6` from the launcher substate at `0x006d1288`; action `5` pumps the selected-map follow-up callback then either rebuilds the open-slot markers and refreshes status control `0x109` or schedules pending step `1` with control `0x11` updates depending on the current launch-side state; action `6` validates the staged text against the active dataset and schedules pending step `6` when the launcher substate remains armed.,ghidra + rizin + llvm-objdump -0x004efe80,1388,multiplayer_window_init_globals,shell,thiscall,inferred,ghidra-headless,4,Initializes the Multiplayer.win shell window family and its large backing state block. The constructor seeds the shared vtable at 0x005d12ac clears multiplayer globals under 0x006d1274 through 0x006d1288 allocates and zeroes a 0x100f2-byte data block stored at 0x006d1270 registers the active singleton at 0x006d1268 pushes the Multiplayer.win resource into the standard shell window setup helper and then continues with multiplayer-specific list and status initialization.,ghidra + rizin + llvm-objdump + strings +0x004efe80,1388,multiplayer_window_init_globals,shell,thiscall,inferred,ghidra-headless,4,Initializes the Multiplayer.win shell window family and its large backing state block. The constructor seeds the shared vtable at 0x005d12ac clears multiplayer globals under 0x006d1274 through 0x006d1288 allocates and zeroes a 0x100f2-byte data block stored at 0x006d1270 registers the active singleton at 0x006d1268 pushes the Multiplayer.win resource into the standard shell window setup helper and then continues with multiplayer-specific list and status initialization. `shell_transition_mode` now grounds this as its mode-`5` constructor branch at `0x483313`.,ghidra + rizin + llvm-objdump + strings + branch correlation +0x0053f830,39,shell_window_find_registered_child_control_by_id,shell,thiscall,inferred,objdump + constructor helper correlation,3,"Looks up one registered shell child control by its 16-bit control id in the intrusive child-control list rooted at `[this+0x70]`. The helper walks each child through link field `+0x8e`, compares the requested id against child field `+0x04`, and returns the matching child pointer or null. Current grounded callers include the `Setup.win` preview-surface publisher `0x00502220`, the `Setup.win` constructor `0x00504010`, and `GameUppermost.win` message handler `0x004e0ba0`, which makes this the generic shell child-control lookup helper rather than a setup-only path.","objdump + constructor helper correlation + caller xrefs + intrusive-list correlation" +0x0053f9c0,131,shell_window_register_child_control_sorted_by_priority_and_optional_tag,shell,thiscall,inferred,objdump + constructor helper correlation,3,"Registers one prepared child-control object on the owning shell window while maintaining the intrusive child-control list rooted at `[this+0x70]/[this+0x74]`. The helper first finalizes the child through `shell_child_control_set_owner_resolve_caption_and_refresh` `0x00558130(owner)`, then walks the existing child list by priority byte at child field `+0x08`, optionally using the caller-supplied u16 tag to stop on one equal-priority sibling, and finally splices the child into the doubly linked list through fields `+0x8a/+0x8e`. Current grounded callers include the `Setup.win` constructor-side optional child branch at `0x0050429b` and the dividend-modal control setup helper `0x004c4c70`, so this now reads as the generic ordered child-control registration helper beneath several shell window constructors.","objdump + constructor helper correlation + caller xrefs + intrusive-list correlation + priority-order correlation" +0x0053fa50,508,shell_window_bind_resource_and_initialize_child_control_links,shell,thiscall,inferred,objdump + constructor correlation + strings,4,"Base shell window setup helper reused by many shell-side constructors. It clears the owning window's child-control list heads at `[this+0x70]/[this+0x74]`, copies the caller-supplied resource name into the local buffer at `[this+0x35]`, seeds several base window fields such as `[this+0x21] = 0x14` and clears `[this+0x54]/[this+0x58]`, and then continues through the shared shell resource-bind path for the requested window resource. Current grounded callers include the constructors for `Setup.win`, `Multiplayer.win`, `LoadScreen.win`, `Game.win`, `Campaign.win`, `Credits.win`, `Trainbuy.win`, `TrainDetail.win`, `StationDetail.win`, and several editor or detail-side dialogs, which makes this the generic shell window resource-bind and child-list initialization helper rather than one mode-specific constructor.","objdump + constructor correlation + strings + caller xrefs + child-list initialization correlation" +0x00558130,70,shell_child_control_set_owner_resolve_caption_and_refresh,shell,thiscall,inferred,objdump + child-control correlation,3,"Initial child-control finalizer used just before intrusive registration on a shell window. The helper stores the owning window pointer at `[this+0x86]`, resolves one localized caption into the inline text buffer at `[this+0x43]` when control word `[this+0x40]` is nonzero through `0x5193f0 -> 0x51d820`, normalizes uninitialized field `[this+0x38]` to `-1`, and then re-enters the child vtable through slots `+0x14` and `+0x3c` to refresh derived control state. Current grounded caller is `shell_window_register_child_control_sorted_by_priority_and_optional_tag` `0x0053f9c0`, which makes this the generic child-control setup step rather than a setup-only helper.","objdump + child-control correlation + caller xrefs + localized-caption correlation" +0x00504010,686,shell_setup_window_construct,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Constructs the `Setup.win` shell window singleton rooted at `0x006d14c0`. The constructor seeds vtable `0x005d1664`, binds the `Setup.win` resource plus `Setup_Coast_To_Coast.imb` through the shared base helper `shell_window_bind_resource_and_initialize_child_control_links` `0x0053fa50`, seeds companion globals `0x006d14b0..0x006d14bc`, marks the runtime profile at `0x006cec7c+0x7d`, immediately refreshes the mode-dependent and summary lanes through `0x00502910` and `0x00502550`, and seeds initial submode `1` through `shell_setup_window_select_launch_mode_and_apply_shell_state` `0x00502c00(1)`. It then builds the setup-control bands rooted at ids `0x0ce8`, `0x0e86`, `0x0e87`, `0x0e88`, repeated ranges `0x0c80..0x0c86` and `0x0f6f..0x0f71`, and optional controls such as `0x0ddf`, `0x0d4c`, and `0x0bd0`. The constructor-side callback split is tighter now too: control `0x0ce8` installs the table-driven payload-category row callback `0x00502030`, while controls `0x0e86` and `0x0e87` install the persisted shell-state selector callbacks `0x00502160` and `0x005021c0`, so that trio belongs to the presentation/config-save side of `Setup.win` rather than the later startup-selector or submode-dispatch lanes. The broader constructor shape is tighter too: the repeated `0x0c80..0x0c86` and `0x0f6f..0x0f71` bands are installed homogeneously as one button-family layer, `0x0e88` is a separate special control whose returned shell object is looked up through `shell_window_find_registered_child_control_by_id` `0x0053f830` and then retuned through float fields `+0xbc/+0xc4`, and the grayscale-heightmap controls `0x0ddf` and `0x0d4c` are only installed when the small capability guard at `0x0051b6f0` says that lane is available. The remaining optional child at `0x0bd0` is tighter now too: it is not another launch root, but a constructor-only owned child control built from the template string block at `0x005d16b4`, one temporary descriptor assembled on the stack through `0x0051d820`, and one optional `0x111`-byte heap object initialized through `0x0053b070/0x0055a040` before registration through `shell_window_register_child_control_sorted_by_priority_and_optional_tag` `0x0053f9c0`. `shell_transition_mode` now grounds this as its mode-`2` constructor branch at `0x483289`.","objdump + strings + caller xrefs + branch correlation + constructor callback correlation + constructor seed-path correlation + conditional-control-install correlation + optional-child-control correlation + generic-shell-helper correlation" +0x00502030,301,shell_setup_window_draw_table_driven_payload_category_row,shell,stdcall,inferred,objdump + constructor callback correlation + data-table inspection,3,"Table-driven `Setup.win` draw callback installed on control `0x0ce8` by the constructor at `0x00504010`. The callback uses the current setup payload at `0x006d14bc` plus the caller row index to read one category byte at `+0x31a`, maps that byte through the record table rooted at `0x005f2d47` to one localized string id via `0x005193f0`, chooses one of the companion style slots `0x18/0x19` depending on whether the current row falls below the shell-state threshold `[0x006cec7c+0x79]`, and then renders the assembled label through the companion objects at `0x006d14b0` and `0x006d14b4` via `0x0053de00 -> 0x00552560`. Current evidence grounds the callback as a table-driven payload-category row renderer rather than another launch or submode selector, even though the exact player-facing category name behind byte `+0x31a` remains open.","objdump + constructor callback correlation + data-table inspection + setup-payload correlation" +0x005174e0,136,shell_video_window_construct,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Constructs the `Video.win` shell window family. The constructor seeds vtable `0x005d1a4c`, increments the live counter under `0x006d4024+0x11427a`, stores live state in globals `0x006d3b68`, `0x006d3b74`, and `0x006d3b78`, binds the `Video.win` resource through `0x0053fa50`, and seeds the primary callback control `0x0c096`. `shell_transition_mode` now grounds this as its mode-`3` constructor branch at `0x4832b7`. The nearby sibling `0x00517660` binds `WinLose.win`, which makes that helper a related child panel rather than the main transition-mode window.","objdump + strings + caller xrefs + sibling correlation" +0x00517570,101,shell_video_window_destroy,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Destructor for the `Video.win` shell window family rooted at vtable `0x005d1a4c`. It decrements the live counter under `0x006d4024+0x11427a`, restores display bounds through `0x005206b0`, notifies the shell runtime through `0x00538a40`, and when the one-shot latch at `0x006d3b68` is set it clears `[0x006cec74+0xa8]` and re-enters the shell-support path through `0x00484910(1)`. This is the destructor sibling of `shell_video_window_construct` `0x005174e0` and is the old-mode teardown branch used by `shell_transition_mode` when leaving mode `3`.","objdump + strings + caller xrefs + destructor correlation" +0x004b8dc0,149,shell_campaign_window_destroy,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Destructor for the `Campaign.win` shell mode family. It restores vtable `0x005d0570`, resets shell display bounds through `0x005206b0`, marks one runtime display flag under `[0x006cec74+0x14]+0x110`, clears globals `0x006cfd28` and `0x006cfd34`, and then tails into the common shell object destructor. This is the destructor sibling of `shell_campaign_window_construct` `0x004b8e60` and is the explicit old-mode teardown branch used by `shell_transition_mode` when leaving mode `7`.","objdump + strings + caller xrefs + destructor correlation" +0x004b8e60,610,shell_campaign_window_construct,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Constructs the `Campaign.win` shell mode family. The constructor seeds vtable `0x005d0570`, binds `Campaign.win`, clears singleton globals `0x006cfd20` and `0x006cfd28`, stores the active object at `0x006cfd1c`, creates control families rooted at `0x0c351`, `0x0c36c..0x0c371`, `0x0c397..0x0c39a`, and `0x0c39b`, seeds or refreshes the shared companion object `0x006cfd34`, and mirrors campaign selectors from `[0x006cec7c+0xc4/+0xc6]` into local state plus the control band starting at `0x0c352`. `shell_transition_mode` now grounds this as its mode-`7` constructor branch at `0x483367`.","objdump + strings + caller xrefs + branch correlation" +0x004c7bc0,181,shell_credits_window_destroy,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Destructor for the `Credits.win` shell window family rooted at `0x006cfe8c`. It restores vtable `0x005d099c`, releases the 31 loaded image handles stored from `[this+0x78]`, frees the companion globals `0x006cfe90..0x006cfe9c`, clears the singleton `0x006cfe8c`, and releases the optional shared companion object `0x006cfea0`. This is the destructor sibling of `shell_credits_window_construct` `0x004c7fc0` and is the old-mode teardown branch used by `shell_transition_mode` when leaving mode `6`.","objdump + strings + caller xrefs + destructor correlation" +0x004c7fc0,717,shell_credits_window_construct,shell,thiscall,inferred,objdump + strings + caller xrefs,4,"Constructs the `Credits.win` shell window singleton rooted at `0x006cfe8c`. The constructor seeds vtable `0x005d099c`, binds `Credits.win` through `0x0053fa50`, loads `data\\Language\\Credits.lng`, materializes up to 250 credit rows into the large local table at `[this+0x584]`, loads the `logos.imb` companion asset and three additional shell resources into globals `0x006cfe90..0x006cfe9c`, seeds control `0x0edb`, and optionally allocates the shared companion object at `0x006cfea0`. `shell_transition_mode` now grounds this as its mode-`6` constructor branch at `0x48333d`.","objdump + strings + caller xrefs + branch correlation" 0x004f03f0,3612,multiplayer_window_service_loop,shell,cdecl,inferred,ghidra-headless,3,Top-level Multiplayer.win service loop. The function performs an early startup countdown through `0x006cd90c` calls multiplayer_service_pending_status_state_machine processes the special pending-step-10 gate with latch byte `0x006d1292` clears one text field when pending step 2 completes and then continues into the broader multiplayer update loop with timed retries staged-text synchronization peer-roster and map-entry list refresh helpers object-state checks and several mode-specific update branches. It queues requested action 5 after rebuilding one selected-map preview follow-up path and requested action 6 after the validated staged-text follow-up dialog branch. The launch-side inline wrappers now separate into three behaviors: a peers-not-ready warning dialog on resource `0xf15`; an add-open-slot path that seeds `0x006cec7c+0x83` stores the callback owner in `0x006d4110` and refreshes status control `0x109`; and a missing-session or slot-capacity warning path that opens modal dialogs on resources `0x2cf` `0x2b8` or `0x2b9`.,ghidra + rizin + llvm-objdump 0x004f13e0,167,multiplayer_restore_preview_state_from_globals,shell,thiscall,inferred,ghidra-headless,3,Restores the Multiplayer.win preview UI from the current global mode and preview-state fields. The callback refreshes the mode-dependent labels through multiplayer_update_preview_mode_labels mirrors selection presence into the active shell object toggles the 0x006d1291 recursion guard replays multiplayer_select_preview_mode_and_refresh and multiplayer_refresh_map_preview_panel using the saved fields at [this+0x7c] and [this+0x78] and if the active preview resources are missing schedules pending status step 7 by writing 0x006d1278 and 0x006d1280 instead of forcing an immediate redraw.,ghidra + rizin + llvm-objdump + strings -0x00502220,813,paint_terrain_load_selected_gmt_surface,shell,cdecl,inferred,ghidra-headless,4,Loads or refreshes the currently selected .gmt-backed preview surface for the PaintTerrain tool family rooted at 0x006d14bc and tied to the PaintTerrain.win or GroundTerrain.tga branch. The routine validates the selected filename suffix copies selected strings into the active record updates tool status bytes and counters formats several shell text fields through 0x00540120 and finishes by decoding a 256x256 image through 0x0053f830 and surface_init_rgba_pixel_buffer.,ghidra + rizin + llvm-objdump + strings -0x00502550,456,paint_terrain_refresh_status_panel,shell,cdecl,inferred,ghidra-headless,3,Refreshes the PaintTerrain tool status or selection panel after the active .gmt surface changes. The helper reads the PaintTerrain singleton at 0x006d14bc consults shell selection globals and lookup tables formats several text or numeric fields through 0x00540120 and toggles the side flag at 0x006d14a8 before returning.,ghidra + rizin + llvm-objdump + strings +0x00502220,813,shell_setup_window_publish_selected_profile_labels_and_preview_surface,shell,cdecl,inferred,objdump + local disassembly,3,"Publishes the currently selected `Setup.win` profile or scenario labels and optional preview surface into the live window object supplied in `ECX`. The helper synchronizes the staged path pair under `[0x006cec7c]+0x11` and `+0x44`, toggles the local presence byte `[0x006cec7c+0x10]`, formats the visible label fields `0xcf5`, `0xe7f`, `0xd4c`, and `0xd4e` through `0x00540120`, and when a live setup payload is present under `0x006d14bc` first re-enters `shell_setup_load_selected_profile_bundle_into_payload_record` `0x00442400`, then copies payload word fields `+0x14/+0x3b2/+0x3ba` plus byte `+0x20` into the staged runtime profile through `shell_setup_profile_copy_payload_scroll_count_and_campaign_byte_and_seed_row_categories` `0x0047be50`, and finally decodes the `0x100 x 0x100` preview surface through `0x0053f830 -> 0x00559520`. Current grounded callers are the list-refresh wrappers at `0x005028f6/0x00502906`, the `Setup.win` dispatcher branch at `0x0050341f`, and the early setup-mode branch at `0x00503083`. This keeps the helper on the selection-label and preview-surface side of `Setup.win` rather than the later launch-mode dispatcher rooted at `0x00502c00`.","objdump + local disassembly + caller xrefs + control-id correlation + setup-payload-load correlation" +0x00502160,85,shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config,shell,thiscall,inferred,objdump + constructor callback correlation,3,"Small `Setup.win` callback installed on control `0x0e86`. Callback value `0` clears the shell-state presence dword at `[0x006cec74+0x233]`; nonzero values set that presence dword to `1`, store the zero-based selected index at `[0x006cec74+0x237]`, and then persist the shell configuration through `shell_save_graphics_config` `0x00484910(1)`. The constructor at `0x00504010` installs this beside sibling callback `0x005021c0`, which keeps the control on the persisted shell-state selector side of `Setup.win` rather than on the startup-selector or submode-dispatch side.","objdump + constructor callback correlation + shell-state write correlation" +0x005021c0,85,shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config,shell,thiscall,inferred,objdump + constructor callback correlation,3,"Small `Setup.win` callback installed on control `0x0e87`. It is the sibling of `0x00502160`: callback value `0` clears the shell-state presence dword at `[0x006cec74+0x23b]`, nonzero values set that presence dword to `1`, store the zero-based selected index at `[0x006cec74+0x23f]`, and then persist the shell configuration through `shell_save_graphics_config` `0x00484910(1)`. Current grounded owner is the `Setup.win` constructor `0x00504010`, which makes this a persisted shell-state selector callback rather than another launch or submode control.","objdump + constructor callback correlation + shell-state write correlation" +0x00502550,456,shell_setup_window_refresh_selection_lists_and_summary_fields,shell,cdecl,inferred,objdump + local disassembly,3,"Refreshes the larger `Setup.win` list and summary panel family from the current setup payload at `0x006d14bc` and staged profile state under `0x006cec7c`. The helper publishes the staged profile-path tail into control `0xe7f`, formats the scalar summary in `0xe84` from `[0x006cec7c+0x77]`, rebuilds the two persisted selector lists rooted at controls `0xe86` and `0xe87` from the static label tables `0x00620dd8` and `0x00620e3c`, mirrors the current persisted selections from shell-state pairs `[0x006cec74+0x233/+0x237]` and `[+0x23b/+0x23f]` into the selected-row summary at control `0x66`, and republishes the config toggles `0xe88/0xe89/0xe8a` from shell-state flags `[+0x247/+0x24b/+0x243]`. It also toggles the local latch at `0x006d14a8`. Current grounded callers are the setup-dispatch branches at `0x0050373a`, `0x00503b0e`, and the constructor-side follow-up at `0x005040c1`, which keeps this bounded as the main list-and-summary refresh helper for `Setup.win` rather than another submode selector.","objdump + local disassembly + caller xrefs + control-id correlation + persisted-selector-list correlation" 0x00502720,144,paint_terrain_tool_init_globals,shell,thiscall,inferred,ghidra-headless,4,Initializes the PaintTerrain shell tool singleton rooted at 0x006d14bc. The constructor seeds the tool vtable and default fields registers the active instance globally and is selected directly from shell_transition_mode alongside the neighboring terrain-edit tool constructor at 0x004ee3a0.,ghidra + rizin + llvm-objdump + strings +0x005027b0,351,shell_setup_window_refresh_file_backed_selection_list_panel,shell,cdecl,inferred,objdump + local disassembly,3,"Refreshes the file-backed list pane used by the `Setup.win` submodes that depend on the staged dataset at `0x006d14b8`. The helper chooses one top header-control family from the current setup submode at `[window+0x7b]`, now bounded exactly as `4 -> 0xd4b`, `9 -> 0xde8`, `6/12/14 -> 0xdf2`, and `10 -> 0xe85`, rebuilds the repeated row controls rooted at `0x88` from each record's text at `+0x12d`, mirrors the selected record into the summary slot `0x66` when its secondary path matches `[0x006cec7c+0x44]`, paints the fixed status-color strip rooted at control `0xaf` from the constant table `0x00622a98`, and then re-enters `shell_setup_window_publish_selected_profile_labels_and_preview_surface` `0x00502220`. RT3.lng now also tightens one earlier misread here: those `0xd4b/0xde8/0xdf2/0xe85` values are local setup header-control or resource ids, not localized text ids. The setup-art bundle tightens that split one step further too: the only distinct file-backed setup art families under `rt3_2WIN.PK4` are the shared `Setup_Load(.imb/_Buttons.imb)` family and the separate `Setup_Sandbox(.imb/_Buttons.imb)` family, which matches the earlier selector evidence that mode `10` is the sandbox-backed `new` list while the neighboring mode `12` is its `load` sibling. The upstream dataset helpers now tighten the remaining family split too: this pane consumes rows staged by `shell_setup_file_list_construct_and_scan_dataset` `0x004336a0`, and the surrounding mode selector makes modes `4/6/10/12/14` default to the ordinary setup file root while mode `9` is the only file-backed sibling that also flips the shell-side root toward the map-family branch. Combined with the dataset normalization split in `0x004333f0`, that now shows only submodes `4` and `10` using the alternate localized-stem list-label path, while `6`, `9`, `12`, and `14` keep the direct filename-normalization lane. Current grounded callers are the mode-`4`, `9`, `6`, `10`, `12`, and `14` follow-up branches inside `shell_setup_window_select_launch_mode_and_apply_shell_state` `0x00502c00`.","objdump + local disassembly + caller xrefs + header-control correlation + dataset-list correlation + setup-file-root correlation + localized-file-list split + RT3.lng negative-result correlation + setup-art-family correlation" +0x00502910,744,shell_setup_window_refresh_mode_dependent_lists,shell,cdecl,inferred,objdump + local disassembly,3,"Refreshes the shared non-file-backed `Setup.win` payload panel family, using the current setup submode at `[window+0x7b]` only as a presence gate rather than a deep selector. The helper formats the current item-count summary into `0x0cf3`, publishes one fixed placeholder or stem into `0x0cf4`, republishes the staged-path tail into `0x0cf5`, formats the scalar field from `[0x006cec7c+0x77]` into `0x0d4f`, mirrors option-byte `[0x006cec7c+0x7d]` into the five compact controls `0x0ce9..0x0ced`, looks up the constructor-installed draw callback host at `0x0ce8`, and then rebuilds the repeated row controls under `0x88` from the current setup payload at `0x006d14bc`. That payload-side row family is tighter now too: row count comes from `[payload+0x3ae]`, the draw callback id is read from `[control+0x1d6]`, row availability is gated by bytes `[payload+0x31b]` and `[payload+0x31c]`, and the live row-selection marker bytes are mirrored into `[0x006cec7c+0x87]` as `1` for the first row, `0x64+index` for later live rows, and `0` for hidden ones. After the row rebuild it republishes the active summary row in control `0x66` when the caller-supplied index still falls inside the current visible band `[submode_base + current_scroll .. + current_scroll + live_rows)`. Current grounded callers are the direct submode follow-up at `0x00503243`, the decrement or increment and option-byte branches at `0x005037e9`, `0x00503828`, `0x0050385f`, `0x005038a8`, `0x005038df`, `0x00503904`, and the constructor-side follow-up at `0x005040ba`. This now bounds it as the shared payload-driven companion to `shell_setup_window_select_launch_mode_and_apply_shell_state` `0x00502c00`, distinct from the later file-backed pane rooted at `0x005027b0` and no longer safely reducible to a mode-`3`-only helper.","objdump + local disassembly + caller xrefs + control-id correlation + payload-row-availability correlation + shared-non-file-backed-panel correlation" +0x00502c00,472,shell_setup_window_select_launch_mode_and_apply_shell_state,shell,cdecl,inferred,objdump + local disassembly,4,"Central launch-mode selector for `Setup.win`. The helper clears or sets `[0x006cec74+0x6c]` according to the requested mode id, re-enters `0x00482e50` on the shell state, toggles `[0x006cec7c+0x97]` and `[0x006cec7c+0x10]`, stores the selected setup submode at `[window+0x7b]`, and republishes the controlling status widgets through `0x00540120`. The internal submode split is tighter now too: mode `1` publishes the cached local exe-version string from `runtime_query_cached_local_exe_version_string` `0x00482d80` into control `0x0c23` and is now the strongest current fit for the main landing panel; mode `2` explicitly clears the staged-profile presence byte at `[0x006cec7c+0x10]` and now most safely reads as the `Single Player` root from RT3.lng `1991/1992`; modes `4`, `9`, `6`, `10`, `12`, and `14` drive the file-backed selection pane through `shell_setup_window_refresh_file_backed_selection_list_panel` `0x005027b0`; modes `4` and `9` plus `6`, `10`, `12`, and `14` also route the `0x0d4d/0x0d4e` preview fields through `0x0053fe90`; modes `7`, `8`, and `9` are the only values that pass `1` into `0x00482e50`; and modes `6`, `9`, `12`, and `14` are the values that clear `[0x006cec7c+0x97]` while sibling file-backed modes set it. The file-backed submode-to-dataset mapping is now exact too: submode `4 -> dataset 5`, `9 -> 4`, `6 -> 8`, `10 -> 6`, `12 -> 10`, and `14 -> 9`. The top-level button-state family is tighter now too: the selector later restyles one persistent control band so that `0xbc5` tracks submode `15`, `0xbc6` tracks `16`, `0xbba` tracks `2`, `0xbbb` tracks `3`, `0xbc3` tracks `13`, `0xbbc` groups `3/4/5`, `0xbbd` tracks `4`, `0xbbe` tracks `5`, `0xbbf` groups `6/12/14`, `0xbc0` tracks `7`, `0xbc1` tracks `8`, `0xbc2` tracks `9`, `0xe75` tracks `10`, and `0xf6e` tracks `17`. The setup file-root helpers now tighten the family boundary further: `shell_setup_file_list_construct_and_scan_dataset` `0x004336a0` defaults the ordinary setup file lanes to `saved games\\*.smp`, while the shell-state branch chosen here only flips into the `maps\\*.gm*` family when the requested mode leaves `[shell+0x6c] == 1`; the separate `[shell+0x6c] == 2` branch remains the tutorial-root `data\\tutorial` family above `0x00438890`. That means the ordinary saved-game-backed family is broader than the narrower file-list-pane family: modes `3`, `4`, `5`, `6`, `10`, `12`, and `14` all stay on the ordinary `.smp` setup side, but only `4`, `6`, `9`, `10`, `12`, and `14` re-enter the dedicated file-list pane at `0x005027b0`, while mode `3` stays on the option-heavy companion at `0x00502910`. Current asset and RT3.lng evidence now tighten several of those names too: mode `3` is the strongest current fit for the shared single-player `New Game` or `Options` companion behind `Setup_Options(.imb)`; mode `5` is the strongest current fit for the `Sandbox` companion behind `Setup_Sandbox(.imb)` and the later launch byte `[0x006cec7c+0x82] = 1`; mode `10` is now the strongest current fit for the sandbox-backed template or profile list because it is the only file-backed submode with its own `0x0e85` header family and a neighboring validated launch control `0x0e81` that both routes into selector `5` and sets runtime-profile byte `[0x006cec7c+0x82] = 1`; mode `4` is therefore the strongest non-sandbox peer in the same alternate localized-stem template-list pair, which makes it the strongest current fit for the standalone `New Scenario`-style chooser still owned by `Setup.win`; and modes `6`, `12`, and `14` now tighten one step further as the three selector-`3` direct-filename load siblings, with mode `14` the strongest current landing panel for that family because `0x0c24` jumps to it directly while `0x0c82` and `0x0c84` only reach sibling modes `6` and `12` from inside the same load cluster. The same control pairing now makes one stronger semantic split defensible too: `0x0c83 -> 10` and `0x0c84 -> 12` look like the sandbox-side new or load pair inside that four-button family, so mode `12` is now the strongest current fit for the setup-local `Load Sandbox` lane. The remaining non-sandbox pair is closed now too: `shell_setup_filter_candidate_file_by_dataset_and_payload_flags` `0x00433260` shows dataset `9` taking the extra nonzero payload-flag lane while dataset `8` stays on the plain non-sandbox path, and the editor-side metadata path now grounds `[0x006cec78+0x66de]` as the direct `Campaign Scenario` checkbox bit because `editorDetail.win` ties control `0x5b6e` to localized ids `3160/3161`. That means the extra dataset-`9` lane is the campaign-designated load family, while dataset `8` is the ordinary scenario load family, so `14 = Load Campaign` and `6 = Load Scenario` now read as grounded rather than residual. Modes `7/8/9` are now the grounded `Editor` or `Choose Map` family from RT3.lng `1995`, `2022`, `2024`, `2026`, and `2028`, with mode `7` the editor root, mode `8` the `New Map` chooser, and mode `9` the file-backed `Load Map` list sibling. Submode `13` is tighter in a second way too: it now clearly joins neither the dedicated file-list pane nor the mode-`3` option pane, and current top-level RT3.lng elimination makes it the strongest residual fit for the `Multi Player` root. Submode `16` remains the other residual top-level `Setup.win` root and is now the strongest current fit for the `High Scores` lane, since `Credits` already lives in separate shell mode `6`. It is the shared callee for many larger dispatcher branches in the `0x005033d0..0x00503b7b` family, including the direct mode requests at `0x00503567`, `0x0050361b`, `0x00503652`, `0x005036c3`, `0x005036f6`, `0x00503707`, `0x0050371f`, `0x0050374b`, `0x00503769`, `0x005037a9`, `0x00503921`, `0x0050393f`, `0x00503982`, `0x00503991`, `0x00503a57`, and `0x00503b44`. Current mode-selection correlation now also grounds its ownership above the startup-profile selector in `0x00438890`: the surrounding dispatcher writes `[0x006cec7c+0x01]` values `2`, `3`, `4`, `5`, `1`, and `7` before later entering `0x00482150` with launch request `0xcc`.","objdump + local disassembly + caller xrefs + setup-dispatch correlation + shell-state correlation + submode-follow-up correlation + selector-table decode + setup-file-root correlation + map-editor-branch correlation + ordinary-smp-family split + top-level-button-state correlation + setup-submode-dataset mapping + grouped-launch-control correlation + RT3.lng top-level correlation + setup-asset correlation + setup-local-new-vs-load split + direct-launch-branch correlation + file-family correlation + load-cluster landing correlation + control-pairing inference + dataset-payload-flag correlation + campaign-scenario-warning correlation + editorDetail.win resource record" +0x005033d0,1963,shell_setup_window_handle_message,shell,thiscall,inferred,objdump + local disassembly,3,"Primary message or command dispatcher for the `Setup.win` family rooted at `0x00504010`. The handler switches over many control ids in the `0x0c80..0x0f71` band, routes direct mode changes through `shell_setup_window_select_launch_mode_and_apply_shell_state` `0x00502c00`, refreshes the visible list families through `shell_setup_window_refresh_mode_dependent_lists` `0x00502910` and `shell_setup_window_refresh_selection_lists_and_summary_fields` `0x00502550`, republishes the selected labels and preview surface through `shell_setup_window_publish_selected_profile_labels_and_preview_surface` `0x00502220`, and writes startup-profile selector values into `[0x006cec7c+0x01]` before later shell request `0x00482150(0xcc, ...)` transitions continue. The control-id split is tighter now too: `0x0d4b/0x0de8/0x0e85` reuse the current row index from `[msg+0x08]` to republish one selected setup record through `0x00502220`; `0x0e88/0x0e89/0x0e8a` toggle the persisted shell-state booleans at `[0x006cec74+0x247/+0x243/+0x24b]` and immediately save config through `0x00484910(1)`; `0x0c1f` is the settings-window escape through `shell_has_settings_window` `0x004fe120` and `shell_open_settings_window` `0x00501e50`; `0x0c1e`, `0x0c20`, and `0x0c22` are direct shell-request branches entering `0x00482150` with request ids `0x0cc` or `0x0cd`; `0x0bc2`, `0x0bc5`, `0x0bc6`, and `0x0bc7` are the separate shell-open or help-content quartet above `shell_query_registry_open_command_for_http_or_rtf_target` `0x00501f20`; `0x0bc1` and `0x0bc8` both select submode `15`, which now safely reads as the `Extras` family because RT3.lng `3118..3129` and the surrounding shell-open quartet align with `Readme`, `Weblinks`, and the return-to-extras sibling; `0x0bc3` selects submode `16`, which now most safely reads as the remaining `High Scores` top-level root because `Credits` already lives in separate shell mode `6` `Credits.win`; `0x0bc4` selects submode `1`, the current strongest main landing-panel fit; `0x0c80` selects submode `13`, now the strongest residual fit for the `Multi Player` root; `0x0c1c` selects submode `17`, which now safely reads as the tutorial chooser because mode `17` is the only family that later exposes startup selectors `1` and `7` through controls `0x0f6f` and `0x0f70`; `0x0c1d` selects submode `2`, the current strongest `Single Player` root from RT3.lng `1991/1992`; and `0x0c24` selects submode `14`; `0x0c81`, `0x0c82`, `0x0c83`, and `0x0c84` select submodes `14`, `6`, `10`, and `12`; `0x0c85` conditionally selects submode `4` or `3` from the entry flag at `[msg+0x2c]+0x6a`; `0x0ce4` writes selector `4` and then selects submode `8`, now the strongest `New Map` chooser fit from RT3.lng `2022/2026/2028`; `0x0ce5` writes selector `3` and then selects submode `9`, now the strongest `Load Map` list sibling; `0x0de0` and `0x0dea` both select submode `7`, now the strongest `Editor` root fit from RT3.lng `1995/1996`; `0x0df4` and `0x0e80` are the high-side slider refresh pair; `0x0e83` selects submode `1`; and `0x0f71` selects submode `1` after writing selector `7`. `0x0ce6/0x0ce7` and `0x0d49/0x0d4a` are bounded decrement or increment controls over `[0x006cec7c+0x7b]` and `[0x006cec7c+0x77]`; `0x0ce9..0x0ced` plus `0x0f3d..0x0f3f` store compact option bytes into `[0x006cec7c+0x7d]`; and `0x0e82/0x0e83` are the wider clamp-to-`0x834/0x70d` slider pair that feeds `0x00502550`. The later launch-side branches are tighter in a corrective way too: the validated staged-profile launch lane no longer includes `0x0ce5` or `0x0dcb`. `0x0cf6` and `0x0e81` are the selector-`5` siblings in that validated lane; current local disassembly also shows the neighboring selector-`3` validated lane is at least shared by the later `0x0de9` and `0x0df3` controls before shell request `0x0cc` continues; and `0x0e81` is now tighter still because it is the only one of those validated controls that also sets runtime-profile byte `[0x006cec7c+0x82] = 1`, the strongest current sandbox-side anchor beneath the later `.gmx` file family. `0x0dca` is now tighter as the grayscale-map picker branch above `shell_open_grayscale_map_tga_picker_and_stage_selection` `0x004eb0b0`, then writes selector `4`; `0x0dcb` conditionally selects submode `5` or `3` from the same entry flag family used by the earlier `0x0c85` branch, which reinforces mode `5` as the sandbox-style companion rather than another launch control; `0x0ddf` is the separate windowed-mode-gated grayscale-heightmap generation branch that reopens the `TGA Files (*.tga)` / `.\Data\GrayscaleMaps` picker through `shell_open_file_dialog_copy_selected_path_and_restore_cwd` `0x0042a970`, validates the chosen image through `shell_query_tga_header_is_supported_truecolor_image` `0x005411c0`, and only then writes selector `2`; `0x0f6f` writes selector `1`; and `0x0f70` writes selector `7` before shell request `0x0cc` continues.","objdump + local disassembly + selector-writer correlation + caller-family reconstruction + control-cluster correlation + jump-table decode + literal-correlation + submode-mapping decode + grayscale-map-picker correlation + extras/tutorial correlation + grayscale-generation correlation + RT3.lng top-level correlation + setup-asset correlation + sandbox-launch-flag correlation + load-map correction" +0x0047bc80,457,shell_setup_payload_seed_unique_row_category_bytes_and_marker_slots,shell,thiscall,inferred,objdump + local disassembly,3,"Normalizes the live `Setup.win` payload row metadata before the shared non-file-backed panel consumes it. Outside editor-map mode `[0x006cec74+0x68] == 0`, the helper clears the static category-used table rooted at `0x005f2d28`, marks every already-nonzero payload category byte from `[payload+0x31a + row*9]`, counts the existing marker bytes across the four 10-byte local bands rooted at `[payload+0x2ca]`, and fills any remaining empty marker slots at `[payload+0x2c9 + n]` until the payload row count at `+0x3ae` is covered. On the multiplayer-preview side it also forces runtime profile dword `[0x006cec7c+0x83] = 7`. It then walks the row records again and, for any zero category byte at `[payload+0x31a + row*9]`, chooses the next unused category id using runtime profile dword `[0x006cec7c+0x83]`, the local marker-slot bytes at `[payload+0x2c9 + n]`, and a bounded retry loop before writing the chosen category back and marking the static-used table. Current grounded callers are the setup payload-copy helper at `0x0047be50` and the post-load chairman-profile builder at `0x00437220`, which makes this the shared category-byte and marker-slot normalizer beneath the setup payload panel rather than one world-only helper.","objdump + local disassembly + setup-payload correlation + category-table correlation + marker-slot correlation + caller split" +0x0047be50,69,shell_setup_profile_copy_payload_scroll_count_and_campaign_byte_and_seed_row_categories,shell,thiscall,inferred,objdump + local disassembly,3,"Copies the small shared-panel runtime fields out of one live `Setup.win` payload record into the staged runtime profile at `0x006cec7c`, then normalizes the payload row metadata. When the caller-supplied payload pointer is non-null and its first byte is nonzero, the helper copies payload word `+0x14` into profile `+0x77`, payload word `+0x3b2` into profile `+0x79`, payload word `+0x3ba` into profile `+0x7b`, and payload byte `+0x20` into profile `+0xc5`, except that the three word copies are skipped while the multiplayer-preview owner at `0x006cd8d8` is live. It then tail-calls `shell_setup_payload_seed_unique_row_category_bytes_and_marker_slots` `0x0047bc80` on the same payload. Current grounded caller is `shell_setup_window_publish_selected_profile_labels_and_preview_surface` `0x00502220`, which uses this helper immediately after the heavier payload-materialization lane at `0x00422400`.","objdump + local disassembly + setup-payload correlation + runtime-profile-field correlation + caller correlation" 0x0047d810,182,placed_structure_remove_route_entry_key_and_compact,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Removes one matching `u16` route-entry key from the six-byte route-entry list rooted at `[this+0x462]/[this+0x466]`. The helper scans the current list, copies surviving six-byte entries into a newly allocated compacted buffer, frees the old buffer, stores the replacement pointer back into `[this+0x466]`, and decrements the route-entry count at `[this+0x462]`. Current grounded caller is the linked-site refresh or teardown branch at `0x0040e102`, so this is the keyed remove-and-compact companion to the linked site's route-entry list rather than another generic free helper.","objdump + caller xrefs + callsite inspection + route-entry-list compaction correlation" 0x0047d8e0,346,placed_structure_load_dynamic_side_buffers_from_stream,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Deserializes the variable-size side buffers on one placed-structure record from the caller-supplied persistence stream. The helper reads tagged blocks through `0x00531360` and `0x00531150`, repopulates the six-byte route-entry list at `[this+0x462]/[this+0x466]`, the three five-byte-per-site arrays rooted at `[this+0x24]` from count `[this+0x30]`, the five eight-byte proximity-bucket arrays counted at `[this+0x590..0x5a0]` and rooted at `[this+0x5a4..0x5b4]`, and the trailing twelve-byte scratch band at `[this+0x34]/[this+0x38]`, then clears `[this+0x5bd]` and re-enters `0x00407780`. Current direct caller is the collection-level load pass at `0x00481464`. The real body begins at `0x0047d8e0` even though current recovered calls target the preceding padding slot `0x0047d8d0`.","objdump + caller xrefs + callsite inspection + stream-layout correlation" 0x0047dcd0,64,placed_structure_clear_proximity_bucket_lists,map,thiscall,inferred,objdump + caller xrefs + data-layout inspection,3,"Clears the five proximity-bucket arrays rooted at `[this+0x5a4..0x5b4]`, zeroes the corresponding per-bucket counts at `[this+0x590..0x5a0]`, and resets the total proximity-entry count at `[this+0x5b8]`. Current grounded callers are the linked-site teardown pass at `0x00480590` and the sibling route-anchor refresh family at `0x00480719`, so this now reads as the common clear step for the nearby-site bucket family rather than a generic free helper.","objdump + caller xrefs + data-layout inspection + proximity-bucket correlation" @@ -591,6 +718,13 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00482d10,110,runtime_query_cached_local_exe_version_float,simulation,thiscall,inferred,objdump + local disassembly,3,"Returns one cached local executable version as a float-like `major + minor/100` value. On first use the helper queries the version-info resource of the literal stem `RT3.EXE` at `0x005cec18` through `0x0055d9c0`, splits the returned packed dword into low and high 16-bit words, converts them into one float as `hi + lo/100.0`, caches the result at `0x006cec5c`, and returns that cached value on later calls. The sibling formatter `0x00482d80` and the rounded hundredths query `0x00482e00` both consume the same source, which now makes this the clearest current owner for the local `1.03/1.04/1.05/1.06`-style version float rather than a gameplay progress value.","objdump + local disassembly + version-resource correlation" 0x00482d80,128,runtime_query_cached_local_exe_version_string,simulation,thiscall,inferred,objdump + local disassembly + string inspection,3,"Returns one cached local executable version string formatted from the same `RT3.EXE` version-info source used by `0x00482d10`. On first use the helper queries the packed local version dword through `0x0055d9c0`, formats it with the literal pattern `%d.%02d` at `0x005ced5c`, allocates one small shell string object at `0x006cec24`, and returns that cached string on later calls. Current grounded callers include `multiplayer_session_event_publish_registration_field` `0x0046a6c0` and the later shell text path at `0x00503254`, which makes this the clearest current local version-string owner.","objdump + local disassembly + string inspection + caller xrefs + version-resource correlation" 0x00482e00,70,runtime_query_hundredths_scaled_build_version,simulation,thiscall,inferred,objdump + caller xrefs + local disassembly,3,"Shared rounded hundredths-scaled build-version query used by route, company, train, and world-side logic. In the ordinary local path the helper consults the cached local executable version float from `runtime_query_cached_local_exe_version_float` `0x00482d10`, adds the fixed offset `0.0001`, multiplies by `100.0`, and rounds the result through the CRT helper at `0x005a10d0`, which makes the local outputs line up with integer build values such as `0x67/0x68/0x69/0x6a == 1.03/1.04/1.05/1.06`. When the multiplayer-side runtime rooted at `0x006cd8d8` is active, or when the local scenario-state gate at `0x004349a0` reports a later mode, it instead delegates to the multiplayer companion path at `0x0046a4b0`, which can reuse a cached network-side integer at `0x006cd96c` or scan live session-peer version fields before falling back to the same local executable-version path. Current grounded callers include the city-connection route builder `0x00402cb0`, the auxiliary tracker pair-metric dispatcher `0x004a65b0`, and numerous neighboring world-side maintenance branches. This is no longer best-read as a gameplay progress or era index: the recovered threshold pattern is a shared executable or session build-version gate.","objdump + caller xrefs + local disassembly + multiplayer-fallback correlation + version-resource correlation + threshold-correlation" +0x004839b0,37,shell_setup_query_file_list_uses_map_extension_pattern,shell,thiscall,inferred,objdump + literal inspection + caller correlation,3,"Returns whether the current `Setup.win` file-list scan should enumerate the map-family extension pattern `*.gm*` instead of the saved-game pattern `*.smp`. The helper checks the live shell state rooted at `0x006cec74`: it requires the broad setup/file gate at `[shell+0x1bf]`, then returns true when either `[shell+0x68]` is nonzero or the current setup-side mode flag at `[this+0x6c]` equals `1`. Current grounded caller is `shell_setup_build_file_list_records_from_current_root_and_pattern` `0x004333f0`, where the result chooses the search literal at `0x005c9d14` versus `0x005c9d1c`.","objdump + literal inspection + caller correlation + setup-file-root correlation" +0x004839e0,37,shell_setup_query_file_list_root_dir_name,shell,thiscall,inferred,objdump + literal inspection + caller correlation,3,"Returns the root directory name used by the current `Setup.win` file-list scan. When `[this+0x6c] == 2` it returns the literal `data\\tutorial` at `0x005ca338`; otherwise it returns `maps` at `0x005ced78` when `[this+0x68]` is nonzero or `[this+0x6c] == 1`, and falls back to `saved games` at `0x005ced80` for the ordinary setup-side load family. Current grounded caller is `shell_setup_build_file_list_records_from_current_root_and_pattern` `0x004333f0`, which formats the returned root through the literal `%s\\` at `0x005c9d10`.","objdump + literal inspection + caller correlation + setup-file-root correlation" +0x00433260,400,shell_setup_filter_candidate_file_by_dataset_and_payload_flags,shell,thiscall,inferred,objdump + local disassembly + caller correlation,3,"Filters one candidate `Setup.win` filename against the current dataset id and the small payload-flag family recovered from the staged bundle. Editor-map mode short-circuits to success immediately through `shell_setup_query_file_list_uses_map_extension_pattern` `0x004839b0`; otherwise the helper builds one rooted path from `shell_setup_query_file_list_root_dir_name` `0x004839e0`, opens the candidate bundle through `0x00530c80`, reads the small chunk family `0x2ee0/0x3c2` through `0x00531150/0x00531360`, and then applies dataset-specific acceptance rules to three recovered flag bytes. The current split is tighter now: dataset `10` requires the sandbox-side payload-flag family, dataset `9` requires a different nonzero payload-flag family, dataset `8` stays on the plain non-sandbox path, and dataset `12` adds one literal stem check through `0x005c9cf8` before the later payload-flag gate. Current grounded caller is `shell_setup_build_file_list_records_from_current_root_and_pattern` `0x004333f0`, which uses this helper as the real extension-and-payload filter beneath the file-backed setup lists.","objdump + local disassembly + caller correlation + setup-dataset correlation + payload-flag gating correlation" +0x004333f0,674,shell_setup_build_file_list_records_from_current_root_and_pattern,shell,thiscall,inferred,objdump + literal inspection + caller correlation,3,"Builds one normalized `Setup.win` file-list record block under the small collection object passed in `ECX`. The helper queries the current root directory through `shell_setup_query_file_list_root_dir_name` `0x004839e0`, chooses either `*.gm*` or `*.smp` through `shell_setup_query_file_list_uses_map_extension_pattern` `0x004839b0`, enumerates the resulting search spec, filters out leading-dot names and extension mismatches through `0x00433260`, counts the surviving rows, allocates `count * 0x25a + 1` bytes, and then repopulates each row with the raw filename at offset `0` plus the normalized display label at `+0x12d`. Dataset ids `5`, `6`, and `7` take the alternate normalization path through `0x0051c920`; sibling dataset ids keep the direct `0x0051df90` text normalization lane. The surrounding selector now bounds the current file-backed mapping more tightly too: submode `4 -> dataset 5`, `9 -> 4`, `6 -> 8`, `10 -> 6`, `12 -> 10`, and `14 -> 9`. Current grounded wrapper is `shell_setup_file_list_construct_and_scan_dataset` `0x004336a0`.","objdump + literal inspection + caller correlation + record-layout reconstruction + dataset-normalization correlation + setup-submode-dataset mapping" +0x004336a0,33,shell_setup_file_list_construct_and_scan_dataset,shell,thiscall,inferred,objdump + caller correlation,3,"Small constructor wrapper above `shell_setup_build_file_list_records_from_current_root_and_pattern` `0x004333f0`. The helper stores the caller-supplied dataset id at `[this+0x04]`, zeroes the row count `[this+0x00]` and payload pointer `[this+0x08]`, and then immediately enters the deeper scan-and-build body. Current grounded caller is `shell_setup_window_select_launch_mode_and_apply_shell_state` `0x00502c00`, whose exact file-backed setup mapping is now bounded as submode `4 -> dataset 5`, `9 -> 4`, `6 -> 8`, `10 -> 6`, `12 -> 10`, and `14 -> 9`.","objdump + caller correlation + setup-dataset reconstruction + setup-submode-dataset mapping" +0x0042a970,188,shell_open_file_dialog_copy_selected_path_and_restore_cwd,shell,thiscall,inferred,objdump + literal correlation,3,"Small shell-side file-open dialog wrapper. The helper clears the caller output buffer, snapshots the current working directory through one import pair, builds a `0x4c`-byte open-file dialog record on the stack, calls the file-open import, restores the previous working directory, and returns true only when the caller buffer is left non-empty. Current grounded caller is the `Setup.win` branch at `0x005039cd`, which passes the `TGA Files (*.tga)` filter at `0x005d1674` and root `.\Data\GrayscaleMaps` at `0x005d1690`, so this is now the generic picker beneath the grayscale-heightmap generation lane rather than another multiplayer helper.","objdump + literal correlation + setup-branch reconstruction" +0x005411c0,79,shell_query_tga_header_is_supported_truecolor_image,shell,cdecl,inferred,objdump + error-string correlation,3,"Small image-header validator used by the `Setup.win` grayscale-heightmap lane. The helper opens the caller path, reads `0x12` bytes into a local buffer, closes the handle, and returns true only when the read succeeds, the error byte remains clear, and the header's image-type byte equals `2`. Current grounded caller is the `0x005039fe` branch beneath `0x005033d0`, where failure raises localized error `0x0e13` (`The selected image is not useable by the game... true-color ... Targa image.`).","objdump + caller correlation + error-string correlation + TGA-header inspection" 0x004801a0,105,placed_structure_is_linked_transit_site_reachable_from_company_route_anchor,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Boolean gate between one linked transit site and one company-side route anchor. The helper first requires the current placed structure to pass the station-or-transit gate `0x0047fd50`, then requires its linked-instance class test through `0x0040c990 == 1`. It resolves the caller-supplied company id through the live company collection `0x0062be10`, asks that company for one cached route-anchor entry id through `company_query_cached_linked_transit_route_anchor_entry_id` `0x00401860`, resolves the site's own route-entry anchor through collection `0x006cfca8`, and finally re-enters `0x0048e3c0` to test whether the two route-entry anchors lie in the same reachable route-side family. Current grounded caller is `company_rebuild_linked_transit_site_peer_cache` `0x004093d0`, where this helper gates whether a foreign linked transit site can still participate in the current company's peer cache.","objdump + caller xrefs + callsite inspection + linked-transit reachability correlation" 0x00480590,371,placed_structure_teardown_linked_site_runtime_state_before_removal,map,thiscall,inferred,objdump + caller xrefs + callsite inspection,3,"Tears down the mutable runtime side of one linked placed-structure record before collection removal. The helper clears the route-style scratch lane through `0x004077e0`, clears the proximity buckets through `placed_structure_clear_proximity_bucket_lists` `0x0047dcd0`, frees the trailing scratch buffer at `[this+0x34]`, clears the route-link list through `0x0047f320`, detaches or invalidates the current route-entry anchor at `[this+0x08]` through the route-entry collection `0x006cfca8`, recomputes the current grid-keyed owner lane through `0x0042bbf0`, frees the three per-site byte arrays at `[this+0x24..0x2c]`, clears this record's indexed byte in the corresponding arrays of every later placed-structure record in `0x006cec20`, and finally re-enters the scenario-side follow-on at `0x00436040` with the current site id. Current direct caller is `placed_structure_collection_remove_linked_site_record` `0x004813d0`, so this is the linked-site teardown pass rather than another route-anchor refresh helper.","objdump + caller xrefs + callsite inspection + linked-site teardown correlation" 0x00480bb0,1535,placed_structure_refresh_linked_site_display_name_and_route_anchor,map,thiscall,inferred,objdump + caller xrefs + callsite inspection + RT3.lng strings,3,"Single-site post-create or post-edit refresh helper reached from `placed_structure_finalize_creation_or_rebuild_local_runtime_state` `0x0040ef10` when the current placed structure keeps one linked site id at `[this+0x2a8]`. The helper operates on that linked placed-structure record, optionally rebuilds one route-entry anchor at `[this+0x08]` through `route_entry_collection_try_build_path_between_optional_endpoint_entries` `0x004a01a0` with both optional endpoint-entry ids unset and literal policy byte `2`, then binds the chosen route entry back to the site through `0x0048abc0` and re-enters `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` `0x004a45f0` so the auxiliary tracker family at `0x006cfcb4` can regroup around the refreshed anchor. Current caller correlation makes that byte the strongest current match for the broader linked-site route-anchor rebuild lane, as opposed to the narrower direct endpoint-anchor creation or replacement lane that neighboring repair branches drive through literal byte `1` into `0x00493cf0`. It also rebuilds the display-name buffer at `[this+0x46b]`: when the current site coordinates resolve a city or region entry through `0x0044a830` it copies that entry name from `[entry+0x356]`, optionally appends one civic suffix from RT3.lng ids `585..588` `Township`, `New`, `Modern`, and `Renaissance`, and on special linked-instance class branches appends `589` `Service Tower` or `590` `Maintenance Facility` with per-city counters instead. When no city entry resolves it falls back to `591` `Anytown`. The ordinary non-special branch also rotates through RT3.lng ids `578..584` `Junction`, `Crossing`, `Depot`, `Corners`, `Exchange`, `Point`, and `Center` via the static table at `0x005f2cf8`. After trimming trailing spaces it conditionally re-enters `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` `0x004682c0` when the narrower station-or-transit gate `0x0047fd50` passes, clears or seeds adjacent city-side cached state through `0x004358d0` and `0x00420650`, and returns. Current direct caller is `0x0040f626`, so this now looks like the linked-site display-name and route-anchor refresh beneath placed-structure finalization rather than another city-connection owner.","objdump + caller xrefs + callsite inspection + RT3.lng strings + route-anchor correlation + linked-site refresh correlation + linked-site policy-byte split correlation + tracker-regrouping correlation" @@ -604,7 +738,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00481fd0,348,bootstrap_scan_autorun_media,bootstrap,cdecl,inferred,ghidra-headless,4,Scans drive letters for RT3 autorun marker files rt3d1.txt and rt3d2.txt using GetDriveTypeA and open or close helpers before deeper shell init.,ghidra + rizin 0x00482160,101,shell_state_service_active_mode_frame,shell,thiscall,inferred,objdump + analysis-context,4,Acts as the broader shell-state service pass around one active-mode update on the shell state rooted at 0x006cec74. The helper increments nested-service depth at [this+0x64] optionally notifies the active mode object at 0x006cec78 through 0x0051f940 and 0x00434050 primes the shell runtime at 0x006d401c through 0x00538b60 conditionally services the Multiplayer preview-dataset object at 0x006cd8d8 through 0x00469720 and then dispatches shell_service_frame_cycle on the global shell controller at 0x006d4024 before decrementing the depth counter.,objdump + analysis-context + caller xrefs 0x004821d0,1019,shell_recompute_layout_slots,bootstrap,thiscall,inferred,ghidra-headless,4,Recomputes the shell layout-slot table after resolution or related display selectors change; derives normalized coordinates from static float tables updates 144 slot entries through the shell bundle child at [0x006d4024+0x18] and then commits the refreshed state.,ghidra + rizin -0x00482ec0,1359,shell_transition_mode,bootstrap,thiscall,inferred,ghidra-headless,4,Switches the shell state's active mode at [this+0x08] tearing down any prior mode object selecting one of seven mode-specific handlers and updating globals like 0x006cec78 before notifying the shell bundle through 0x00538e50.,ghidra + rizin +0x00482ec0,1359,shell_transition_mode,bootstrap,thiscall,inferred,ghidra-headless + objdump,4,"Switches the shell state's active mode at `[this+0x08]`, tears down any prior mode object, selects one of seven mode-specific handlers, updates globals like `0x006cec78`, and then notifies the shell bundle through `0x00538e50`. The constructor jump table at `0x48342c` is now mostly grounded as a real mode map rather than raw branch addresses: mode `1` enters the `Game.win` family through `shell_game_window_construct` `0x004dfbe0`, mode `2` enters `Setup.win` through `shell_setup_window_construct` `0x00504010`, mode `3` enters `Video.win` through `shell_video_window_construct` `0x005174e0`, mode `4` enters `LoadScreen.win` through `shell_load_screen_window_construct` `0x004ea620`, mode `5` enters `Multiplayer.win` through `multiplayer_window_init_globals` `0x004efe80`, mode `6` enters `Credits.win` through `shell_credits_window_construct` `0x004c7fc0`, and mode `7` enters `Campaign.win` through `shell_campaign_window_construct` `0x004b8e60`. The clearest load-side lane remains mode `4`: it publishes the new active-mode object into `0x006cec78` and then calls `shell_active_mode_run_profile_startup_and_load_dispatch` `0x00438890` with stack args `(1, 0)`. The paired old-mode teardown side is now tighter too: mode `1` tears down through `shell_game_window_destroy` `0x004dfd70`, mode `3` through `shell_video_window_destroy` `0x00517570`, mode `4` through `shell_load_screen_window_destroy` `0x004ea730`, mode `6` through `shell_credits_window_destroy` `0x004c7bc0`, and mode `7` through `shell_campaign_window_destroy` `0x004b8dc0`. Current grounded callers remain bootstrap shell bring-up at `0x004840e0` and the world-entry side at `0x00443a50`.","ghidra + rizin + objdump + branch-disassembly correlation + jump-table decode + constructor/destructor correlation" 0x005a2d64,101,crt_init_exit_handlers,startup,cdecl,inferred,ghidra-headless,3,Initializes on-exit tables and registers atexit handling before control reaches application startup.,ghidra + rizin 0x005a30f2,34,__amsg_exit,startup,cdecl,inferred,ghidra-headless,4,CRT fatal-exit helper that forwards startup failures into __exit.,ghidra + rizin 0x005a3117,36,crt_fast_error_exit,startup,cdecl,inferred,ghidra-headless,4,Startup error path that optionally emits the CRT banner then formats the failure and terminates through ___crtExitProcess.,ghidra + rizin @@ -676,6 +810,16 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00533db0,30,shell_grid_get_geographic_label_cell,bootstrap,thiscall,inferred,ghidra-headless,4,Returns one tile-grid cell from the geographic-label layer rooted at [this+0x1675]. The helper converts world coordinates into 16x16 tile coordinates multiplies by the grid width stored at [this+0x15d9] and indexes the cell-pointer table at [this+0x1675].,ghidra + rizin + llvm-objdump 0x00533e30,32,shell_grid_get_animated_quad_cell,bootstrap,thiscall,inferred,ghidra-headless,4,Returns one tile-grid cell from the animated-quad presentation layer rooted at [this+0x1681]. The helper converts world coordinates into 16x16 tile coordinates multiplies by the grid width stored at [this+0x15d9] and indexes the cell-pointer table at [this+0x1681].,ghidra + rizin + llvm-objdump 0x00533e50,32,shell_grid_get_ranked_overlay_cell,bootstrap,thiscall,inferred,ghidra-headless,4,Returns one tile-grid cell from the ranked secondary overlay layer rooted at [this+0x1685]. The helper uses the same 16x16 tile addressing and grid width field at [this+0x15d9] as the other shell cell-grid accessors and currently feeds 0x0052a2f0.,ghidra + rizin + llvm-objdump +0x00533e70,168,world_secondary_overlay_release_coarse_chunks_in_rect,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Rectangle-wide coarse-chunk release helper over the secondary overlay table rooted at `[this+0x1685]`. The helper clamps the caller-supplied world-grid rectangle to the live bundle dimensions `[this+0x15d9/+0x15d5]`, converts the surviving bounds to 16x16 chunk coordinates, walks every chunk slot in that coarse range, and when a chunk pointer is present releases or clears it through `0x0056b770(this)`. Current grounded callers include the late world-entry tail at `0x00444b48`, the secondary-grid overlay-cache service `world_service_secondary_grid_marked_cell_overlay_cache` `0x0044c670`, one neighboring world-side refresh branch at `0x0044d469`, and the shell-side world-mode branch at `0x00484f51`, so this is the safest current read for the shared coarse secondary-overlay rectangle reset helper rather than a one-shot startup scrub.","objdump + caller inspection + field correlation + coarse-chunk correlation + secondary-overlay correlation" +0x00533fe0,89,world_secondary_overlay_write_local_chunk_cell_value,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Small write-side companion to the secondary overlay coarse-chunk family rooted at `[this+0x1685]`. The helper resolves the caller-supplied world-grid cell into one 16x16 chunk slot using width field `[this+0x15d9]`, keeps only the low local cell offsets inside that chunk, and when the chunk object exists delegates the local write or clear through `0x0056b000(chunk, world, x_local, y_local, arg2)`. Current grounded callers include the post-load `319` cleanup sweep through `world_run_post_load_generation_pipeline` `0x004384d0`, neighboring placed-structure or world-overlay branches at `0x00414f33`, `0x004158a6`, `0x0041ff3c`, and `0x00454ede`, and one later world-entry-side caller at `0x00444712`, so this is the safest current read for the shared local secondary-overlay chunk-cell write helper rather than a broad chunk reset or allocator.","objdump + caller inspection + field correlation + coarse-chunk correlation + write-side companion correlation" +0x00534160,259,world_secondary_overlay_ensure_coarse_chunk_and_seed_local_marks,map,thiscall,inferred,objdump + caller inspection + field correlation,3,"Shared coarse-chunk helper beneath the secondary overlay family rooted at `[this+0x1685]`. The helper converts the caller-supplied world-grid coordinates into one 16x16 chunk index using width field `[this+0x15d9]`, lazily allocates one `0x54`-byte chunk object into `[this+0x1685]` through `0x0053b070` when that slot is empty, initializes the new chunk from chunk-space coordinates through `0x0056af70`, and then re-enters `0x0056b580` up to the caller-supplied step count capped at `6` using the low-bit local offsets plus two extra caller parameters. Current grounded callers include the late secondary-grid overlay service `world_service_secondary_grid_marked_cell_overlay_cache` `0x0044c670`, the neighboring startup-side branch at `0x00447faf`, one earlier placed-structure overlay builder at `0x004157d2`, and one world-side surface branch at `0x004545b2`, so this is the safest current read for the shared coarse secondary-overlay chunk ensure-and-seed helper rather than a one-shot startup allocator.","objdump + caller inspection + field correlation + coarse-chunk correlation + secondary-overlay correlation" +0x00534af0,350,shell_world_presentation_publish_staged_overlay_surfaces_and_release_buffer,bootstrap,thiscall,inferred,objdump + caller inspection + field correlation,3,"Shared publish-or-teardown helper over the shell-side world-presentation bundle. The helper first requires staging flag byte `[this+0x1588]`. In normal publish mode `arg0=0` it walks the staged dword buffer at `[this+0x1584]` across the rectangle `[this+0x1589..+0x1591] x [this+0x158d..+0x1595]`, lazily materializes up to `0xff` temporary strip or surface objects through `0x00541970` using the per-slot roots at `[this+0x08..]`, copies staged row dwords into those objects, and then finalizes each populated slot through `0x005438d0`. In teardown-only mode `arg0!=0` it skips the publish sweep and goes straight to cleanup. Both paths then clear `[this+0x1588]`, free the staging buffer at `[this+0x1584]`, and null that pointer. Current grounded callers include the late secondary-grid overlay path at `0x0044cdff`, startup-side and neighboring world branches at `0x00446691`, `0x00447754`, `0x0044f63b`, and `0x0044fada`, earlier overlay builders at `0x004180a8`, `0x004184bf`, and `0x00418584`, plus shell-side callers at `0x0047b061` and `0x004f5f74`, so this is the safest current read for the shared staged-overlay surface publish-and-release helper rather than a world-only renderer or a pure destructor.","objdump + caller inspection + field correlation + staged-surface correlation + publish-vs-teardown correlation" +0x00534c50,32,shell_world_presentation_query_scaled_surface_dimensions,bootstrap,thiscall,inferred,objdump + caller inspection + field correlation,3,"Tiny dimension query over the shared shell-side world-presentation bundle. The helper reads dwords `[this+0x157c]` and `[this+0x1580]`, shifts both left by two, and writes the results to the caller-supplied out-pointers as one scaled width-height pair. Current grounded callers first resolve the live presentation object through the shell owner at `0x006d4024` or the neighboring bundle resolver and then use these scaled dimensions in overlay, bounds, or allocation setup, including the late secondary-grid overlay path at `0x0044ca3e`, neighboring world-side branches at `0x0044ea34` and `0x0044f876`, earlier placed-structure overlay builders at `0x0041538a` and `0x00417fad`, and one shell-side allocator at `0x004f7f0a`, so this is the safest current read for the shared scaled surface-dimension query rather than a world-only or startup-only helper.","objdump + caller inspection + field correlation + shell-world-bundle correlation" +0x00534e10,64,world_secondary_raster_query_cell_class_in_set_1_3_4_5,map,thiscall,inferred,objdump + caller inspection + raster-cell correlation,3,"Tiny reusable predicate over one 3-byte cell record in the secondary raster family rooted at `[this+0x165d]` with row stride `[this+0x15dd]`. The helper resolves the requested cell from caller-supplied world-grid coordinates, masks the low three class bits from the first byte, and returns `1` when that class is `1`, `3`, `4`, or `5`, else `0`. Current grounded callers span many world-side placement, overlay, and scan branches including `placed_structure_validate_projected_candidate_placement` `0x004197e0`, `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` `0x00416ec0`, the late world-entry tail around `0x004481a6`, and one secondary-grid sibling under `0x0044c450`, so this is the safest current read for the shared secondary-raster class-set predicate rather than a startup-only helper.","objdump + caller inspection + raster-cell correlation + late-world-tail correlation" +0x00534e50,50,world_secondary_raster_query_cell_class_in_set_1_4,map,thiscall,inferred,objdump + caller inspection + raster-cell correlation,3,"Tiny reusable companion predicate over the same 3-byte secondary-raster cell family rooted at `[this+0x165d]` with row stride `[this+0x15dd]`. The helper resolves one caller-selected world-grid cell, masks the low three class bits from the first byte, and returns `1` only when that class is `1` or `4`, else `0`. Current grounded callers include the transportation or pricing grid pass `world_compute_transport_and_pricing_grid` `0x0044fb70`, the live-world `.smp` serializer `world_runtime_serialize_smp_bundle` `0x00446240`, and several neighboring world-side scan or presentation branches at `0x00448c2f`, `0x00449d46`, `0x0044ec29`, `0x00451016`, and `0x0047a551`, which makes this the safest current read for the shared secondary-raster class-subset predicate rather than a transport-only helper.","objdump + caller inspection + raster-cell correlation + transport-grid correlation + serializer correlation" +0x00534e90,48,world_secondary_raster_query_cell_marked_bit,map,thiscall,inferred,objdump + caller inspection + raster-cell correlation,3,"Tiny reusable bit query over the same 3-byte secondary-raster cell family rooted at `[this+0x165d]` with row stride `[this+0x15dd]`. The helper resolves one cell from caller-supplied world-grid coordinates, reads the 16-bit companion word from that cell record, and returns bit `9` as a boolean marked-state flag. Current grounded callers include the secondary-grid overlay-cache service `world_service_secondary_grid_marked_cell_overlay_cache` `0x0044c670`, neighboring world scan or mutation branches at `0x004499a6`, `0x00449bdf`, and `0x00450f69`, plus one shell-side or editor-adjacent caller at `0x004a0e72`, which makes this the safest current name for the shared secondary-raster marked-bit predicate.","objdump + caller inspection + raster-cell correlation + secondary-grid overlay correlation" +0x00534ec0,56,world_secondary_raster_query_cell_class_in_set_2_4_5,map,thiscall,inferred,objdump + caller inspection + raster-cell correlation,3,"Tiny reusable class-subset predicate over the same 3-byte secondary-raster family rooted at `[this+0x165d]` with row stride `[this+0x15dd]`. The helper resolves one caller-selected world-grid cell, masks the low three class bits from the first byte, and returns `1` only when that class is `2`, `4`, or `5`, else `0`. Current grounded callers include neighboring world-side setup, scan, and presentation branches around `0x00446418`, `0x00449c88`, `0x0044bdfc`, `0x0044dd78`, `0x0044ec51`, `0x0044f30e`, `0x0044f445`, `0x00450f7a`, and `0x004fa86c`, plus serializer-adjacent paths under `0x00446240`, so this is the safest current read for the shared secondary-raster class-subset predicate rather than a more player-facing terrain label.","objdump + caller inspection + raster-cell correlation + serializer correlation" +0x00534f00,52,world_secondary_raster_query_cell_class_in_set_3_5,map,thiscall,inferred,objdump + caller inspection + raster-cell correlation,3,"Tiny reusable class-subset predicate over the same 3-byte secondary-raster family rooted at `[this+0x165d]` with row stride `[this+0x15dd]`. The helper resolves one caller-selected world-grid cell, masks the low three class bits from the first byte, and returns `1` only when that class is `3` or `5`, else `0`. Current grounded callers include neighboring world-side setup, serializer, and presentation branches around `0x00446240`, `0x00448cbf`, `0x0044dbcd`, `0x0044ec3d`, `0x0044ede9`, `0x0044ee0a`, `0x0044ef7a`, `0x0044f131`, `0x0044f1b5`, `0x0045105e`, `0x0047a569`, and `0x004df627`, so this is the safest current read for the shared secondary-raster class-subset predicate rather than a more player-facing terrain label.","objdump + caller inspection + raster-cell correlation + serializer correlation" 0x00539fb0,924,shell_emit_geographic_label_frame_vertex24_records,bootstrap,thiscall,inferred,ghidra-headless,4,Expands the current geographic-label item into cached frame vertex24 records inside the caller buffer. The helper patches packed alpha into up to sixteen prebuilt 0x18-byte records copies additional 24-byte frame blocks from fixed item offsets and returns the emitted vertex count for the label border or backing geometry.,ghidra + rizin + llvm-objdump 0x0053a440,14,shell_set_geographic_label_item_alpha,bootstrap,thiscall,inferred,ghidra-headless,4,Stores an 8-bit alpha input into the high-byte color field at [this+0x5b] for the current geographic-label item before frame or text emission.,ghidra + rizin + llvm-objdump 0x0053a960,723,shell_emit_geographic_label_text_span,bootstrap,thiscall,inferred,ghidra-headless,4,Builds and emits one geographic-label text span for the current cell item. The helper calls the item vtable at +0x10 to materialize a null-terminated display string up to 0x12c bytes computes placement from item float fields and shell service state checks visibility through the shell bundle and forwards the resolved text payload into the presentation path through 0x005519f0. The item family aligns with gpdLabelDB and 2DLabel.imb rather than the parallel city assets.,ghidra + rizin + llvm-objdump @@ -787,12 +931,13 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x0058db20,53,multiplayer_transport_clear_status_pump,shell,thiscall,inferred,ghidra-headless,3,Clears the session-event transport status-pump flag at [this+0xb44] then reruns multiplayer_transport_service_status_pump. When the transport still owns the auxiliary object at [this+0xaf0] it follows up with either 0x00597370 or 0x00597350 depending on whether selector slot [this+0x398] is present.,ghidra + rizin + llvm-objdump 0x0058db60,5,multiplayer_transport_force_status_flush,shell,thiscall,inferred,ghidra-headless,3,Tail-call wrapper into 0x00597370 for the active session-event transport object. The shell flush path uses it immediately before multiplayer_transport_flush_and_maybe_shutdown.,ghidra + rizin + llvm-objdump 0x0058dc30,22,multiplayer_transport_is_route_mode_active_nonterminal,shell,cdecl,inferred,ghidra-headless,3,Tiny predicate over the route-mode field at [this+0x18b8]. It returns false when the mode is zero or terminal mode `5` and true for the other active route modes. Current grounded callers use it to decide whether route callbacks can run inline or whether route work must be re-enqueued.,ghidra + rizin + llvm-objdump +0x0058dc50,576,multiplayer_transport_construct_and_zero_runtime_fields,shell,thiscall,inferred,objdump + local disassembly,3,"Constructor or bring-up owner for the session-event transport object. It allocates or adopts the `0x1ee4`-byte transport body, bulk-zeroes the full runtime field band through `rep stosd` with count `0x7b9`, and then seeds the neighboring replay-band and transport-runtime families through their dedicated helpers and inline stores. Current evidence now makes this row important to the unresolved capacity-sidecar edge too: the constructor explicitly zero-initializes `[this+0x1778]`, later seeds neighbors such as `[this+0x177c]`, `[this+0x17fc]`, and the surrounding route-callback-table fields, and still never writes a nonzero value into `[this+0x1778]`. That proves the sidecar is not seeded by ordinary local construction inside `RT3.exe`.","objdump + local disassembly + constructor-layout correlation + replay-band negative-writer correlation" 0x0058de90,95,multiplayer_transport_shutdown,shell,thiscall,inferred,ghidra-headless,3,Shuts down the session-event transport object and either marks deferred-close state or tears the object down immediately. It preserves [this+0x178c] across the common shutdown helper at 0x0058de50 disconnects active routes through multiplayer_transport_disconnect and when no outstanding work remains drops into the reset path at 0x0058d8a0; otherwise it latches deferred-close flag [this+0x1ee0].,ghidra + rizin + llvm-objdump 0x0058def0,40,multiplayer_transport_flush_and_maybe_shutdown,shell,thiscall,inferred,ghidra-headless,3,Flushes the transport state through 0x0058d8d0 with selector -1 and when deferred-close flag [this+0x1ee0] is set and the outstanding-work count at [this+0x1808] has reached zero immediately falls into multiplayer_transport_shutdown.,ghidra + rizin + llvm-objdump 0x0058d720,35,multiplayer_transport_context_id_is_absent_from_queued_and_active_collections,shell,cdecl,inferred,objdump + caller inspection,2,"Small immediate-drain quiescence gate for one transport context id carried in `ESI`. It first checks the transient work-record collection at `[transport+0x1780]` through `multiplayer_transport_queued_work_collection_lacks_context_id` `0x593400`, then checks the active opcode-record collection at `[transport+0x17fc]` through `multiplayer_transport_active_opcode_record_collection_lacks_context_id` `0x592970`, and returns success only when both collections lack that same id. Current grounded callers are the immediate-drain tails in `multiplayer_transport_submit_text_record` `0x58df20`, the neighboring formatted selector-text publish root at `0x58dfb0`, and `multiplayer_transport_register_callback_table` `0x58e200`.","objdump + caller inspection + immediate-drain correlation + collection-quiescence correlation" 0x0058df20,131,multiplayer_transport_submit_text_record,shell,thiscall,inferred,ghidra-headless,3,"Submits one prepared text record through the session-event transport using a caller-supplied callback wrapper. The helper first seeds one shared immediate-drain context id through `multiplayer_transport_next_work_sequence` `0x5934c0`, then tries the text fastpath through `multiplayer_transport_try_submit_text_record_fastpath` `0x593d60`; when that fast path declines it packages the caller callback mode and payload into `0x593170` together with the same context id. When the caller requested immediate draining it services the transport queue through `0x58d8d0` and waits in `0x58d720` until that same id disappears from both queued work field `+0x0c` and active opcode-record field `+0x14`, then may fall into `multiplayer_transport_shutdown` when deferred close is armed.","ghidra + rizin + llvm-objdump" 0x0058e100,230,multiplayer_transport_publish_fixed_token_message,shell,thiscall,inferred,ghidra-headless,3,Publishes one fixed-token status message through selector `2` on the session-event transport. The helper requires the transport to be active and fully configured builds a formatted status line from the caller token plus internal fields such as [this+0x282] and [this+0x54] sends that line through multiplayer_transport_send_selector_text sets [this+0xb44] to 1 reruns the status pump and when appropriate nudges the downstream mode helper at 0x00595650 or the auxiliary object paths 0x00597350 and 0x00597370.,ghidra + rizin + llvm-objdump + strings -0x0058e200,211,multiplayer_transport_register_callback_table,shell,thiscall,inferred,ghidra-headless,3,"Registers or refreshes the session-event transport callback table and descriptor block. The helper first seeds one shared immediate-drain context id through `multiplayer_transport_next_work_sequence` `0x5934c0`. When the transport is not yet fully configured it copies the local name into `[this+0x04]`, stores the callback-table pointers at `[this+0x4c]` and `[this+0x5c]`, sets `[this+0x44]` active, and forwards the descriptor block plus caller metadata into `multiplayer_transport_attach_callback_table_descriptor` `0x593650` with that same context id. It then routes the resolved table through `multiplayer_transport_dispatch_callback_table_binding` `0x592a40`, and when immediate draining is requested it pumps `0x58d8d0` until `0x58d720` confirms that same id has disappeared from both the queued work and active opcode collections before honoring deferred-close state.","ghidra + rizin + llvm-objdump" +0x0058e200,211,multiplayer_transport_register_callback_table,shell,thiscall,inferred,objdump + caller inspection,3,"Registers or refreshes the session-event transport callback table and descriptor block. The helper first seeds one shared immediate-drain context id through `multiplayer_transport_next_work_sequence` `0x5934c0`. When the transport is not yet fully configured it copies the local name into `[this+0x04]`, stores two caller-supplied follow-on callback fields at `[this+0x4c]` and `[this+0x5c]`, sets `[this+0x44]` active, and forwards the descriptor block plus caller metadata into `multiplayer_transport_attach_callback_table_descriptor` `0x593650` with that same context id. It then routes the resolved table through `multiplayer_transport_dispatch_callback_table_binding` `0x592a40`, and when immediate draining is requested it pumps `0x58d8d0` until `0x58d720` confirms that same id has disappeared from both the queued work and active opcode collections before honoring deferred-close state.","objdump + caller inspection + callback-binding correlation" 0x0058e2e0,38,multiplayer_transport_reset_and_maybe_shutdown,shell,thiscall,inferred,ghidra-headless,3,Resets the common transport state through 0x0058de50 and when deferred-close flag [this+0x1ee0] is armed and the outstanding-work count at [this+0x1808] has reached zero immediately falls into multiplayer_transport_shutdown.,ghidra + rizin + llvm-objdump 0x0058e370,33,multiplayer_transport_is_request_pending,shell,cdecl,inferred,ghidra-headless,3,Returns true while the caller transport request still appears in either the queued request collection at [this+0x550] or the secondary active-work collection checked through 0x0059c540. Immediate-drain callers use it as the loop predicate after pumping queued text and sleeping for 10 ms.,ghidra + rizin + llvm-objdump 0x0058e3f0,137,multiplayer_transport_drain_request_text_queue,shell,cdecl,inferred,ghidra-headless,3,Immediate-drain helper for one transport request. When request kind [req+0x20] is `1` it walks queued transport text lines under [this+0x1c] republishes them through 0x0059b790 and notifies the small observer table through 0x0058e310 until the queue is empty. When request kind `2` drains it also publishes `Disconnected`. Both paths refresh timeout state through 0x00598030 and finish by forwarding the request into 0x0059c470.,ghidra + rizin + llvm-objdump + strings @@ -838,18 +983,18 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x005907d0,222,multiplayer_gamespy_server_descriptor_collection_append_decoded_compact_payload_if_new,shell,cdecl,inferred,objdump,3,"Decodes and appends one compact descriptor payload into the caller collection when the payload is self-consistent and not one special global descriptor. It first validates the payload length against the compact-header precheck helpers at `0x58fe20`, `0x58fe90`, and `0x58fe50`, then parses the header shape through `0x58ff20`, allocates one fresh descriptor through `multiplayer_gamespy_server_descriptor_alloc_primary_endpoint_record` `0x58d5b0`, rejects the special global record through `multiplayer_gamespy_server_descriptor_matches_special_global_record` `0x58d680`, decodes the header and property payload through `multiplayer_gamespy_server_descriptor_decode_compact_header_and_property_payload` `0x58ff60` with decode mode `1`, and finally inserts the surviving descriptor through `0x590370`. Unlike the keyed upsert lane at `0x590d00`, this path always allocates a fresh descriptor after the precheck succeeds.","objdump + caller inspection + compact-descriptor correlation" 0x00590540,95,multiplayer_route_callback_runtime_acquire_shared_string_copy,shell,cdecl,inferred,objdump,3,"Acquires one refcounted shared string copy for the route-callback-table runtime. It lazily initializes the global shared-string pool through `0x58d6a0`, probes that pool by exact string through `0x58f9c0`, increments the stored refcount and returns the pooled string pointer on hit, and otherwise duplicates the caller string through `0x58f4a0` and inserts a new `{string, refcount=1}` pair through `0x58f920`. Current grounded callers are the route-callback receive/decode state machine `0x5908c0`, which uses this helper while materializing schema-owned dictionary strings.","objdump + caller inspection + shared-string-pool correlation" 0x005905a0,58,multiplayer_route_callback_runtime_release_shared_string_copy,shell,cdecl,inferred,objdump,3,"Releases one refcounted shared string copy from the route-callback-table runtime. It probes the global shared-string pool through `0x58d6a0/0x58f9c0`, decrements the stored refcount on hit, and removes the backing entry through `0x58f970` once the refcount reaches zero. Current grounded callers are the runtime teardown helpers `0x5906f0` and `0x5906c1` beneath the route-callback-table family.","objdump + caller inspection + shared-string-pool correlation" -0x005905e0,194,multiplayer_transport_route_callback_table_construct,shell,cdecl,inferred,objdump,3,"Constructs one transport-owned route callback table runtime. The helper seeds table state to `1`, clears the intrusive-head slot at `[this+0x5bc]`, copies three caller strings into local buffers `[this+0x0c]`, `[this+0x2c]`, and `[this+0x4c]`, stores the owner callback and cookie at `[this+0x480]/[this+0x484]`, seeds default strings at `[this+0x488]` and `[this+0x49c]`, zeroes staged companion fields `[this+0x490]/[this+0x494]`, resets live socket and receive-buffer state at `[this+0x4a0]`, `[this+0x74]`, and `[this+0x78]`, stores the caller schema or descriptor owner pointer at `[this+0x4a8]`, and initializes the decoded schema dictionary lanes rooted at `[this+0x08]` and `[this+0x478/0x47c]`. Current grounded callers are the callback-table initialization paths under `0x590ed0` and the larger transport table bring-up family.","objdump + caller inspection + route-callback-table correlation" +0x005905e0,194,multiplayer_transport_route_callback_table_construct,shell,cdecl,inferred,objdump,3,"Constructs one transport-owned route callback table runtime. The helper seeds table state to `1`, clears the intrusive-head slot at `[this+0x5bc]`, copies three caller strings into local buffers `[this+0x0c]`, `[this+0x2c]`, and `[this+0x4c]`, stores the owner callback and cookie at `[this+0x480]/[this+0x484]`, seeds default strings at `[this+0x488]` and `[this+0x49c]`, zeroes staged companion fields `[this+0x490]/[this+0x494]`, resets live socket and receive-buffer state at `[this+0x4a0]`, `[this+0x74]`, and `[this+0x78]`, stores the caller schema or descriptor owner pointer at `[this+0x4a8]`, and initializes the decoded schema dictionary lanes rooted at `[this+0x08]` and `[this+0x478/0x47c]`. The owner callback lane is now tighter too: current grounded later users invoke `[this+0x480]` with mode `0` from append-notify `0x590370`, mode `1` from compact upsert `0x590d00`, mode `2` from remove-notify `0x590430`, and modes `6/5/3` from the live receive/decode state machine `0x5908c0`. Current grounded callers are the callback-table initialization paths under `0x590ed0` and the larger transport table bring-up family.","objdump + caller inspection + route-callback-table correlation + owner-mode correlation" 0x005906b0,53,multiplayer_transport_route_callback_table_release_schema_shared_string_slots,shell,cdecl,inferred,objdump,3,"Releases the table-local shared schema-string slot array rooted at `[this+0x7c]` with live count `[this+0x478]`. It walks each stored shared-string pointer through `multiplayer_route_callback_runtime_release_shared_string_copy` `0x5905a0` and then clears the live count back to zero. Current grounded callers are the broader live-route reset helper `0x590740` and the decode-side teardown paths that abandon schema materialization midstream.","objdump + local disassembly + caller inspection + shared-string-slot correlation" 0x005906f0,68,multiplayer_transport_route_callback_table_release_decoded_schema_dictionary,shell,cdecl,inferred,objdump,3,"Releases the decoded schema-dictionary runtime rooted at `[this+0x08]` for one route callback table. It walks every stored shared-string pointer through the collection at `[this+0x08]`, releases each one through `multiplayer_route_callback_runtime_release_shared_string_copy` `0x5905a0`, destroys the backing collection through `0x59e330`, and clears the owner slot afterward. Current grounded callers are the larger route-callback receive/decode and teardown paths.","objdump + caller inspection + route-callback-table correlation" 0x00590740,84,multiplayer_transport_route_callback_table_reset_live_route_and_decode_runtime,shell,cdecl,inferred,objdump,3,"Resets the live route and decode-side runtime for one route-callback table without destroying the outer table object. It frees the staged receive buffer at `[this+0x74]`, closes the live route handle at `[this+0x4a0]` when present, restores table state to sentinel `1`, releases the decoded schema dictionary through `multiplayer_transport_route_callback_table_release_decoded_schema_dictionary` `0x5906f0`, resets schema companion field `[this+0x47c]` to `-1`, and releases the table-local shared schema-string slots through `multiplayer_transport_route_callback_table_release_schema_shared_string_slots` `0x5906b0`. Current grounded callers are the disconnect-publication helper `0x590ea0`, the one-shot resend wrapper `0x5912c0`, and the broader destroy path `0x5907a0`.","objdump + local disassembly + caller inspection + route-callback-table correlation" 0x005907a0,43,multiplayer_transport_route_callback_table_destroy_runtime_and_release_descriptor_collection,shell,cdecl,inferred,objdump,3,"Destroys the full route-callback-table runtime. It first resets the live route and decode-side state through `multiplayer_transport_route_callback_table_reset_live_route_and_decode_runtime` `0x590740`, then releases the active descriptor collection through `0x5904d0`, performs one remaining shared multiplayer cleanup call through `0x58d0a0`, destroys the backing descriptor vector at `[this+0x04]` through `0x59e330` when present, and clears that owner slot afterward. Current grounded callers are the larger transport teardown lanes and the auxiliary capacity-descriptor cache cleanup family.","objdump + local disassembly + caller inspection + route-callback-table correlation + descriptor-collection correlation" -0x005908c0,804,multiplayer_transport_route_callback_table_service_receive_decode_state_machine,shell,cdecl,inferred,objdump,3,"Services the live receive/decode state machine for one transport-owned route callback table using staged buffer `[this+0x74]/[this+0x78]` and state dword `[this+0x5b8]`. The current bounded model is: state `0` validates the leading route companion header, stores the first dword into `[this+0x490]`, stores the first word or sentinel into `[this+0x498]`, can publish owner callbacks in modes `6` and `5`, and either enters a terminal route-mode branch or continues into schema decode; states `1..3` build the table-owned descriptor schema and shared-string dictionaries under `[this+0x08]` and `[this+0x7c..]` through `0x59e0b0`, `0x590540`, and `0x59e4d0`; and state `4` repeatedly hands the remaining compact payload stream to `multiplayer_gamespy_server_descriptor_collection_append_decoded_compact_payload_if_new` `0x5907d0` until the staged receive buffer is exhausted. Decode failures return `5`, while successful progress updates the staged-buffer pointers and leaves the remaining byte count back in `[this+0x78]`. Current grounded caller is `multiplayer_transport_service_route_callback_table_once` `0x591290` in table states `2/3`.","objdump + caller inspection + route-callback-table correlation + compact-descriptor correlation" +0x005908c0,804,multiplayer_transport_route_callback_table_service_receive_decode_state_machine,shell,cdecl,inferred,objdump,3,"Services the live receive/decode state machine for one transport-owned route callback table using staged buffer `[this+0x74]/[this+0x78]` and state dword `[this+0x5b8]`. The current bounded model is: state `0` validates the leading route companion header, stores the first dword into `[this+0x490]`, stores the first word or sentinel into `[this+0x498]`, publishes owner callback mode `6` with the special global descriptor `0x00db8b4c` plus cookie `[this+0x484]`, and when the trailing token path succeeds also publishes owner callback mode `5` with that same special global descriptor before either entering a terminal route-mode branch or continuing into schema decode; states `1..3` build the table-owned descriptor schema and shared-string dictionaries under `[this+0x08]` and `[this+0x7c..]` through `0x59e0b0`, `0x590540`, and `0x59e4d0`; and state `4` repeatedly hands the remaining compact payload stream to `multiplayer_gamespy_server_descriptor_collection_append_decoded_compact_payload_if_new` `0x5907d0` until the staged receive buffer is exhausted. Decode failures return `5`, while the explicit compact-payload failure tail publishes owner callback mode `3` with that same special global descriptor before advancing the staged-buffer pointers and leaving the remaining byte count back in `[this+0x78]`. Current grounded caller is `multiplayer_transport_service_route_callback_table_once` `0x591290` in table states `2/3`.","objdump + caller inspection + route-callback-table correlation + compact-descriptor correlation + owner-mode correlation" 0x00590ea0,34,multiplayer_transport_route_callback_table_publish_disconnect_and_reset,shell,cdecl,inferred,objdump,3,"Publishes one route-callback-table disconnect event and then tears the live route side down. It invokes the owner callback at `[this+0x480]` in mode `4`, passing the special global descriptor at `0x00db8b4c` plus cookie `[this+0x484]`, and then tails into the broader table reset helper `0x590740`. Current grounded callers are the state-`2/3` receive-service helper `0x5911e0`, the connect-or-send wrapper `0x5912c0`, and failure paths beneath the route-table open helper `0x590ed0`.","objdump + caller inspection + route-callback-table correlation + owner-callback correlation" 0x00590ed0,531,multiplayer_transport_route_callback_table_open_live_route_and_seed_receive_state,shell,cdecl,inferred,objdump,3,"Opens or reopens the live route side for one transport-owned callback table. The helper validates the caller-supplied route-name strings, resets temporary builder state, seeds a small descriptor schema block in stack scratch, copies the chosen route labels into the table-local buffers `[this+0x0c]` and `[this+0x2c]`, stages one outbound request payload into the local send buffer rooted at `[this+0x6c]`, opens the live route handle into `[this+0x4a0]` through `0x5b3216`, and on success sets table state to `3`, clears decode-substate `[this+0x5b8]`, allocates the initial receive buffer at `[this+0x74]` when needed, and zeroes the staged receive count `[this+0x78]`. Failure paths return `3`, `5`, or `6` and can tear the live route side back down through `multiplayer_transport_route_callback_table_publish_disconnect_and_reset` `0x590ea0`. Current grounded callers are the reconnect wrapper `0x5912c0`, the direct `gsi_am_rating` upsert path `0x591330`, and the larger transport-owned route bring-up paths around `0x5964e1` and `0x59655f`.","objdump + caller inspection + route-callback-table correlation + live-route-handle correlation + caller correlation" 0x005911e0,332,multiplayer_transport_route_callback_table_service_live_socket_and_feed_decode_machine,shell,cdecl,inferred,objdump,3,"Services one open route-callback-table socket in states `2/3`. It polls the live route handle at `[this+0x4a0]`, reads newly available bytes into the staged receive buffer `[this+0x74]/[this+0x78]` through `0x5b321c`, grows that backing buffer through `0x59e750` when the staged byte count would overflow the current capacity, enters the heavier decode state machine `0x5908c0` once the table is in state `3`, compacts any unconsumed tail back to the start of the buffer, and tears the route side down through `multiplayer_transport_route_callback_table_publish_disconnect_and_reset` `0x590ea0` on closure or decode failure. Current grounded caller is `multiplayer_transport_service_route_callback_table_once` `0x591290` for table states `2/3`.","objdump + caller inspection + route-callback-table correlation + staged-buffer correlation" 0x00590dc0,155,multiplayer_transport_primary_endpoint_table_seed_from_raw_endpoint_list,shell,cdecl,inferred,objdump,3,"Rebuilds the transport-owned primary-endpoint table from the raw endpoint list exposed by the live route handle at `[this+0x4a0]`. It first probes list availability through `0x58f4e0`, then repeatedly reads one endpoint tuple through `0x58bc7e` record type `0x1f3`, skips tuples already present in the table through `multiplayer_gamespy_server_descriptor_collection_find_by_primary_ipv4_and_port` `0x5903a0`, allocates fresh descriptor records through `multiplayer_gamespy_server_descriptor_alloc_primary_endpoint_record` `0x58d5b0`, rejects one special global descriptor through `0x58d680`, then stamps descriptor flag byte `[entry+0x15]` with `0x11` and inserts the surviving record into the table through `0x590370`. That makes this the strongest current source-side writer for header bit `0x1`, and it also ties bit `0x10` to the same source-header family later decoded as the inline primary-port-present branch in `0x58ff20/0x58ff60`. Current grounded caller is the recurring table service helper `0x591290` when the table sits in state `0`.","objdump + local disassembly + caller inspection + endpoint-table correlation + header-flag correlation + compact-header correlation" 0x0058ff60,432,multiplayer_gamespy_server_descriptor_decode_compact_header_and_property_payload,shell,cdecl,inferred,objdump,3,"Decodes one compact server-descriptor header and trailing property payload into the caller descriptor record. The helper copies the source header byte into descriptor flag byte `[entry+0x15]` through `0x58d630`, then conditionally consumes endpoint and scalar fields according to header bits `0x02`, `0x08`, `0x10`, `0x20`, `0x40`, and signed bit `0x80`. Current grounded split is tighter now: the primary IPv4 dword is always present immediately after the header byte; bit `0x10` only marks the inline primary port word branch, otherwise the helper falls back to the owner default port at `[caller+0x498]`; bit `0x02` supplies the secondary IPv4 dword; bit `0x20` supplies the paired secondary port word, otherwise the helper again falls back to the owner default port; bit `0x08` supplies one still-unresolved auxiliary dword through `[entry+0x10]`; bit `0x40` enables one inline keyed-property vector decoded through `0x59e110/0x59e120` plus the property-store writers rooted at `0x58d0f0` and `0x58d130`, after which the helper ORs descriptor state byte `[entry+0x14]` with bit `0x1`; and signed bit `0x80` enables one trailing NUL-terminated string-pair tail decoded through repeated `0x58d0f0` stores, after which the helper ORs state byte `[entry+0x14]` with bit `0x2`. Current grounded callers are the larger compact decode paths at `0x5907d0` and `0x590d00`. This remains the strongest proof that byte-`0x15` bit `0x1` is a source-side descriptor header bit rather than a queue-generated flag.","objdump + caller inspection + compact-decode correlation + header-flag correlation + secondary-endpoint correlation + state-byte correlation" -0x00590d00,184,multiplayer_transport_decode_compact_descriptor_payload_upsert_by_primary_endpoint_and_notify_owner,shell,cdecl,inferred,objdump,3,"Decodes one compact descriptor payload into the transport-owned primary-endpoint family while reusing an existing descriptor when the compact primary endpoint key already exists. After one short header-shape precheck through `0x58ff20`, it looks up the descriptor by primary IPv4 and port through `multiplayer_gamespy_server_descriptor_collection_find_by_primary_ipv4_and_port` `0x5903a0`. If no match exists it allocates a fresh record through `multiplayer_gamespy_server_descriptor_alloc_primary_endpoint_record` `0x58d5b0`, rejects the special global record through `multiplayer_gamespy_server_descriptor_matches_special_global_record` `0x58d680`, and later inserts the new descriptor through `0x590370`; otherwise it reuses the existing record through `0x590480`. It then decodes the compact header and property payload through `multiplayer_gamespy_server_descriptor_decode_compact_header_and_property_payload` `0x58ff60` with decode mode `0`, and finally notifies the owner callback at `[this+0x480]` in mode `1` with the updated descriptor plus cookie `[this+0x484]`.","objdump + caller inspection + compact-descriptor correlation + owner-callback correlation" +0x00590d00,184,multiplayer_transport_decode_compact_descriptor_payload_upsert_by_primary_endpoint_and_notify_owner,shell,cdecl,inferred,objdump,3,"Decodes one compact descriptor payload into the transport-owned primary-endpoint family while reusing an existing descriptor when the compact primary endpoint key already exists. After one short header-shape precheck through `0x58ff20`, it looks up the descriptor by primary IPv4 and port through `multiplayer_gamespy_server_descriptor_collection_find_by_primary_ipv4_and_port` `0x5903a0`. If no match exists it allocates a fresh record through `multiplayer_gamespy_server_descriptor_alloc_primary_endpoint_record` `0x58d5b0`, rejects the special global record through `multiplayer_gamespy_server_descriptor_matches_special_global_record` `0x58d680`, and later inserts the new descriptor through `0x590370`; otherwise it reuses the existing record through `0x590480`. It then decodes the compact header and property payload through `multiplayer_gamespy_server_descriptor_decode_compact_header_and_property_payload` `0x58ff60` with decode mode `0`, and finally notifies the owner callback at `[this+0x480]` in mode `1` with the updated descriptor plus cookie `[this+0x484]`. The current capacity-descriptor owner `0x595bc0` now makes this mode split tighter too: mode `1` is a no-op for that owner, so this lane updates the live callback-table descriptor family without emitting one opcode-`2` capacity record directly.","objdump + caller inspection + compact-descriptor correlation + owner-callback correlation + capacity-owner-mode correlation" 0x00591290,43,multiplayer_transport_service_route_callback_table_once,shell,cdecl,inferred,objdump,3,"Shared recurring service helper for one transport-owned route callback or descriptor table. It first clears the staged intrusive descriptor list at `[this+0x5bc]` through `multiplayer_transport_route_callback_table_release_staged_intrusive_descriptor_list` `0x590490`, then switches on table state dword `[this+0x00]`: state `0` seeds the primary-endpoint side through `multiplayer_transport_primary_endpoint_table_seed_from_raw_endpoint_list` `0x590dc0`; states `2` and `3` service the live receive path rooted at socket `[this+0x4a0]` by appending new bytes into the staging buffer at `[this+0x74]/[this+0x78]`, growing the backing buffer through `0x59e750` when needed, and invoking the heavier decode state machine `0x5908c0` once buffered data is available in state `3`; other states return immediately. Receive failure or closure tears the live route side down through `0x590ea0` and returns status `3`. Current grounded caller is `multiplayer_transport_service_route_callback_tables` `0x596210`, which uses this helper on the route tables at `[transport+0xba4]`, `[transport+0x1164]`, and `[transport+0x18bc]`.","objdump + caller inspection + route-table-service correlation + intrusive-list correlation" 0x005912c0,108,multiplayer_transport_route_callback_table_send_payload_with_one_reopen_retry,shell,cdecl,inferred,objdump,3,"Attempts one outbound send on the live route handle at `[this+0x4a0]` and performs at most one full reopen retry on failure. It forwards the caller payload pointer and byte count into `0x5b3216`; if that first send fails it resets the live route side through `multiplayer_transport_route_callback_table_reset_live_route_and_decode_runtime` `0x590740`, reopens the route through `multiplayer_transport_route_callback_table_open_live_route_and_seed_receive_state` `0x590ed0` in mode `2`, retries the same send once, and on persistent failure publishes disconnect plus reset through `multiplayer_transport_route_callback_table_publish_disconnect_and_reset` `0x590ea0`. Current grounded callers are the keyed primary-endpoint upsert lane `0x591330` and the direct route-send family under the callback-table transport block.","objdump + local disassembly + caller inspection + route-send correlation" 0x00591330,96,multiplayer_transport_primary_endpoint_table_upsert_descriptor_by_primary_ipv4_and_port,shell,cdecl,inferred,objdump,3,"Upserts one compact descriptor record into the `gsi_am_rating` primary-endpoint table rooted at `[transport+0x18bc]`. When the table is still in sentinel state `1` it first reinitializes it through `0x590ed0` mode `2`; afterward it converts the caller host-order port through `0x58bc5a`, builds a 9-byte stack record with tag byte `1`, primary IPv4 dword, and primary port word, and forwards that record into `0x5912c0` for keyed insertion or replacement. Current grounded caller is `multiplayer_transport_dispatch_am_rating_route_event_mode` when descriptor flag byte `0x15` bit `0x1` is clear.","objdump + caller inspection + endpoint-table correlation" @@ -864,7 +1009,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x005929a0,69,multiplayer_transport_remove_active_opcode_records_by_type,shell,cdecl,inferred,objdump,3,"Removes active opcode records of one requested type from the collection rooted at `[this+0x17fc]`. It walks the live records in reverse ordinal order, compares opcode dword `+0x00` against the requested type in `EBX`, and removes each match through `0x59e3d0`. Current grounded caller `multiplayer_transport_clear_progress_field_cache` `0x595b80` uses it with opcode type `3`, which corrects that helper as an active field-snapshot cleanup rather than a queued-work sweep.","objdump + local disassembly + caller inspection + active-collection correlation" 0x005929f0,78,multiplayer_transport_remove_active_field_snapshot_records_by_callback_pair,shell,cdecl,inferred,objdump,3,"Removes active field-snapshot opcode records keyed by one subscribed callback pair. It walks the active opcode-record collection at `[this+0x17fc]` in reverse ordinal order, filters for opcode type `3`, resolves the opcode payload pointer at record `+0x10`, and removes records whose payload dword `+0x04` matches the requested callback or context dword in `EBX`. Current grounded caller `multiplayer_transport_enqueue_field_snapshot_record` `0x592b50` uses it before building a fresh opcode-`3` snapshot entry.","objdump + local disassembly + caller inspection + opcode-3 correlation + active-collection correlation" 0x00592970,41,multiplayer_transport_active_opcode_record_collection_lacks_context_id,shell,thiscall,inferred,objdump + caller inspection,2,"Predicate over the active opcode-record collection rooted at `[this+0x17fc]`. It performs a comparator-driven collection search through `0x59e420` using comparator `0x592960`, which orders records by dword field `+0x14`, and returns `1` only when no active opcode record carries the requested context id. Current grounded caller is the immediate-drain completion gate `0x58d720`, so current evidence now bounds active field `+0x14` specifically as the active-side mirror of the shared drain context id seeded by `0x5934c0`.","objdump + caller inspection + collection-search correlation + immediate-drain correlation" -0x00592a40,40,multiplayer_transport_dispatch_callback_table_binding,shell,cdecl,inferred,ghidra-headless,2,"Small deferred callback-table binding wrapper over `multiplayer_transport_enqueue_opcode_record` with opcode `4`. It packages the caller binding fields into the 0x08-byte opcode-`4` record builder at `0x592c40`; current grounded callback-table owners now show the staged work-record triplet more concretely as `(callback fn @ +0x10, callback companion @ +0x18, drain context id @ +0x0c)`, with the final dword still aligned to the shared `0x5934c0`-seeded immediate-drain context later waited on through `0x58d720`.","ghidra + rizin + llvm-objdump + local disassembly + callback-triplet correlation" +0x00592a40,40,multiplayer_transport_dispatch_callback_table_binding,shell,cdecl,inferred,objdump + local disassembly,2,"Small deferred callback-trigger wrapper over `multiplayer_transport_enqueue_opcode_record` using explicit opcode `1` (table slot `0`) and payload size `0x04`. The opcode-`1` constructor at `0x5913a0` is a no-op, so this wrapper is not the real 0x08-byte binding-record builder; it instead stages one tiny callback trigger record whose active-side service lands in `0x5913c0`. Current grounded callback-table callers still show the replay-side triplet feeding this lane as `(first staged metadata dword duplicated in work `+0x0c/+0x10`, second staged metadata dword in `+0x18`)`, with the incoming `EDX` mode or status carried separately into the queued record.","objdump + local disassembly + opcode-table correction + callback-triplet correlation" 0x00592a70,109,multiplayer_transport_probe_or_enqueue_route_record,shell,cdecl,inferred,ghidra-headless,2,"Small route-probe or deferred route-record wrapper over `multiplayer_transport_enqueue_opcode_record`. It first calls `multiplayer_transport_is_route_mode_active_nonterminal` and when that succeeds with caller mode `2` directly invokes the supplied callback; otherwise it falls back to an 0x08-byte opcode-`1` record built from the caller callback and payload fields. Current grounded callers now show the staged work-record triplet more concretely as `(callback fn @ +0x10, callback companion @ +0x18, drain context id @ +0x0c)` with extra route-mode control bytes layered on top, and the final dword again aligned to the shared `0x5934c0`-seeded drain context used by the deferred path.","ghidra + rizin + llvm-objdump + local disassembly + callback-triplet correlation" 0x00592ae0,111,multiplayer_transport_enqueue_descriptor_block_record,shell,cdecl,inferred,objdump + local disassembly,3,"Copies one caller-supplied seven-dword descriptor-block payload into a local `0x1c` buffer and enqueues it through `multiplayer_transport_enqueue_opcode_record` `0x5928a0` as opcode `2`. The deeper opcode-`2` initializer family rooted at `0x591410/0x591470/0x591480` now bounds that payload more tightly: it stores dwords `+0x00/+0x04/+0x0c/+0x10/+0x14/+0x18` verbatim and duplicates the optional string pointer at `+0x08` into owned heap storage. Current grounded callers are now broader than the earlier callback-registration-only note: the helper is also the enqueue tail beneath `multiplayer_transport_enqueue_capacity_descriptor_record` `0x595bc0`, where live mode supplies a populated descriptor payload but replay modes `3/5` intentionally pass an all-zero seven-dword payload while reusing separate sidecar metadata slots from the cached work record.","objdump + local disassembly + opcode-record table correlation + descriptor-block initializer correlation + capacity-descriptor correlation" 0x00592b50,226,multiplayer_transport_enqueue_field_snapshot_record,shell,cdecl,inferred,ghidra-headless,3,"Builds and enqueues one field-snapshot transport record through `multiplayer_transport_enqueue_opcode_record` using opcode `3` and a `0x14`-byte payload. Depending on the caller mode it can first remove prior matching entries through `0x5929f0`, then normalizes the `hostname` field against `(No Name)`, samples the `gamemode` field and compares it against `openstaging`, computes one 0-to-100 progress percentage from cached progress slot `[this+0x1774]` plus counters `[this+0x1734]` and `[this+0x1740]` and the current active descriptor count under `[this+0xba4]`, and packages the subscribed callback pointers from `[this+0x176c]` and `[this+0x1770]`. Current grounded caller `0x596500` seeds `[this+0x1774]` to `1` immediately before the first mode-`3` snapshot under `multiplayer_transport_open_field_subscription_route_callback_table` `0x5962e0`.","ghidra + rizin + llvm-objdump + strings + local disassembly + caller inspection" @@ -873,7 +1018,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00593380,30,multiplayer_transport_destroy_transient_work_record_collection,shell,thiscall,inferred,objdump + local disassembly,2,"Destructor-side helper for the transient transport work-record collection rooted at `[this+0x1780]`. When the collection exists it destroys that vector owner through `0x59e330`, then clears `[this+0x1780]` to null.","objdump + local disassembly + work-queue correlation" 0x005933a0,83,multiplayer_transport_remove_queued_work_record_by_pointer,shell,thiscall,inferred,objdump + local disassembly,3,"Scans the transient transport work-record collection at `[this+0x1780]` for one exact record-pointer match and removes that vector slot through `generic_vector_remove_index` `0x59e3d0`. Successful removal also increments the released-or-completed work counter at `[this+0x1788]`. Current grounded callers include the callback-table binding result helper `0x593570`, route-binding release `0x595620`, and the names or bound-route or selector-text completion lanes when they drop stale or finished work records.","objdump + local disassembly + caller inspection + work-queue correlation" 0x00593400,90,multiplayer_transport_queued_work_collection_lacks_context_id,shell,thiscall,inferred,objdump + local disassembly,2,"Predicate over the same transient work-record collection at `[this+0x1780]`. It returns `1` when no queued work record carries the requested dword context id in field `+0x0c`, and returns `0` on the first match. Current grounded caller is the small transport gate at `0x58d720`, which uses this uniqueness test immediately before `0x592970`; that now bounds queued field `+0x0c` specifically as the queued-side mirror of the shared drain context id seeded by `0x5934c0`.","objdump + local disassembly + caller inspection + work-queue correlation + immediate-drain correlation" -0x00592c40,54,multiplayer_transport_enqueue_callback_binding_record,shell,cdecl,inferred,ghidra-headless,2,Builds and enqueues one 0x08-byte opcode `4` callback-binding record through multiplayer_transport_enqueue_opcode_record. The helper uses the registered callback-table pointer at [this+0x4c] and is the direct worker beneath multiplayer_transport_dispatch_callback_table_binding.,ghidra + rizin + llvm-objdump +0x00592c40,54,multiplayer_transport_enqueue_callback_binding_record,shell,cdecl,inferred,objdump + local disassembly,2,"Builds and enqueues one `0x08`-byte explicit opcode-`5` callback-binding record through `multiplayer_transport_enqueue_opcode_record` `0x5928a0`. The helper stages a local two-dword payload from `(incoming EDX, first stack dword)`, uses that local payload as the deep-copy source for the opcode-`5` family `0x591540/0x591570/0x591580`, and carries the transport follow-on callback field `[this+0x4c]` plus the remaining caller metadata in the queued outer record. It is the real lower binding leaf beneath the worker callback shim at `0x593610`, not the earlier direct role previously attributed to `0x592a40`.","objdump + local disassembly + opcode-table correction + callback-binding correlation" 0x00592c80,80,multiplayer_transport_enqueue_callback_slot9_record,shell,cdecl,inferred,ghidra-headless,2,Gated callback-slot wrapper that enqueues one 0x10-byte opcode `9` record through multiplayer_transport_enqueue_opcode_record when byte [this+0x1790] is set. The record is built around the callback-side state rooted near [this+0x17f8].,ghidra + rizin + llvm-objdump 0x00592cd0,85,multiplayer_transport_enqueue_callback_slot10_record,shell,cdecl,inferred,ghidra-headless,2,Gated callback-slot wrapper that enqueues one 0x14-byte opcode `10` record through multiplayer_transport_enqueue_opcode_record when byte [this+0x1794] is set. The record is built around the callback-side state rooted near [this+0x17f8].,ghidra + rizin + llvm-objdump 0x00592d30,62,multiplayer_transport_enqueue_callback_slot11_record,shell,cdecl,inferred,ghidra-headless,2,Gated callback-slot wrapper that enqueues one 0x04-byte opcode `11` record through multiplayer_transport_enqueue_opcode_record when byte [this+0x1798] is set. The record is built around the callback-side state rooted near [this+0x17f8].,ghidra + rizin + llvm-objdump @@ -954,22 +1099,22 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x00593b00,161,multiplayer_transport_handle_selector_update_response,shell,cdecl,inferred,ghidra-headless,3,"Follow-up callback used by `multiplayer_transport_handle_selector_text_route_request`. When the callback succeeds it initializes or repopulates selector slot `[req+0x1c]` through `multiplayer_transport_init_selector_slot` and `multiplayer_transport_upsert_selector_name_entry`. When it fails it resets that selector slot. Both paths finish by enqueueing a route record through `multiplayer_transport_probe_or_enqueue_route_record` using the staged work fields `(callback fn +0x10, callback companion +0x18, drain context id +0x0c)` plus the request-local selector slot id at `+0x1c`, then unlinking the request through `0x5933a0`.","ghidra + rizin + llvm-objdump + local disassembly + callback-triplet correlation" 0x00593bb0,144,multiplayer_transport_handle_selector_text_route_request,shell,cdecl,inferred,ghidra-headless,3,Completion callback for multiplayer_transport_submit_selector_text_route_request. If the request is already stale at +0x38 it clears the transient state through 0x5962c0 and unlinks the request. On nonzero result it schedules multiplayer_transport_handle_selector_update_response through multiplayer_transport_submit_names_query_with_callback. On zero result it resets selector slot [req+0x1c] and falls back to multiplayer_transport_probe_or_enqueue_route_record before unlinking the request.,ghidra + rizin + llvm-objdump 0x00593c40,177,multiplayer_transport_submit_selector_text_route_request,shell,cdecl,inferred,ghidra-headless,3,"Builds and submits one selector-text route request. It validates the caller text defaults the sample text to 0x005c87a8 allocates a type `2` transient request record through 0x5934e0 stores the selector id at +0x1c stages the same three transport wrapper metadata dwords later consumed from work fields `+0x0c/+0x10/+0x18` refreshes selector naming through 0x59fc80 and multiplayer_transport_set_selector_name and then submits the request through 0x58e720 using multiplayer_transport_handle_selector_text_route_request.","ghidra + rizin + llvm-objdump + strings + work-record-triplet correlation" -0x00595a40,245,multiplayer_transport_dispatch_field_snapshot_mode,shell,cdecl,inferred,ghidra-headless,3,"Dispatches several session-field snapshot update modes into multiplayer_transport_enqueue_field_snapshot_record. Current grounded cases are tighter now: mode `0` enqueues one descriptor-backed snapshot and, when descriptor ready bit `0x1` is still clear, also inserts that descriptor into the local field-cache family `[this+0x1724]` with pending tag `0x4`; mode `1` enqueues the same snapshot without cache insertion; mode `2` removes descriptors carrying pending state bits `0x04/0x08` from that local field-cache family before enqueueing; mode `3` clears progress scalar `[this+0x1774]` and resets the callback payload to zero; mode `4` enqueues one empty selector snapshot through mode `0`; and mode `5` copies the transport-staged route companion dword from `[this+0x490]` into `[this+0x54]` while mirroring that same value into the local field cache rooted at `[this+0x1724]`. Queue service later promotes pending tag `0x4` into ready bit `0x1`.","ghidra + rizin + llvm-objdump + strings + queue-state correlation + caller inspection" +0x00595a40,245,multiplayer_transport_dispatch_field_snapshot_mode,shell,cdecl,inferred,ghidra-headless,3,"Dispatches several session-field snapshot update modes into multiplayer_transport_enqueue_field_snapshot_record. Current grounded cases are tighter now: mode `0` enqueues one descriptor-backed snapshot and, when descriptor ready bit `0x1` is still clear, also inserts that descriptor into the local field-cache family `[this+0x1724]` with pending tag `0x4`; mode `1` enqueues the same snapshot without cache insertion; mode `2` removes descriptors carrying pending state bits `0x04/0x08` from that local field-cache family before enqueueing; mode `3` clears progress scalar `[this+0x1774]` and resets the callback payload to zero; mode `4` enqueues one empty selector snapshot through mode `0`; and mode `5` copies the transport-staged route companion dword from `[this+0x490]` into `[this+0x54]` while mirroring that same value into the field-cache subslot `[this+0x1724+0x24]` through `multiplayer_gamespy_server_descriptor_queue_set_companion_dword_filter` `0x005a0940`, not into `[this+0x1778]`. Queue service later promotes pending tag `0x4` into ready bit `0x1`.","ghidra + rizin + llvm-objdump + strings + queue-state correlation + caller inspection + local disassembly + companion-dword-slot correlation" 0x00595b60,25,multiplayer_transport_enqueue_field_snapshot_mode1_if_enabled,shell,cdecl,inferred,ghidra-headless,2,Tiny field-snapshot wrapper that enqueues one mode-1 field snapshot only when the caller enable flag is zero. The helper is a thin front end over multiplayer_transport_enqueue_field_snapshot_record.,ghidra + rizin + llvm-objdump 0x00595b80,50,multiplayer_transport_clear_progress_field_cache,shell,cdecl,inferred,ghidra-headless,3,Clears the progress-related field cache rooted at [this+0xba0] and then clears the local field cache at [this+0x1724]. It finishes by forwarding opcode type `3` into 0x005929a0 to remove matching active field-snapshot records from the active opcode collection at [this+0x17fc].,ghidra + rizin + llvm-objdump + strings + local disassembly -0x00595bc0,272,multiplayer_transport_enqueue_capacity_descriptor_record,shell,cdecl,inferred,objdump,3,"Builds and enqueues one opcode-`2` descriptor-block record tied to the local capacity or occupancy sidecar at `[this+0x1778]`. Current evidence now bounds that sidecar more tightly: it behaves as one cached pointer into the transient transport work-record family rooted at `[this+0x1780]`, because every meaningful branch in this helper first reads that pointer and then consumes the familiar work-record metadata triplet at `+0x0c/+0x10/+0x18`. Mode `0` is the live append-notify branch, lining up directly with the generic descriptor owner callback at `0x590370`: it samples the current descriptor's primary IPv4, `hostname`, `numwaiting`, `maxwaiting`, `numservers`, and `numplayers` properties through `0x58d1f0`, `0x58d170`, and `0x58d6d0`, then packs a populated seven-dword descriptor payload through `multiplayer_transport_enqueue_descriptor_block_record` `0x592ae0` while also carrying the same outer callback-wrapper triplet as `(drain context id [cache+0x0c], callback fn [cache+0x10], callback companion [cache+0x18])`. Modes `3` and `5` are the live receive-state callbacks sourced by `multiplayer_transport_route_callback_table_service_live_socket_and_feed_decode_machine` `0x5911e0` and its inner decode state machine `0x5908c0`: they deliberately enqueue an all-zero seven-dword descriptor payload, forward only that same stored callback-wrapper triplet in the outer slots, and then unlink the cached work record through `0x5933a0`, using `EDX=1` for mode `3` and `EDX=0` for mode `5`. Other owner-callback modes fall through without staging a descriptor block here, and the negative result is stronger now too: direct local field-xref scans hit neighboring lifecycle fields `[this+0x176c]`, `[this+0x1770]`, `[this+0x1774]`, `[this+0x177c]`, `[this+0x1780]`, and `[this+0x1784]`, but `[this+0x1778]` still appears only as this helper's single read; broader local text scans also fail to show any obvious `lea`-based replay-band writer. So the sidecar writer remains upstream of this leaf family and is not one ordinary direct or nearby derived-address field store in local text. Mode `2` stays separate as the generic remove-notify-and-stage path at `0x590430`, not one of this helper's own branches. Current evidence therefore bounds this as a real capacity or occupancy descriptor publisher over one cached work record, not a vague route-progress helper or a custom replay-scalar blob.","objdump + local disassembly + strings + capacity-cache correlation + work-record correlation + descriptor-block correlation + mode split correlation + opcode2-payload correlation + generic-owner-mode correlation + negative-xref correlation + callback-triplet correlation + neighboring-field-lifecycle correlation + live-receive-owner correlation + negative-derived-address-scan" +0x00595bc0,272,multiplayer_transport_enqueue_capacity_descriptor_record,shell,cdecl,inferred,objdump,3,"Builds and enqueues one opcode-`2` descriptor-block record tied to the local capacity or occupancy sidecar at `[this+0x1778]`. Current evidence now bounds that sidecar more tightly: it behaves as one cached pointer into the transient transport work-record family rooted at `[this+0x1780]`, because every meaningful branch in this helper first reads that pointer and then consumes the familiar work-record metadata triplet at `+0x0c/+0x10/+0x18`. Mode `0` is the live append-notify branch, lining up directly with the generic descriptor owner callback at `0x590370`: it samples the current descriptor's primary IPv4, `hostname`, `numwaiting`, `maxwaiting`, `numservers`, and `numplayers` properties through `0x58d1f0`, `0x58d170`, and `0x58d6d0`, then packs a populated seven-dword descriptor payload through `multiplayer_transport_enqueue_descriptor_block_record` `0x592ae0` while also carrying the same outer callback-wrapper triplet as `(drain context id [cache+0x0c], callback fn [cache+0x10], callback companion [cache+0x18])`. Modes `3` and `5` are the live receive-state callbacks sourced by `multiplayer_transport_route_callback_table_service_live_socket_and_feed_decode_machine` `0x5911e0` and its inner decode state machine `0x5908c0`: they deliberately enqueue an all-zero seven-dword descriptor payload, forward only that same stored callback-wrapper triplet in the outer slots, and then unlink the cached work record through `0x5933a0`, using `EDX=1` for mode `3` and `EDX=0` for mode `5`. Modes `1`, `2`, and `6` are now explicitly bounded too: compact-descriptor upsert notifies mode `1` through `0x590d00`, generic removal notifies mode `2` through `0x590430`, and the receive-header gate notifies mode `6` through `0x5908c0`, but this capacity owner falls through without staging any descriptor block for those modes. The negative result is stronger now too: direct local field-xref scans hit neighboring lifecycle fields `[this+0x176c]`, `[this+0x1770]`, `[this+0x1774]`, `[this+0x177c]`, `[this+0x1780]`, and `[this+0x1784]`, while the owned transient-work lifecycle at `0x593330/0x593370/0x593380/0x5934e0/0x5933a0` and the neighboring active-opcode reset path at `0x5929a0` still never touch `[this+0x1778]`; constructor, recurring service, reset, teardown, and route-callback-table setup scans around `0x58dc50/0x596090/0x596210/0x596060/0x5961b0/0x5962e0/0x596530` likewise seed or clear the surrounding route tables and replay-band neighbors without ever seeding `[this+0x1778]`. The constructor proof is now explicit too: `0x58dc50` bulk-zeroes the full `0x1ee4`-byte transport body and still never writes a nonzero value into `[this+0x1778]`. Broader local text scans also fail to show any `lea`-based replay-band writer or a block-copy owner spanning the whole `0x176c..0x1784` band. A full-binary literal offset sweep now tightens that further: the only direct `0x1778` hit in `RT3.exe` is this read at `0x595bce`. The callback-binding family now sharpens that boundary too: `0x5934e0` stages the shared work-record metadata triplet, `0x593650` binds it into the callback-table worker path, and `0x593570` later consumes and republishes it, while `[this+0x1778]` still appears only as the borrowed sidecar read in this helper. So the sidecar producer remains upstream of the mapped binary and is now best treated as an external callback or worker handoff rather than one missing ordinary direct, derived-address, literal-offset, constructor-side, or higher callback-owner lifecycle store. Current evidence therefore bounds this as a real capacity or occupancy descriptor publisher over one cached borrowed work record, not a vague route-progress helper or a custom replay-scalar blob.","objdump + local disassembly + strings + capacity-cache correlation + work-record correlation + descriptor-block correlation + mode split correlation + opcode2-payload correlation + generic-owner-mode correlation + negative-xref correlation + callback-triplet correlation + neighboring-field-lifecycle correlation + live-receive-owner correlation + negative-derived-address-scan + constructor-teardown-band scan + full-binary literal-offset scan + request-collection-lifecycle correlation + constructor-zero-init correlation + explicit-owner-mode-noop correlation + higher-owner-lifecycle correlation + callback-binding-boundary correlation" 0x00595ce0,22,multiplayer_transport_clear_capacity_descriptor_route_callback_table,shell,cdecl,inferred,objdump + local disassembly,3,"Clears the auxiliary capacity-descriptor route callback table when `[this+0xba0]` is present by forwarding the embedded runtime at `[this+0x1164]` into `multiplayer_transport_route_callback_table_reset_live_route_and_decode_runtime` `0x590740`. Current grounded callers use this before disconnect or larger route-state cleanup. The helper does not target the field-subscription table at `[this+0xba4]`; current evidence ties it specifically to the callback table whose owner handler is `multiplayer_transport_enqueue_capacity_descriptor_record` `0x595bc0`.","objdump + local disassembly + caller inspection + route-callback-table correlation" 0x00595d60,84,multiplayer_transport_check_openstaging_capacity_gate,shell,cdecl,inferred,ghidra-headless,2,Checks whether the current transport object still matches the cached openstaging-like descriptor and whether numplayers remains below maxplayers. When the cached route object at [this+0x1ecc] already matches the current transport identifiers it returns success immediately; otherwise it compares the current maxplayers and numplayers fields and on success falls into 0x00592710 for the caller's route transition path.,ghidra + rizin + llvm-objdump + strings 0x00595dc0,79,multiplayer_transport_try_transition_after_capacity_gate,shell,cdecl,inferred,ghidra-headless,2,"Rejects when `[this+0x1e8c]` or selector slot `[this+0x38c]` is busy, then runs `multiplayer_transport_check_openstaging_capacity_gate` `0x595d60`, refreshes route-side selector state through `0x5973b0` and `multiplayer_transport_reset_selector_slot` `0x5954b0` on slot `2`, forwards the caller descriptor into `multiplayer_transport_try_stage_route_callback_payload` `0x5958e0`, and on success transitions through `multiplayer_transport_set_route_mode` `0x595650` mode `0`. Current grounded callers are the ready-descriptor branch in `0x595e10` mode `1` and the mode-`0` fastpath in `0x595f70`.","ghidra + rizin + llvm-objdump + caller inspection" -0x00595e10,321,multiplayer_transport_dispatch_am_rating_route_event_mode,shell,cdecl,inferred,ghidra-headless,3,"Dispatches route-event modes for the `gsi_am_rating` callback branch rooted at the primary-endpoint table `[this+0x18bc]` and the queued descriptor family `[this+0x1e7c]`. Current grounded cases are tighter now: mode `0` uses descriptor flag-byte-`0x15` bit `0x1` to choose between direct primary-endpoint handling through `multiplayer_transport_primary_endpoint_table_upsert_descriptor_by_primary_ipv4_and_port` `0x00591330` and queued insertion through `multiplayer_gamespy_server_descriptor_queue_insert_with_pending_state_tag` `0x005a09a0`; mode `1` uses descriptor state-byte ready bit `0x2` to choose between immediate transition handling through `multiplayer_transport_try_transition_after_capacity_gate` `0x595dc0` and reinsertion into that same queue family, but then applies one second guard through flag bit `0x1`, which suppresses the direct transition path even when ready bit `0x2` is already present; mode `2` removes descriptors still carrying pending state bits `0x04/0x08` from the queued family through `0x005a0cd0`; mode `3` forces route mode `2` when the primary-endpoint table at `[this+0x18bc]` is empty; mode `4` updates `[this+0x1ed4]` and can switch transport mode based on the callback-table sentinel at `[this+0x18b8]` plus deferred descriptor pointer `[this+0x1ed8]`; and mode `5` copies the transport-staged route companion dword from `[this+0x490]` into `[this+0x54]` while mirroring that same value into the local field cache rooted at `[this+0x1724]`. The strongest current read is that flag byte `0x15` bit `0x1` marks primary-endpoint-seed or endpoint-only descriptors: those descriptors can be staged and enriched through the queue family, but they do not take the richer direct transition path used by clear-bit descriptors.","ghidra + rizin + llvm-objdump + am-rating-owner correlation + endpoint-table correlation + queued-descriptor correlation + queue-state correlation + caller inspection + transition-suppression correlation + raw-endpoint-seed correlation" +0x00595e10,321,multiplayer_transport_dispatch_am_rating_route_event_mode,shell,cdecl,inferred,ghidra-headless,3,"Dispatches route-event modes for the `gsi_am_rating` callback branch rooted at the primary-endpoint table `[this+0x18bc]` and the queued descriptor family `[this+0x1e7c]`. Current grounded cases are tighter now: mode `0` uses descriptor flag-byte-`0x15` bit `0x1` to choose between direct primary-endpoint handling through `multiplayer_transport_primary_endpoint_table_upsert_descriptor_by_primary_ipv4_and_port` `0x00591330` and queued insertion through `multiplayer_gamespy_server_descriptor_queue_insert_with_pending_state_tag` `0x005a09a0`; mode `1` uses descriptor state-byte ready bit `0x2` to choose between immediate transition handling through `multiplayer_transport_try_transition_after_capacity_gate` `0x595dc0` and reinsertion into that same queue family, but then applies one second guard through flag bit `0x1`, which suppresses the direct transition path even when ready bit `0x2` is already present; mode `2` removes descriptors still carrying pending state bits `0x04/0x08` from the queued family through `0x005a0cd0`; mode `3` forces route mode `2` when the primary-endpoint table at `[this+0x18bc]` is empty; mode `4` updates `[this+0x1ed4]` and can switch transport mode based on the callback-table sentinel at `[this+0x18b8]` plus deferred descriptor pointer `[this+0x1ed8]`; and mode `5` copies the transport-staged route companion dword from `[this+0x490]` into `[this+0x54]` while mirroring that same value into the field-cache subslot `[this+0x1724+0x24]` through `multiplayer_gamespy_server_descriptor_queue_set_companion_dword_filter` `0x005a0940`, not into `[this+0x1778]`. The strongest current read is that flag byte `0x15` bit `0x1` marks primary-endpoint-seed or endpoint-only descriptors: those descriptors can be staged and enriched through the queue family, but they do not take the richer direct transition path used by clear-bit descriptors.","ghidra + rizin + llvm-objdump + am-rating-owner correlation + endpoint-table correlation + queued-descriptor correlation + queue-state correlation + caller inspection + transition-suppression correlation + raw-endpoint-seed correlation + companion-dword-slot correlation" 0x00595f70,237,multiplayer_transport_dispatch_am_rating_route_callback,shell,cdecl,inferred,ghidra-headless,3,"Callback handler for the `gsi_am_rating` route branch rooted at the primary-endpoint table `[this+0x18bc]`. Mode `0` forwards directly into multiplayer_transport_try_transition_after_capacity_gate. Mode `2` now has a cleaner ownership split: it walks the primary-endpoint table through `0x590470/0x590480`, prunes stale entries against multiplayer_transport_check_openstaging_capacity_gate, updates surviving entries through `0x58d130` using the `gsi_am_rating` key, and then either forces transport mode `2` when the table empties or forwards the surviving head descriptor into `0x5958e0` before transitioning through `0x595650` mode `0`.","ghidra + rizin + llvm-objdump + strings + endpoint-table correlation" 0x00596060,48,multiplayer_transport_reset_am_rating_route_state,shell,cdecl,inferred,ghidra-headless,3,"Small reset helper for the active `gsi_am_rating` route state. When `[this+0xba0]` is set it clears the primary-endpoint callback table at `[this+0x18bc]` through `0x590740`, resets `[this+0x1ec4]` to zero, and clears the queued descriptor family at `[this+0x1e7c]` through `0x5a0950`.",ghidra + rizin + llvm-objdump + strings -0x00596090,272,multiplayer_transport_init_route_callback_tables,shell,cdecl,inferred,ghidra-headless,3,"Initializes the transport-owned route callback tables at `[this+0xba4]`, `[this+0x1164]`, and `[this+0x18bc]` together with the descriptor caches at `[this+0x1724]` and `[this+0x1e7c]`. Current evidence now bounds the constructor lanes more tightly than the earlier handler-table note: it constructs `[this+0xba4]` through `multiplayer_transport_route_callback_table_construct` `0x5905e0` with owner callback `0x595a40`, shared owner cookie `this`, route-label buffers rooted at `[this+0xb58]` and `[this+0xb78]`, and schema or descriptor-owner pointer `[this+0xb98]`; it seeds the local field-cache family `[this+0x1724]` through `0x5a08f0` with helper `0x595b60`; it constructs `[this+0x1164]` through the same `0x5905e0` path but with owner callback `0x595bc0`; and it constructs `[this+0x18bc]` through `0x5905e0` with owner callback `0x595e10` before seeding `[this+0x1e7c]` through `0x5a08f0` with helper `0x595f70`. On success it also clears the staged route-callback payload slot `[this+0xb50]` and sets callback-table enable latch `[this+0xba0]` to `1`.","ghidra + rizin + llvm-objdump + handler-table correlation + local disassembly + constructor-argument correlation + latch-state correlation" +0x00596090,272,multiplayer_transport_init_route_callback_tables,shell,cdecl,inferred,ghidra-headless,3,"Initializes the transport-owned route callback tables at `[this+0xba4]`, `[this+0x1164]`, and `[this+0x18bc]` together with the descriptor caches at `[this+0x1724]` and `[this+0x1e7c]`. Current evidence now bounds the constructor lanes more tightly than the earlier handler-table note: it constructs `[this+0xba4]` through `multiplayer_transport_route_callback_table_construct` `0x5905e0` with owner callback `0x595a40`, shared owner cookie `this`, route-label buffers rooted at `[this+0xb58]` and `[this+0xb78]`, and schema or descriptor-owner pointer `[this+0xb98]`; it seeds the local field-cache family `[this+0x1724]` through `0x5a08f0` with helper `0x595b60`; it constructs `[this+0x1164]` through the same `0x5905e0` path but with owner callback `0x595bc0`; and it constructs `[this+0x18bc]` through `0x5905e0` with owner callback `0x595e10` before seeding `[this+0x1e7c]` through `0x5a08f0` with helper `0x595f70`. On success it also clears the staged route-callback payload slot `[this+0xb50]` and sets callback-table enable latch `[this+0xba0]` to `1`. This stronger lifecycle decode now makes the negative result around `[this+0x1778]` explicit too: the higher callback-owner bring-up seeds the surrounding route tables and replay-band caches without ever seeding that sidecar slot.","ghidra + rizin + llvm-objdump + handler-table correlation + local disassembly + constructor-argument correlation + latch-state correlation + higher-owner-lifecycle correlation" 0x005961b0,92,multiplayer_transport_teardown_route_callback_tables,shell,cdecl,inferred,ghidra-headless,4,"Full teardown for the transport-owned route callback tables. It first clears progress and local field-cache state through `0x595b80`, resets the capacity-descriptor route callback table at `[this+0x1164]` through `0x595ce0`, and then, when callback-table plumbing latch `[this+0xba0]` is set, destroys the callback tables at `[this+0xba4]`, `[this+0x1164]`, and `[this+0x18bc]` through `0x5907a0`, clears the related caches at `[this+0x1724]` and `[this+0x1e7c]` through `0x5a0970`, and resets `[this+0x1ec4]` to zero. Current grounded caller is `multiplayer_transport_disconnect` `0x58d830`.","ghidra + rizin + llvm-objdump + caller inspection + route-callback-table correlation" -0x00596210,71,multiplayer_transport_service_route_callback_tables,shell,cdecl,inferred,objdump,3,"Recurring service sweep for the transport-owned callback tables and descriptor caches. When route callback plumbing is enabled at `[this+0xba0]` it services the callback tables at `[this+0xba4]`, `[this+0x1164]`, and the `gsi_am_rating` primary-endpoint table `[this+0x18bc]` through the shared table-service helper `0x591290`, services the cache blocks at `[this+0x1724]` and the companion queued descriptor family `[this+0x1e7c]` through `multiplayer_gamespy_server_descriptor_queue_service_and_publish_empty_transition` `0x005a0c80`, and otherwise returns immediately. Current evidence now bounds those queue families more tightly too: service promotes pending descriptor state tags `0x4/0x8` into ready bits `0x1/0x2` before the higher transport-owned branches consume them. The current grounded caller is multiplayer_transport_service_frame, which makes this the callback-table side of the recurring multiplayer transport cadence.",objdump + am-rating-owner correlation + queue-state correlation +0x00596210,71,multiplayer_transport_service_route_callback_tables,shell,cdecl,inferred,objdump,3,"Recurring service sweep for the transport-owned callback tables and descriptor caches. When route callback plumbing is enabled at `[this+0xba0]` it services the callback tables at `[this+0xba4]`, `[this+0x1164]`, and the `gsi_am_rating` primary-endpoint table `[this+0x18bc]` through the shared table-service helper `0x591290`, services the cache blocks at `[this+0x1724]` and the companion queued descriptor family `[this+0x1e7c]` through `multiplayer_gamespy_server_descriptor_queue_service_and_publish_empty_transition` `0x005a0c80`, and otherwise returns immediately. Current evidence now bounds those queue families more tightly too: service promotes pending descriptor state tags `0x4/0x8` into ready bits `0x1/0x2` before the higher transport-owned branches consume them. The current grounded caller is multiplayer_transport_service_frame, which makes this the callback-table side of the recurring multiplayer transport cadence. The same recurring sweep now also strengthens the negative replay-band result: it services all local owner tables surrounding `[this+0x1778]` without ever writing that sidecar slot.",objdump + am-rating-owner correlation + queue-state correlation + higher-owner-lifecycle correlation 0x005962c0,32,multiplayer_transport_clear_staged_route_callback_payload,shell,cdecl,inferred,objdump + local disassembly,3,"Clears the cloned staged route-callback payload handle at `[this+0xb50]`. When that slot is non-null the helper forwards the embedded owned object slot through `0x58d0d0`, then zeroes `[this+0xb50]`. Current grounded callers are the stale-request branch in `multiplayer_transport_handle_selector_text_route_request` `0x593bb0` and the selector-slot-`2` reset path around `0x595561`.","objdump + local disassembly + caller inspection + payload-slot correlation" 0x005962e0,583,multiplayer_transport_open_field_subscription_route_callback_table,shell,cdecl,inferred,objdump,3,"Builds and opens the field-subscription route callback table rooted at `[this+0xba4]`. After clearing the progress field cache through `0x595b80` and releasing any prior active descriptors through `0x5904d0`, it builds one route-label string from the optional suffix text plus the static route stem family at `0x005e22a0..0x005e22d0`, seeds the local field-cache family `[this+0x1724]` with the initial callback keys through `0x5a0cc0`, appends per-field selector names from the caller field-id list through the string table at `0x00629958`, and then opens the live route through `multiplayer_transport_route_callback_table_open_live_route_and_seed_receive_state` `0x590ed0` in mode `4`. On success it seeds cached progress percentage `[this+0x1774]` to `1` and immediately enqueues one mode-`3` field snapshot through `multiplayer_transport_enqueue_field_snapshot_record` `0x592b50`; on failure it falls back through the same progress-cache clear path. This is the strongest current upstream owner above the `[transport+0xba4]` route-callback table.","objdump + local disassembly + caller inspection + field-cache correlation + route-callback-table correlation" -0x00596530,101,multiplayer_transport_try_open_am_rating_route_callback_table_from_stored_route_label,shell,cdecl,inferred,objdump,3,"Tries to reopen the `gsi_am_rating` route callback table rooted at `[this+0x18bc]` from the stored route label at `[this+0x1ed0]`. It first resets the am-rating route state through `multiplayer_transport_reset_am_rating_route_state` `0x596060`, releases any prior active descriptors through `0x5904d0`, and then opens one mode-`4` live route through `multiplayer_transport_route_callback_table_open_live_route_and_seed_receive_state` `0x590ed0` with a null companion route string. Success clears `[this+0x1ed4]`, sets `[this+0x1ec4]` to `1`, and leaves the primary-endpoint table ready for later raw-endpoint seeding through `0x590dc0`; failure reverts through the same reset path and sets `[this+0x1ed4]`. Current grounded caller is the larger route-mode setter around `0x595650`.","objdump + local disassembly + caller inspection + am-rating-owner correlation + route-callback-table correlation" +0x00596530,101,multiplayer_transport_try_open_am_rating_route_callback_table_from_stored_route_label,shell,cdecl,inferred,objdump,3,"Tries to reopen the `gsi_am_rating` route callback table rooted at `[this+0x18bc]` from the stored route label at `[this+0x1ed0]`. It first resets the am-rating route state through `multiplayer_transport_reset_am_rating_route_state` `0x596060`, releases any prior active descriptors through `0x5904d0`, and then opens one mode-`4` live route through `multiplayer_transport_route_callback_table_open_live_route_and_seed_receive_state` `0x590ed0` with a null companion route string. Success clears `[this+0x1ed4]`, sets `[this+0x1ec4]` to `1`, and leaves the primary-endpoint table ready for later raw-endpoint seeding through `0x590dc0`; failure reverts through the same reset path and sets `[this+0x1ed4]`. Current grounded caller is the larger route-mode setter around `0x595650`. This higher reopen path also tightens the negative result for `[this+0x1778]`: even the am-rating reset and reopen lifecycle clears and reseeds the surrounding live tables and queued descriptor family without ever staging that sidecar slot.","objdump + local disassembly + caller inspection + am-rating-owner correlation + route-callback-table correlation + higher-owner-lifecycle correlation" 0x005965a0,44,multiplayer_transport_try_connect_status_route_once,shell,cdecl,inferred,ghidra-headless,3,Single-shot wrapper for the auxiliary status-route object at [this+0xaf0]. When the in-flight latch at [this+0xb40] is already set it returns false immediately. Otherwise it sets that latch and forwards the caller route id into multiplayer_transport_try_connect_status_route then booleanizes the result. Current grounded caller is multiplayer_transport_handle_names_query_response.,ghidra + rizin + llvm-objdump 0x00596970,404,multiplayer_transport_handle_profile_key_query_result,shell,cdecl,inferred,objdump,3,"Per-key callback helper for the profile-key query bundle family. It ignores empty selector names, treats a null fallback text as `0x005c87a8`, special-cases the `username` key by parsing one `X...X|%d` marker through multiplayer_transport_parse_selector_view_probe_marker, arming selector-view probe tracking through multiplayer_transport_arm_selector_view_probe_tracking, and optionally publishing callback slot `22` with the selector name plus the parsed probe tuple `(request id, displayed version/build integer)` or a zeroed `(END)` sentinel payload. It also special-cases `b_flags` by forwarding the returned mode-letter string into multiplayer_transport_merge_selector_mode_mask, then hashes the selector name, key name, and resolved value text through `0x58f4a0` and upserts that triplet into the caller table through hashed_entry_table_upsert.","objdump + strings + caller context" 0x00596b90,72,multiplayer_transport_query_slot_built_in_profile_key_and_publish_slot28_on_success,shell,cdecl,inferred,objdump + local disassembly,3,"Small helper above the generic per-key profile query path. Using the caller selector slot in `edx`, it indexes one per-slot built-in string pair from `[this+0x189c+slot*4]` and `[this+0x18ac+slot*4]`, forwards that pair plus the caller selector name and fallback text into `multiplayer_transport_handle_profile_key_query_result` `0x596970` with its publication flag enabled, and, when that lower helper returns success, also publishes callback slot `28` through `multiplayer_transport_enqueue_callback_slot28_record` `0x593200`. Current grounded callers are the selector callback root `0x59fbd0` and the later multi-entry sweep around `0x596d33`.","objdump + local disassembly + caller inspection" @@ -982,6 +1127,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x0059faf0,98,multiplayer_transport_callback_set_selector_slot_sample_text_and_refresh_active_object,shell,cdecl,inferred,objdump + local disassembly,2,"Callback-root helper adjacent to `0x59fab0`. After resolving the caller selector name into one slot index through `0x5951a0`, it copies up to `0x200` bytes of caller text into the fixed selector sample buffer at `[this+0x39c+slot*0x200]`, clears the trailing byte at `[this+0x59b+slot*0x200]`, and, when an active selector object is still present at `[this+0x390+slot*4]`, refreshes that object through `0x592d30`. This currently bounds the helper as the selector-sample-text update lane rather than a broader selector-table mutator.","objdump + local disassembly + selector-buffer correlation" 0x0059fb60,104,multiplayer_transport_callback_replace_selector_slot_name_set_request_default_profile_keys_and_publish_slot20,shell,cdecl,inferred,objdump + local disassembly,3,"Callback-root helper installed at offset `0x24` in the selector descriptor lane seeded by `0x59fc80`. It resolves the caller selector name into one slot index through `0x5951a0`, clears that selector slot from every selector-view entry through `multiplayer_transport_clear_selector_view_slot_from_all_entries` `0x5950a0`, then iterates one caller-supplied name list and re-upserts each name into that slot through `multiplayer_transport_upsert_selector_name_entry` `0x594f20` using the paired caller-side flag words. After the replacement sweep it requests the default profile-key bundle for that selector slot through `0x596fc0` and publishes callback slot `20` through `0x592fc0`.","objdump + local disassembly + callback-table install correlation + caller inspection" 0x0059fbd0,69,multiplayer_transport_callback_query_slot_built_in_profile_key_and_publish_slot28,shell,cdecl,inferred,objdump + local disassembly,3,"Callback-root helper installed at offset `0x28` in the selector descriptor lane seeded by `0x59fc80`. It resolves the caller selector name into one slot index through `0x5951a0`, forwards the caller trio into `multiplayer_transport_query_slot_built_in_profile_key_and_publish_slot28_on_success` `0x596b90`, and then publishes the same trio through `multiplayer_transport_enqueue_callback_slot28_record` `0x593200`. This currently bounds the helper as the built-in per-slot profile-key query sibling next to the selector-set replacement lane, rather than another generic selector-text path.","objdump + local disassembly + callback-table install correlation + helper correlation" +0x005a0940,4,multiplayer_gamespy_server_descriptor_queue_set_companion_dword_filter,shell,cdecl,inferred,objdump + local disassembly + caller inspection,3,"Tiny setter for one queue-family-side companion dword at `[this+0x24]`. Current grounded callers are the field-snapshot mode dispatcher `0x595a40` and the `gsi_am_rating` route-event dispatcher `0x595e10`, where mode `5` copies the transport-staged route companion dword from `[transport+0x490]` into transport field `[transport+0x54]` and then mirrors the same value into this queue-side slot. The heavier queue service path `0x5a0b40` later uses `[this+0x24]` as the alternate endpoint companion filter when matching descriptors that carry secondary-endpoint state bit `0x2`, so this is now the safest current read for the shared queue companion-dword setter rather than an opaque local store.","objdump + local disassembly + caller inspection + queue-service correlation + companion-dword-slot correlation" 0x005a0950,18,multiplayer_gamespy_server_descriptor_queue_clear_active_and_pending_lists,shell,cdecl,inferred,objdump,3,"Clears both linked lists in one compact server-descriptor queue family by forwarding the active list at `[this+0x08]` and pending list at `[this+0x14]` into the shared list-clear helper `0x5a07b0`. Current grounded caller is `multiplayer_transport_reset_am_rating_route_state`, which uses it to clear the queued-descriptor family at `[transport+0x1e7c]`.","objdump + caller inspection + queue-family correlation" 0x005a0970,48,multiplayer_gamespy_server_descriptor_queue_destroy_and_release_owned_buffer,shell,cdecl,inferred,objdump,2,"Destructor-side helper for one compact server-descriptor queue family. It releases the owned scratch buffer or stream handle at `[this+0x20]` through `0x58bc4e`, resets that slot to `-1`, and then clears the active and pending lists through the same lower list-clear helper used by `0x005a0950`. Current grounded caller is the queued-descriptor family teardown path beneath the multiplayer transport callback-table shutdown.","objdump + caller inspection + queue-family correlation" 0x005a09a0,84,multiplayer_gamespy_server_descriptor_queue_insert_with_pending_state_tag,shell,cdecl,inferred,objdump,3,"Inserts one compact server descriptor into a queue family while stamping a pending state tag into descriptor byte `[entry+0x14]`. The helper first clears transient state bits `0x4/0x8/0x10`; then its second stack argument chooses pending bit `0x4` or `0x8`, which later service code promotes into ready bits `0x1` or `0x2`. The first stack argument chooses whether insertion goes through the pending-list path at `[this+0x14]` or the active-list path at `[this+0x08]`. If the family is full it grows storage through `0x5a07c0`. Current grounded callers use pending tag `0x4` for the local field-cache family at `[transport+0x1724]` and pending tag `0x8` for the `gsi_am_rating` queued-descriptor family at `[transport+0x1e7c]`.","objdump + caller inspection + queue-state correlation" @@ -1047,7 +1193,7 @@ address,size,name,subsystem,calling_convention,prototype_status,source_tool,conf 0x0059dea0,96,multiplayer_transport_stage_registered_name_callback_payload_for_name,shell,cdecl,inferred,rizin,3,Looks up one primary registered-name entry then fans helper multiplayer_transport_stage_registered_name_callback_payload across the registered-name store through generic_callback_list_for_each using the caller secondary key plus the two payload buffers. Current grounded role is a primary-name keyed payload staging wrapper for nested callback-entry records.,rizin + llvm-objdump 0x0059df00,96,multiplayer_transport_try_resolve_registered_name_callback_payload,shell,cdecl,inferred,rizin,4,Fast resolver for one nested callback-entry payload. When the descriptor either has no selector string or matches the shared two-byte default token at 0x005e1e1c it looks up the nested callback-entry record by key from `[entry+0x134]` and if the entry is active at `[subentry+0xd8]` marks the descriptor successful and returns pointers to the staged payload blocks at `[subentry+0x80]` and `[subentry+0x98]`.,rizin + llvm-objdump 0x005934c0,30,multiplayer_transport_next_work_sequence,shell,thiscall,inferred,ghidra-headless,3,"Returns the next monotonically increasing transport work-sequence value by incrementing dword `[this+0x177c]` and clamping negative wraparound back to zero. Current grounded callers now bound this more tightly than a generic work-sequence source: the returned dword is also the shared immediate-drain context id later copied into queued work field `+0x0c`, mirrored into active opcode-record field `+0x14`, and waited on through `0x58d720` by the text-submission and callback-table registration roots.","ghidra + rizin + llvm-objdump" -0x00593650,229,multiplayer_transport_attach_callback_table_descriptor,shell,cdecl,inferred,ghidra-headless,3,"Builds one transport-side callback-table descriptor from the caller table pointers and metadata. The helper first allocates one transient work record through `multiplayer_transport_allocate_and_enqueue_work_record` `0x5934e0`, and this lane now constrains that staged metadata more tightly: it uses work-record type `0`, leaves field `+0x08` zero, duplicates one caller metadata dword into both fields `+0x0c` and `+0x18`, and carries the remaining caller callback function pointer in field `+0x10` for later replay through `multiplayer_transport_publish_callback_table_binding_result_and_release_work_record` `0x593570 -> 0x592a40`. It then installs callback vectors from `0x59f5c0` and `0x59f650`, copies the caller transport pointer into the local descriptor frame, and finishes by linking the result through `multiplayer_transport_worker_create` `0x58f2f0`. Failure unlinks the staged work record through `multiplayer_transport_remove_queued_work_record_by_pointer` `0x5933a0`. The current grounded caller is `multiplayer_transport_register_callback_table`.","ghidra + rizin + llvm-objdump + local disassembly + work-queue correlation + callback-binding-triplet correlation" +0x00593650,229,multiplayer_transport_attach_callback_table_descriptor,shell,cdecl,inferred,objdump + local disassembly,3,"Builds one transport-side callback-table descriptor from caller metadata and then links it through `multiplayer_transport_worker_create` `0x58f2f0`. The helper first allocates one transient work record through `multiplayer_transport_allocate_and_enqueue_work_record` `0x5934e0`; this lane is now tighter: it uses work-record type `0`, leaves field `+0x08` zero, duplicates the first caller metadata dword into both fields `+0x0c` and `+0x10`, and carries the second caller metadata dword in field `+0x18` for the later replay path through `multiplayer_transport_publish_callback_table_binding_result_and_release_work_record` `0x593570`. It then installs callback vectors from `0x59f5c0` and `0x59f650`, copies the caller transport pointer into the local descriptor frame, and chooses the follow-on worker callback pair `0x593610/0x593630` from transport field `[this+0x4c]`. Failure unlinks the staged work record through `multiplayer_transport_remove_queued_work_record_by_pointer` `0x5933a0`. The current grounded caller is `multiplayer_transport_register_callback_table`.","objdump + local disassembly + work-queue correlation + callback-binding-triplet correction" 0x00593d60,66,multiplayer_transport_try_submit_text_record_fastpath,shell,cdecl,inferred,ghidra-headless,3,"Attempts the fast submission path for one prepared transport text record. It allocates a type-`9` transient record through `0x005934e0`, again staging the shared transport wrapper triplet as `(drain context id +0x0c, callback fn +0x10, callback companion +0x18)`, and when that succeeds forwards the caller callback and payload through `0x0058e510` with callback shim `0x00593d00`. That shim copies the returned text into `[transport+0x04]` and, when work field `+0x10` is nonnull, re-emits one follow-on callback record through `0x00593170` using the staged callback pointer and companion plus the same drain context id. The current grounded caller is `multiplayer_transport_submit_text_record`.","ghidra + rizin + llvm-objdump + work-record-triplet correlation + local disassembly" 0x00598d50,496,multiplayer_transport_handle_registered_name_callback_bind_record_mode1,shell,cdecl,inferred,rizin,3,Owner-side wrapper for record mode 1 in the registered-name branch. It parses the mode prefix from the secondary key string at record field `+0x08` checks whether the primary name matches the local transport name at `[this+0x36c]` and either seeds one local registered-name entry through multiplayer_transport_upsert_registered_name_entry plus multiplayer_transport_set_registered_name_status_text or upserts one nested callback-entry record through multiplayer_transport_upsert_registered_name_callback_entry and emits follow-up opcode 6 or opcode 12 notifications when the target name entry is already marked dirty.,rizin + llvm-objdump 0x00598f40,255,multiplayer_transport_handle_registered_name_callback_remove_record_mode1,shell,cdecl,inferred,rizin,3,Owner-side removal wrapper for registered-name record mode 1. It resolves the primary and secondary key strings from the caller record removes the matching nested callback-entry through multiplayer_transport_remove_registered_name_callback_entry and then emits opcode 7 or opcode 12 notifications from the current registered-name owner callbacks when the target entry is dirty.,rizin + llvm-objdump diff --git a/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-forward-subgraph.dot b/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-forward-subgraph.dot new file mode 100644 index 0000000..91038c7 --- /dev/null +++ b/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-forward-subgraph.dot @@ -0,0 +1,1071 @@ +digraph shell_load { + graph [rankdir=LR, labelloc="t", labeljust="l"]; + label="Scenario Runtime Effect Service Subgraph (Depth 7, Forward Only)"; + node [shape=box, style="rounded,filled", fillcolor="#f8f8f8", color="#555555", fontname="Helvetica"]; + edge [color="#666666", fontname="Helvetica"]; + subgraph cluster_map { + label="map"; + color="#cccccc"; + "0x004010f0" [label="0x004010f0\\ncity_compute_connection_bonus_candidate_weight", fillcolor="#f8f8f8"]; + "0x00402cb0" [label="0x00402cb0\\ncity_connection_try_build_route_with_optional_direct_site_placement", fillcolor="#f8f8f8"]; + "0x00404640" [label="0x00404640\\ncity_connection_bonus_try_compact_route_builder_from_region_entry", fillcolor="#f8f8f8"]; + "0x004046a0" [label="0x004046a0\\ncity_connection_bonus_build_peer_route_candidate", fillcolor="#f8f8f8"]; + "0x00404c60" [label="0x00404c60\\ncity_connection_try_build_route_between_region_entry_pair", fillcolor="#f8f8f8"]; + "0x0040e360" [label="0x0040e360\\nplaced_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime", fillcolor="#f8f8f8"]; + "0x0040e450" [label="0x0040e450\\nplaced_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem", fillcolor="#f8f8f8"]; + "0x0040eba0" [label="0x0040eba0\\nplaced_structure_set_world_coords_and_refresh_local_runtime_side_state", fillcolor="#f8f8f8"]; + "0x0040ee10" [label="0x0040ee10\\nplaced_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon", fillcolor="#f8f8f8"]; + "0x0040ef10" [label="0x0040ef10\\nplaced_structure_finalize_creation_or_rebuild_local_runtime_state", fillcolor="#f8f8f8"]; + "0x0040f6d0" [label="0x0040f6d0\\nplaced_structure_construct_entry_from_candidate_and_world_args", fillcolor="#f8f8f8"]; + "0x0040fbe0" [label="0x0040fbe0\\nplaced_structure_endpoint_pair_has_shared_route_entry_key", fillcolor="#f8f8f8"]; + "0x0040fef0" [label="0x0040fef0\\nplaced_structure_try_emit_best_route_style_peer_link_for_candidate_class", fillcolor="#f8f8f8"]; + "0x004101e0" [label="0x004101e0\\nplaced_structure_rebuild_route_style_candidate_scores_and_peer_links", fillcolor="#f8f8f8"]; + "0x00412ca0" [label="0x00412ca0\\nworld_region_pick_commercial_profile_label_by_region_rank", fillcolor="#f8f8f8"]; + "0x004133b0" [label="0x004133b0\\nplaced_structure_collection_refresh_local_runtime_records_and_position_scalars", fillcolor="#f8f8f8"]; + "0x004134d0" [label="0x004134d0\\nplaced_structure_collection_allocate_and_construct_entry", fillcolor="#f8f8f8"]; + "0x00413580" [label="0x00413580\\nplaced_structure_collection_refresh_quarter_subset_route_style_state", fillcolor="#f8f8f8"]; + "0x00415020" [label="0x00415020\\nworld_grid_refresh_flagged_region_float_extrema_and_mean", fillcolor="#f8f8f8"]; + "0x00415f20" [label="0x00415f20\\nplaced_structure_recursive_collect_connected_component_tile_bounds", fillcolor="#f8f8f8"]; + "0x004160c0" [label="0x004160c0\\nplaced_structure_collect_connected_component_tile_bounds_with_version_gate", fillcolor="#f8f8f8"]; + "0x00416170" [label="0x00416170\\nplaced_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh", fillcolor="#f8f8f8"]; + "0x00416620" [label="0x00416620\\nplaced_structure_publish_projected_runtime_rect_globals_and_validate_side_windows", fillcolor="#f8f8f8"]; + "0x00416e20" [label="0x00416e20\\nindexed_collection_resolve_live_entry_id_by_stem_string", fillcolor="#f8f8f8"]; + "0x00416ec0" [label="0x00416ec0\\nplaced_structure_build_projected_runtime_scratch_from_candidate_and_coords", fillcolor="#f8f8f8"]; + "0x00417790" [label="0x00417790\\nmap_angle_rotate_grid_offset_pair_into_world_offset_pair", fillcolor="#f8f8f8"]; + "0x00417840" [label="0x00417840\\nplaced_structure_project_candidate_grid_extent_offset_by_rotation", fillcolor="#f8f8f8"]; + "0x00418040" [label="0x00418040\\nplaced_structure_render_local_runtime_overlay_payload_from_projected_bounds", fillcolor="#f8f8f8"]; + "0x004185a0" [label="0x004185a0\\nworld_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples", fillcolor="#f8f8f8"]; + "0x00418610" [label="0x00418610\\nworld_grid_refresh_projected_rect_sample_band_and_flag_mask", fillcolor="#f8f8f8"]; + "0x00418a60" [label="0x00418a60\\nplaced_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds", fillcolor="#f8f8f8"]; + "0x00418be0" [label="0x00418be0\\nplaced_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch", fillcolor="#f8f8f8"]; + "0x004197e0" [label="0x004197e0\\nplaced_structure_validate_projected_candidate_placement", fillcolor="#f8f8f8"]; + "0x0041e220" [label="0x0041e220\\nstructure_candidate_is_enabled_for_current_year", fillcolor="#f8f8f8"]; + "0x0041e650" [label="0x0041e650\\nstructure_candidate_query_route_style_or_local_availability_metric", fillcolor="#f8f8f8"]; + "0x0041f9b0" [label="0x0041f9b0\\nworld_region_count_structure_profiles_before_year_for_category", fillcolor="#f8f8f8"]; + "0x0041fac0" [label="0x0041fac0\\nworld_region_read_structure_profile_label_and_weight_by_index", fillcolor="#f8f8f8"]; + "0x00420030" [label="0x00420030\\ncity_connection_bonus_exists_matching_peer_site", fillcolor="#f8f8f8"]; + "0x00420280" [label="0x00420280\\ncity_connection_bonus_select_first_matching_peer_site", fillcolor="#f8f8f8"]; + "0x004207d0" [label="0x004207d0\\ncity_site_format_connection_bonus_status_label", fillcolor="#f8f8f8"]; + "0x00422900" [label="0x00422900\\nworld_region_accumulate_structure_category_totals", fillcolor="#f8f8f8"]; + "0x00422a70" [label="0x00422a70\\nworld_region_validate_and_commit_candidate_placement", fillcolor="#f8f8f8"]; + "0x00422be0" [label="0x00422be0\\nworld_region_count_placed_structures_for_category", fillcolor="#f8f8f8"]; + "0x00422ee0" [label="0x00422ee0\\nworld_region_try_place_candidate_structure", fillcolor="#f8f8f8"]; + "0x004234e0" [label="0x004234e0\\nworld_region_query_projected_structure_count_scalar_by_category", fillcolor="#f8f8f8"]; + "0x004235c0" [label="0x004235c0\\nworld_region_balance_structure_demand_and_place_candidates", fillcolor="#f8f8f8"]; + "0x0042c690" [label="0x0042c690\\nplaced_structure_rebuild_candidate_cargo_service_bitsets", fillcolor="#f8f8f8"]; + "0x0042cdf0" [label="0x0042cdf0\\nplaced_structure_refresh_candidate_service_state", fillcolor="#f8f8f8"]; + "0x00430270" [label="0x00430270\\nworld_try_place_random_structure_batch_from_compact_record", fillcolor="#f8f8f8"]; + "0x00431b20" [label="0x00431b20\\nworld_apply_compact_runtime_effect_record_to_resolved_targets [seed]", fillcolor="#ffe9a8"]; + "0x00434870" [label="0x00434870\\nscenario_state_get_selected_chairman_company_record", fillcolor="#f8f8f8"]; + "0x00434890" [label="0x00434890\\nscenario_state_set_selected_chairman_profile", fillcolor="#f8f8f8"]; + "0x004348c0" [label="0x004348c0\\nscenario_state_get_selected_chairman_profile_record", fillcolor="#f8f8f8"]; + "0x004377a0" [label="0x004377a0\\nworld_seed_default_chairman_profile_slots", fillcolor="#f8f8f8"]; + "0x00444dd0" [label="0x00444dd0\\nmap_bundle_open_reference_databases", fillcolor="#f8f8f8"]; + "0x00445de0" [label="0x00445de0\\nshell_map_file_world_bundle_coordinator", fillcolor="#f8f8f8"]; + "0x00446240" [label="0x00446240\\nworld_runtime_serialize_smp_bundle", fillcolor="#f8f8f8"]; + "0x00467c30" [label="0x00467c30\\nplaced_structure_route_link_recompute_endpoint_pair_state", fillcolor="#f8f8f8"]; + "0x00467eb0" [label="0x00467eb0\\nplaced_structure_route_link_attach_site_owner", fillcolor="#f8f8f8"]; + "0x00467f50" [label="0x00467f50\\nplaced_structure_route_link_allocate_site_pair_for_candidate_class", fillcolor="#f8f8f8"]; + "0x004682c0" [label="0x004682c0\\nplaced_structure_route_link_collection_recompute_all_endpoint_pair_state", fillcolor="#f8f8f8"]; + "0x00477820" [label="0x00477820\\nprofile_collection_count_active_chairman_records", fillcolor="#f8f8f8"]; + "0x00477860" [label="0x00477860\\nprofile_collection_get_nth_active_chairman_record", fillcolor="#f8f8f8"]; + "0x0047d440" [label="0x0047d440\\nworld_conditionally_seed_named_starting_railroad_companies", fillcolor="#f8f8f8"]; + "0x0047dd10" [label="0x0047dd10\\nplaced_structure_remove_site_id_from_proximity_bucket_lists", fillcolor="#f8f8f8"]; + "0x0047e240" [label="0x0047e240\\nplaced_structure_query_candidate_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0047e330" [label="0x0047e330\\nplaced_structure_count_candidates_with_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0047efe0" [label="0x0047efe0\\nplaced_structure_query_linked_company_id", fillcolor="#f8f8f8"]; + "0x0047fdb0" [label="0x0047fdb0\\nplaced_structure_append_nearby_transit_site_distance_bucket_entry", fillcolor="#f8f8f8"]; + "0x004801a0" [label="0x004801a0\\nplaced_structure_is_linked_transit_site_reachable_from_company_route_anchor", fillcolor="#f8f8f8"]; + "0x00480210" [label="0x00480210\\nplaced_structure_construct_linked_site_record_from_anchor_and_coords", fillcolor="#f8f8f8"]; + "0x00480bb0" [label="0x00480bb0\\nplaced_structure_refresh_linked_site_display_name_and_route_anchor", fillcolor="#f8f8f8"]; + "0x00481390" [label="0x00481390\\nplaced_structure_collection_allocate_and_construct_linked_site_record", fillcolor="#f8f8f8"]; + "0x00481480" [label="0x00481480\\nplaced_structure_collection_append_site_into_all_proximity_bucket_lists", fillcolor="#f8f8f8"]; + "0x004814c0" [label="0x004814c0\\nplaced_structure_collection_remove_site_id_from_all_proximity_bucket_lists", fillcolor="#f8f8f8"]; + "0x00493cf0" [label="0x00493cf0\\nroute_entry_collection_create_endpoint_entry_from_coords_and_policy", fillcolor="#f8f8f8"]; + "0x00494cb0" [label="0x00494cb0\\nroute_entry_collection_try_find_route_entry_covering_point_window", fillcolor="#f8f8f8"]; + "0x00494e40" [label="0x00494e40\\naux_route_entry_tracker_reset", fillcolor="#f8f8f8"]; + "0x00494e90" [label="0x00494e90\\naux_route_entry_tracker_seed_owner_entry_id", fillcolor="#f8f8f8"]; + "0x00494eb0" [label="0x00494eb0\\naux_route_entry_tracker_adjust_refcount", fillcolor="#f8f8f8"]; + "0x00494f00" [label="0x00494f00\\naux_route_entry_tracker_merge_or_bind_endpoint_entry", fillcolor="#f8f8f8"]; + "0x004952f0" [label="0x004952f0\\nmath_compute_quadrant_adjusted_heading_angle_from_xy_pair", fillcolor="#f8f8f8"]; + "0x004953c0" [label="0x004953c0\\nmath_normalize_subtracted_angle_delta_and_report_wrap", fillcolor="#f8f8f8"]; + "0x004955b0" [label="0x004955b0\\nroute_entry_collection_map_track_lay_mode_to_endpoint_policy_byte", fillcolor="#f8f8f8"]; + "0x0049bd40" [label="0x0049bd40\\nroute_entry_collection_run_initial_candidate_path_sweep", fillcolor="#f8f8f8"]; + "0x0049c900" [label="0x0049c900\\nroute_entry_collection_try_extend_search_frontier_toward_target_coords", fillcolor="#f8f8f8"]; + "0x0049d380" [label="0x0049d380\\nroute_entry_collection_search_path_between_entry_or_coord_endpoints", fillcolor="#f8f8f8"]; + "0x004a01a0" [label="0x004a01a0\\nroute_entry_collection_try_build_path_between_optional_endpoint_entries", fillcolor="#f8f8f8"]; + "0x004a42b0" [label="0x004a42b0\\naux_route_entry_tracker_collection_allocate_entry", fillcolor="#f8f8f8"]; + "0x004a4340" [label="0x004a4340\\naux_route_entry_tracker_collection_adjust_refcount_or_destroy", fillcolor="#f8f8f8"]; + "0x004a45f0" [label="0x004a45f0\\naux_route_entry_tracker_collection_refresh_route_entry_group_membership", fillcolor="#f8f8f8"]; + "0x004a5280" [label="0x004a5280\\naux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search", fillcolor="#f8f8f8"]; + "0x004a5900" [label="0x004a5900\\naux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk", fillcolor="#f8f8f8"]; + "0x004a65b0" [label="0x004a65b0\\naux_route_entry_tracker_dispatch_route_entry_pair_metric_query", fillcolor="#f8f8f8"]; + "0x004a6630" [label="0x004a6630\\naux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks", fillcolor="#f8f8f8"]; + "0x004b99c0" [label="0x004b99c0\\nstructure_candidate_collection_get_nth_active_candidate_id", fillcolor="#f8f8f8"]; + "0x004cd680" [label="0x004cd680\\nmap_editor_locomotive_availability_panel_construct", fillcolor="#f8f8f8"]; + "0x004cf0d0" [label="0x004cf0d0\\nmap_editor_locomotive_availability_panel_handle_message", fillcolor="#f8f8f8"]; + "0x004d0420" [label="0x004d0420\\nmap_editor_city_count_stats_report", fillcolor="#f8f8f8"]; + "0x004d30a0" [label="0x004d30a0\\nmap_editor_city_count_stats_panel_construct", fillcolor="#f8f8f8"]; + } + subgraph cluster_scenario { + label="scenario"; + color="#cccccc"; + "0x0042d700" [label="0x0042d700\\nscenario_event_query_standalone_condition_row_list_class_and_modifier_flags", fillcolor="#f8f8f8"]; + "0x0042d740" [label="0x0042d740\\nscenario_event_query_grouped_effect_row_list_type_flags", fillcolor="#f8f8f8"]; + "0x0042db20" [label="0x0042db20\\nscenario_event_refresh_runtime_record_from_packed_state", fillcolor="#f8f8f8"]; + "0x0042df30" [label="0x0042df30\\nscenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback", fillcolor="#f8f8f8"]; + "0x0042df70" [label="0x0042df70\\nscenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback", fillcolor="#f8f8f8"]; + "0x0042dfb0" [label="0x0042dfb0\\nscenario_event_condition_row_list_has_class_bit2_or_type63_fallback", fillcolor="#f8f8f8"]; + "0x0042dff0" [label="0x0042dff0\\nscenario_event_condition_row_list_has_any_class_bit012_or_special_fallback", fillcolor="#f8f8f8"]; + "0x0042e050" [label="0x0042e050\\nscenario_event_clone_runtime_record_deep_copy", fillcolor="#f8f8f8"]; + "0x00430b50" [label="0x00430b50\\nscenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets [seed]", fillcolor="#ffe9a8"]; + "0x004323a0" [label="0x004323a0\\nscenario_runtime_effect_record_service_and_dispatch_linked_compact_effects [seed]", fillcolor="#ffe9a8"]; + "0x00432ea0" [label="0x00432ea0\\nscenario_event_collection_allocate_runtime_effect_record_from_compact_payload [seed]", fillcolor="#ffe9a8"]; + "0x00432f40" [label="0x00432f40\\nscenario_event_collection_service_runtime_effect_records_for_trigger_kind", fillcolor="#f8f8f8"]; + "0x00433130" [label="0x00433130\\nscenario_event_collection_refresh_runtime_records_from_packed_state", fillcolor="#f8f8f8"]; + } + subgraph cluster_shell { + label="shell"; + color="#cccccc"; + "0x00425880" [label="0x00425880\\ncompany_compute_negative_cash_balance_interest_rate", fillcolor="#f8f8f8"]; + "0x004258c0" [label="0x004258c0\\ncompany_compute_positive_cash_balance_interest_rate", fillcolor="#f8f8f8"]; + "0x004333f0" [label="0x004333f0\\nshell_setup_build_file_list_records_from_current_root_and_pattern", fillcolor="#f8f8f8"]; + "0x004336a0" [label="0x004336a0\\nshell_setup_file_list_construct_and_scan_dataset", fillcolor="#f8f8f8"]; + "0x00434050" [label="0x00434050\\nshell_has_auxiliary_preview_owner", fillcolor="#f8f8f8"]; + "0x00469720" [label="0x00469720\\nmultiplayer_preview_dataset_service_frame", fillcolor="#f8f8f8"]; + "0x0047d120" [label="0x0047d120\\nstart_new_company_dialog_commit_create_company", fillcolor="#f8f8f8"]; + "0x00482160" [label="0x00482160\\nshell_state_service_active_mode_frame", fillcolor="#f8f8f8"]; + "0x004839b0" [label="0x004839b0\\nshell_setup_query_file_list_uses_map_extension_pattern", fillcolor="#f8f8f8"]; + "0x004839e0" [label="0x004839e0\\nshell_setup_query_file_list_root_dir_name", fillcolor="#f8f8f8"]; + "0x00484910" [label="0x00484910\\nshell_save_graphics_config", fillcolor="#f8f8f8"]; + "0x004b9a20" [label="0x004b9a20\\nshell_building_detail_refresh_flagged_service_capability_rows", fillcolor="#f8f8f8"]; + "0x004b9e10" [label="0x004b9e10\\nshell_building_detail_submit_aux_owner_subject_sync_request", fillcolor="#f8f8f8"]; + "0x004ba3d0" [label="0x004ba3d0\\nshell_building_detail_refresh_subject_cargo_and_service_rows", fillcolor="#f8f8f8"]; + "0x004bad20" [label="0x004bad20\\nshell_building_detail_refresh_subject_pair_value_rows", fillcolor="#f8f8f8"]; + "0x004bb9e0" [label="0x004bb9e0\\nshell_building_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x004bfb30" [label="0x004bfb30\\nshell_format_company_financial_summary_card", fillcolor="#f8f8f8"]; + "0x004c0160" [label="0x004c0160\\nshell_format_company_stock_data_panel", fillcolor="#f8f8f8"]; + "0x004c1610" [label="0x004c1610\\nshell_company_detail_bind_bond_row_band_for_active_panel", fillcolor="#f8f8f8"]; + "0x004c1730" [label="0x004c1730\\nshell_company_detail_render_financial_history_panel", fillcolor="#f8f8f8"]; + "0x004c1ab0" [label="0x004c1ab0\\nshell_company_detail_render_company_summary_card", fillcolor="#f8f8f8"]; + "0x004c1b60" [label="0x004c1b60\\nshell_company_detail_refresh_selected_territory_access_summary", fillcolor="#f8f8f8"]; + "0x004c1d30" [label="0x004c1d30\\nshell_company_detail_select_territory_access_row", fillcolor="#f8f8f8"]; + "0x004c1d70" [label="0x004c1d70\\nshell_company_detail_render_territory_access_row", fillcolor="#f8f8f8"]; + "0x004c1ec0" [label="0x004c1ec0\\nshell_company_detail_render_bond_maturity_and_repay_panel", fillcolor="#f8f8f8"]; + "0x004c22e0" [label="0x004c22e0\\nshell_company_detail_sync_selected_territory_from_picker", fillcolor="#f8f8f8"]; + "0x004c23a0" [label="0x004c23a0\\nshell_company_detail_render_debt_credit_and_rate_summary_panel", fillcolor="#f8f8f8"]; + "0x004c2720" [label="0x004c2720\\nshell_company_detail_render_share_value_and_dividend_summary_panel", fillcolor="#f8f8f8"]; + "0x004c2ca0" [label="0x004c2ca0\\nshell_company_detail_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004c3560" [label="0x004c3560\\nshell_company_detail_render_issue_bond_offer_dialog", fillcolor="#f8f8f8"]; + "0x004c3890" [label="0x004c3890\\nshell_company_detail_issue_bond_offer_flow", fillcolor="#f8f8f8"]; + "0x004c3f30" [label="0x004c3f30\\nshell_company_detail_issue_stock_offer_flow", fillcolor="#f8f8f8"]; + "0x004c4300" [label="0x004c4300\\nshell_company_detail_render_stock_buyback_offer_dialog", fillcolor="#f8f8f8"]; + "0x004c46d0" [label="0x004c46d0\\nshell_company_detail_buyback_stock_flow", fillcolor="#f8f8f8"]; + "0x004c4c70" [label="0x004c4c70\\nshell_company_detail_setup_dividend_rate_adjust_controls", fillcolor="#f8f8f8"]; + "0x004c4e30" [label="0x004c4e30\\nshell_company_detail_render_change_dividend_rate_dialog", fillcolor="#f8f8f8"]; + "0x004c5140" [label="0x004c5140\\nshell_company_detail_handle_change_dividend_rate_dialog_message", fillcolor="#f8f8f8"]; + "0x004c5360" [label="0x004c5360\\nshell_company_detail_change_dividend_rate_flow", fillcolor="#f8f8f8"]; + "0x004c5540" [label="0x004c5540\\nshell_company_detail_window_construct", fillcolor="#f8f8f8"]; + "0x004c56a0" [label="0x004c56a0\\nshell_company_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x004c5a0e" [label="0x004c5a0e\\nshell_company_detail_resign_chairmanship_flow", fillcolor="#f8f8f8"]; + "0x004c5b99" [label="0x004c5b99\\nshell_company_detail_bankruptcy_flow", fillcolor="#f8f8f8"]; + "0x004c5fc9" [label="0x004c5fc9\\nshell_company_detail_buy_territory_access_rights_flow", fillcolor="#f8f8f8"]; + "0x004c98a0" [label="0x004c98a0\\nshell_open_custom_modal_dialog_with_callbacks", fillcolor="#f8f8f8"]; + "0x004d4500" [label="0x004d4500\\nshell_ensure_editor_panel_window", fillcolor="#f8f8f8"]; + "0x004d57c0" [label="0x004d57c0\\nshell_event_conditions_window_construct", fillcolor="#f8f8f8"]; + "0x004d77b0" [label="0x004d77b0\\nshell_event_conditions_window_refresh_grouped_effect_summary_band_affordances", fillcolor="#f8f8f8"]; + "0x004d7ef0" [label="0x004d7ef0\\nshell_event_effects_window_refresh_event_selector_list_and_selected_event_id", fillcolor="#f8f8f8"]; + "0x004d8120" [label="0x004d8120\\nshell_event_conditions_window_refresh_condition_row_list_panel", fillcolor="#f8f8f8"]; + "0x004d88f0" [label="0x004d88f0\\nshell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel", fillcolor="#f8f8f8"]; + "0x004d8d50" [label="0x004d8d50\\nshell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch", fillcolor="#f8f8f8"]; + "0x004d8ea0" [label="0x004d8ea0\\nshell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change", fillcolor="#f8f8f8"]; + "0x004d9360" [label="0x004d9360\\nshell_event_conditions_window_remove_selected_event_and_refresh_selector", fillcolor="#f8f8f8"]; + "0x004d9390" [label="0x004d9390\\nshell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows", fillcolor="#f8f8f8"]; + "0x004d9970" [label="0x004d9970\\nshell_event_conditions_window_refresh_condition_class_summary_and_group_rows", fillcolor="#f8f8f8"]; + "0x004d9d10" [label="0x004d9d10\\nshell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance", fillcolor="#f8f8f8"]; + "0x004d9dc0" [label="0x004d9dc0\\nshell_open_event_conditions_modal_and_return_result", fillcolor="#f8f8f8"]; + "0x004d9e40" [label="0x004d9e40\\nshell_open_event_effects_modal_and_return_result", fillcolor="#f8f8f8"]; + "0x004d9ed0" [label="0x004d9ed0\\nshell_event_conditions_window_remove_selected_condition_row", fillcolor="#f8f8f8"]; + "0x004d9f50" [label="0x004d9f50\\nshell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels", fillcolor="#f8f8f8"]; + "0x004da0f0" [label="0x004da0f0\\nshell_event_conditions_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004da640" [label="0x004da640\\nshell_event_conditions_window_append_default_condition_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da700" [label="0x004da700\\nshell_event_conditions_window_edit_selected_condition_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da7c0" [label="0x004da7c0\\nshell_event_effects_window_append_grouped_effect_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da860" [label="0x004da860\\nshell_event_effects_window_edit_selected_grouped_effect_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da920" [label="0x004da920\\nshell_event_effects_window_remove_selected_grouped_effect_row", fillcolor="#f8f8f8"]; + "0x004da9a0" [label="0x004da9a0\\nshell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event", fillcolor="#f8f8f8"]; + "0x004dab60" [label="0x004dab60\\nshell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip", fillcolor="#f8f8f8"]; + "0x004daf40" [label="0x004daf40\\nshell_event_conditions_window_reset_selected_event_summary_placeholders", fillcolor="#f8f8f8"]; + "0x004db120" [label="0x004db120\\nshell_event_conditions_window_refresh_selected_event_strip_and_navigation", fillcolor="#f8f8f8"]; + "0x004db520" [label="0x004db520\\nshell_event_conditions_window_select_previous_event_and_refresh", fillcolor="#f8f8f8"]; + "0x004db5e0" [label="0x004db5e0\\nshell_event_conditions_window_select_next_event_and_refresh", fillcolor="#f8f8f8"]; + "0x004db6a0" [label="0x004db6a0\\nshell_event_conditions_window_set_selected_event_id_and_refresh_if_open", fillcolor="#f8f8f8"]; + "0x004db6f0" [label="0x004db6f0\\nshell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection", fillcolor="#f8f8f8"]; + "0x004db8b0" [label="0x004db8b0\\nshell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal", fillcolor="#f8f8f8"]; + "0x004dba90" [label="0x004dba90\\nshell_event_conditions_window_rename_selected_event_via_name_modal", fillcolor="#f8f8f8"]; + "0x004dbb80" [label="0x004dbb80\\nshell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions", fillcolor="#f8f8f8"]; + "0x004dbf93" [label="0x004dbf93\\nshell_event_conditions_window_select_grouped_effect_summary_band_and_refresh", fillcolor="#f8f8f8"]; + "0x004dbfca" [label="0x004dbfca\\nshell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh", fillcolor="#f8f8f8"]; + "0x004dd010" [label="0x004dd010\\nshell_file_request_dialog_collect_target_path", fillcolor="#f8f8f8"]; + "0x004ddbd0" [label="0x004ddbd0\\nshell_detail_panel_transition_manager", fillcolor="#f8f8f8"]; + "0x004e5130" [label="0x004e5130\\nshell_load_screen_render_company_stock_data_panel", fillcolor="#f8f8f8"]; + "0x004e51ea" [label="0x004e51ea\\nshell_load_screen_render_game_status_briefing_panel", fillcolor="#f8f8f8"]; + "0x004e5300" [label="0x004e5300\\nshell_load_screen_render_player_detail_stock_holdings_panel", fillcolor="#f8f8f8"]; + "0x004e5a80" [label="0x004e5a80\\nshell_render_company_overview_panel_header_and_optional_change_affordance", fillcolor="#f8f8f8"]; + "0x004e5cf0" [label="0x004e5cf0\\nshell_format_company_governance_and_economy_status_panel", fillcolor="#f8f8f8"]; + "0x004e68e0" [label="0x004e68e0\\nshell_load_screen_render_company_list_panel", fillcolor="#f8f8f8"]; + "0x004e6ef0" [label="0x004e6ef0\\nshell_load_screen_render_player_list_panel", fillcolor="#f8f8f8"]; + "0x004e7670" [label="0x004e7670\\nshell_load_screen_render_company_train_list_panel", fillcolor="#f8f8f8"]; + "0x004e8270" [label="0x004e8270\\nshell_load_screen_render_company_industry_list_panel", fillcolor="#f8f8f8"]; + "0x004e8bb0" [label="0x004e8bb0\\nshell_load_screen_render_company_station_list_panel", fillcolor="#f8f8f8"]; + "0x004e9460" [label="0x004e9460\\nshell_load_screen_render_map_cargo_list_panel", fillcolor="#f8f8f8"]; + "0x004e9b20" [label="0x004e9b20\\nshell_load_screen_render_company_report_history_panel", fillcolor="#f8f8f8"]; + "0x004ea060" [label="0x004ea060\\nshell_load_screen_render_active_page_panel", fillcolor="#f8f8f8"]; + "0x004eb890" [label="0x004eb890\\nshell_present_merger_vote_outcome_dialog", fillcolor="#f8f8f8"]; + "0x004ebd10" [label="0x004ebd10\\nshell_resolve_merger_vote_and_commit_outcome", fillcolor="#f8f8f8"]; + "0x004ec640" [label="0x004ec640\\nshell_company_detail_attempt_merger_flow", fillcolor="#f8f8f8"]; + "0x004ee0e0" [label="0x004ee0e0\\nmultiplayer_open_staged_text_entry_dialog", fillcolor="#f8f8f8"]; + "0x00508550" [label="0x00508550\\nstation_place_format_selected_site_summary", fillcolor="#f8f8f8"]; + "0x00508bb0" [label="0x00508bb0\\nstation_place_world_surface_sync_and_dispatch", fillcolor="#f8f8f8"]; + "0x0050c500" [label="0x0050c500\\nshell_present_chairmanship_takeover_vote_outcome_dialog", fillcolor="#f8f8f8"]; + "0x0050c940" [label="0x0050c940\\nshell_resolve_chairmanship_takeover_vote_and_commit_outcome", fillcolor="#f8f8f8"]; + "0x0050ccc0" [label="0x0050ccc0\\nshell_company_detail_attempt_chairmanship_takeover_flow", fillcolor="#f8f8f8"]; + "0x00513130" [label="0x00513130\\nshell_trainbuy_window_query_selected_train_id", fillcolor="#f8f8f8"]; + "0x00516d00" [label="0x00516d00\\ntutorial_validate_train_route_station_indicator_step", fillcolor="#f8f8f8"]; + "0x0051c920" [label="0x0051c920\\nlocalization_lookup_display_label_by_stem_or_fallback", fillcolor="#f8f8f8"]; + "0x0053f9c0" [label="0x0053f9c0\\nshell_window_register_child_control_sorted_by_priority_and_optional_tag", fillcolor="#f8f8f8"]; + "0x0053fa50" [label="0x0053fa50\\nshell_window_bind_resource_and_initialize_child_control_links", fillcolor="#f8f8f8"]; + "0x00540a47" [label="0x00540a47\\nshell_control_refresh_matching_dynamic_text_payload", fillcolor="#f8f8f8"]; + "0x0054f710" [label="0x0054f710\\nshell_queue_callout_segment_marker", fillcolor="#f8f8f8"]; + "0x005519f0" [label="0x005519f0\\nshell_publish_text_callout_presentation", fillcolor="#f8f8f8"]; + "0x00552900" [label="0x00552900\\nshell_queue_projected_world_anchor_quad", fillcolor="#f8f8f8"]; + "0x00558130" [label="0x00558130\\nshell_child_control_set_owner_resolve_caption_and_refresh", fillcolor="#f8f8f8"]; + "0x005639d2" [label="0x005639d2\\nshell_control_release_dynamic_text_payload", fillcolor="#f8f8f8"]; + } + subgraph cluster_simulation { + label="simulation"; + color="#cccccc"; + "0x004014b0" [label="0x004014b0\\ncompany_try_buy_unowned_industry_near_city_and_publish_news", fillcolor="#f8f8f8"]; + "0x00401860" [label="0x00401860\\ncompany_query_cached_linked_transit_route_anchor_entry_id", fillcolor="#f8f8f8"]; + "0x004019e0" [label="0x004019e0\\ncompany_service_periodic_city_connection_finance_and_linked_transit_lanes", fillcolor="#f8f8f8"]; + "0x00401c50" [label="0x00401c50\\ncompany_evaluate_annual_finance_policy_and_publish_news", fillcolor="#f8f8f8"]; + "0x00404ce0" [label="0x00404ce0\\nsimulation_try_select_and_publish_company_start_or_city_connection_news", fillcolor="#f8f8f8"]; + "0x00405920" [label="0x00405920\\ncompany_query_min_linked_site_distance_to_xy", fillcolor="#f8f8f8"]; + "0x00406050" [label="0x00406050\\ncompany_evaluate_and_publish_city_connection_bonus_news", fillcolor="#f8f8f8"]; + "0x004078a0" [label="0x004078a0\\ncompany_select_preferred_available_locomotive_id", fillcolor="#f8f8f8"]; + "0x00407bd0" [label="0x00407bd0\\ncompany_rebuild_linked_transit_autoroute_site_score_cache", fillcolor="#f8f8f8"]; + "0x00408280" [label="0x00408280\\ncompany_select_best_owned_linked_transit_site_by_autoroute_score", fillcolor="#f8f8f8"]; + "0x00408380" [label="0x00408380\\ncompany_build_linked_transit_autoroute_entry", fillcolor="#f8f8f8"]; + "0x00408f70" [label="0x00408f70\\ncompany_compute_owned_linked_transit_site_score_total", fillcolor="#f8f8f8"]; + "0x00409300" [label="0x00409300\\ncompany_publish_train_upgrade_news", fillcolor="#f8f8f8"]; + "0x004093d0" [label="0x004093d0\\ncompany_rebuild_linked_transit_site_peer_cache", fillcolor="#f8f8f8"]; + "0x00409770" [label="0x00409770\\ntrain_try_append_linked_transit_autoroute_entry", fillcolor="#f8f8f8"]; + "0x00409830" [label="0x00409830\\ncompany_try_add_linked_transit_train_and_publish_news", fillcolor="#f8f8f8"]; + "0x00409950" [label="0x00409950\\ncompany_balance_linked_transit_train_roster", fillcolor="#f8f8f8"]; + "0x0040a590" [label="0x0040a590\\nsimulation_service_periodic_boundary_work", fillcolor="#f8f8f8"]; + "0x0041d550" [label="0x0041d550\\nlocomotive_era_and_engine_type_pass_company_policy_gate", fillcolor="#f8f8f8"]; + "0x00423d70" [label="0x00423d70\\ncompany_repay_bond_slot_and_compact_debt_table", fillcolor="#f8f8f8"]; + "0x00423e40" [label="0x00423e40\\ncompany_compute_weighted_average_bond_interest_rate", fillcolor="#f8f8f8"]; + "0x00423eb0" [label="0x00423eb0\\ncompany_query_cached_share_price_scalar", fillcolor="#f8f8f8"]; + "0x00423ec0" [label="0x00423ec0\\ncompany_adjust_available_track_laying_capacity_with_floor_zero", fillcolor="#f8f8f8"]; + "0x00424010" [label="0x00424010\\ncompany_has_territory_access_rights", fillcolor="#f8f8f8"]; + "0x00424030" [label="0x00424030\\ncompany_set_territory_access_rights_byte", fillcolor="#f8f8f8"]; + "0x004240a0" [label="0x004240a0\\ncompany_query_available_track_laying_capacity_or_unlimited", fillcolor="#f8f8f8"]; + "0x00424580" [label="0x00424580\\ncompany_compute_prime_rate_from_issue39_scenario_baseline", fillcolor="#f8f8f8"]; + "0x004246b0" [label="0x004246b0\\ncompany_compute_five_year_weighted_shareholder_return", fillcolor="#f8f8f8"]; + "0x004248d0" [label="0x004248d0\\ncompany_compute_cached_recent_per_share_performance_subscore", fillcolor="#f8f8f8"]; + "0x00424fd0" [label="0x00424fd0\\ncompany_compute_public_support_adjusted_share_price_scalar", fillcolor="#f8f8f8"]; + "0x00425320" [label="0x00425320\\ncompany_compute_connection_bonus_value_ladder", fillcolor="#f8f8f8"]; + "0x00425a90" [label="0x00425a90\\ncompany_declare_bankruptcy_and_halve_bond_debt", fillcolor="#f8f8f8"]; + "0x004261b0" [label="0x004261b0\\ncompany_count_unassigned_shares_after_active_chairman_holdings", fillcolor="#f8f8f8"]; + "0x00426260" [label="0x00426260\\ncompany_compute_board_approved_dividend_rate_ceiling", fillcolor="#f8f8f8"]; + "0x004264c0" [label="0x004264c0\\ncompany_count_owned_trains", fillcolor="#f8f8f8"]; + "0x00426590" [label="0x00426590\\ncompany_count_linked_transit_sites", fillcolor="#f8f8f8"]; + "0x00426d60" [label="0x00426d60\\ncompany_deactivate_and_clear_chairman_share_links", fillcolor="#f8f8f8"]; + "0x00426ef0" [label="0x00426ef0\\ncompany_get_linked_chairman_profile_record", fillcolor="#f8f8f8"]; + "0x004273c0" [label="0x004273c0\\ncompany_repurchase_public_shares_and_reduce_capital", fillcolor="#f8f8f8"]; + "0x00427450" [label="0x00427450\\ncompany_issue_public_shares_and_raise_capital", fillcolor="#f8f8f8"]; + "0x00427540" [label="0x00427540\\ncompany_compute_bond_interest_rate_quote", fillcolor="#f8f8f8"]; + "0x00427590" [label="0x00427590\\ncompany_connection_bonus_lane_is_unlocked", fillcolor="#f8f8f8"]; + "0x004275c0" [label="0x004275c0\\ncompany_issue_bond_and_record_terms", fillcolor="#f8f8f8"]; + "0x00428a10" [label="0x00428a10\\ncompany_clear_selected_chairman_if_current_profile", fillcolor="#f8f8f8"]; + "0x00429a50" [label="0x00429a50\\ncompany_collection_count_active_companies", fillcolor="#f8f8f8"]; + "0x00429c70" [label="0x00429c70\\ncompany_read_derived_financial_report_metric_slot", fillcolor="#f8f8f8"]; + "0x0042a040" [label="0x0042a040\\ncompany_add_delta_into_stat_series_and_current_slot", fillcolor="#f8f8f8"]; + "0x0042a080" [label="0x0042a080\\ncompany_add_delta_into_stat_series_current_slot_and_optional_cash_totals", fillcolor="#f8f8f8"]; + "0x0042a0e0" [label="0x0042a0e0\\ncompany_query_highest_coupon_bond_slot_index", fillcolor="#f8f8f8"]; + "0x0042a2e0" [label="0x0042a2e0\\ncompany_read_control_transfer_metric_slot", fillcolor="#f8f8f8"]; + "0x0042a5d0" [label="0x0042a5d0\\ncompany_read_year_or_control_transfer_metric_value", fillcolor="#f8f8f8"]; + "0x00436590" [label="0x00436590\\nscenario_state_compute_issue_opinion_multiplier", fillcolor="#f8f8f8"]; + "0x00436710" [label="0x00436710\\nscenario_state_sum_issue_opinion_terms_raw", fillcolor="#f8f8f8"]; + "0x00461cd0" [label="0x00461cd0\\nlocomotive_collection_select_best_era_matched_non_electric_fallback_id", fillcolor="#f8f8f8"]; + "0x004768c0" [label="0x004768c0\\nchairman_profile_owns_all_company_shares", fillcolor="#f8f8f8"]; + "0x00482d10" [label="0x00482d10\\nruntime_query_cached_local_exe_version_float", fillcolor="#f8f8f8"]; + "0x00482d80" [label="0x00482d80\\nruntime_query_cached_local_exe_version_string", fillcolor="#f8f8f8"]; + "0x00482e00" [label="0x00482e00\\nruntime_query_hundredths_scaled_build_version", fillcolor="#f8f8f8"]; + "0x004b2c10" [label="0x004b2c10\\ntrain_route_list_validate_reachability_and_station_pair", fillcolor="#f8f8f8"]; + "0x004b3160" [label="0x004b3160\\ntrain_route_list_insert_staged_entry_at_index", fillcolor="#f8f8f8"]; + "0x004e39e0" [label="0x004e39e0\\ncompany_query_display_year_or_current_year", fillcolor="#f8f8f8"]; + "0x00517cf0" [label="0x00517cf0\\nindexed_collection_slot_count", fillcolor="#f8f8f8"]; + "0x00518140" [label="0x00518140\\nindexed_collection_resolve_live_entry_by_id", fillcolor="#f8f8f8"]; + "0x00518380" [label="0x00518380\\nindexed_collection_get_nth_live_entry_id", fillcolor="#f8f8f8"]; + } + subgraph cluster_support { + label="support"; + color="#cccccc"; + "0x0051db80" [label="0x0051db80\\nmath_measure_float_xy_pair_distance", fillcolor="#f8f8f8"]; + "0x005a152e" [label="0x005a152e\\nmath_abs_double_with_crt_special_case_handling", fillcolor="#f8f8f8"]; + } + "0x004010f0" -> "0x00406050"; + "0x004010f0" -> "0x00424010"; + "0x004014b0" -> "0x004019e0"; + "0x004014b0" -> "0x00426590"; + "0x004014b0" -> "0x0051c920"; + "0x00401860" -> "0x004801a0"; + "0x004019e0" -> "0x004014b0"; + "0x004019e0" -> "0x00401c50"; + "0x004019e0" -> "0x00404ce0"; + "0x004019e0" -> "0x00406050"; + "0x004019e0" -> "0x004078a0"; + "0x004019e0" -> "0x00407bd0"; + "0x004019e0" -> "0x00409300"; + "0x004019e0" -> "0x004093d0"; + "0x004019e0" -> "0x00409830"; + "0x004019e0" -> "0x00409950"; + "0x004019e0" -> "0x0041d550"; + "0x004019e0" -> "0x0049bd40"; + "0x00401c50" -> "0x004019e0"; + "0x00401c50" -> "0x00423d70"; + "0x00401c50" -> "0x00424fd0"; + "0x00401c50" -> "0x00425a90"; + "0x00401c50" -> "0x004261b0"; + "0x00401c50" -> "0x00426260"; + "0x00401c50" -> "0x004273c0"; + "0x00401c50" -> "0x00427450"; + "0x00401c50" -> "0x004275c0"; + "0x00401c50" -> "0x0042a0e0"; + "0x00401c50" -> "0x0042a5d0"; + "0x00402cb0" -> "0x00404640"; + "0x00402cb0" -> "0x004046a0"; + "0x00402cb0" -> "0x00404c60"; + "0x00402cb0" -> "0x00404ce0"; + "0x00402cb0" -> "0x0040ef10"; + "0x00402cb0" -> "0x004134d0"; + "0x00402cb0" -> "0x00417840"; + "0x00402cb0" -> "0x004197e0"; + "0x00402cb0" -> "0x00482e00"; + "0x00402cb0" -> "0x004a01a0"; + "0x00404640" -> "0x00402cb0"; + "0x00404640" -> "0x004046a0"; + "0x004046a0" -> "0x00402cb0"; + "0x004046a0" -> "0x00404640"; + "0x004046a0" -> "0x00406050"; + "0x004046a0" -> "0x00420280"; + "0x00404c60" -> "0x00402cb0"; + "0x00404c60" -> "0x00404ce0"; + "0x00404ce0" -> "0x004010f0"; + "0x00404ce0" -> "0x00404c60"; + "0x00404ce0" -> "0x00406050"; + "0x00404ce0" -> "0x00420030"; + "0x00404ce0" -> "0x00424010"; + "0x00404ce0" -> "0x0042a5d0"; + "0x00405920" -> "0x00406050"; + "0x00405920" -> "0x0047efe0"; + "0x00406050" -> "0x004010f0"; + "0x00406050" -> "0x004046a0"; + "0x00406050" -> "0x00405920"; + "0x00406050" -> "0x00425320"; + "0x00406050" -> "0x00426590"; + "0x00406050" -> "0x00426ef0"; + "0x00406050" -> "0x00427590"; + "0x00406050" -> "0x0042a5d0"; + "0x004078a0" -> "0x004019e0"; + "0x004078a0" -> "0x00409300"; + "0x004078a0" -> "0x00409830"; + "0x004078a0" -> "0x0041d550"; + "0x004078a0" -> "0x00461cd0"; + "0x00407bd0" -> "0x0047e330"; + "0x00407bd0" -> "0x004a65b0"; + "0x00408280" -> "0x00408380"; + "0x00408380" -> "0x00408280"; + "0x00408380" -> "0x00408f70"; + "0x00408380" -> "0x00409770"; + "0x00408f70" -> "0x00409950"; + "0x00409300" -> "0x004078a0"; + "0x00409300" -> "0x00409950"; + "0x004093d0" -> "0x00405920"; + "0x004093d0" -> "0x00407bd0"; + "0x004093d0" -> "0x0047efe0"; + "0x004093d0" -> "0x004801a0"; + "0x004093d0" -> "0x004a6630"; + "0x00409770" -> "0x00408380"; + "0x00409770" -> "0x004b3160"; + "0x00409830" -> "0x004078a0"; + "0x00409830" -> "0x00408380"; + "0x00409830" -> "0x00409950"; + "0x00409830" -> "0x004b3160"; + "0x00409950" -> "0x00408f70"; + "0x00409950" -> "0x00409300"; + "0x00409950" -> "0x00409830"; + "0x00409950" -> "0x004264c0"; + "0x00409950" -> "0x00426590"; + "0x0040a590" -> "0x00413580"; + "0x0040a590" -> "0x00445de0"; + "0x0040e360" -> "0x0040eba0"; + "0x0040e360" -> "0x0040ee10"; + "0x0040e450" -> "0x004133b0"; + "0x0040e450" -> "0x00416e20"; + "0x0040e450" -> "0x00418a60"; + "0x0040eba0" -> "0x0040e360"; + "0x0040eba0" -> "0x0040ee10"; + "0x0040eba0" -> "0x0040ef10"; + "0x0040eba0" -> "0x0040f6d0"; + "0x0040eba0" -> "0x00481480"; + "0x0040eba0" -> "0x004814c0"; + "0x0040eba0" -> "0x00508bb0"; + "0x0040ee10" -> "0x0040e360"; + "0x0040ee10" -> "0x004133b0"; + "0x0040ee10" -> "0x00415f20"; + "0x0040ee10" -> "0x00434050"; + "0x0040ef10" -> "0x0040eba0"; + "0x0040ef10" -> "0x004101e0"; + "0x0040ef10" -> "0x00418be0"; + "0x0040f6d0" -> "0x0040eba0"; + "0x0040f6d0" -> "0x004134d0"; + "0x0040f6d0" -> "0x00418be0"; + "0x0040f6d0" -> "0x00481390"; + "0x0040fbe0" -> "0x0040fef0"; + "0x0040fbe0" -> "0x00467f50"; + "0x0040fef0" -> "0x0040fbe0"; + "0x0040fef0" -> "0x00467f50"; + "0x004101e0" -> "0x0040fef0"; + "0x004101e0" -> "0x00436590"; + "0x004101e0" -> "0x00482e00"; + "0x00412ca0" -> "0x004235c0"; + "0x004133b0" -> "0x0040e450"; + "0x004133b0" -> "0x0040ee10"; + "0x004134d0" -> "0x0040f6d0"; + "0x004134d0" -> "0x00422ee0"; + "0x00413580" -> "0x004101e0"; + "0x00415f20" -> "0x0040ee10"; + "0x00415f20" -> "0x004160c0"; + "0x004160c0" -> "0x00415f20"; + "0x00416170" -> "0x004160c0"; + "0x00416170" -> "0x00418a60"; + "0x00416170" -> "0x00418be0"; + "0x00416620" -> "0x00416ec0"; + "0x00416620" -> "0x004197e0"; + "0x00416e20" -> "0x0040e450"; + "0x00416e20" -> "0x00418be0"; + "0x00416e20" -> "0x00517cf0"; + "0x00416e20" -> "0x00518140"; + "0x00416e20" -> "0x00518380"; + "0x00416ec0" -> "0x00416620"; + "0x00416ec0" -> "0x00418be0"; + "0x00417790" -> "0x00417840"; + "0x00417840" -> "0x00402cb0"; + "0x00417840" -> "0x00417790"; + "0x00417840" -> "0x004197e0"; + "0x00418040" -> "0x00418be0"; + "0x004185a0" -> "0x00418610"; + "0x004185a0" -> "0x00418a60"; + "0x00418610" -> "0x00415020"; + "0x00418610" -> "0x004185a0"; + "0x00418610" -> "0x00418be0"; + "0x00418610" -> "0x004197e0"; + "0x00418a60" -> "0x0040e450"; + "0x00418a60" -> "0x00416170"; + "0x00418a60" -> "0x004185a0"; + "0x00418be0" -> "0x0040ef10"; + "0x00418be0" -> "0x0040f6d0"; + "0x00418be0" -> "0x00416170"; + "0x00418be0" -> "0x00416e20"; + "0x00418be0" -> "0x00416ec0"; + "0x00418be0" -> "0x00418040"; + "0x00418be0" -> "0x00418610"; + "0x004197e0" -> "0x00402cb0"; + "0x004197e0" -> "0x00417840"; + "0x004197e0" -> "0x00424010"; + "0x004197e0" -> "0x004240a0"; + "0x004197e0" -> "0x00494cb0"; + "0x0041d550" -> "0x004078a0"; + "0x0041d550" -> "0x00436710"; + "0x0041d550" -> "0x00461cd0"; + "0x0041d550" -> "0x004cd680"; + "0x0041d550" -> "0x004cf0d0"; + "0x0041e220" -> "0x0042c690"; + "0x0041e650" -> "0x004e9460"; + "0x0041e650" -> "0x00517cf0"; + "0x0041e650" -> "0x00518140"; + "0x0041e650" -> "0x00518380"; + "0x0041f9b0" -> "0x004235c0"; + "0x00420030" -> "0x004207d0"; + "0x00420030" -> "0x0047efe0"; + "0x00420280" -> "0x004207d0"; + "0x004207d0" -> "0x00420030"; + "0x004207d0" -> "0x00420280"; + "0x004207d0" -> "0x0047efe0"; + "0x00422900" -> "0x004235c0"; + "0x00422a70" -> "0x004134d0"; + "0x00422a70" -> "0x004197e0"; + "0x00422a70" -> "0x00422ee0"; + "0x00422a70" -> "0x00430270"; + "0x00422be0" -> "0x004235c0"; + "0x00422ee0" -> "0x004134d0"; + "0x00422ee0" -> "0x004235c0"; + "0x004234e0" -> "0x004d0420"; + "0x004235c0" -> "0x00412ca0"; + "0x004235c0" -> "0x0041f9b0"; + "0x004235c0" -> "0x0041fac0"; + "0x004235c0" -> "0x00422900"; + "0x004235c0" -> "0x00422be0"; + "0x004235c0" -> "0x00422ee0"; + "0x004235c0" -> "0x004234e0"; + "0x00423d70" -> "0x0042a040"; + "0x00423d70" -> "0x0042a080"; + "0x00423e40" -> "0x00425320"; + "0x00423e40" -> "0x00427540"; + "0x00423e40" -> "0x004c23a0"; + "0x00423eb0" -> "0x00424fd0"; + "0x00423eb0" -> "0x004c2720"; + "0x00423ec0" -> "0x004240a0"; + "0x00423ec0" -> "0x00493cf0"; + "0x00424010" -> "0x004c1b60"; + "0x00424010" -> "0x004c5fc9"; + "0x00424030" -> "0x004c5fc9"; + "0x004240a0" -> "0x004197e0"; + "0x004240a0" -> "0x00493cf0"; + "0x004240a0" -> "0x0049d380"; + "0x00424580" -> "0x00425880"; + "0x00424580" -> "0x004258c0"; + "0x00424580" -> "0x00427540"; + "0x00424580" -> "0x00436710"; + "0x00424580" -> "0x004c23a0"; + "0x004246b0" -> "0x0042a2e0"; + "0x004248d0" -> "0x00424fd0"; + "0x004248d0" -> "0x0042a5d0"; + "0x00424fd0" -> "0x00423eb0"; + "0x00424fd0" -> "0x004248d0"; + "0x00424fd0" -> "0x00425a90"; + "0x00424fd0" -> "0x004273c0"; + "0x00424fd0" -> "0x00427450"; + "0x00424fd0" -> "0x00436590"; + "0x00424fd0" -> "0x004ebd10"; + "0x00425320" -> "0x00406050"; + "0x00425320" -> "0x00423e40"; + "0x00425320" -> "0x00424580"; + "0x00425320" -> "0x00427540"; + "0x00425320" -> "0x00427590"; + "0x00425320" -> "0x0042a5d0"; + "0x00425880" -> "0x00424580"; + "0x00425880" -> "0x0042a5d0"; + "0x00425880" -> "0x004e9b20"; + "0x004258c0" -> "0x00424580"; + "0x004258c0" -> "0x0042a5d0"; + "0x004258c0" -> "0x004e9b20"; + "0x00425a90" -> "0x00424fd0"; + "0x00425a90" -> "0x0042a040"; + "0x00426260" -> "0x004c5140"; + "0x004264c0" -> "0x00409950"; + "0x004264c0" -> "0x004e7670"; + "0x00426590" -> "0x00406050"; + "0x00426590" -> "0x0047efe0"; + "0x00426ef0" -> "0x004e5cf0"; + "0x00426ef0" -> "0x00518140"; + "0x004273c0" -> "0x00401c50"; + "0x004273c0" -> "0x00424fd0"; + "0x004273c0" -> "0x0042a040"; + "0x004273c0" -> "0x0042a080"; + "0x004273c0" -> "0x004c46d0"; + "0x00427450" -> "0x00401c50"; + "0x00427450" -> "0x00424fd0"; + "0x00427450" -> "0x00425320"; + "0x00427450" -> "0x004c3f30"; + "0x00427540" -> "0x00424580"; + "0x00427540" -> "0x00425320"; + "0x00427540" -> "0x004275c0"; + "0x00427590" -> "0x00406050"; + "0x00427590" -> "0x00425320"; + "0x004275c0" -> "0x00401c50"; + "0x004275c0" -> "0x00427540"; + "0x004275c0" -> "0x004c3890"; + "0x00429a50" -> "0x00518140"; + "0x00429a50" -> "0x00518380"; + "0x00429c70" -> "0x0042a5d0"; + "0x0042a040" -> "0x00423d70"; + "0x0042a040" -> "0x00425a90"; + "0x0042a040" -> "0x004273c0"; + "0x0042a040" -> "0x004c5fc9"; + "0x0042a080" -> "0x004273c0"; + "0x0042a080" -> "0x0042a040"; + "0x0042a0e0" -> "0x00401c50"; + "0x0042a2e0" -> "0x004246b0"; + "0x0042a2e0" -> "0x00424fd0"; + "0x0042a2e0" -> "0x00429c70"; + "0x0042a5d0" -> "0x00429c70"; + "0x0042a5d0" -> "0x0042a2e0"; + "0x0042c690" -> "0x0041e220"; + "0x0042c690" -> "0x0042cdf0"; + "0x0042cdf0" -> "0x0042c690"; + "0x0042d700" -> "0x004d9970"; + "0x0042d700" -> "0x004da0f0"; + "0x0042d740" -> "0x004d9d10"; + "0x0042d740" -> "0x004da0f0"; + "0x0042db20" -> "0x0042df30"; + "0x0042db20" -> "0x0042df70"; + "0x0042db20" -> "0x0042dfb0"; + "0x0042db20" -> "0x0042dff0"; + "0x0042db20" -> "0x0042e050"; + "0x0042db20" -> "0x00433130"; + "0x0042df30" -> "0x0042db20"; + "0x0042df70" -> "0x0042df30"; + "0x0042dfb0" -> "0x0042df30"; + "0x0042dff0" -> "0x0042df30"; + "0x0042dff0" -> "0x0042df70"; + "0x0042dff0" -> "0x0042dfb0"; + "0x0042e050" -> "0x004db8b0"; + "0x00430270" -> "0x00422a70"; + "0x00430b50" -> "0x00431b20"; + "0x00430b50" -> "0x00432ea0"; + "0x00431b20" -> "0x00424030"; + "0x00431b20" -> "0x00430270"; + "0x00431b20" -> "0x00434890"; + "0x00431b20" -> "0x004348c0"; + "0x004323a0" -> "0x00424fd0"; + "0x004323a0" -> "0x0042d700"; + "0x004323a0" -> "0x00430b50"; + "0x004323a0" -> "0x00431b20"; + "0x004323a0" -> "0x00432f40"; + "0x00432ea0" -> "0x00430b50"; + "0x00432f40" -> "0x0040a590"; + "0x00432f40" -> "0x00424fd0"; + "0x00432f40" -> "0x004323a0"; + "0x00432f40" -> "0x0047d120"; + "0x00432f40" -> "0x004e51ea"; + "0x00432f40" -> "0x00517cf0"; + "0x00432f40" -> "0x00518140"; + "0x00432f40" -> "0x00518380"; + "0x00433130" -> "0x0042db20"; + "0x00433130" -> "0x00517cf0"; + "0x00433130" -> "0x00518140"; + "0x00433130" -> "0x00518380"; + "0x004333f0" -> "0x004336a0"; + "0x004333f0" -> "0x004839b0"; + "0x004333f0" -> "0x004839e0"; + "0x004333f0" -> "0x0051c920"; + "0x004336a0" -> "0x004333f0"; + "0x00434050" -> "0x00445de0"; + "0x00434050" -> "0x00482160"; + "0x00434050" -> "0x004b9e10"; + "0x00434050" -> "0x004bb9e0"; + "0x004348c0" -> "0x00434890"; + "0x00436590" -> "0x00424fd0"; + "0x00436590" -> "0x004ebd10"; + "0x00436710" -> "0x00424580"; + "0x00445de0" -> "0x00434050"; + "0x00445de0" -> "0x00444dd0"; + "0x00445de0" -> "0x00446240"; + "0x00445de0" -> "0x004dd010"; + "0x00446240" -> "0x00445de0"; + "0x00461cd0" -> "0x004078a0"; + "0x00461cd0" -> "0x0041d550"; + "0x00467c30" -> "0x00467eb0"; + "0x00467eb0" -> "0x0041e650"; + "0x00467eb0" -> "0x00467c30"; + "0x00467f50" -> "0x0040fef0"; + "0x00467f50" -> "0x00467c30"; + "0x00467f50" -> "0x00467eb0"; + "0x004682c0" -> "0x00467c30"; + "0x004682c0" -> "0x00517cf0"; + "0x004682c0" -> "0x00518140"; + "0x004682c0" -> "0x00518380"; + "0x00469720" -> "0x005519f0"; + "0x004768c0" -> "0x004e5cf0"; + "0x00477820" -> "0x0047d440"; + "0x00477860" -> "0x0047d440"; + "0x0047d120" -> "0x00432f40"; + "0x0047d440" -> "0x004377a0"; + "0x0047d440" -> "0x00477820"; + "0x0047d440" -> "0x00477860"; + "0x0047e240" -> "0x0041e220"; + "0x0047e330" -> "0x0047e240"; + "0x0047e330" -> "0x00518380"; + "0x0047fdb0" -> "0x0051db80"; + "0x004801a0" -> "0x00401860"; + "0x004801a0" -> "0x004093d0"; + "0x00480210" -> "0x00417840"; + "0x00480210" -> "0x00481390"; + "0x00480210" -> "0x00493cf0"; + "0x00480bb0" -> "0x0040ef10"; + "0x00480bb0" -> "0x004682c0"; + "0x00480bb0" -> "0x00493cf0"; + "0x00480bb0" -> "0x004a01a0"; + "0x00480bb0" -> "0x004a45f0"; + "0x00481390" -> "0x0040f6d0"; + "0x00481390" -> "0x00480210"; + "0x00481390" -> "0x00518140"; + "0x00481480" -> "0x0047fdb0"; + "0x004814c0" -> "0x0047dd10"; + "0x00482160" -> "0x00434050"; + "0x00482160" -> "0x00469720"; + "0x00482d10" -> "0x00482d80"; + "0x00482d10" -> "0x00482e00"; + "0x00482d80" -> "0x00482d10"; + "0x00482e00" -> "0x00402cb0"; + "0x00482e00" -> "0x00482d10"; + "0x00482e00" -> "0x004a65b0"; + "0x004839b0" -> "0x004333f0"; + "0x004839e0" -> "0x004333f0"; + "0x00493cf0" -> "0x00423ec0"; + "0x00493cf0" -> "0x004240a0"; + "0x00493cf0" -> "0x004955b0"; + "0x00493cf0" -> "0x004a01a0"; + "0x00494cb0" -> "0x0049bd40"; + "0x00494e40" -> "0x004a42b0"; + "0x00494e90" -> "0x004a42b0"; + "0x00494eb0" -> "0x004a4340"; + "0x00494f00" -> "0x004a01a0"; + "0x004952f0" -> "0x0049c900"; + "0x004952f0" -> "0x0049d380"; + "0x004952f0" -> "0x004a01a0"; + "0x004953c0" -> "0x0049c900"; + "0x004953c0" -> "0x0049d380"; + "0x004955b0" -> "0x00493cf0"; + "0x0049bd40" -> "0x004019e0"; + "0x0049bd40" -> "0x00402cb0"; + "0x0049bd40" -> "0x00494cb0"; + "0x0049bd40" -> "0x0049d380"; + "0x0049bd40" -> "0x004a6630"; + "0x0049bd40" -> "0x0051db80"; + "0x0049c900" -> "0x00494cb0"; + "0x0049c900" -> "0x004952f0"; + "0x0049c900" -> "0x004953c0"; + "0x0049c900" -> "0x0049d380"; + "0x0049c900" -> "0x005a152e"; + "0x0049d380" -> "0x004240a0"; + "0x0049d380" -> "0x00494cb0"; + "0x0049d380" -> "0x004952f0"; + "0x0049d380" -> "0x004953c0"; + "0x0049d380" -> "0x0049bd40"; + "0x0049d380" -> "0x0049c900"; + "0x0049d380" -> "0x004a01a0"; + "0x0049d380" -> "0x0051db80"; + "0x0049d380" -> "0x005a152e"; + "0x004a01a0" -> "0x00402cb0"; + "0x004a01a0" -> "0x00480bb0"; + "0x004a01a0" -> "0x00493cf0"; + "0x004a01a0" -> "0x00494f00"; + "0x004a01a0" -> "0x004952f0"; + "0x004a01a0" -> "0x0049d380"; + "0x004a01a0" -> "0x004a42b0"; + "0x004a01a0" -> "0x004a4340"; + "0x004a01a0" -> "0x00518140"; + "0x004a42b0" -> "0x00494e40"; + "0x004a42b0" -> "0x00494e90"; + "0x004a42b0" -> "0x004a01a0"; + "0x004a4340" -> "0x00494eb0"; + "0x004a4340" -> "0x004a01a0"; + "0x004a45f0" -> "0x00480bb0"; + "0x004a45f0" -> "0x00494eb0"; + "0x004a45f0" -> "0x00494f00"; + "0x004a45f0" -> "0x004a42b0"; + "0x004a5280" -> "0x004a65b0"; + "0x004a5900" -> "0x00424010"; + "0x004a5900" -> "0x004a5280"; + "0x004a5900" -> "0x004a65b0"; + "0x004a65b0" -> "0x00482e00"; + "0x004a65b0" -> "0x004a5280"; + "0x004a65b0" -> "0x004a5900"; + "0x004a65b0" -> "0x004a6630"; + "0x004a6630" -> "0x004093d0"; + "0x004a6630" -> "0x0049bd40"; + "0x004a6630" -> "0x004a65b0"; + "0x004a6630" -> "0x004b2c10"; + "0x004b2c10" -> "0x004a6630"; + "0x004b3160" -> "0x00516d00"; + "0x004b9a20" -> "0x004b99c0"; + "0x004b9e10" -> "0x004bb9e0"; + "0x004b9e10" -> "0x00513130"; + "0x004ba3d0" -> "0x004b9a20"; + "0x004ba3d0" -> "0x004bad20"; + "0x004ba3d0" -> "0x00518140"; + "0x004ba3d0" -> "0x0051c920"; + "0x004bad20" -> "0x004ba3d0"; + "0x004bb9e0" -> "0x00434050"; + "0x004bb9e0" -> "0x004b9a20"; + "0x004bb9e0" -> "0x004b9e10"; + "0x004bb9e0" -> "0x004bad20"; + "0x004bb9e0" -> "0x004c98a0"; + "0x004bfb30" -> "0x0042a5d0"; + "0x004bfb30" -> "0x004c1ab0"; + "0x004c0160" -> "0x004246b0"; + "0x004c0160" -> "0x004e5130"; + "0x004c1610" -> "0x004c2ca0"; + "0x004c1730" -> "0x0042a5d0"; + "0x004c1730" -> "0x004c5540"; + "0x004c1ab0" -> "0x004bfb30"; + "0x004c1ab0" -> "0x004c1730"; + "0x004c1ab0" -> "0x004c5540"; + "0x004c1b60" -> "0x004c1d30"; + "0x004c1b60" -> "0x004c1d70"; + "0x004c1b60" -> "0x004c22e0"; + "0x004c1d30" -> "0x004c1b60"; + "0x004c1d70" -> "0x00424010"; + "0x004c1d70" -> "0x0054f710"; + "0x004c1ec0" -> "0x004c1610"; + "0x004c1ec0" -> "0x004c5540"; + "0x004c22e0" -> "0x004c1b60"; + "0x004c23a0" -> "0x00423e40"; + "0x004c23a0" -> "0x00424580"; + "0x004c23a0" -> "0x00425320"; + "0x004c23a0" -> "0x0042a5d0"; + "0x004c2720" -> "0x00423eb0"; + "0x004c2720" -> "0x004c0160"; + "0x004c2ca0" -> "0x00434870"; + "0x004c2ca0" -> "0x004c5540"; + "0x004c2ca0" -> "0x004c56a0"; + "0x004c2ca0" -> "0x004e5cf0"; + "0x004c2ca0" -> "0x00540a47"; + "0x004c2ca0" -> "0x005639d2"; + "0x004c3560" -> "0x004c3890"; + "0x004c3560" -> "0x004c98a0"; + "0x004c3890" -> "0x004275c0"; + "0x004c3890" -> "0x004c3560"; + "0x004c3890" -> "0x004c56a0"; + "0x004c3f30" -> "0x00427450"; + "0x004c3f30" -> "0x004c56a0"; + "0x004c4300" -> "0x004c46d0"; + "0x004c4300" -> "0x004c98a0"; + "0x004c46d0" -> "0x004273c0"; + "0x004c46d0" -> "0x004c4300"; + "0x004c46d0" -> "0x004c56a0"; + "0x004c4c70" -> "0x004c4e30"; + "0x004c4c70" -> "0x004c5140"; + "0x004c4c70" -> "0x004c5360"; + "0x004c4c70" -> "0x0053f9c0"; + "0x004c4e30" -> "0x004c5360"; + "0x004c4e30" -> "0x004c98a0"; + "0x004c5140" -> "0x00426260"; + "0x004c5140" -> "0x004c5360"; + "0x004c5140" -> "0x004c98a0"; + "0x004c5360" -> "0x004c4c70"; + "0x004c5360" -> "0x004c4e30"; + "0x004c5360" -> "0x004c5140"; + "0x004c5360" -> "0x004c56a0"; + "0x004c5540" -> "0x004c1730"; + "0x004c5540" -> "0x004c1ab0"; + "0x004c5540" -> "0x004c1d30"; + "0x004c5540" -> "0x004c1d70"; + "0x004c5540" -> "0x004c1ec0"; + "0x004c5540" -> "0x004c22e0"; + "0x004c5540" -> "0x004c2ca0"; + "0x004c5540" -> "0x0053fa50"; + "0x004c56a0" -> "0x00423d70"; + "0x004c56a0" -> "0x00426d60"; + "0x004c56a0" -> "0x004c2ca0"; + "0x004c56a0" -> "0x004c3890"; + "0x004c56a0" -> "0x004c3f30"; + "0x004c56a0" -> "0x004c46d0"; + "0x004c56a0" -> "0x004c5360"; + "0x004c56a0" -> "0x004c5a0e"; + "0x004c56a0" -> "0x004c5b99"; + "0x004c56a0" -> "0x004c5fc9"; + "0x004c56a0" -> "0x004ddbd0"; + "0x004c56a0" -> "0x004ec640"; + "0x004c56a0" -> "0x0050ccc0"; + "0x004c5a0e" -> "0x00428a10"; + "0x004c5a0e" -> "0x004c56a0"; + "0x004c5b99" -> "0x00425a90"; + "0x004c5b99" -> "0x004c56a0"; + "0x004c5fc9" -> "0x00424030"; + "0x004c5fc9" -> "0x0042a040"; + "0x004c5fc9" -> "0x004c56a0"; + "0x004c98a0" -> "0x004ee0e0"; + "0x004cf0d0" -> "0x004cd680"; + "0x004d0420" -> "0x004234e0"; + "0x004d0420" -> "0x004d30a0"; + "0x004d30a0" -> "0x004d0420"; + "0x004d4500" -> "0x0053fa50"; + "0x004d57c0" -> "0x0053fa50"; + "0x004d77b0" -> "0x004d9390"; + "0x004d77b0" -> "0x004d9970"; + "0x004d77b0" -> "0x004daf40"; + "0x004d8120" -> "0x004d9ed0"; + "0x004d8120" -> "0x004da640"; + "0x004d8120" -> "0x004da700"; + "0x004d88f0" -> "0x004d9390"; + "0x004d88f0" -> "0x004da7c0"; + "0x004d88f0" -> "0x004da860"; + "0x004d88f0" -> "0x004da920"; + "0x004d88f0" -> "0x004db120"; + "0x004d88f0" -> "0x004dbf93"; + "0x004d8d50" -> "0x004dbf93"; + "0x004d8ea0" -> "0x004db520"; + "0x004d8ea0" -> "0x004db5e0"; + "0x004d8ea0" -> "0x004db6a0"; + "0x004d8ea0" -> "0x004dbfca"; + "0x004d9360" -> "0x004d7ef0"; + "0x004d9390" -> "0x004d77b0"; + "0x004d9390" -> "0x004d88f0"; + "0x004d9390" -> "0x004d9f50"; + "0x004d9390" -> "0x004daf40"; + "0x004d9390" -> "0x004dbb80"; + "0x004d9970" -> "0x0042d700"; + "0x004d9970" -> "0x004d9ed0"; + "0x004d9970" -> "0x004da640"; + "0x004d9970" -> "0x004da700"; + "0x004d9d10" -> "0x0042d740"; + "0x004d9d10" -> "0x004da0f0"; + "0x004d9d10" -> "0x004dbb80"; + "0x004d9dc0" -> "0x004d57c0"; + "0x004d9dc0" -> "0x004da640"; + "0x004d9dc0" -> "0x004da700"; + "0x004d9e40" -> "0x004da7c0"; + "0x004d9e40" -> "0x004da860"; + "0x004d9ed0" -> "0x004d8120"; + "0x004d9ed0" -> "0x004d9970"; + "0x004d9f50" -> "0x004d9390"; + "0x004d9f50" -> "0x004db120"; + "0x004d9f50" -> "0x004dbb80"; + "0x004da0f0" -> "0x0042d740"; + "0x004da0f0" -> "0x0042df30"; + "0x004da0f0" -> "0x0042df70"; + "0x004da0f0" -> "0x0042dfb0"; + "0x004da0f0" -> "0x0042dff0"; + "0x004da0f0" -> "0x004d9970"; + "0x004da0f0" -> "0x004d9d10"; + "0x004da0f0" -> "0x004d9f50"; + "0x004da0f0" -> "0x004dbfca"; + "0x004da640" -> "0x004d8120"; + "0x004da640" -> "0x004d9970"; + "0x004da640" -> "0x004d9dc0"; + "0x004da700" -> "0x004d8120"; + "0x004da700" -> "0x004d9970"; + "0x004da700" -> "0x004d9dc0"; + "0x004da7c0" -> "0x004d88f0"; + "0x004da7c0" -> "0x004d9e40"; + "0x004da7c0" -> "0x004da0f0"; + "0x004da860" -> "0x004d88f0"; + "0x004da860" -> "0x004d9e40"; + "0x004da860" -> "0x004da0f0"; + "0x004da920" -> "0x004d88f0"; + "0x004da920" -> "0x004da0f0"; + "0x004da9a0" -> "0x004da0f0"; + "0x004da9a0" -> "0x004db120"; + "0x004da9a0" -> "0x004dbf93"; + "0x004dab60" -> "0x004d8d50"; + "0x004dab60" -> "0x004d9d10"; + "0x004dab60" -> "0x004da9a0"; + "0x004daf40" -> "0x004db6a0"; + "0x004daf40" -> "0x004db6f0"; + "0x004db120" -> "0x004d8120"; + "0x004db120" -> "0x004d88f0"; + "0x004db120" -> "0x004d9970"; + "0x004db120" -> "0x004d9f50"; + "0x004db120" -> "0x004dab60"; + "0x004db520" -> "0x004d7ef0"; + "0x004db520" -> "0x004d8ea0"; + "0x004db520" -> "0x004db120"; + "0x004db5e0" -> "0x004d7ef0"; + "0x004db5e0" -> "0x004db120"; + "0x004db5e0" -> "0x004db520"; + "0x004db6a0" -> "0x004d8ea0"; + "0x004db6a0" -> "0x004daf40"; + "0x004db6a0" -> "0x004db120"; + "0x004db6a0" -> "0x004db6f0"; + "0x004db6f0" -> "0x004d7ef0"; + "0x004db6f0" -> "0x004daf40"; + "0x004db6f0" -> "0x004db120"; + "0x004db6f0" -> "0x004db6a0"; + "0x004db8b0" -> "0x0042e050"; + "0x004db8b0" -> "0x00432ea0"; + "0x004db8b0" -> "0x004c98a0"; + "0x004db8b0" -> "0x004d7ef0"; + "0x004db8b0" -> "0x004db120"; + "0x004dba90" -> "0x004c98a0"; + "0x004dba90" -> "0x004d7ef0"; + "0x004dba90" -> "0x004db120"; + "0x004dbb80" -> "0x004d9360"; + "0x004dbb80" -> "0x004d9d10"; + "0x004dbb80" -> "0x004d9f50"; + "0x004dbb80" -> "0x004db520"; + "0x004dbb80" -> "0x004db5e0"; + "0x004dbb80" -> "0x004db8b0"; + "0x004dbb80" -> "0x004dba90"; + "0x004dbb80" -> "0x004dbf93"; + "0x004dbb80" -> "0x004dbfca"; + "0x004dbf93" -> "0x004d88f0"; + "0x004dbf93" -> "0x004d8d50"; + "0x004dbf93" -> "0x004da0f0"; + "0x004dbf93" -> "0x004da9a0"; + "0x004dbf93" -> "0x004dbb80"; + "0x004dbfca" -> "0x004d8ea0"; + "0x004dbfca" -> "0x004dab60"; + "0x004dbfca" -> "0x004db120"; + "0x004dd010" -> "0x004839b0"; + "0x004ddbd0" -> "0x004d4500"; + "0x004e39e0" -> "0x004e5cf0"; + "0x004e5130" -> "0x004c0160"; + "0x004e5130" -> "0x004ea060"; + "0x004e51ea" -> "0x00432f40"; + "0x004e51ea" -> "0x004ea060"; + "0x004e5300" -> "0x00429a50"; + "0x004e5300" -> "0x004348c0"; + "0x004e5a80" -> "0x00434870"; + "0x004e5a80" -> "0x004e5cf0"; + "0x004e5cf0" -> "0x00426ef0"; + "0x004e5cf0" -> "0x0042a5d0"; + "0x004e5cf0" -> "0x004768c0"; + "0x004e5cf0" -> "0x004c56a0"; + "0x004e5cf0" -> "0x004e39e0"; + "0x004e68e0" -> "0x00429a50"; + "0x004e68e0" -> "0x0042a5d0"; + "0x004e6ef0" -> "0x00477820"; + "0x004e6ef0" -> "0x00477860"; + "0x004e7670" -> "0x004264c0"; + "0x004e7670" -> "0x004e39e0"; + "0x004e8bb0" -> "0x00426590"; + "0x004e9460" -> "0x0041e220"; + "0x004e9460" -> "0x0041e650"; + "0x004e9b20" -> "0x00425880"; + "0x004e9b20" -> "0x004258c0"; + "0x004e9b20" -> "0x0042a5d0"; + "0x004e9b20" -> "0x004ea060"; + "0x004ea060" -> "0x004e5130"; + "0x004ea060" -> "0x004e51ea"; + "0x004ea060" -> "0x004e5300"; + "0x004ea060" -> "0x004e5a80"; + "0x004ea060" -> "0x004e68e0"; + "0x004ea060" -> "0x004e6ef0"; + "0x004ea060" -> "0x004e7670"; + "0x004ea060" -> "0x004e8270"; + "0x004ea060" -> "0x004e8bb0"; + "0x004ea060" -> "0x004e9460"; + "0x004ea060" -> "0x004e9b20"; + "0x004eb890" -> "0x004ebd10"; + "0x004ebd10" -> "0x004eb890"; + "0x004ec640" -> "0x004c56a0"; + "0x004ec640" -> "0x004ebd10"; + "0x004ee0e0" -> "0x00484910"; + "0x004ee0e0" -> "0x004c98a0"; + "0x00508bb0" -> "0x00508550"; + "0x0050c500" -> "0x0050c940"; + "0x0050c940" -> "0x0050c500"; + "0x0050ccc0" -> "0x004c56a0"; + "0x0050ccc0" -> "0x0050c940"; + "0x00516d00" -> "0x004b3160"; + "0x00516d00" -> "0x004c98a0"; + "0x00517cf0" -> "0x00518380"; + "0x0051c920" -> "0x004ba3d0"; + "0x0051db80" -> "0x00402cb0"; + "0x0051db80" -> "0x0049bd40"; + "0x0051db80" -> "0x0049d380"; + "0x0051db80" -> "0x00552900"; + "0x0053f9c0" -> "0x004c4c70"; + "0x0053f9c0" -> "0x00558130"; + "0x00540a47" -> "0x005639d2"; + "0x00552900" -> "0x0051db80"; + "0x00558130" -> "0x0053f9c0"; + "0x005a152e" -> "0x0049c900"; + "0x005a152e" -> "0x0049d380"; +} diff --git a/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-forward-subgraph.md b/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-forward-subgraph.md new file mode 100644 index 0000000..cc70fd5 --- /dev/null +++ b/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-forward-subgraph.md @@ -0,0 +1,1328 @@ +# Scenario Runtime Effect Service Subgraph (Depth 7, Forward Only) + +- Nodes: `293` +- Edges: `752` +- Seeds: `0x00430b50`, `0x00431b20`, `0x004323a0`, `0x00432ea0` +- Graphviz: `runtime-effect-service-depth7-forward-subgraph.dot` + +## Nodes + +| Address | Name | Subsystem | Confidence | +| --- | --- | --- | --- | +| `0x004010f0` | `city_compute_connection_bonus_candidate_weight` | `map` | `4` | +| `0x004014b0` | `company_try_buy_unowned_industry_near_city_and_publish_news` | `simulation` | `2` | +| `0x00401860` | `company_query_cached_linked_transit_route_anchor_entry_id` | `simulation` | `3` | +| `0x004019e0` | `company_service_periodic_city_connection_finance_and_linked_transit_lanes` | `simulation` | `2` | +| `0x00401c50` | `company_evaluate_annual_finance_policy_and_publish_news` | `simulation` | `2` | +| `0x00402cb0` | `city_connection_try_build_route_with_optional_direct_site_placement` | `map` | `3` | +| `0x00404640` | `city_connection_bonus_try_compact_route_builder_from_region_entry` | `map` | `3` | +| `0x004046a0` | `city_connection_bonus_build_peer_route_candidate` | `map` | `4` | +| `0x00404c60` | `city_connection_try_build_route_between_region_entry_pair` | `map` | `3` | +| `0x00404ce0` | `simulation_try_select_and_publish_company_start_or_city_connection_news` | `simulation` | `3` | +| `0x00405920` | `company_query_min_linked_site_distance_to_xy` | `simulation` | `4` | +| `0x00406050` | `company_evaluate_and_publish_city_connection_bonus_news` | `simulation` | `4` | +| `0x004078a0` | `company_select_preferred_available_locomotive_id` | `simulation` | `3` | +| `0x00407bd0` | `company_rebuild_linked_transit_autoroute_site_score_cache` | `simulation` | `3` | +| `0x00408280` | `company_select_best_owned_linked_transit_site_by_autoroute_score` | `simulation` | `3` | +| `0x00408380` | `company_build_linked_transit_autoroute_entry` | `simulation` | `3` | +| `0x00408f70` | `company_compute_owned_linked_transit_site_score_total` | `simulation` | `3` | +| `0x00409300` | `company_publish_train_upgrade_news` | `simulation` | `3` | +| `0x004093d0` | `company_rebuild_linked_transit_site_peer_cache` | `simulation` | `3` | +| `0x00409770` | `train_try_append_linked_transit_autoroute_entry` | `simulation` | `3` | +| `0x00409830` | `company_try_add_linked_transit_train_and_publish_news` | `simulation` | `3` | +| `0x00409950` | `company_balance_linked_transit_train_roster` | `simulation` | `3` | +| `0x0040a590` | `simulation_service_periodic_boundary_work` | `simulation` | `3` | +| `0x0040e360` | `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` | `map` | `2` | +| `0x0040e450` | `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` | `map` | `2` | +| `0x0040eba0` | `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` | `map` | `2` | +| `0x0040ee10` | `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` | `map` | `2` | +| `0x0040ef10` | `placed_structure_finalize_creation_or_rebuild_local_runtime_state` | `map` | `3` | +| `0x0040f6d0` | `placed_structure_construct_entry_from_candidate_and_world_args` | `map` | `3` | +| `0x0040fbe0` | `placed_structure_endpoint_pair_has_shared_route_entry_key` | `map` | `3` | +| `0x0040fef0` | `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` | `map` | `3` | +| `0x004101e0` | `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` | `map` | `3` | +| `0x00412ca0` | `world_region_pick_commercial_profile_label_by_region_rank` | `map` | `4` | +| `0x004133b0` | `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` | `map` | `2` | +| `0x004134d0` | `placed_structure_collection_allocate_and_construct_entry` | `map` | `3` | +| `0x00413580` | `placed_structure_collection_refresh_quarter_subset_route_style_state` | `map` | `3` | +| `0x00415020` | `world_grid_refresh_flagged_region_float_extrema_and_mean` | `map` | `3` | +| `0x00415f20` | `placed_structure_recursive_collect_connected_component_tile_bounds` | `map` | `3` | +| `0x004160c0` | `placed_structure_collect_connected_component_tile_bounds_with_version_gate` | `map` | `3` | +| `0x00416170` | `placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh` | `map` | `3` | +| `0x00416620` | `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` | `map` | `2` | +| `0x00416e20` | `indexed_collection_resolve_live_entry_id_by_stem_string` | `map` | `3` | +| `0x00416ec0` | `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` | `map` | `2` | +| `0x00417790` | `map_angle_rotate_grid_offset_pair_into_world_offset_pair` | `map` | `2` | +| `0x00417840` | `placed_structure_project_candidate_grid_extent_offset_by_rotation` | `map` | `3` | +| `0x00418040` | `placed_structure_render_local_runtime_overlay_payload_from_projected_bounds` | `map` | `2` | +| `0x004185a0` | `world_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples` | `map` | `2` | +| `0x00418610` | `world_grid_refresh_projected_rect_sample_band_and_flag_mask` | `map` | `2` | +| `0x00418a60` | `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` | `map` | `2` | +| `0x00418be0` | `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` | `map` | `2` | +| `0x004197e0` | `placed_structure_validate_projected_candidate_placement` | `map` | `3` | +| `0x0041d550` | `locomotive_era_and_engine_type_pass_company_policy_gate` | `simulation` | `2` | +| `0x0041e220` | `structure_candidate_is_enabled_for_current_year` | `map` | `3` | +| `0x0041e650` | `structure_candidate_query_route_style_or_local_availability_metric` | `map` | `3` | +| `0x0041f9b0` | `world_region_count_structure_profiles_before_year_for_category` | `map` | `4` | +| `0x0041fac0` | `world_region_read_structure_profile_label_and_weight_by_index` | `map` | `4` | +| `0x00420030` | `city_connection_bonus_exists_matching_peer_site` | `map` | `4` | +| `0x00420280` | `city_connection_bonus_select_first_matching_peer_site` | `map` | `4` | +| `0x004207d0` | `city_site_format_connection_bonus_status_label` | `map` | `4` | +| `0x00422900` | `world_region_accumulate_structure_category_totals` | `map` | `3` | +| `0x00422a70` | `world_region_validate_and_commit_candidate_placement` | `map` | `3` | +| `0x00422be0` | `world_region_count_placed_structures_for_category` | `map` | `3` | +| `0x00422ee0` | `world_region_try_place_candidate_structure` | `map` | `4` | +| `0x004234e0` | `world_region_query_projected_structure_count_scalar_by_category` | `map` | `3` | +| `0x004235c0` | `world_region_balance_structure_demand_and_place_candidates` | `map` | `4` | +| `0x00423d70` | `company_repay_bond_slot_and_compact_debt_table` | `simulation` | `4` | +| `0x00423e40` | `company_compute_weighted_average_bond_interest_rate` | `simulation` | `4` | +| `0x00423eb0` | `company_query_cached_share_price_scalar` | `simulation` | `3` | +| `0x00423ec0` | `company_adjust_available_track_laying_capacity_with_floor_zero` | `simulation` | `2` | +| `0x00424010` | `company_has_territory_access_rights` | `simulation` | `4` | +| `0x00424030` | `company_set_territory_access_rights_byte` | `simulation` | `4` | +| `0x004240a0` | `company_query_available_track_laying_capacity_or_unlimited` | `simulation` | `2` | +| `0x00424580` | `company_compute_prime_rate_from_issue39_scenario_baseline` | `simulation` | `4` | +| `0x004246b0` | `company_compute_five_year_weighted_shareholder_return` | `simulation` | `3` | +| `0x004248d0` | `company_compute_cached_recent_per_share_performance_subscore` | `simulation` | `3` | +| `0x00424fd0` | `company_compute_public_support_adjusted_share_price_scalar` | `simulation` | `3` | +| `0x00425320` | `company_compute_connection_bonus_value_ladder` | `simulation` | `4` | +| `0x00425880` | `company_compute_negative_cash_balance_interest_rate` | `shell` | `4` | +| `0x004258c0` | `company_compute_positive_cash_balance_interest_rate` | `shell` | `4` | +| `0x00425a90` | `company_declare_bankruptcy_and_halve_bond_debt` | `simulation` | `4` | +| `0x004261b0` | `company_count_unassigned_shares_after_active_chairman_holdings` | `simulation` | `4` | +| `0x00426260` | `company_compute_board_approved_dividend_rate_ceiling` | `simulation` | `4` | +| `0x004264c0` | `company_count_owned_trains` | `simulation` | `3` | +| `0x00426590` | `company_count_linked_transit_sites` | `simulation` | `4` | +| `0x00426d60` | `company_deactivate_and_clear_chairman_share_links` | `simulation` | `4` | +| `0x00426ef0` | `company_get_linked_chairman_profile_record` | `simulation` | `4` | +| `0x004273c0` | `company_repurchase_public_shares_and_reduce_capital` | `simulation` | `3` | +| `0x00427450` | `company_issue_public_shares_and_raise_capital` | `simulation` | `3` | +| `0x00427540` | `company_compute_bond_interest_rate_quote` | `simulation` | `3` | +| `0x00427590` | `company_connection_bonus_lane_is_unlocked` | `simulation` | `4` | +| `0x004275c0` | `company_issue_bond_and_record_terms` | `simulation` | `3` | +| `0x00428a10` | `company_clear_selected_chairman_if_current_profile` | `simulation` | `4` | +| `0x00429a50` | `company_collection_count_active_companies` | `simulation` | `4` | +| `0x00429c70` | `company_read_derived_financial_report_metric_slot` | `simulation` | `3` | +| `0x0042a040` | `company_add_delta_into_stat_series_and_current_slot` | `simulation` | `3` | +| `0x0042a080` | `company_add_delta_into_stat_series_current_slot_and_optional_cash_totals` | `simulation` | `3` | +| `0x0042a0e0` | `company_query_highest_coupon_bond_slot_index` | `simulation` | `3` | +| `0x0042a2e0` | `company_read_control_transfer_metric_slot` | `simulation` | `3` | +| `0x0042a5d0` | `company_read_year_or_control_transfer_metric_value` | `simulation` | `3` | +| `0x0042c690` | `placed_structure_rebuild_candidate_cargo_service_bitsets` | `map` | `3` | +| `0x0042cdf0` | `placed_structure_refresh_candidate_service_state` | `map` | `4` | +| `0x0042d700` | `scenario_event_query_standalone_condition_row_list_class_and_modifier_flags` | `scenario` | `2` | +| `0x0042d740` | `scenario_event_query_grouped_effect_row_list_type_flags` | `scenario` | `2` | +| `0x0042db20` | `scenario_event_refresh_runtime_record_from_packed_state` | `scenario` | `2` | +| `0x0042df30` | `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` | `scenario` | `2` | +| `0x0042df70` | `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` | `scenario` | `2` | +| `0x0042dfb0` | `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` | `scenario` | `2` | +| `0x0042dff0` | `scenario_event_condition_row_list_has_any_class_bit012_or_special_fallback` | `scenario` | `2` | +| `0x0042e050` | `scenario_event_clone_runtime_record_deep_copy` | `scenario` | `2` | +| `0x00430270` | `world_try_place_random_structure_batch_from_compact_record` | `map` | `3` | +| `0x00430b50` | `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` | `scenario` | `3` | +| `0x00431b20` | `world_apply_compact_runtime_effect_record_to_resolved_targets` | `map` | `3` | +| `0x004323a0` | `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` | `scenario` | `3` | +| `0x00432ea0` | `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` | `scenario` | `3` | +| `0x00432f40` | `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` | `scenario` | `3` | +| `0x00433130` | `scenario_event_collection_refresh_runtime_records_from_packed_state` | `scenario` | `3` | +| `0x004333f0` | `shell_setup_build_file_list_records_from_current_root_and_pattern` | `shell` | `3` | +| `0x004336a0` | `shell_setup_file_list_construct_and_scan_dataset` | `shell` | `3` | +| `0x00434050` | `shell_has_auxiliary_preview_owner` | `shell` | `4` | +| `0x00434870` | `scenario_state_get_selected_chairman_company_record` | `map` | `4` | +| `0x00434890` | `scenario_state_set_selected_chairman_profile` | `map` | `4` | +| `0x004348c0` | `scenario_state_get_selected_chairman_profile_record` | `map` | `4` | +| `0x00436590` | `scenario_state_compute_issue_opinion_multiplier` | `simulation` | `4` | +| `0x00436710` | `scenario_state_sum_issue_opinion_terms_raw` | `simulation` | `4` | +| `0x004377a0` | `world_seed_default_chairman_profile_slots` | `map` | `4` | +| `0x00444dd0` | `map_bundle_open_reference_databases` | `map` | `3` | +| `0x00445de0` | `shell_map_file_world_bundle_coordinator` | `map` | `4` | +| `0x00446240` | `world_runtime_serialize_smp_bundle` | `map` | `3` | +| `0x00461cd0` | `locomotive_collection_select_best_era_matched_non_electric_fallback_id` | `simulation` | `2` | +| `0x00467c30` | `placed_structure_route_link_recompute_endpoint_pair_state` | `map` | `3` | +| `0x00467eb0` | `placed_structure_route_link_attach_site_owner` | `map` | `3` | +| `0x00467f50` | `placed_structure_route_link_allocate_site_pair_for_candidate_class` | `map` | `3` | +| `0x004682c0` | `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` | `map` | `3` | +| `0x00469720` | `multiplayer_preview_dataset_service_frame` | `shell` | `3` | +| `0x004768c0` | `chairman_profile_owns_all_company_shares` | `simulation` | `4` | +| `0x00477820` | `profile_collection_count_active_chairman_records` | `map` | `4` | +| `0x00477860` | `profile_collection_get_nth_active_chairman_record` | `map` | `4` | +| `0x0047d120` | `start_new_company_dialog_commit_create_company` | `shell` | `4` | +| `0x0047d440` | `world_conditionally_seed_named_starting_railroad_companies` | `map` | `4` | +| `0x0047dd10` | `placed_structure_remove_site_id_from_proximity_bucket_lists` | `map` | `3` | +| `0x0047e240` | `placed_structure_query_candidate_local_service_metrics` | `map` | `3` | +| `0x0047e330` | `placed_structure_count_candidates_with_local_service_metrics` | `map` | `3` | +| `0x0047efe0` | `placed_structure_query_linked_company_id` | `map` | `4` | +| `0x0047fdb0` | `placed_structure_append_nearby_transit_site_distance_bucket_entry` | `map` | `3` | +| `0x004801a0` | `placed_structure_is_linked_transit_site_reachable_from_company_route_anchor` | `map` | `3` | +| `0x00480210` | `placed_structure_construct_linked_site_record_from_anchor_and_coords` | `map` | `3` | +| `0x00480bb0` | `placed_structure_refresh_linked_site_display_name_and_route_anchor` | `map` | `3` | +| `0x00481390` | `placed_structure_collection_allocate_and_construct_linked_site_record` | `map` | `3` | +| `0x00481480` | `placed_structure_collection_append_site_into_all_proximity_bucket_lists` | `map` | `3` | +| `0x004814c0` | `placed_structure_collection_remove_site_id_from_all_proximity_bucket_lists` | `map` | `3` | +| `0x00482160` | `shell_state_service_active_mode_frame` | `shell` | `4` | +| `0x00482d10` | `runtime_query_cached_local_exe_version_float` | `simulation` | `3` | +| `0x00482d80` | `runtime_query_cached_local_exe_version_string` | `simulation` | `3` | +| `0x00482e00` | `runtime_query_hundredths_scaled_build_version` | `simulation` | `3` | +| `0x004839b0` | `shell_setup_query_file_list_uses_map_extension_pattern` | `shell` | `3` | +| `0x004839e0` | `shell_setup_query_file_list_root_dir_name` | `shell` | `3` | +| `0x00484910` | `shell_save_graphics_config` | `shell` | `4` | +| `0x00493cf0` | `route_entry_collection_create_endpoint_entry_from_coords_and_policy` | `map` | `3` | +| `0x00494cb0` | `route_entry_collection_try_find_route_entry_covering_point_window` | `map` | `3` | +| `0x00494e40` | `aux_route_entry_tracker_reset` | `map` | `2` | +| `0x00494e90` | `aux_route_entry_tracker_seed_owner_entry_id` | `map` | `2` | +| `0x00494eb0` | `aux_route_entry_tracker_adjust_refcount` | `map` | `2` | +| `0x00494f00` | `aux_route_entry_tracker_merge_or_bind_endpoint_entry` | `map` | `3` | +| `0x004952f0` | `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` | `map` | `4` | +| `0x004953c0` | `math_normalize_subtracted_angle_delta_and_report_wrap` | `map` | `4` | +| `0x004955b0` | `route_entry_collection_map_track_lay_mode_to_endpoint_policy_byte` | `map` | `3` | +| `0x0049bd40` | `route_entry_collection_run_initial_candidate_path_sweep` | `map` | `3` | +| `0x0049c900` | `route_entry_collection_try_extend_search_frontier_toward_target_coords` | `map` | `3` | +| `0x0049d380` | `route_entry_collection_search_path_between_entry_or_coord_endpoints` | `map` | `3` | +| `0x004a01a0` | `route_entry_collection_try_build_path_between_optional_endpoint_entries` | `map` | `3` | +| `0x004a42b0` | `aux_route_entry_tracker_collection_allocate_entry` | `map` | `3` | +| `0x004a4340` | `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` | `map` | `3` | +| `0x004a45f0` | `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` | `map` | `3` | +| `0x004a5280` | `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` | `map` | `3` | +| `0x004a5900` | `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` | `map` | `3` | +| `0x004a65b0` | `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` | `map` | `3` | +| `0x004a6630` | `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` | `map` | `3` | +| `0x004b2c10` | `train_route_list_validate_reachability_and_station_pair` | `simulation` | `4` | +| `0x004b3160` | `train_route_list_insert_staged_entry_at_index` | `simulation` | `4` | +| `0x004b99c0` | `structure_candidate_collection_get_nth_active_candidate_id` | `map` | `4` | +| `0x004b9a20` | `shell_building_detail_refresh_flagged_service_capability_rows` | `shell` | `3` | +| `0x004b9e10` | `shell_building_detail_submit_aux_owner_subject_sync_request` | `shell` | `3` | +| `0x004ba3d0` | `shell_building_detail_refresh_subject_cargo_and_service_rows` | `shell` | `3` | +| `0x004bad20` | `shell_building_detail_refresh_subject_pair_value_rows` | `shell` | `3` | +| `0x004bb9e0` | `shell_building_detail_window_handle_message` | `shell` | `4` | +| `0x004bfb30` | `shell_format_company_financial_summary_card` | `shell` | `4` | +| `0x004c0160` | `shell_format_company_stock_data_panel` | `shell` | `4` | +| `0x004c1610` | `shell_company_detail_bind_bond_row_band_for_active_panel` | `shell` | `4` | +| `0x004c1730` | `shell_company_detail_render_financial_history_panel` | `shell` | `4` | +| `0x004c1ab0` | `shell_company_detail_render_company_summary_card` | `shell` | `4` | +| `0x004c1b60` | `shell_company_detail_refresh_selected_territory_access_summary` | `shell` | `4` | +| `0x004c1d30` | `shell_company_detail_select_territory_access_row` | `shell` | `4` | +| `0x004c1d70` | `shell_company_detail_render_territory_access_row` | `shell` | `4` | +| `0x004c1ec0` | `shell_company_detail_render_bond_maturity_and_repay_panel` | `shell` | `4` | +| `0x004c22e0` | `shell_company_detail_sync_selected_territory_from_picker` | `shell` | `4` | +| `0x004c23a0` | `shell_company_detail_render_debt_credit_and_rate_summary_panel` | `shell` | `4` | +| `0x004c2720` | `shell_company_detail_render_share_value_and_dividend_summary_panel` | `shell` | `4` | +| `0x004c2ca0` | `shell_company_detail_window_refresh_controls` | `shell` | `4` | +| `0x004c3560` | `shell_company_detail_render_issue_bond_offer_dialog` | `shell` | `4` | +| `0x004c3890` | `shell_company_detail_issue_bond_offer_flow` | `shell` | `4` | +| `0x004c3f30` | `shell_company_detail_issue_stock_offer_flow` | `shell` | `4` | +| `0x004c4300` | `shell_company_detail_render_stock_buyback_offer_dialog` | `shell` | `4` | +| `0x004c46d0` | `shell_company_detail_buyback_stock_flow` | `shell` | `4` | +| `0x004c4c70` | `shell_company_detail_setup_dividend_rate_adjust_controls` | `shell` | `4` | +| `0x004c4e30` | `shell_company_detail_render_change_dividend_rate_dialog` | `shell` | `4` | +| `0x004c5140` | `shell_company_detail_handle_change_dividend_rate_dialog_message` | `shell` | `4` | +| `0x004c5360` | `shell_company_detail_change_dividend_rate_flow` | `shell` | `4` | +| `0x004c5540` | `shell_company_detail_window_construct` | `shell` | `4` | +| `0x004c56a0` | `shell_company_detail_window_handle_message` | `shell` | `4` | +| `0x004c5a0e` | `shell_company_detail_resign_chairmanship_flow` | `shell` | `4` | +| `0x004c5b99` | `shell_company_detail_bankruptcy_flow` | `shell` | `4` | +| `0x004c5fc9` | `shell_company_detail_buy_territory_access_rights_flow` | `shell` | `4` | +| `0x004c98a0` | `shell_open_custom_modal_dialog_with_callbacks` | `shell` | `4` | +| `0x004cd680` | `map_editor_locomotive_availability_panel_construct` | `map` | `4` | +| `0x004cf0d0` | `map_editor_locomotive_availability_panel_handle_message` | `map` | `4` | +| `0x004d0420` | `map_editor_city_count_stats_report` | `map` | `4` | +| `0x004d30a0` | `map_editor_city_count_stats_panel_construct` | `map` | `4` | +| `0x004d4500` | `shell_ensure_editor_panel_window` | `shell` | `4` | +| `0x004d57c0` | `shell_event_conditions_window_construct` | `shell` | `3` | +| `0x004d77b0` | `shell_event_conditions_window_refresh_grouped_effect_summary_band_affordances` | `shell` | `3` | +| `0x004d7ef0` | `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` | `shell` | `3` | +| `0x004d8120` | `shell_event_conditions_window_refresh_condition_row_list_panel` | `shell` | `3` | +| `0x004d88f0` | `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` | `shell` | `3` | +| `0x004d8d50` | `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` | `shell` | `3` | +| `0x004d8ea0` | `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` | `shell` | `3` | +| `0x004d9360` | `shell_event_conditions_window_remove_selected_event_and_refresh_selector` | `shell` | `3` | +| `0x004d9390` | `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` | `shell` | `3` | +| `0x004d9970` | `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` | `shell` | `3` | +| `0x004d9d10` | `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` | `shell` | `3` | +| `0x004d9dc0` | `shell_open_event_conditions_modal_and_return_result` | `shell` | `3` | +| `0x004d9e40` | `shell_open_event_effects_modal_and_return_result` | `shell` | `3` | +| `0x004d9ed0` | `shell_event_conditions_window_remove_selected_condition_row` | `shell` | `3` | +| `0x004d9f50` | `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` | `shell` | `3` | +| `0x004da0f0` | `shell_event_conditions_window_refresh_controls` | `shell` | `3` | +| `0x004da640` | `shell_event_conditions_window_append_default_condition_row_via_modal` | `shell` | `3` | +| `0x004da700` | `shell_event_conditions_window_edit_selected_condition_row_via_modal` | `shell` | `3` | +| `0x004da7c0` | `shell_event_effects_window_append_grouped_effect_row_via_modal` | `shell` | `3` | +| `0x004da860` | `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` | `shell` | `3` | +| `0x004da920` | `shell_event_effects_window_remove_selected_grouped_effect_row` | `shell` | `3` | +| `0x004da9a0` | `shell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event` | `shell` | `3` | +| `0x004dab60` | `shell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip` | `shell` | `3` | +| `0x004daf40` | `shell_event_conditions_window_reset_selected_event_summary_placeholders` | `shell` | `3` | +| `0x004db120` | `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` | `shell` | `3` | +| `0x004db520` | `shell_event_conditions_window_select_previous_event_and_refresh` | `shell` | `3` | +| `0x004db5e0` | `shell_event_conditions_window_select_next_event_and_refresh` | `shell` | `3` | +| `0x004db6a0` | `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` | `shell` | `3` | +| `0x004db6f0` | `shell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection` | `shell` | `3` | +| `0x004db8b0` | `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` | `shell` | `3` | +| `0x004dba90` | `shell_event_conditions_window_rename_selected_event_via_name_modal` | `shell` | `3` | +| `0x004dbb80` | `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` | `shell` | `3` | +| `0x004dbf93` | `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` | `shell` | `3` | +| `0x004dbfca` | `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` | `shell` | `3` | +| `0x004dd010` | `shell_file_request_dialog_collect_target_path` | `shell` | `4` | +| `0x004ddbd0` | `shell_detail_panel_transition_manager` | `shell` | `3` | +| `0x004e39e0` | `company_query_display_year_or_current_year` | `simulation` | `4` | +| `0x004e5130` | `shell_load_screen_render_company_stock_data_panel` | `shell` | `4` | +| `0x004e51ea` | `shell_load_screen_render_game_status_briefing_panel` | `shell` | `4` | +| `0x004e5300` | `shell_load_screen_render_player_detail_stock_holdings_panel` | `shell` | `4` | +| `0x004e5a80` | `shell_render_company_overview_panel_header_and_optional_change_affordance` | `shell` | `4` | +| `0x004e5cf0` | `shell_format_company_governance_and_economy_status_panel` | `shell` | `4` | +| `0x004e68e0` | `shell_load_screen_render_company_list_panel` | `shell` | `4` | +| `0x004e6ef0` | `shell_load_screen_render_player_list_panel` | `shell` | `4` | +| `0x004e7670` | `shell_load_screen_render_company_train_list_panel` | `shell` | `4` | +| `0x004e8270` | `shell_load_screen_render_company_industry_list_panel` | `shell` | `4` | +| `0x004e8bb0` | `shell_load_screen_render_company_station_list_panel` | `shell` | `4` | +| `0x004e9460` | `shell_load_screen_render_map_cargo_list_panel` | `shell` | `4` | +| `0x004e9b20` | `shell_load_screen_render_company_report_history_panel` | `shell` | `4` | +| `0x004ea060` | `shell_load_screen_render_active_page_panel` | `shell` | `4` | +| `0x004eb890` | `shell_present_merger_vote_outcome_dialog` | `shell` | `4` | +| `0x004ebd10` | `shell_resolve_merger_vote_and_commit_outcome` | `shell` | `4` | +| `0x004ec640` | `shell_company_detail_attempt_merger_flow` | `shell` | `4` | +| `0x004ee0e0` | `multiplayer_open_staged_text_entry_dialog` | `shell` | `3` | +| `0x00508550` | `station_place_format_selected_site_summary` | `shell` | `3` | +| `0x00508bb0` | `station_place_world_surface_sync_and_dispatch` | `shell` | `4` | +| `0x0050c500` | `shell_present_chairmanship_takeover_vote_outcome_dialog` | `shell` | `4` | +| `0x0050c940` | `shell_resolve_chairmanship_takeover_vote_and_commit_outcome` | `shell` | `4` | +| `0x0050ccc0` | `shell_company_detail_attempt_chairmanship_takeover_flow` | `shell` | `4` | +| `0x00513130` | `shell_trainbuy_window_query_selected_train_id` | `shell` | `4` | +| `0x00516d00` | `tutorial_validate_train_route_station_indicator_step` | `shell` | `4` | +| `0x00517cf0` | `indexed_collection_slot_count` | `simulation` | `4` | +| `0x00518140` | `indexed_collection_resolve_live_entry_by_id` | `simulation` | `4` | +| `0x00518380` | `indexed_collection_get_nth_live_entry_id` | `simulation` | `4` | +| `0x0051c920` | `localization_lookup_display_label_by_stem_or_fallback` | `shell` | `4` | +| `0x0051db80` | `math_measure_float_xy_pair_distance` | `support` | `4` | +| `0x0053f9c0` | `shell_window_register_child_control_sorted_by_priority_and_optional_tag` | `shell` | `3` | +| `0x0053fa50` | `shell_window_bind_resource_and_initialize_child_control_links` | `shell` | `4` | +| `0x00540a47` | `shell_control_refresh_matching_dynamic_text_payload` | `shell` | `3` | +| `0x0054f710` | `shell_queue_callout_segment_marker` | `shell` | `2` | +| `0x005519f0` | `shell_publish_text_callout_presentation` | `shell` | `3` | +| `0x00552900` | `shell_queue_projected_world_anchor_quad` | `shell` | `3` | +| `0x00558130` | `shell_child_control_set_owner_resolve_caption_and_refresh` | `shell` | `3` | +| `0x005639d2` | `shell_control_release_dynamic_text_payload` | `shell` | `3` | +| `0x005a152e` | `math_abs_double_with_crt_special_case_handling` | `support` | `4` | + +## Edges + +- `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00424010` `company_has_territory_access_rights` +- `0x004014b0` `company_try_buy_unowned_industry_near_city_and_publish_news` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00426590` `company_count_linked_transit_sites` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x00401860` `company_query_cached_linked_transit_route_anchor_entry_id` + -> `0x004801a0` `placed_structure_is_linked_transit_site_reachable_from_company_route_anchor` +- `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x004014b0` `company_try_buy_unowned_industry_near_city_and_publish_news` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x00409300` `company_publish_train_upgrade_news` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x00409830` `company_try_add_linked_transit_train_and_publish_news` + -> `0x00409950` `company_balance_linked_transit_train_roster` + -> `0x0041d550` `locomotive_era_and_engine_type_pass_company_policy_gate` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` +- `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x004261b0` `company_count_unassigned_shares_after_active_chairman_holdings` + -> `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x00427450` `company_issue_public_shares_and_raise_capital` + -> `0x004275c0` `company_issue_bond_and_record_terms` + -> `0x0042a0e0` `company_query_highest_coupon_bond_slot_index` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` +- `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00420280` `city_connection_bonus_select_first_matching_peer_site` +- `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` +- `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x00426590` `company_count_linked_transit_sites` + -> `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x00427590` `company_connection_bonus_lane_is_unlocked` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00409300` `company_publish_train_upgrade_news` + -> `0x00409830` `company_try_add_linked_transit_train_and_publish_news` + -> `0x0041d550` `locomotive_era_and_engine_type_pass_company_policy_gate` + -> `0x00461cd0` `locomotive_collection_select_best_era_matched_non_electric_fallback_id` +- `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x0047e330` `placed_structure_count_candidates_with_local_service_metrics` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x00408280` `company_select_best_owned_linked_transit_site_by_autoroute_score` + -> `0x00408380` `company_build_linked_transit_autoroute_entry` +- `0x00408380` `company_build_linked_transit_autoroute_entry` + -> `0x00408280` `company_select_best_owned_linked_transit_site_by_autoroute_score` + -> `0x00408f70` `company_compute_owned_linked_transit_site_score_total` + -> `0x00409770` `train_try_append_linked_transit_autoroute_entry` +- `0x00408f70` `company_compute_owned_linked_transit_site_score_total` + -> `0x00409950` `company_balance_linked_transit_train_roster` +- `0x00409300` `company_publish_train_upgrade_news` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x00409950` `company_balance_linked_transit_train_roster` +- `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x0047efe0` `placed_structure_query_linked_company_id` + -> `0x004801a0` `placed_structure_is_linked_transit_site_reachable_from_company_route_anchor` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x00409770` `train_try_append_linked_transit_autoroute_entry` + -> `0x00408380` `company_build_linked_transit_autoroute_entry` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` +- `0x00409830` `company_try_add_linked_transit_train_and_publish_news` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x00408380` `company_build_linked_transit_autoroute_entry` + -> `0x00409950` `company_balance_linked_transit_train_roster` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` +- `0x00409950` `company_balance_linked_transit_train_roster` + -> `0x00408f70` `company_compute_owned_linked_transit_site_score_total` + -> `0x00409300` `company_publish_train_upgrade_news` + -> `0x00409830` `company_try_add_linked_transit_train_and_publish_news` + -> `0x004264c0` `company_count_owned_trains` + -> `0x00426590` `company_count_linked_transit_sites` +- `0x0040a590` `simulation_service_periodic_boundary_work` + -> `0x00413580` `placed_structure_collection_refresh_quarter_subset_route_style_state` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` +- `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` +- `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x00481480` `placed_structure_collection_append_site_into_all_proximity_bucket_lists` + -> `0x004814c0` `placed_structure_collection_remove_site_id_from_all_proximity_bucket_lists` + -> `0x00508bb0` `station_place_world_surface_sync_and_dispatch` +- `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` + -> `0x00434050` `shell_has_auxiliary_preview_owner` +- `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` +- `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` + -> `0x00481390` `placed_structure_collection_allocate_and_construct_linked_site_record` +- `0x0040fbe0` `placed_structure_endpoint_pair_has_shared_route_entry_key` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x00467f50` `placed_structure_route_link_allocate_site_pair_for_candidate_class` +- `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x0040fbe0` `placed_structure_endpoint_pair_has_shared_route_entry_key` + -> `0x00467f50` `placed_structure_route_link_allocate_site_pair_for_candidate_class` +- `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x00436590` `scenario_state_compute_issue_opinion_multiplier` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` +- `0x00412ca0` `world_region_pick_commercial_profile_label_by_region_rank` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` +- `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x00422ee0` `world_region_try_place_candidate_structure` +- `0x00413580` `placed_structure_collection_refresh_quarter_subset_route_style_state` + -> `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` +- `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x004160c0` `placed_structure_collect_connected_component_tile_bounds_with_version_gate` +- `0x004160c0` `placed_structure_collect_connected_component_tile_bounds_with_version_gate` + -> `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` +- `0x00416170` `placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh` + -> `0x004160c0` `placed_structure_collect_connected_component_tile_bounds_with_version_gate` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` +- `0x00416620` `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` + -> `0x00416ec0` `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` +- `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00416ec0` `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` + -> `0x00416620` `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` +- `0x00417790` `map_angle_rotate_grid_offset_pair_into_world_offset_pair` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` +- `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00417790` `map_angle_rotate_grid_offset_pair_into_world_offset_pair` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` +- `0x00418040` `placed_structure_render_local_runtime_overlay_payload_from_projected_bounds` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` +- `0x004185a0` `world_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples` + -> `0x00418610` `world_grid_refresh_projected_rect_sample_band_and_flag_mask` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x00418610` `world_grid_refresh_projected_rect_sample_band_and_flag_mask` + -> `0x00415020` `world_grid_refresh_flagged_region_float_extrema_and_mean` + -> `0x004185a0` `world_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` +- `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00416170` `placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh` + -> `0x004185a0` `world_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples` +- `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x00416170` `placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh` + -> `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x00416ec0` `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` + -> `0x00418040` `placed_structure_render_local_runtime_overlay_payload_from_projected_bounds` + -> `0x00418610` `world_grid_refresh_projected_rect_sample_band_and_flag_mask` +- `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` +- `0x0041d550` `locomotive_era_and_engine_type_pass_company_policy_gate` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x00436710` `scenario_state_sum_issue_opinion_terms_raw` + -> `0x00461cd0` `locomotive_collection_select_best_era_matched_non_electric_fallback_id` + -> `0x004cd680` `map_editor_locomotive_availability_panel_construct` + -> `0x004cf0d0` `map_editor_locomotive_availability_panel_handle_message` +- `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0042c690` `placed_structure_rebuild_candidate_cargo_service_bitsets` +- `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` + -> `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0041f9b0` `world_region_count_structure_profiles_before_year_for_category` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x004207d0` `city_site_format_connection_bonus_status_label` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00420280` `city_connection_bonus_select_first_matching_peer_site` + -> `0x004207d0` `city_site_format_connection_bonus_status_label` +- `0x004207d0` `city_site_format_connection_bonus_status_label` + -> `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x00420280` `city_connection_bonus_select_first_matching_peer_site` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422a70` `world_region_validate_and_commit_candidate_placement` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00422ee0` `world_region_try_place_candidate_structure` + -> `0x00430270` `world_try_place_random_structure_batch_from_compact_record` +- `0x00422be0` `world_region_count_placed_structures_for_category` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422ee0` `world_region_try_place_candidate_structure` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x004234e0` `world_region_query_projected_structure_count_scalar_by_category` + -> `0x004d0420` `map_editor_city_count_stats_report` +- `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` + -> `0x00412ca0` `world_region_pick_commercial_profile_label_by_region_rank` + -> `0x0041f9b0` `world_region_count_structure_profiles_before_year_for_category` + -> `0x0041fac0` `world_region_read_structure_profile_label_and_weight_by_index` + -> `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x00422be0` `world_region_count_placed_structures_for_category` + -> `0x00422ee0` `world_region_try_place_candidate_structure` + -> `0x004234e0` `world_region_query_projected_structure_count_scalar_by_category` +- `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` + -> `0x0042a080` `company_add_delta_into_stat_series_current_slot_and_optional_cash_totals` +- `0x00423e40` `company_compute_weighted_average_bond_interest_rate` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x004c23a0` `shell_company_detail_render_debt_credit_and_rate_summary_panel` +- `0x00423eb0` `company_query_cached_share_price_scalar` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x004c2720` `shell_company_detail_render_share_value_and_dividend_summary_panel` +- `0x00423ec0` `company_adjust_available_track_laying_capacity_with_floor_zero` + -> `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` +- `0x00424010` `company_has_territory_access_rights` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x00424030` `company_set_territory_access_rights_byte` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` +- `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x00425880` `company_compute_negative_cash_balance_interest_rate` + -> `0x004258c0` `company_compute_positive_cash_balance_interest_rate` + -> `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x00436710` `scenario_state_sum_issue_opinion_terms_raw` + -> `0x004c23a0` `shell_company_detail_render_debt_credit_and_rate_summary_panel` +- `0x004246b0` `company_compute_five_year_weighted_shareholder_return` + -> `0x0042a2e0` `company_read_control_transfer_metric_slot` +- `0x004248d0` `company_compute_cached_recent_per_share_performance_subscore` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x00423eb0` `company_query_cached_share_price_scalar` + -> `0x004248d0` `company_compute_cached_recent_per_share_performance_subscore` + -> `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x00427450` `company_issue_public_shares_and_raise_capital` + -> `0x00436590` `scenario_state_compute_issue_opinion_multiplier` + -> `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` +- `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00423e40` `company_compute_weighted_average_bond_interest_rate` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x00427590` `company_connection_bonus_lane_is_unlocked` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00425880` `company_compute_negative_cash_balance_interest_rate` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x004258c0` `company_compute_positive_cash_balance_interest_rate` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` +- `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` +- `0x004264c0` `company_count_owned_trains` + -> `0x00409950` `company_balance_linked_transit_train_roster` + -> `0x004e7670` `shell_load_screen_render_company_train_list_panel` +- `0x00426590` `company_count_linked_transit_sites` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` + -> `0x0042a080` `company_add_delta_into_stat_series_current_slot_and_optional_cash_totals` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` +- `0x00427450` `company_issue_public_shares_and_raise_capital` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` +- `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x004275c0` `company_issue_bond_and_record_terms` +- `0x00427590` `company_connection_bonus_lane_is_unlocked` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` +- `0x004275c0` `company_issue_bond_and_record_terms` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` +- `0x00429a50` `company_collection_count_active_companies` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00429c70` `company_read_derived_financial_report_metric_slot` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x0042a080` `company_add_delta_into_stat_series_current_slot_and_optional_cash_totals` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` +- `0x0042a0e0` `company_query_highest_coupon_bond_slot_index` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` +- `0x0042a2e0` `company_read_control_transfer_metric_slot` + -> `0x004246b0` `company_compute_five_year_weighted_shareholder_return` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x00429c70` `company_read_derived_financial_report_metric_slot` +- `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x00429c70` `company_read_derived_financial_report_metric_slot` + -> `0x0042a2e0` `company_read_control_transfer_metric_slot` +- `0x0042c690` `placed_structure_rebuild_candidate_cargo_service_bitsets` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0042cdf0` `placed_structure_refresh_candidate_service_state` +- `0x0042cdf0` `placed_structure_refresh_candidate_service_state` + -> `0x0042c690` `placed_structure_rebuild_candidate_cargo_service_bitsets` +- `0x0042d700` `scenario_event_query_standalone_condition_row_list_class_and_modifier_flags` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x0042d740` `scenario_event_query_grouped_effect_row_list_type_flags` + -> `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x0042db20` `scenario_event_refresh_runtime_record_from_packed_state` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` + -> `0x0042df70` `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` + -> `0x0042dfb0` `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` + -> `0x0042dff0` `scenario_event_condition_row_list_has_any_class_bit012_or_special_fallback` + -> `0x0042e050` `scenario_event_clone_runtime_record_deep_copy` + -> `0x00433130` `scenario_event_collection_refresh_runtime_records_from_packed_state` +- `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` + -> `0x0042db20` `scenario_event_refresh_runtime_record_from_packed_state` +- `0x0042df70` `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` +- `0x0042dfb0` `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` +- `0x0042dff0` `scenario_event_condition_row_list_has_any_class_bit012_or_special_fallback` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` + -> `0x0042df70` `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` + -> `0x0042dfb0` `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` +- `0x0042e050` `scenario_event_clone_runtime_record_deep_copy` + -> `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` +- `0x00430270` `world_try_place_random_structure_batch_from_compact_record` + -> `0x00422a70` `world_region_validate_and_commit_candidate_placement` +- `0x00430b50` `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` + -> `0x00431b20` `world_apply_compact_runtime_effect_record_to_resolved_targets` + -> `0x00432ea0` `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` +- `0x00431b20` `world_apply_compact_runtime_effect_record_to_resolved_targets` + -> `0x00424030` `company_set_territory_access_rights_byte` + -> `0x00430270` `world_try_place_random_structure_batch_from_compact_record` + -> `0x00434890` `scenario_state_set_selected_chairman_profile` + -> `0x004348c0` `scenario_state_get_selected_chairman_profile_record` +- `0x004323a0` `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x0042d700` `scenario_event_query_standalone_condition_row_list_class_and_modifier_flags` + -> `0x00430b50` `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` + -> `0x00431b20` `world_apply_compact_runtime_effect_record_to_resolved_targets` + -> `0x00432f40` `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` +- `0x00432ea0` `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` + -> `0x00430b50` `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` +- `0x00432f40` `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` + -> `0x0040a590` `simulation_service_periodic_boundary_work` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x004323a0` `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` + -> `0x0047d120` `start_new_company_dialog_commit_create_company` + -> `0x004e51ea` `shell_load_screen_render_game_status_briefing_panel` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00433130` `scenario_event_collection_refresh_runtime_records_from_packed_state` + -> `0x0042db20` `scenario_event_refresh_runtime_record_from_packed_state` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` + -> `0x00482160` `shell_state_service_active_mode_frame` + -> `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bb9e0` `shell_building_detail_window_handle_message` +- `0x004348c0` `scenario_state_get_selected_chairman_profile_record` + -> `0x00434890` `scenario_state_set_selected_chairman_profile` +- `0x00436590` `scenario_state_compute_issue_opinion_multiplier` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` +- `0x00436710` `scenario_state_sum_issue_opinion_terms_raw` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` +- `0x00445de0` `shell_map_file_world_bundle_coordinator` + -> `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x00444dd0` `map_bundle_open_reference_databases` + -> `0x00446240` `world_runtime_serialize_smp_bundle` + -> `0x004dd010` `shell_file_request_dialog_collect_target_path` +- `0x00446240` `world_runtime_serialize_smp_bundle` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` +- `0x00461cd0` `locomotive_collection_select_best_era_matched_non_electric_fallback_id` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x0041d550` `locomotive_era_and_engine_type_pass_company_policy_gate` +- `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` + -> `0x00467eb0` `placed_structure_route_link_attach_site_owner` +- `0x00467eb0` `placed_structure_route_link_attach_site_owner` + -> `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` + -> `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` +- `0x00467f50` `placed_structure_route_link_allocate_site_pair_for_candidate_class` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` + -> `0x00467eb0` `placed_structure_route_link_attach_site_owner` +- `0x004682c0` `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` + -> `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00469720` `multiplayer_preview_dataset_service_frame` + -> `0x005519f0` `shell_publish_text_callout_presentation` +- `0x004768c0` `chairman_profile_owns_all_company_shares` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` +- `0x00477860` `profile_collection_get_nth_active_chairman_record` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` +- `0x0047d120` `start_new_company_dialog_commit_create_company` + -> `0x00432f40` `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` +- `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x00477860` `profile_collection_get_nth_active_chairman_record` +- `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` +- `0x0047e330` `placed_structure_count_candidates_with_local_service_metrics` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0047fdb0` `placed_structure_append_nearby_transit_site_distance_bucket_entry` + -> `0x0051db80` `math_measure_float_xy_pair_distance` +- `0x004801a0` `placed_structure_is_linked_transit_site_reachable_from_company_route_anchor` + -> `0x00401860` `company_query_cached_linked_transit_route_anchor_entry_id` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` +- `0x00480210` `placed_structure_construct_linked_site_record_from_anchor_and_coords` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00481390` `placed_structure_collection_allocate_and_construct_linked_site_record` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` +- `0x00480bb0` `placed_structure_refresh_linked_site_display_name_and_route_anchor` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x004682c0` `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x004a45f0` `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` +- `0x00481390` `placed_structure_collection_allocate_and_construct_linked_site_record` + -> `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x00480210` `placed_structure_construct_linked_site_record_from_anchor_and_coords` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x00481480` `placed_structure_collection_append_site_into_all_proximity_bucket_lists` + -> `0x0047fdb0` `placed_structure_append_nearby_transit_site_distance_bucket_entry` +- `0x004814c0` `placed_structure_collection_remove_site_id_from_all_proximity_bucket_lists` + -> `0x0047dd10` `placed_structure_remove_site_id_from_proximity_bucket_lists` +- `0x00482160` `shell_state_service_active_mode_frame` + -> `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x00469720` `multiplayer_preview_dataset_service_frame` +- `0x00482d10` `runtime_query_cached_local_exe_version_float` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` +- `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x00482d10` `runtime_query_cached_local_exe_version_float` +- `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00482d10` `runtime_query_cached_local_exe_version_float` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` + -> `0x00423ec0` `company_adjust_available_track_laying_capacity_with_floor_zero` + -> `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x004955b0` `route_entry_collection_map_track_lay_mode_to_endpoint_policy_byte` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` +- `0x00494e40` `aux_route_entry_tracker_reset` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` +- `0x00494e90` `aux_route_entry_tracker_seed_owner_entry_id` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` +- `0x00494eb0` `aux_route_entry_tracker_adjust_refcount` + -> `0x004a4340` `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` +- `0x00494f00` `aux_route_entry_tracker_merge_or_bind_endpoint_entry` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x004952f0` `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` + -> `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x004953c0` `math_normalize_subtracted_angle_delta_and_report_wrap` + -> `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` +- `0x004955b0` `route_entry_collection_map_track_lay_mode_to_endpoint_policy_byte` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` +- `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` + -> `0x0051db80` `math_measure_float_xy_pair_distance` +- `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` + -> `0x004952f0` `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` + -> `0x004953c0` `math_normalize_subtracted_angle_delta_and_report_wrap` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x005a152e` `math_abs_double_with_crt_special_case_handling` +- `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` + -> `0x004952f0` `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` + -> `0x004953c0` `math_normalize_subtracted_angle_delta_and_report_wrap` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x0051db80` `math_measure_float_xy_pair_distance` + -> `0x005a152e` `math_abs_double_with_crt_special_case_handling` +- `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00480bb0` `placed_structure_refresh_linked_site_display_name_and_route_anchor` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` + -> `0x00494f00` `aux_route_entry_tracker_merge_or_bind_endpoint_entry` + -> `0x004952f0` `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` + -> `0x004a4340` `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` + -> `0x00494e40` `aux_route_entry_tracker_reset` + -> `0x00494e90` `aux_route_entry_tracker_seed_owner_entry_id` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x004a4340` `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` + -> `0x00494eb0` `aux_route_entry_tracker_adjust_refcount` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x004a45f0` `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` + -> `0x00480bb0` `placed_structure_refresh_linked_site_display_name_and_route_anchor` + -> `0x00494eb0` `aux_route_entry_tracker_adjust_refcount` + -> `0x00494f00` `aux_route_entry_tracker_merge_or_bind_endpoint_entry` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` +- `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` + -> `0x004b2c10` `train_route_list_validate_reachability_and_station_pair` +- `0x004b2c10` `train_route_list_validate_reachability_and_station_pair` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x004b3160` `train_route_list_insert_staged_entry_at_index` + -> `0x00516d00` `tutorial_validate_train_route_station_indicator_step` +- `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004b99c0` `structure_candidate_collection_get_nth_active_candidate_id` +- `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bb9e0` `shell_building_detail_window_handle_message` + -> `0x00513130` `shell_trainbuy_window_query_selected_train_id` +- `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` +- `0x004bb9e0` `shell_building_detail_window_handle_message` + -> `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004bfb30` `shell_format_company_financial_summary_card` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004c1ab0` `shell_company_detail_render_company_summary_card` +- `0x004c0160` `shell_format_company_stock_data_panel` + -> `0x004246b0` `company_compute_five_year_weighted_shareholder_return` + -> `0x004e5130` `shell_load_screen_render_company_stock_data_panel` +- `0x004c1610` `shell_company_detail_bind_bond_row_band_for_active_panel` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` +- `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c1ab0` `shell_company_detail_render_company_summary_card` + -> `0x004bfb30` `shell_format_company_financial_summary_card` + -> `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` + -> `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` +- `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` +- `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x0054f710` `shell_queue_callout_segment_marker` +- `0x004c1ec0` `shell_company_detail_render_bond_maturity_and_repay_panel` + -> `0x004c1610` `shell_company_detail_bind_bond_row_band_for_active_panel` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` +- `0x004c23a0` `shell_company_detail_render_debt_credit_and_rate_summary_panel` + -> `0x00423e40` `company_compute_weighted_average_bond_interest_rate` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x004c2720` `shell_company_detail_render_share_value_and_dividend_summary_panel` + -> `0x00423eb0` `company_query_cached_share_price_scalar` + -> `0x004c0160` `shell_format_company_stock_data_panel` +- `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x00434870` `scenario_state_get_selected_chairman_company_record` + -> `0x004c5540` `shell_company_detail_window_construct` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00540a47` `shell_control_refresh_matching_dynamic_text_payload` + -> `0x005639d2` `shell_control_release_dynamic_text_payload` +- `0x004c3560` `shell_company_detail_render_issue_bond_offer_dialog` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004275c0` `company_issue_bond_and_record_terms` + -> `0x004c3560` `shell_company_detail_render_issue_bond_offer_dialog` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x00427450` `company_issue_public_shares_and_raise_capital` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c4300` `shell_company_detail_render_stock_buyback_offer_dialog` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x004c4300` `shell_company_detail_render_stock_buyback_offer_dialog` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` +- `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5540` `shell_company_detail_window_construct` + -> `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x004c1ab0` `shell_company_detail_render_company_summary_card` + -> `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x004c1ec0` `shell_company_detail_render_bond_maturity_and_repay_panel` + -> `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00426d60` `company_deactivate_and_clear_chairman_share_links` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c5a0e` `shell_company_detail_resign_chairmanship_flow` + -> `0x004c5b99` `shell_company_detail_bankruptcy_flow` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` + -> `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004ec640` `shell_company_detail_attempt_merger_flow` + -> `0x0050ccc0` `shell_company_detail_attempt_chairmanship_takeover_flow` +- `0x004c5a0e` `shell_company_detail_resign_chairmanship_flow` + -> `0x00428a10` `company_clear_selected_chairman_if_current_profile` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5b99` `shell_company_detail_bankruptcy_flow` + -> `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` + -> `0x00424030` `company_set_territory_access_rights_byte` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004ee0e0` `multiplayer_open_staged_text_entry_dialog` +- `0x004cf0d0` `map_editor_locomotive_availability_panel_handle_message` + -> `0x004cd680` `map_editor_locomotive_availability_panel_construct` +- `0x004d0420` `map_editor_city_count_stats_report` + -> `0x004234e0` `world_region_query_projected_structure_count_scalar_by_category` + -> `0x004d30a0` `map_editor_city_count_stats_panel_construct` +- `0x004d30a0` `map_editor_city_count_stats_panel_construct` + -> `0x004d0420` `map_editor_city_count_stats_report` +- `0x004d4500` `shell_ensure_editor_panel_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004d57c0` `shell_event_conditions_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004d77b0` `shell_event_conditions_window_refresh_grouped_effect_summary_band_affordances` + -> `0x004d9390` `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` +- `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9ed0` `shell_event_conditions_window_remove_selected_condition_row` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9390` `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` + -> `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` + -> `0x004da920` `shell_event_effects_window_remove_selected_grouped_effect_row` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` +- `0x004d8d50` `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` + -> `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` +- `0x004d8ea0` `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` + -> `0x004db520` `shell_event_conditions_window_select_previous_event_and_refresh` + -> `0x004db5e0` `shell_event_conditions_window_select_next_event_and_refresh` + -> `0x004db6a0` `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` + -> `0x004dbfca` `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` +- `0x004d9360` `shell_event_conditions_window_remove_selected_event_and_refresh_selector` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` +- `0x004d9390` `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` + -> `0x004d77b0` `shell_event_conditions_window_refresh_grouped_effect_summary_band_affordances` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` + -> `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` +- `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x0042d700` `scenario_event_query_standalone_condition_row_list_class_and_modifier_flags` + -> `0x004d9ed0` `shell_event_conditions_window_remove_selected_condition_row` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x0042d740` `scenario_event_query_grouped_effect_row_list_type_flags` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` +- `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` + -> `0x004d57c0` `shell_event_conditions_window_construct` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` +- `0x004d9ed0` `shell_event_conditions_window_remove_selected_condition_row` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` +- `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004d9390` `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` +- `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x0042d740` `scenario_event_query_grouped_effect_row_list_type_flags` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` + -> `0x0042df70` `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` + -> `0x0042dfb0` `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` + -> `0x0042dff0` `scenario_event_condition_row_list_has_any_class_bit012_or_special_fallback` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004dbfca` `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` +- `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` +- `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` +- `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x004da920` `shell_event_effects_window_remove_selected_grouped_effect_row` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x004da9a0` `shell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` +- `0x004dab60` `shell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip` + -> `0x004d8d50` `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` + -> `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x004da9a0` `shell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event` +- `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` + -> `0x004db6a0` `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` + -> `0x004db6f0` `shell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection` +- `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004dab60` `shell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip` +- `0x004db520` `shell_event_conditions_window_select_previous_event_and_refresh` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004d8ea0` `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004db5e0` `shell_event_conditions_window_select_next_event_and_refresh` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004db520` `shell_event_conditions_window_select_previous_event_and_refresh` +- `0x004db6a0` `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` + -> `0x004d8ea0` `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` + -> `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004db6f0` `shell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection` +- `0x004db6f0` `shell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004db6a0` `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` +- `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` + -> `0x0042e050` `scenario_event_clone_runtime_record_deep_copy` + -> `0x00432ea0` `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004dba90` `shell_event_conditions_window_rename_selected_event_via_name_modal` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` + -> `0x004d9360` `shell_event_conditions_window_remove_selected_event_and_refresh_selector` + -> `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004db520` `shell_event_conditions_window_select_previous_event_and_refresh` + -> `0x004db5e0` `shell_event_conditions_window_select_next_event_and_refresh` + -> `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` + -> `0x004dba90` `shell_event_conditions_window_rename_selected_event_via_name_modal` + -> `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` + -> `0x004dbfca` `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` +- `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d8d50` `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x004da9a0` `shell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event` + -> `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` +- `0x004dbfca` `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` + -> `0x004d8ea0` `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` + -> `0x004dab60` `shell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004dd010` `shell_file_request_dialog_collect_target_path` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` +- `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004d4500` `shell_ensure_editor_panel_window` +- `0x004e39e0` `company_query_display_year_or_current_year` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e5130` `shell_load_screen_render_company_stock_data_panel` + -> `0x004c0160` `shell_format_company_stock_data_panel` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004e51ea` `shell_load_screen_render_game_status_briefing_panel` + -> `0x00432f40` `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x004348c0` `scenario_state_get_selected_chairman_profile_record` +- `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x00434870` `scenario_state_get_selected_chairman_company_record` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004768c0` `chairman_profile_owns_all_company_shares` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x004e39e0` `company_query_display_year_or_current_year` +- `0x004e68e0` `shell_load_screen_render_company_list_panel` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x004e6ef0` `shell_load_screen_render_player_list_panel` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x00477860` `profile_collection_get_nth_active_chairman_record` +- `0x004e7670` `shell_load_screen_render_company_train_list_panel` + -> `0x004264c0` `company_count_owned_trains` + -> `0x004e39e0` `company_query_display_year_or_current_year` +- `0x004e8bb0` `shell_load_screen_render_company_station_list_panel` + -> `0x00426590` `company_count_linked_transit_sites` +- `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` +- `0x004e9b20` `shell_load_screen_render_company_report_history_panel` + -> `0x00425880` `company_compute_negative_cash_balance_interest_rate` + -> `0x004258c0` `company_compute_positive_cash_balance_interest_rate` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004ea060` `shell_load_screen_render_active_page_panel` + -> `0x004e5130` `shell_load_screen_render_company_stock_data_panel` + -> `0x004e51ea` `shell_load_screen_render_game_status_briefing_panel` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e68e0` `shell_load_screen_render_company_list_panel` + -> `0x004e6ef0` `shell_load_screen_render_player_list_panel` + -> `0x004e7670` `shell_load_screen_render_company_train_list_panel` + -> `0x004e8270` `shell_load_screen_render_company_industry_list_panel` + -> `0x004e8bb0` `shell_load_screen_render_company_station_list_panel` + -> `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x004eb890` `shell_present_merger_vote_outcome_dialog` + -> `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` +- `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` + -> `0x004eb890` `shell_present_merger_vote_outcome_dialog` +- `0x004ec640` `shell_company_detail_attempt_merger_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` +- `0x004ee0e0` `multiplayer_open_staged_text_entry_dialog` + -> `0x00484910` `shell_save_graphics_config` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x00508bb0` `station_place_world_surface_sync_and_dispatch` + -> `0x00508550` `station_place_format_selected_site_summary` +- `0x0050c500` `shell_present_chairmanship_takeover_vote_outcome_dialog` + -> `0x0050c940` `shell_resolve_chairmanship_takeover_vote_and_commit_outcome` +- `0x0050c940` `shell_resolve_chairmanship_takeover_vote_and_commit_outcome` + -> `0x0050c500` `shell_present_chairmanship_takeover_vote_outcome_dialog` +- `0x0050ccc0` `shell_company_detail_attempt_chairmanship_takeover_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x0050c940` `shell_resolve_chairmanship_takeover_vote_and_commit_outcome` +- `0x00516d00` `tutorial_validate_train_route_station_indicator_step` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` +- `0x0051db80` `math_measure_float_xy_pair_distance` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x00552900` `shell_queue_projected_world_anchor_quad` +- `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` + -> `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x00558130` `shell_child_control_set_owner_resolve_caption_and_refresh` +- `0x00540a47` `shell_control_refresh_matching_dynamic_text_payload` + -> `0x005639d2` `shell_control_release_dynamic_text_payload` +- `0x00552900` `shell_queue_projected_world_anchor_quad` + -> `0x0051db80` `math_measure_float_xy_pair_distance` +- `0x00558130` `shell_child_control_set_owner_resolve_caption_and_refresh` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` +- `0x005a152e` `math_abs_double_with_crt_special_case_handling` + -> `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` diff --git a/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-subgraph.dot b/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-subgraph.dot new file mode 100644 index 0000000..ea2a5e3 --- /dev/null +++ b/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-subgraph.dot @@ -0,0 +1,1794 @@ +digraph shell_load { + graph [rankdir=LR, labelloc="t", labeljust="l"]; + label="Scenario Runtime Effect Service Subgraph (Depth 7)"; + node [shape=box, style="rounded,filled", fillcolor="#f8f8f8", color="#555555", fontname="Helvetica"]; + edge [color="#666666", fontname="Helvetica"]; + subgraph cluster_bootstrap { + label="bootstrap"; + color="#cccccc"; + "0x00482ec0" [label="0x00482ec0\\nshell_transition_mode", fillcolor="#f8f8f8"]; + "0x004840e0" [label="0x004840e0\\nbootstrap_init_shell_window_services", fillcolor="#f8f8f8"]; + "0x00521060" [label="0x00521060\\nbootstrap_init_shell_service_bundle", fillcolor="#f8f8f8"]; + "0x00521390" [label="0x00521390\\nbootstrap_destroy_shell_service_bundle", fillcolor="#f8f8f8"]; + } + subgraph cluster_map { + label="map"; + color="#cccccc"; + "0x004010f0" [label="0x004010f0\\ncity_compute_connection_bonus_candidate_weight", fillcolor="#f8f8f8"]; + "0x00402c90" [label="0x00402c90\\nplaced_structure_resolve_linked_candidate_record", fillcolor="#f8f8f8"]; + "0x00402cb0" [label="0x00402cb0\\ncity_connection_try_build_route_with_optional_direct_site_placement", fillcolor="#f8f8f8"]; + "0x00404640" [label="0x00404640\\ncity_connection_bonus_try_compact_route_builder_from_region_entry", fillcolor="#f8f8f8"]; + "0x004046a0" [label="0x004046a0\\ncity_connection_bonus_build_peer_route_candidate", fillcolor="#f8f8f8"]; + "0x00404c60" [label="0x00404c60\\ncity_connection_try_build_route_between_region_entry_pair", fillcolor="#f8f8f8"]; + "0x0040e360" [label="0x0040e360\\nplaced_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime", fillcolor="#f8f8f8"]; + "0x0040e450" [label="0x0040e450\\nplaced_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem", fillcolor="#f8f8f8"]; + "0x0040eba0" [label="0x0040eba0\\nplaced_structure_set_world_coords_and_refresh_local_runtime_side_state", fillcolor="#f8f8f8"]; + "0x0040ee10" [label="0x0040ee10\\nplaced_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon", fillcolor="#f8f8f8"]; + "0x0040ef10" [label="0x0040ef10\\nplaced_structure_finalize_creation_or_rebuild_local_runtime_state", fillcolor="#f8f8f8"]; + "0x0040f6d0" [label="0x0040f6d0\\nplaced_structure_construct_entry_from_candidate_and_world_args", fillcolor="#f8f8f8"]; + "0x0040fbe0" [label="0x0040fbe0\\nplaced_structure_endpoint_pair_has_shared_route_entry_key", fillcolor="#f8f8f8"]; + "0x0040fef0" [label="0x0040fef0\\nplaced_structure_try_emit_best_route_style_peer_link_for_candidate_class", fillcolor="#f8f8f8"]; + "0x004101e0" [label="0x004101e0\\nplaced_structure_rebuild_route_style_candidate_scores_and_peer_links", fillcolor="#f8f8f8"]; + "0x00412ca0" [label="0x00412ca0\\nworld_region_pick_commercial_profile_label_by_region_rank", fillcolor="#f8f8f8"]; + "0x004133b0" [label="0x004133b0\\nplaced_structure_collection_refresh_local_runtime_records_and_position_scalars", fillcolor="#f8f8f8"]; + "0x004134d0" [label="0x004134d0\\nplaced_structure_collection_allocate_and_construct_entry", fillcolor="#f8f8f8"]; + "0x00413580" [label="0x00413580\\nplaced_structure_collection_refresh_quarter_subset_route_style_state", fillcolor="#f8f8f8"]; + "0x00413f50" [label="0x00413f50\\nplaced_structure_local_runtime_site_id_queue_pop_next", fillcolor="#f8f8f8"]; + "0x00414470" [label="0x00414470\\nplaced_structure_cache_projected_rect_profile_slot_id", fillcolor="#f8f8f8"]; + "0x00414480" [label="0x00414480\\nplaced_structure_local_runtime_site_id_queue_count", fillcolor="#f8f8f8"]; + "0x00414e10" [label="0x00414e10\\nworld_grid_refresh_projected_rect_surface_and_region_byte_tables", fillcolor="#f8f8f8"]; + "0x00414fa0" [label="0x00414fa0\\nworld_grid_count_flagged_cells_and_collect_float_samples", fillcolor="#f8f8f8"]; + "0x00415020" [label="0x00415020\\nworld_grid_refresh_flagged_region_float_extrema_and_mean", fillcolor="#f8f8f8"]; + "0x00415570" [label="0x00415570\\nplaced_structure_try_select_projected_rect_profile_slot", fillcolor="#f8f8f8"]; + "0x00415f20" [label="0x00415f20\\nplaced_structure_recursive_collect_connected_component_tile_bounds", fillcolor="#f8f8f8"]; + "0x004160c0" [label="0x004160c0\\nplaced_structure_collect_connected_component_tile_bounds_with_version_gate", fillcolor="#f8f8f8"]; + "0x00416170" [label="0x00416170\\nplaced_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh", fillcolor="#f8f8f8"]; + "0x00416620" [label="0x00416620\\nplaced_structure_publish_projected_runtime_rect_globals_and_validate_side_windows", fillcolor="#f8f8f8"]; + "0x00416e20" [label="0x00416e20\\nindexed_collection_resolve_live_entry_id_by_stem_string", fillcolor="#f8f8f8"]; + "0x00416ec0" [label="0x00416ec0\\nplaced_structure_build_projected_runtime_scratch_from_candidate_and_coords", fillcolor="#f8f8f8"]; + "0x00417790" [label="0x00417790\\nmap_angle_rotate_grid_offset_pair_into_world_offset_pair", fillcolor="#f8f8f8"]; + "0x00417840" [label="0x00417840\\nplaced_structure_project_candidate_grid_extent_offset_by_rotation", fillcolor="#f8f8f8"]; + "0x00418040" [label="0x00418040\\nplaced_structure_render_local_runtime_overlay_payload_from_projected_bounds", fillcolor="#f8f8f8"]; + "0x004185a0" [label="0x004185a0\\nworld_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples", fillcolor="#f8f8f8"]; + "0x00418610" [label="0x00418610\\nworld_grid_refresh_projected_rect_sample_band_and_flag_mask", fillcolor="#f8f8f8"]; + "0x00418a60" [label="0x00418a60\\nplaced_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds", fillcolor="#f8f8f8"]; + "0x00418be0" [label="0x00418be0\\nplaced_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch", fillcolor="#f8f8f8"]; + "0x004197e0" [label="0x004197e0\\nplaced_structure_validate_projected_candidate_placement", fillcolor="#f8f8f8"]; + "0x0041e220" [label="0x0041e220\\nstructure_candidate_is_enabled_for_current_year", fillcolor="#f8f8f8"]; + "0x0041e2b0" [label="0x0041e2b0\\nstructure_candidate_rebuild_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0041e650" [label="0x0041e650\\nstructure_candidate_query_route_style_or_local_availability_metric", fillcolor="#f8f8f8"]; + "0x0041ea50" [label="0x0041ea50\\nworld_setup_building_collection_phase", fillcolor="#f8f8f8"]; + "0x0041f9b0" [label="0x0041f9b0\\nworld_region_count_structure_profiles_before_year_for_category", fillcolor="#f8f8f8"]; + "0x0041fac0" [label="0x0041fac0\\nworld_region_read_structure_profile_label_and_weight_by_index", fillcolor="#f8f8f8"]; + "0x00420030" [label="0x00420030\\ncity_connection_bonus_exists_matching_peer_site", fillcolor="#f8f8f8"]; + "0x00420280" [label="0x00420280\\ncity_connection_bonus_select_first_matching_peer_site", fillcolor="#f8f8f8"]; + "0x004207d0" [label="0x004207d0\\ncity_site_format_connection_bonus_status_label", fillcolor="#f8f8f8"]; + "0x00421b60" [label="0x00421b60\\nworld_region_collection_seed_default_regions", fillcolor="#f8f8f8"]; + "0x00421c20" [label="0x00421c20\\nworld_region_collection_run_building_population_pass", fillcolor="#f8f8f8"]; + "0x00422320" [label="0x00422320\\nworld_region_normalize_cached_structure_balance_scalars", fillcolor="#f8f8f8"]; + "0x004228b0" [label="0x004228b0\\nworld_region_count_linked_placed_structures_by_category", fillcolor="#f8f8f8"]; + "0x00422900" [label="0x00422900\\nworld_region_accumulate_structure_category_totals", fillcolor="#f8f8f8"]; + "0x00422a70" [label="0x00422a70\\nworld_region_validate_and_commit_candidate_placement", fillcolor="#f8f8f8"]; + "0x00422be0" [label="0x00422be0\\nworld_region_count_placed_structures_for_category", fillcolor="#f8f8f8"]; + "0x00422ee0" [label="0x00422ee0\\nworld_region_try_place_candidate_structure", fillcolor="#f8f8f8"]; + "0x004234e0" [label="0x004234e0\\nworld_region_query_projected_structure_count_scalar_by_category", fillcolor="#f8f8f8"]; + "0x004235c0" [label="0x004235c0\\nworld_region_balance_structure_demand_and_place_candidates", fillcolor="#f8f8f8"]; + "0x00423d30" [label="0x00423d30\\nworld_region_refresh_cached_category_totals_and_weight_slots", fillcolor="#f8f8f8"]; + "0x0042c690" [label="0x0042c690\\nplaced_structure_rebuild_candidate_cargo_service_bitsets", fillcolor="#f8f8f8"]; + "0x0042cab0" [label="0x0042cab0\\nplaced_structure_accumulate_candidate_metric_or_emit_route_style_peer_link", fillcolor="#f8f8f8"]; + "0x0042cdf0" [label="0x0042cdf0\\nplaced_structure_refresh_candidate_service_state", fillcolor="#f8f8f8"]; + "0x00430270" [label="0x00430270\\nworld_try_place_random_structure_batch_from_compact_record", fillcolor="#f8f8f8"]; + "0x00431b20" [label="0x00431b20\\nworld_apply_compact_runtime_effect_record_to_resolved_targets [seed]", fillcolor="#ffe9a8"]; + "0x00434300" [label="0x00434300\\nworld_runtime_release_global_services", fillcolor="#f8f8f8"]; + "0x00434870" [label="0x00434870\\nscenario_state_get_selected_chairman_company_record", fillcolor="#f8f8f8"]; + "0x00434890" [label="0x00434890\\nscenario_state_set_selected_chairman_profile", fillcolor="#f8f8f8"]; + "0x004348c0" [label="0x004348c0\\nscenario_state_get_selected_chairman_profile_record", fillcolor="#f8f8f8"]; + "0x00437220" [label="0x00437220\\nworld_build_chairman_profile_slot_records", fillcolor="#f8f8f8"]; + "0x004377a0" [label="0x004377a0\\nworld_seed_default_chairman_profile_slots", fillcolor="#f8f8f8"]; + "0x004384d0" [label="0x004384d0\\nworld_run_post_load_generation_pipeline", fillcolor="#f8f8f8"]; + "0x00438890" [label="0x00438890\\nshell_active_mode_run_profile_startup_and_load_dispatch", fillcolor="#f8f8f8"]; + "0x00443a50" [label="0x00443a50\\nworld_entry_transition_and_runtime_bringup", fillcolor="#f8f8f8"]; + "0x00444dd0" [label="0x00444dd0\\nmap_bundle_open_reference_databases", fillcolor="#f8f8f8"]; + "0x00445ac0" [label="0x00445ac0\\nshell_map_file_entry_coordinator", fillcolor="#f8f8f8"]; + "0x00445de0" [label="0x00445de0\\nshell_map_file_world_bundle_coordinator", fillcolor="#f8f8f8"]; + "0x00446240" [label="0x00446240\\nworld_runtime_serialize_smp_bundle", fillcolor="#f8f8f8"]; + "0x00446d40" [label="0x00446d40\\nworld_load_saved_runtime_state_bundle", fillcolor="#f8f8f8"]; + "0x0044fb70" [label="0x0044fb70\\nworld_compute_transport_and_pricing_grid", fillcolor="#f8f8f8"]; + "0x00467c30" [label="0x00467c30\\nplaced_structure_route_link_recompute_endpoint_pair_state", fillcolor="#f8f8f8"]; + "0x00467df0" [label="0x00467df0\\nplaced_structure_route_link_detach_current_owner_chain", fillcolor="#f8f8f8"]; + "0x00467eb0" [label="0x00467eb0\\nplaced_structure_route_link_attach_site_owner", fillcolor="#f8f8f8"]; + "0x00467f20" [label="0x00467f20\\nplaced_structure_route_link_attach_route_node_owner", fillcolor="#f8f8f8"]; + "0x00467f50" [label="0x00467f50\\nplaced_structure_route_link_allocate_site_pair_for_candidate_class", fillcolor="#f8f8f8"]; + "0x004680b0" [label="0x004680b0\\nplaced_structure_route_link_release_and_detach", fillcolor="#f8f8f8"]; + "0x004682c0" [label="0x004682c0\\nplaced_structure_route_link_collection_recompute_all_endpoint_pair_state", fillcolor="#f8f8f8"]; + "0x00468300" [label="0x00468300\\nplaced_structure_route_link_rebuild_route_style_grid_counters_and_endpoint_state", fillcolor="#f8f8f8"]; + "0x00477820" [label="0x00477820\\nprofile_collection_count_active_chairman_records", fillcolor="#f8f8f8"]; + "0x00477860" [label="0x00477860\\nprofile_collection_get_nth_active_chairman_record", fillcolor="#f8f8f8"]; + "0x0047d440" [label="0x0047d440\\nworld_conditionally_seed_named_starting_railroad_companies", fillcolor="#f8f8f8"]; + "0x0047dd10" [label="0x0047dd10\\nplaced_structure_remove_site_id_from_proximity_bucket_lists", fillcolor="#f8f8f8"]; + "0x0047e240" [label="0x0047e240\\nplaced_structure_query_candidate_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0047e330" [label="0x0047e330\\nplaced_structure_count_candidates_with_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0047e690" [label="0x0047e690\\nplaced_structure_query_candidate_directional_route_overlay_summary", fillcolor="#f8f8f8"]; + "0x0047efe0" [label="0x0047efe0\\nplaced_structure_query_linked_company_id", fillcolor="#f8f8f8"]; + "0x0047f010" [label="0x0047f010\\nplaced_structure_append_unique_route_entry", fillcolor="#f8f8f8"]; + "0x0047fdb0" [label="0x0047fdb0\\nplaced_structure_append_nearby_transit_site_distance_bucket_entry", fillcolor="#f8f8f8"]; + "0x004801a0" [label="0x004801a0\\nplaced_structure_is_linked_transit_site_reachable_from_company_route_anchor", fillcolor="#f8f8f8"]; + "0x00480210" [label="0x00480210\\nplaced_structure_construct_linked_site_record_from_anchor_and_coords", fillcolor="#f8f8f8"]; + "0x00480590" [label="0x00480590\\nplaced_structure_teardown_linked_site_runtime_state_before_removal", fillcolor="#f8f8f8"]; + "0x00480bb0" [label="0x00480bb0\\nplaced_structure_refresh_linked_site_display_name_and_route_anchor", fillcolor="#f8f8f8"]; + "0x00481390" [label="0x00481390\\nplaced_structure_collection_allocate_and_construct_linked_site_record", fillcolor="#f8f8f8"]; + "0x004813d0" [label="0x004813d0\\nplaced_structure_collection_remove_linked_site_record", fillcolor="#f8f8f8"]; + "0x00481480" [label="0x00481480\\nplaced_structure_collection_append_site_into_all_proximity_bucket_lists", fillcolor="#f8f8f8"]; + "0x004814c0" [label="0x004814c0\\nplaced_structure_collection_remove_site_id_from_all_proximity_bucket_lists", fillcolor="#f8f8f8"]; + "0x004882e0" [label="0x004882e0\\nworld_region_border_overlay_rebuild", fillcolor="#f8f8f8"]; + "0x00489f80" [label="0x00489f80\\nroute_entry_assign_aux_tracker_group_id", fillcolor="#f8f8f8"]; + "0x00493cf0" [label="0x00493cf0\\nroute_entry_collection_create_endpoint_entry_from_coords_and_policy", fillcolor="#f8f8f8"]; + "0x00494240" [label="0x00494240\\nroute_entry_collection_query_rect_window_passes_entry_type_gate", fillcolor="#f8f8f8"]; + "0x00494cb0" [label="0x00494cb0\\nroute_entry_collection_try_find_route_entry_covering_point_window", fillcolor="#f8f8f8"]; + "0x00494e40" [label="0x00494e40\\naux_route_entry_tracker_reset", fillcolor="#f8f8f8"]; + "0x00494e90" [label="0x00494e90\\naux_route_entry_tracker_seed_owner_entry_id", fillcolor="#f8f8f8"]; + "0x00494eb0" [label="0x00494eb0\\naux_route_entry_tracker_adjust_refcount", fillcolor="#f8f8f8"]; + "0x00494ed0" [label="0x00494ed0\\naux_route_entry_tracker_contains_endpoint_entry_id", fillcolor="#f8f8f8"]; + "0x00494f00" [label="0x00494f00\\naux_route_entry_tracker_merge_or_bind_endpoint_entry", fillcolor="#f8f8f8"]; + "0x00494fb0" [label="0x00494fb0\\naux_route_entry_tracker_refresh_boolean_class_latch_and_notify_owner", fillcolor="#f8f8f8"]; + "0x00495020" [label="0x00495020\\naux_route_entry_tracker_refresh_cached_match_fields_and_maybe_split_duplicate_pair", fillcolor="#f8f8f8"]; + "0x004950f0" [label="0x004950f0\\naux_route_entry_tracker_replace_matching_endpoint_entry_and_refresh_latch", fillcolor="#f8f8f8"]; + "0x004952f0" [label="0x004952f0\\nmath_compute_quadrant_adjusted_heading_angle_from_xy_pair", fillcolor="#f8f8f8"]; + "0x004953c0" [label="0x004953c0\\nmath_normalize_subtracted_angle_delta_and_report_wrap", fillcolor="#f8f8f8"]; + "0x004955b0" [label="0x004955b0\\nroute_entry_collection_map_track_lay_mode_to_endpoint_policy_byte", fillcolor="#f8f8f8"]; + "0x0049bd40" [label="0x0049bd40\\nroute_entry_collection_run_initial_candidate_path_sweep", fillcolor="#f8f8f8"]; + "0x0049c900" [label="0x0049c900\\nroute_entry_collection_try_extend_search_frontier_toward_target_coords", fillcolor="#f8f8f8"]; + "0x0049d380" [label="0x0049d380\\nroute_entry_collection_search_path_between_entry_or_coord_endpoints", fillcolor="#f8f8f8"]; + "0x004a01a0" [label="0x004a01a0\\nroute_entry_collection_try_build_path_between_optional_endpoint_entries", fillcolor="#f8f8f8"]; + "0x004a42b0" [label="0x004a42b0\\naux_route_entry_tracker_collection_allocate_entry", fillcolor="#f8f8f8"]; + "0x004a4340" [label="0x004a4340\\naux_route_entry_tracker_collection_adjust_refcount_or_destroy", fillcolor="#f8f8f8"]; + "0x004a4380" [label="0x004a4380\\naux_route_entry_tracker_collection_try_split_route_entry_chain_into_fresh_group", fillcolor="#f8f8f8"]; + "0x004a45f0" [label="0x004a45f0\\naux_route_entry_tracker_collection_refresh_route_entry_group_membership", fillcolor="#f8f8f8"]; + "0x004a4c00" [label="0x004a4c00\\naux_route_entry_tracker_route_entry_pair_pass_adjacent_chain_transfer_gate", fillcolor="#f8f8f8"]; + "0x004a4ce0" [label="0x004a4ce0\\naux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups", fillcolor="#f8f8f8"]; + "0x004a4ff0" [label="0x004a4ff0\\naux_route_entry_tracker_collection_reseed_group_from_route_entry_component", fillcolor="#f8f8f8"]; + "0x004a5280" [label="0x004a5280\\naux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search", fillcolor="#f8f8f8"]; + "0x004a5900" [label="0x004a5900\\naux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk", fillcolor="#f8f8f8"]; + "0x004a5fc0" [label="0x004a5fc0\\naux_route_entry_tracker_collection_refresh_component_labels_and_reseed_invalid_groups", fillcolor="#f8f8f8"]; + "0x004a62c0" [label="0x004a62c0\\naux_route_entry_tracker_query_tracker_component_labels_match", fillcolor="#f8f8f8"]; + "0x004a6320" [label="0x004a6320\\naux_route_entry_tracker_collection_query_component_label_by_tracker_id", fillcolor="#f8f8f8"]; + "0x004a6360" [label="0x004a6360\\naux_route_entry_tracker_collection_refresh_owner_adjacent_compatible_group_links", fillcolor="#f8f8f8"]; + "0x004a65b0" [label="0x004a65b0\\naux_route_entry_tracker_dispatch_route_entry_pair_metric_query", fillcolor="#f8f8f8"]; + "0x004a6630" [label="0x004a6630\\naux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks", fillcolor="#f8f8f8"]; + "0x004b99c0" [label="0x004b99c0\\nstructure_candidate_collection_get_nth_active_candidate_id", fillcolor="#f8f8f8"]; + "0x004c9da0" [label="0x004c9da0\\nmap_editor_chairman_slot_panel_format_slot_card", fillcolor="#f8f8f8"]; + "0x004ca1c0" [label="0x004ca1c0\\nmap_editor_chairman_slot_panel_refresh_slot_counters", fillcolor="#f8f8f8"]; + "0x004ca540" [label="0x004ca540\\nmap_editor_available_chairman_panel_construct", fillcolor="#f8f8f8"]; + "0x004ca790" [label="0x004ca790\\nmap_editor_scenario_metadata_panel_refresh_controls", fillcolor="#f8f8f8"]; + "0x004ca910" [label="0x004ca910\\nmap_editor_building_density_panel_refresh_controls", fillcolor="#f8f8f8"]; + "0x004cadf0" [label="0x004cadf0\\nmap_editor_economic_cost_slider_panel_construct", fillcolor="#f8f8f8"]; + "0x004cb2b0" [label="0x004cb2b0\\nmap_editor_scenario_special_conditions_panel_construct", fillcolor="#f8f8f8"]; + "0x004cc250" [label="0x004cc250\\nmap_editor_chairman_slot_panel_refresh_slot_list", fillcolor="#f8f8f8"]; + "0x004cc2d0" [label="0x004cc2d0\\nmap_editor_chairman_slot_panel_construct", fillcolor="#f8f8f8"]; + "0x004cc980" [label="0x004cc980\\nmap_editor_city_region_panel_construct", fillcolor="#f8f8f8"]; + "0x004cd070" [label="0x004cd070\\nmap_editor_territory_panel_construct", fillcolor="#f8f8f8"]; + "0x004cd680" [label="0x004cd680\\nmap_editor_locomotive_availability_panel_construct", fillcolor="#f8f8f8"]; + "0x004cdbd0" [label="0x004cdbd0\\nmap_editor_industry_availability_panel_construct", fillcolor="#f8f8f8"]; + "0x004ce070" [label="0x004ce070\\nmap_editor_panel_select_active_section", fillcolor="#f8f8f8"]; + "0x004cecc0" [label="0x004cecc0\\nmap_editor_chairman_slot_panel_handle_message", fillcolor="#f8f8f8"]; + "0x004cf0d0" [label="0x004cf0d0\\nmap_editor_locomotive_availability_panel_handle_message", fillcolor="#f8f8f8"]; + "0x004cf910" [label="0x004cf910\\nmap_editor_port_warehouse_cargo_panel_construct", fillcolor="#f8f8f8"]; + "0x004d0420" [label="0x004d0420\\nmap_editor_city_count_stats_report", fillcolor="#f8f8f8"]; + "0x004d3000" [label="0x004d3000\\nmap_editor_cargo_stats_panel_construct", fillcolor="#f8f8f8"]; + "0x004d3020" [label="0x004d3020\\nmap_editor_city_region_growth_stats_panel_construct", fillcolor="#f8f8f8"]; + "0x004d3060" [label="0x004d3060\\nmap_editor_tree_stats_panel_construct", fillcolor="#f8f8f8"]; + "0x004d3080" [label="0x004d3080\\nmap_editor_general_validation_panel_construct", fillcolor="#f8f8f8"]; + "0x004d30a0" [label="0x004d30a0\\nmap_editor_city_count_stats_panel_construct", fillcolor="#f8f8f8"]; + "0x004d4110" [label="0x004d4110\\nmap_editor_event_variable_values_panel_construct", fillcolor="#f8f8f8"]; + "0x004d4130" [label="0x004d4130\\nmap_editor_event_validation_panel_construct", fillcolor="#f8f8f8"]; + } + subgraph cluster_render { + label="render"; + color="#cccccc"; + "0x0043f640" [label="0x0043f640\\nworld_render_station_candidate_service_map_overlay", fillcolor="#f8f8f8"]; + } + subgraph cluster_scenario { + label="scenario"; + color="#cccccc"; + "0x0042d700" [label="0x0042d700\\nscenario_event_query_standalone_condition_row_list_class_and_modifier_flags", fillcolor="#f8f8f8"]; + "0x0042d740" [label="0x0042d740\\nscenario_event_query_grouped_effect_row_list_type_flags", fillcolor="#f8f8f8"]; + "0x0042db20" [label="0x0042db20\\nscenario_event_refresh_runtime_record_from_packed_state", fillcolor="#f8f8f8"]; + "0x0042df30" [label="0x0042df30\\nscenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback", fillcolor="#f8f8f8"]; + "0x0042df70" [label="0x0042df70\\nscenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback", fillcolor="#f8f8f8"]; + "0x0042dfb0" [label="0x0042dfb0\\nscenario_event_condition_row_list_has_class_bit2_or_type63_fallback", fillcolor="#f8f8f8"]; + "0x0042dff0" [label="0x0042dff0\\nscenario_event_condition_row_list_has_any_class_bit012_or_special_fallback", fillcolor="#f8f8f8"]; + "0x0042e050" [label="0x0042e050\\nscenario_event_clone_runtime_record_deep_copy", fillcolor="#f8f8f8"]; + "0x00430b50" [label="0x00430b50\\nscenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets [seed]", fillcolor="#ffe9a8"]; + "0x004323a0" [label="0x004323a0\\nscenario_runtime_effect_record_service_and_dispatch_linked_compact_effects [seed]", fillcolor="#ffe9a8"]; + "0x00432ea0" [label="0x00432ea0\\nscenario_event_collection_allocate_runtime_effect_record_from_compact_payload [seed]", fillcolor="#ffe9a8"]; + "0x00432f40" [label="0x00432f40\\nscenario_event_collection_service_runtime_effect_records_for_trigger_kind", fillcolor="#f8f8f8"]; + "0x00433130" [label="0x00433130\\nscenario_event_collection_refresh_runtime_records_from_packed_state", fillcolor="#f8f8f8"]; + "0x004886e0" [label="0x004886e0\\nscenario_text_export_build_language_file", fillcolor="#f8f8f8"]; + "0x00489830" [label="0x00489830\\nscenario_text_export_report_language_file", fillcolor="#f8f8f8"]; + "0x00489a20" [label="0x00489a20\\nscenario_text_export_batch_process_maps", fillcolor="#f8f8f8"]; + } + subgraph cluster_shell { + label="shell"; + color="#cccccc"; + "0x00425880" [label="0x00425880\\ncompany_compute_negative_cash_balance_interest_rate", fillcolor="#f8f8f8"]; + "0x004258c0" [label="0x004258c0\\ncompany_compute_positive_cash_balance_interest_rate", fillcolor="#f8f8f8"]; + "0x0042a970" [label="0x0042a970\\nshell_open_file_dialog_copy_selected_path_and_restore_cwd", fillcolor="#f8f8f8"]; + "0x004333f0" [label="0x004333f0\\nshell_setup_build_file_list_records_from_current_root_and_pattern", fillcolor="#f8f8f8"]; + "0x004336a0" [label="0x004336a0\\nshell_setup_file_list_construct_and_scan_dataset", fillcolor="#f8f8f8"]; + "0x00433b00" [label="0x00433b00\\nshell_can_open_trainbuy_window_or_warn", fillcolor="#f8f8f8"]; + "0x00434050" [label="0x00434050\\nshell_has_auxiliary_preview_owner", fillcolor="#f8f8f8"]; + "0x0043db00" [label="0x0043db00\\nworld_view_service_shell_input_pan_and_hover", fillcolor="#f8f8f8"]; + "0x00442400" [label="0x00442400\\nshell_setup_load_selected_profile_bundle_into_payload_record", fillcolor="#f8f8f8"]; + "0x00464410" [label="0x00464410\\nshell_dispatch_ui_command", fillcolor="#f8f8f8"]; + "0x00469720" [label="0x00469720\\nmultiplayer_preview_dataset_service_frame", fillcolor="#f8f8f8"]; + "0x0046a6c0" [label="0x0046a6c0\\nmultiplayer_session_event_publish_registration_field", fillcolor="#f8f8f8"]; + "0x0046b780" [label="0x0046b780\\nmultiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync", fillcolor="#f8f8f8"]; + "0x0047bc80" [label="0x0047bc80\\nshell_setup_payload_seed_unique_row_category_bytes_and_marker_slots", fillcolor="#f8f8f8"]; + "0x0047be50" [label="0x0047be50\\nshell_setup_profile_copy_payload_scroll_count_and_campaign_byte_and_seed_row_categories", fillcolor="#f8f8f8"]; + "0x0047d080" [label="0x0047d080\\nstart_new_company_dialog_open", fillcolor="#f8f8f8"]; + "0x0047d120" [label="0x0047d120\\nstart_new_company_dialog_commit_create_company", fillcolor="#f8f8f8"]; + "0x00482160" [label="0x00482160\\nshell_state_service_active_mode_frame", fillcolor="#f8f8f8"]; + "0x004839b0" [label="0x004839b0\\nshell_setup_query_file_list_uses_map_extension_pattern", fillcolor="#f8f8f8"]; + "0x004839e0" [label="0x004839e0\\nshell_setup_query_file_list_root_dir_name", fillcolor="#f8f8f8"]; + "0x00483f70" [label="0x00483f70\\nshell_service_pump_iteration", fillcolor="#f8f8f8"]; + "0x00484590" [label="0x00484590\\nshell_init_graphics_preset_state", fillcolor="#f8f8f8"]; + "0x00484910" [label="0x00484910\\nshell_save_graphics_config", fillcolor="#f8f8f8"]; + "0x00484980" [label="0x00484980\\nshell_load_graphics_config_or_init_defaults", fillcolor="#f8f8f8"]; + "0x00484a60" [label="0x00484a60\\nshell_match_legacy_gpu_profile_token", fillcolor="#f8f8f8"]; + "0x00484d70" [label="0x00484d70\\nshell_apply_graphics_option_runtime_effects", fillcolor="#f8f8f8"]; + "0x00485060" [label="0x00485060\\nshell_set_graphics_option_with_fanout", fillcolor="#f8f8f8"]; + "0x004852e0" [label="0x004852e0\\nshell_apply_default_graphics_master_profile", fillcolor="#f8f8f8"]; + "0x004853c0" [label="0x004853c0\\nshell_apply_graphics_preset_bundle", fillcolor="#f8f8f8"]; + "0x004b8dc0" [label="0x004b8dc0\\nshell_campaign_window_destroy", fillcolor="#f8f8f8"]; + "0x004b8e60" [label="0x004b8e60\\nshell_campaign_window_construct", fillcolor="#f8f8f8"]; + "0x004b9a20" [label="0x004b9a20\\nshell_building_detail_refresh_flagged_service_capability_rows", fillcolor="#f8f8f8"]; + "0x004b9d70" [label="0x004b9d70\\nshell_has_live_building_detail_window", fillcolor="#f8f8f8"]; + "0x004b9d80" [label="0x004b9d80\\nshell_mark_building_detail_window_dirty", fillcolor="#f8f8f8"]; + "0x004b9e10" [label="0x004b9e10\\nshell_building_detail_submit_aux_owner_subject_sync_request", fillcolor="#f8f8f8"]; + "0x004b9fd0" [label="0x004b9fd0\\nshell_building_detail_present_flagged_service_capability_popup", fillcolor="#f8f8f8"]; + "0x004ba3d0" [label="0x004ba3d0\\nshell_building_detail_refresh_subject_cargo_and_service_rows", fillcolor="#f8f8f8"]; + "0x004bad20" [label="0x004bad20\\nshell_building_detail_refresh_subject_pair_value_rows", fillcolor="#f8f8f8"]; + "0x004baef0" [label="0x004baef0\\nshell_building_detail_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004bb9e0" [label="0x004bb9e0\\nshell_building_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x004bc0a0" [label="0x004bc0a0\\nshell_building_detail_window_construct", fillcolor="#f8f8f8"]; + "0x004bc100" [label="0x004bc100\\nshell_open_or_focus_building_detail_window", fillcolor="#f8f8f8"]; + "0x004bfb30" [label="0x004bfb30\\nshell_format_company_financial_summary_card", fillcolor="#f8f8f8"]; + "0x004c0160" [label="0x004c0160\\nshell_format_company_stock_data_panel", fillcolor="#f8f8f8"]; + "0x004c1610" [label="0x004c1610\\nshell_company_detail_bind_bond_row_band_for_active_panel", fillcolor="#f8f8f8"]; + "0x004c16f0" [label="0x004c16f0\\nshell_company_detail_resolve_selected_company", fillcolor="#f8f8f8"]; + "0x004c1730" [label="0x004c1730\\nshell_company_detail_render_financial_history_panel", fillcolor="#f8f8f8"]; + "0x004c1ab0" [label="0x004c1ab0\\nshell_company_detail_render_company_summary_card", fillcolor="#f8f8f8"]; + "0x004c1b60" [label="0x004c1b60\\nshell_company_detail_refresh_selected_territory_access_summary", fillcolor="#f8f8f8"]; + "0x004c1d30" [label="0x004c1d30\\nshell_company_detail_select_territory_access_row", fillcolor="#f8f8f8"]; + "0x004c1d70" [label="0x004c1d70\\nshell_company_detail_render_territory_access_row", fillcolor="#f8f8f8"]; + "0x004c1ec0" [label="0x004c1ec0\\nshell_company_detail_render_bond_maturity_and_repay_panel", fillcolor="#f8f8f8"]; + "0x004c22e0" [label="0x004c22e0\\nshell_company_detail_sync_selected_territory_from_picker", fillcolor="#f8f8f8"]; + "0x004c23a0" [label="0x004c23a0\\nshell_company_detail_render_debt_credit_and_rate_summary_panel", fillcolor="#f8f8f8"]; + "0x004c2720" [label="0x004c2720\\nshell_company_detail_render_share_value_and_dividend_summary_panel", fillcolor="#f8f8f8"]; + "0x004c2ca0" [label="0x004c2ca0\\nshell_company_detail_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004c3470" [label="0x004c3470\\nshell_company_detail_step_selected_active_company_delta", fillcolor="#f8f8f8"]; + "0x004c3540" [label="0x004c3540\\nshell_company_detail_select_next_active_company", fillcolor="#f8f8f8"]; + "0x004c3550" [label="0x004c3550\\nshell_company_detail_select_previous_active_company", fillcolor="#f8f8f8"]; + "0x004c3560" [label="0x004c3560\\nshell_company_detail_render_issue_bond_offer_dialog", fillcolor="#f8f8f8"]; + "0x004c3890" [label="0x004c3890\\nshell_company_detail_issue_bond_offer_flow", fillcolor="#f8f8f8"]; + "0x004c3b50" [label="0x004c3b50\\nshell_company_detail_render_issue_stock_offer_dialog", fillcolor="#f8f8f8"]; + "0x004c3f30" [label="0x004c3f30\\nshell_company_detail_issue_stock_offer_flow", fillcolor="#f8f8f8"]; + "0x004c4300" [label="0x004c4300\\nshell_company_detail_render_stock_buyback_offer_dialog", fillcolor="#f8f8f8"]; + "0x004c46d0" [label="0x004c46d0\\nshell_company_detail_buyback_stock_flow", fillcolor="#f8f8f8"]; + "0x004c4c70" [label="0x004c4c70\\nshell_company_detail_setup_dividend_rate_adjust_controls", fillcolor="#f8f8f8"]; + "0x004c4e30" [label="0x004c4e30\\nshell_company_detail_render_change_dividend_rate_dialog", fillcolor="#f8f8f8"]; + "0x004c5140" [label="0x004c5140\\nshell_company_detail_handle_change_dividend_rate_dialog_message", fillcolor="#f8f8f8"]; + "0x004c5360" [label="0x004c5360\\nshell_company_detail_change_dividend_rate_flow", fillcolor="#f8f8f8"]; + "0x004c5540" [label="0x004c5540\\nshell_company_detail_window_construct", fillcolor="#f8f8f8"]; + "0x004c56a0" [label="0x004c56a0\\nshell_company_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x004c5a0e" [label="0x004c5a0e\\nshell_company_detail_resign_chairmanship_flow", fillcolor="#f8f8f8"]; + "0x004c5b99" [label="0x004c5b99\\nshell_company_detail_bankruptcy_flow", fillcolor="#f8f8f8"]; + "0x004c5fc9" [label="0x004c5fc9\\nshell_company_detail_buy_territory_access_rights_flow", fillcolor="#f8f8f8"]; + "0x004c6b40" [label="0x004c6b40\\nshell_company_list_format_company_or_start_row", fillcolor="#f8f8f8"]; + "0x004c6bb0" [label="0x004c6bb0\\nshell_company_list_activate_or_shift_center_company", fillcolor="#f8f8f8"]; + "0x004c6c30" [label="0x004c6c30\\nshell_company_list_window_refresh_rows", fillcolor="#f8f8f8"]; + "0x004c6f30" [label="0x004c6f30\\nshell_company_list_window_handle_message", fillcolor="#f8f8f8"]; + "0x004c7200" [label="0x004c7200\\nshell_company_list_window_construct", fillcolor="#f8f8f8"]; + "0x004c7bc0" [label="0x004c7bc0\\nshell_credits_window_destroy", fillcolor="#f8f8f8"]; + "0x004c7fc0" [label="0x004c7fc0\\nshell_credits_window_construct", fillcolor="#f8f8f8"]; + "0x004c8670" [label="0x004c8670\\nshell_mark_custom_modal_dialog_dirty", fillcolor="#f8f8f8"]; + "0x004c8680" [label="0x004c8680\\nshell_has_live_custom_modal_dialog", fillcolor="#f8f8f8"]; + "0x004c98a0" [label="0x004c98a0\\nshell_open_custom_modal_dialog_with_callbacks", fillcolor="#f8f8f8"]; + "0x004d4500" [label="0x004d4500\\nshell_ensure_editor_panel_window", fillcolor="#f8f8f8"]; + "0x004d57c0" [label="0x004d57c0\\nshell_event_conditions_window_construct", fillcolor="#f8f8f8"]; + "0x004d5d00" [label="0x004d5d00\\nshell_event_effects_window_refresh_effect_type_selector", fillcolor="#f8f8f8"]; + "0x004d5f50" [label="0x004d5f50\\nshell_event_effects_window_refresh_selected_effect_parameter_rows", fillcolor="#f8f8f8"]; + "0x004d6090" [label="0x004d6090\\nshell_event_effects_window_refresh_selected_staged_effect_editor_panels", fillcolor="#f8f8f8"]; + "0x004d67f0" [label="0x004d67f0\\nshell_event_effects_window_commit_current_editor_state_into_staged_row", fillcolor="#f8f8f8"]; + "0x004d6d60" [label="0x004d6d60\\nshell_event_effects_window_construct", fillcolor="#f8f8f8"]; + "0x004d7060" [label="0x004d7060\\nshell_event_effects_window_handle_message", fillcolor="#f8f8f8"]; + "0x004d77b0" [label="0x004d77b0\\nshell_event_conditions_window_refresh_grouped_effect_summary_band_affordances", fillcolor="#f8f8f8"]; + "0x004d7ef0" [label="0x004d7ef0\\nshell_event_effects_window_refresh_event_selector_list_and_selected_event_id", fillcolor="#f8f8f8"]; + "0x004d8120" [label="0x004d8120\\nshell_event_conditions_window_refresh_condition_row_list_panel", fillcolor="#f8f8f8"]; + "0x004d88f0" [label="0x004d88f0\\nshell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel", fillcolor="#f8f8f8"]; + "0x004d8d50" [label="0x004d8d50\\nshell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch", fillcolor="#f8f8f8"]; + "0x004d8ea0" [label="0x004d8ea0\\nshell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change", fillcolor="#f8f8f8"]; + "0x004d91e0" [label="0x004d91e0\\nshell_event_conditions_window_commit_selected_event_summary_headers_and_group_mode", fillcolor="#f8f8f8"]; + "0x004d9360" [label="0x004d9360\\nshell_event_conditions_window_remove_selected_event_and_refresh_selector", fillcolor="#f8f8f8"]; + "0x004d9390" [label="0x004d9390\\nshell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows", fillcolor="#f8f8f8"]; + "0x004d9970" [label="0x004d9970\\nshell_event_conditions_window_refresh_condition_class_summary_and_group_rows", fillcolor="#f8f8f8"]; + "0x004d9d10" [label="0x004d9d10\\nshell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance", fillcolor="#f8f8f8"]; + "0x004d9dc0" [label="0x004d9dc0\\nshell_open_event_conditions_modal_and_return_result", fillcolor="#f8f8f8"]; + "0x004d9e40" [label="0x004d9e40\\nshell_open_event_effects_modal_and_return_result", fillcolor="#f8f8f8"]; + "0x004d9ed0" [label="0x004d9ed0\\nshell_event_conditions_window_remove_selected_condition_row", fillcolor="#f8f8f8"]; + "0x004d9f50" [label="0x004d9f50\\nshell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels", fillcolor="#f8f8f8"]; + "0x004da0f0" [label="0x004da0f0\\nshell_event_conditions_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004da640" [label="0x004da640\\nshell_event_conditions_window_append_default_condition_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da700" [label="0x004da700\\nshell_event_conditions_window_edit_selected_condition_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da7c0" [label="0x004da7c0\\nshell_event_effects_window_append_grouped_effect_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da860" [label="0x004da860\\nshell_event_effects_window_edit_selected_grouped_effect_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da920" [label="0x004da920\\nshell_event_effects_window_remove_selected_grouped_effect_row", fillcolor="#f8f8f8"]; + "0x004da9a0" [label="0x004da9a0\\nshell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event", fillcolor="#f8f8f8"]; + "0x004dab60" [label="0x004dab60\\nshell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip", fillcolor="#f8f8f8"]; + "0x004daf40" [label="0x004daf40\\nshell_event_conditions_window_reset_selected_event_summary_placeholders", fillcolor="#f8f8f8"]; + "0x004db120" [label="0x004db120\\nshell_event_conditions_window_refresh_selected_event_strip_and_navigation", fillcolor="#f8f8f8"]; + "0x004db520" [label="0x004db520\\nshell_event_conditions_window_select_previous_event_and_refresh", fillcolor="#f8f8f8"]; + "0x004db5e0" [label="0x004db5e0\\nshell_event_conditions_window_select_next_event_and_refresh", fillcolor="#f8f8f8"]; + "0x004db6a0" [label="0x004db6a0\\nshell_event_conditions_window_set_selected_event_id_and_refresh_if_open", fillcolor="#f8f8f8"]; + "0x004db6f0" [label="0x004db6f0\\nshell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection", fillcolor="#f8f8f8"]; + "0x004db8b0" [label="0x004db8b0\\nshell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal", fillcolor="#f8f8f8"]; + "0x004dba90" [label="0x004dba90\\nshell_event_conditions_window_rename_selected_event_via_name_modal", fillcolor="#f8f8f8"]; + "0x004dbb80" [label="0x004dbb80\\nshell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions", fillcolor="#f8f8f8"]; + "0x004dbe7a" [label="0x004dbe7a\\nshell_event_conditions_window_open_choice_event_single_player_only_warning_modal", fillcolor="#f8f8f8"]; + "0x004dbf93" [label="0x004dbf93\\nshell_event_conditions_window_select_grouped_effect_summary_band_and_refresh", fillcolor="#f8f8f8"]; + "0x004dbfca" [label="0x004dbfca\\nshell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh", fillcolor="#f8f8f8"]; + "0x004dc670" [label="0x004dc670\\nshell_file_options_dialog_construct", fillcolor="#f8f8f8"]; + "0x004dc7d0" [label="0x004dc7d0\\nshell_has_file_options_dialog", fillcolor="#f8f8f8"]; + "0x004dc7e0" [label="0x004dc7e0\\nshell_mark_file_options_dialog_dirty", fillcolor="#f8f8f8"]; + "0x004dc7f0" [label="0x004dc7f0\\nshell_file_options_dialog_handle_message", fillcolor="#f8f8f8"]; + "0x004dd010" [label="0x004dd010\\nshell_file_request_dialog_collect_target_path", fillcolor="#f8f8f8"]; + "0x004ddbd0" [label="0x004ddbd0\\nshell_detail_panel_transition_manager", fillcolor="#f8f8f8"]; + "0x004dfbe0" [label="0x004dfbe0\\nshell_game_window_construct", fillcolor="#f8f8f8"]; + "0x004dfd70" [label="0x004dfd70\\nshell_game_window_destroy", fillcolor="#f8f8f8"]; + "0x004dfdf0" [label="0x004dfdf0\\nshell_ensure_game_message_window", fillcolor="#f8f8f8"]; + "0x004e0720" [label="0x004e0720\\ngame_message_window_service_if_present", fillcolor="#f8f8f8"]; + "0x004e0960" [label="0x004e0960\\ngame_uppermost_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004e0b20" [label="0x004e0b20\\ngame_uppermost_window_construct", fillcolor="#f8f8f8"]; + "0x004e0ba0" [label="0x004e0ba0\\ngame_uppermost_window_handle_message", fillcolor="#f8f8f8"]; + "0x004e0e40" [label="0x004e0e40\\nshell_ensure_game_uppermost_window", fillcolor="#f8f8f8"]; + "0x004e1d60" [label="0x004e1d60\\nshell_load_screen_refresh_page_strip_and_page_kind_controls", fillcolor="#f8f8f8"]; + "0x004e1f50" [label="0x004e1f50\\nshell_has_live_load_screen_window", fillcolor="#f8f8f8"]; + "0x004e1f60" [label="0x004e1f60\\nshell_mark_load_screen_window_dirty", fillcolor="#f8f8f8"]; + "0x004e2c10" [label="0x004e2c10\\nshell_load_screen_select_page_subject_and_refresh", fillcolor="#f8f8f8"]; + "0x004e3a00" [label="0x004e3a00\\nshell_load_screen_step_selected_company_delta", fillcolor="#f8f8f8"]; + "0x004e3a80" [label="0x004e3a80\\nshell_load_screen_window_handle_message", fillcolor="#f8f8f8"]; + "0x004e45d0" [label="0x004e45d0\\nshell_load_screen_profile_stock_holdings_page_handle_message", fillcolor="#f8f8f8"]; + "0x004e4b10" [label="0x004e4b10\\nshell_load_screen_reset_runtime_state_and_seed_selection", fillcolor="#f8f8f8"]; + "0x004e4ee0" [label="0x004e4ee0\\nshell_open_or_focus_load_screen_page", fillcolor="#f8f8f8"]; + "0x004e5130" [label="0x004e5130\\nshell_load_screen_render_company_stock_data_panel", fillcolor="#f8f8f8"]; + "0x004e51ea" [label="0x004e51ea\\nshell_load_screen_render_game_status_briefing_panel", fillcolor="#f8f8f8"]; + "0x004e5300" [label="0x004e5300\\nshell_load_screen_render_player_detail_stock_holdings_panel", fillcolor="#f8f8f8"]; + "0x004e5a80" [label="0x004e5a80\\nshell_render_company_overview_panel_header_and_optional_change_affordance", fillcolor="#f8f8f8"]; + "0x004e5cf0" [label="0x004e5cf0\\nshell_format_company_governance_and_economy_status_panel", fillcolor="#f8f8f8"]; + "0x004e68e0" [label="0x004e68e0\\nshell_load_screen_render_company_list_panel", fillcolor="#f8f8f8"]; + "0x004e6ef0" [label="0x004e6ef0\\nshell_load_screen_render_player_list_panel", fillcolor="#f8f8f8"]; + "0x004e7670" [label="0x004e7670\\nshell_load_screen_render_company_train_list_panel", fillcolor="#f8f8f8"]; + "0x004e8270" [label="0x004e8270\\nshell_load_screen_render_company_industry_list_panel", fillcolor="#f8f8f8"]; + "0x004e8bb0" [label="0x004e8bb0\\nshell_load_screen_render_company_station_list_panel", fillcolor="#f8f8f8"]; + "0x004e9460" [label="0x004e9460\\nshell_load_screen_render_map_cargo_list_panel", fillcolor="#f8f8f8"]; + "0x004e9b20" [label="0x004e9b20\\nshell_load_screen_render_company_report_history_panel", fillcolor="#f8f8f8"]; + "0x004ea060" [label="0x004ea060\\nshell_load_screen_render_active_page_panel", fillcolor="#f8f8f8"]; + "0x004ea620" [label="0x004ea620\\nshell_load_screen_window_construct", fillcolor="#f8f8f8"]; + "0x004ea720" [label="0x004ea720\\nshell_load_screen_window_is_open", fillcolor="#f8f8f8"]; + "0x004ea730" [label="0x004ea730\\nshell_load_screen_window_destroy", fillcolor="#f8f8f8"]; + "0x004eb0b0" [label="0x004eb0b0\\nshell_open_grayscale_map_tga_picker_and_stage_selection", fillcolor="#f8f8f8"]; + "0x004eb890" [label="0x004eb890\\nshell_present_merger_vote_outcome_dialog", fillcolor="#f8f8f8"]; + "0x004ebd10" [label="0x004ebd10\\nshell_resolve_merger_vote_and_commit_outcome", fillcolor="#f8f8f8"]; + "0x004ec640" [label="0x004ec640\\nshell_company_detail_attempt_merger_flow", fillcolor="#f8f8f8"]; + "0x004ee0e0" [label="0x004ee0e0\\nmultiplayer_open_staged_text_entry_dialog", fillcolor="#f8f8f8"]; + "0x004ee1d0" [label="0x004ee1d0\\nmultiplayer_commit_staged_text_entry", fillcolor="#f8f8f8"]; + "0x004ee3a0" [label="0x004ee3a0\\nmultiplayer_reset_tool_globals", fillcolor="#f8f8f8"]; + "0x004ee810" [label="0x004ee810\\nmultiplayer_publish_wrapped_chat_message", fillcolor="#f8f8f8"]; + "0x004ee950" [label="0x004ee950\\nmultiplayer_load_selected_map_preview_surface", fillcolor="#f8f8f8"]; + "0x004eed30" [label="0x004eed30\\nmultiplayer_sync_selected_map_entry", fillcolor="#f8f8f8"]; + "0x004efe80" [label="0x004efe80\\nmultiplayer_window_init_globals", fillcolor="#f8f8f8"]; + "0x004f2e80" [label="0x004f2e80\\nshell_has_live_overview_window", fillcolor="#f8f8f8"]; + "0x004f2e90" [label="0x004f2e90\\nshell_mark_overview_window_dirty", fillcolor="#f8f8f8"]; + "0x004f38a0" [label="0x004f38a0\\nshell_overview_window_construct", fillcolor="#f8f8f8"]; + "0x004f38f0" [label="0x004f38f0\\nshell_overview_window_handle_message", fillcolor="#f8f8f8"]; + "0x004f3a10" [label="0x004f3a10\\nshell_open_or_focus_overview_window", fillcolor="#f8f8f8"]; + "0x004fe120" [label="0x004fe120\\nshell_has_settings_window", fillcolor="#f8f8f8"]; + "0x004fe130" [label="0x004fe130\\nshell_mark_settings_window_dirty", fillcolor="#f8f8f8"]; + "0x00500640" [label="0x00500640\\nshell_settings_window_construct", fillcolor="#f8f8f8"]; + "0x00501e50" [label="0x00501e50\\nshell_open_settings_window", fillcolor="#f8f8f8"]; + "0x00501f20" [label="0x00501f20\\nshell_query_registry_open_command_for_http_or_rtf_target", fillcolor="#f8f8f8"]; + "0x00502030" [label="0x00502030\\nshell_setup_window_draw_table_driven_payload_category_row", fillcolor="#f8f8f8"]; + "0x00502160" [label="0x00502160\\nshell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config", fillcolor="#f8f8f8"]; + "0x005021c0" [label="0x005021c0\\nshell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config", fillcolor="#f8f8f8"]; + "0x00502220" [label="0x00502220\\nshell_setup_window_publish_selected_profile_labels_and_preview_surface", fillcolor="#f8f8f8"]; + "0x00502550" [label="0x00502550\\nshell_setup_window_refresh_selection_lists_and_summary_fields", fillcolor="#f8f8f8"]; + "0x00502720" [label="0x00502720\\npaint_terrain_tool_init_globals", fillcolor="#f8f8f8"]; + "0x005027b0" [label="0x005027b0\\nshell_setup_window_refresh_file_backed_selection_list_panel", fillcolor="#f8f8f8"]; + "0x00502910" [label="0x00502910\\nshell_setup_window_refresh_mode_dependent_lists", fillcolor="#f8f8f8"]; + "0x00502c00" [label="0x00502c00\\nshell_setup_window_select_launch_mode_and_apply_shell_state", fillcolor="#f8f8f8"]; + "0x005033d0" [label="0x005033d0\\nshell_setup_window_handle_message", fillcolor="#f8f8f8"]; + "0x00504010" [label="0x00504010\\nshell_setup_window_construct", fillcolor="#f8f8f8"]; + "0x00504a90" [label="0x00504a90\\nshell_station_detail_clear_active_candidate_service_preview", fillcolor="#f8f8f8"]; + "0x00504ae0" [label="0x00504ae0\\nshell_station_detail_set_active_candidate_service_preview", fillcolor="#f8f8f8"]; + "0x00504ba0" [label="0x00504ba0\\nshell_station_detail_update_candidate_service_entry", fillcolor="#f8f8f8"]; + "0x00504bea" [label="0x00504bea\\nshell_station_detail_format_candidate_local_service_summary", fillcolor="#f8f8f8"]; + "0x00505760" [label="0x00505760\\nshell_station_detail_refresh_candidate_service_rows", fillcolor="#f8f8f8"]; + "0x005068c0" [label="0x005068c0\\nshell_station_detail_window_construct", fillcolor="#f8f8f8"]; + "0x00508550" [label="0x00508550\\nstation_place_format_selected_site_summary", fillcolor="#f8f8f8"]; + "0x00508bb0" [label="0x00508bb0\\nstation_place_world_surface_sync_and_dispatch", fillcolor="#f8f8f8"]; + "0x005091b0" [label="0x005091b0\\nstation_place_window_handle_message", fillcolor="#f8f8f8"]; + "0x00509d80" [label="0x00509d80\\nstation_place_window_construct", fillcolor="#f8f8f8"]; + "0x0050a530" [label="0x0050a530\\nstation_place_window_service_frame", fillcolor="#f8f8f8"]; + "0x0050c500" [label="0x0050c500\\nshell_present_chairmanship_takeover_vote_outcome_dialog", fillcolor="#f8f8f8"]; + "0x0050c940" [label="0x0050c940\\nshell_resolve_chairmanship_takeover_vote_and_commit_outcome", fillcolor="#f8f8f8"]; + "0x0050ccc0" [label="0x0050ccc0\\nshell_company_detail_attempt_chairmanship_takeover_flow", fillcolor="#f8f8f8"]; + "0x0050e400" [label="0x0050e400\\ntrack_lay_window_construct", fillcolor="#f8f8f8"]; + "0x0050f740" [label="0x0050f740\\nshell_has_live_trainbuy_window", fillcolor="#f8f8f8"]; + "0x0050f750" [label="0x0050f750\\nshell_mark_trainbuy_window_dirty", fillcolor="#f8f8f8"]; + "0x0050f760" [label="0x0050f760\\nshell_trainbuy_window_query_selected_locomotive_id", fillcolor="#f8f8f8"]; + "0x0050f790" [label="0x0050f790\\nshell_trainbuy_window_compute_selected_upgrade_total_and_count", fillcolor="#f8f8f8"]; + "0x0050f890" [label="0x0050f890\\nshell_trainbuy_window_render_selected_train_upgrade_summary", fillcolor="#f8f8f8"]; + "0x0050fc00" [label="0x0050fc00\\nshell_trainbuy_window_render_selected_train_route_and_state_panel", fillcolor="#f8f8f8"]; + "0x00511500" [label="0x00511500\\nshell_trainbuy_window_construct", fillcolor="#f8f8f8"]; + "0x00512080" [label="0x00512080\\nshell_trainbuy_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x00512c50" [label="0x00512c50\\nshell_open_or_focus_trainbuy_window", fillcolor="#f8f8f8"]; + "0x00512f80" [label="0x00512f80\\nshell_trainbuy_window_refresh_selection_side_toggle", fillcolor="#f8f8f8"]; + "0x005130f0" [label="0x005130f0\\nshell_trainbuy_window_query_selected_train_record", fillcolor="#f8f8f8"]; + "0x00513130" [label="0x00513130\\nshell_trainbuy_window_query_selected_train_id", fillcolor="#f8f8f8"]; + "0x005131a0" [label="0x005131a0\\nshell_trainbuy_window_selected_train_belongs_to_selected_company", fillcolor="#f8f8f8"]; + "0x00513220" [label="0x00513220\\nshell_trainbuy_window_warn_selected_train_not_owned_by_current_company", fillcolor="#f8f8f8"]; + "0x00513720" [label="0x00513720\\nshell_trainbuy_window_refresh_selection_column_empty_state_labels", fillcolor="#f8f8f8"]; + "0x00514110" [label="0x00514110\\nshell_train_detail_window_refresh_selected_train_name_label", fillcolor="#f8f8f8"]; + "0x00514160" [label="0x00514160\\nshell_train_detail_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x00514420" [label="0x00514420\\nshell_train_detail_window_construct", fillcolor="#f8f8f8"]; + "0x00514620" [label="0x00514620\\nshell_open_or_focus_train_detail_window", fillcolor="#f8f8f8"]; + "0x00514690" [label="0x00514690\\nshell_train_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x00516be0" [label="0x00516be0\\ntutorial_advance_step_and_refresh_expected_control_ids", fillcolor="#f8f8f8"]; + "0x00516d00" [label="0x00516d00\\ntutorial_validate_train_route_station_indicator_step", fillcolor="#f8f8f8"]; + "0x005174e0" [label="0x005174e0\\nshell_video_window_construct", fillcolor="#f8f8f8"]; + "0x00517570" [label="0x00517570\\nshell_video_window_destroy", fillcolor="#f8f8f8"]; + "0x0051c920" [label="0x0051c920\\nlocalization_lookup_display_label_by_stem_or_fallback", fillcolor="#f8f8f8"]; + "0x0051ebc0" [label="0x0051ebc0\\nshell_reset_display_runtime_defaults", fillcolor="#f8f8f8"]; + "0x0051eea0" [label="0x0051eea0\\nshell_save_display_runtime_config", fillcolor="#f8f8f8"]; + "0x0051ef20" [label="0x0051ef20\\nshell_load_display_runtime_config_or_init_defaults", fillcolor="#f8f8f8"]; + "0x005204b0" [label="0x005204b0\\nshell_flush_deferred_work_queues", fillcolor="#f8f8f8"]; + "0x00520620" [label="0x00520620\\nshell_service_frame_cycle", fillcolor="#f8f8f8"]; + "0x0053f830" [label="0x0053f830\\nshell_window_find_registered_child_control_by_id", fillcolor="#f8f8f8"]; + "0x0053f9c0" [label="0x0053f9c0\\nshell_window_register_child_control_sorted_by_priority_and_optional_tag", fillcolor="#f8f8f8"]; + "0x0053fa50" [label="0x0053fa50\\nshell_window_bind_resource_and_initialize_child_control_links", fillcolor="#f8f8f8"]; + "0x00540a47" [label="0x00540a47\\nshell_control_refresh_matching_dynamic_text_payload", fillcolor="#f8f8f8"]; + "0x005411c0" [label="0x005411c0\\nshell_query_tga_header_is_supported_truecolor_image", fillcolor="#f8f8f8"]; + "0x0054f710" [label="0x0054f710\\nshell_queue_callout_segment_marker", fillcolor="#f8f8f8"]; + "0x0054fb10" [label="0x0054fb10\\nshell_queue_callout_leader_path", fillcolor="#f8f8f8"]; + "0x005519f0" [label="0x005519f0\\nshell_publish_text_callout_presentation", fillcolor="#f8f8f8"]; + "0x00552560" [label="0x00552560\\nshell_queue_world_anchor_marker", fillcolor="#f8f8f8"]; + "0x00552900" [label="0x00552900\\nshell_queue_projected_world_anchor_quad", fillcolor="#f8f8f8"]; + "0x00558130" [label="0x00558130\\nshell_child_control_set_owner_resolve_caption_and_refresh", fillcolor="#f8f8f8"]; + "0x005639d2" [label="0x005639d2\\nshell_control_release_dynamic_text_payload", fillcolor="#f8f8f8"]; + } + subgraph cluster_simulation { + label="simulation"; + color="#cccccc"; + "0x004014b0" [label="0x004014b0\\ncompany_try_buy_unowned_industry_near_city_and_publish_news", fillcolor="#f8f8f8"]; + "0x00401860" [label="0x00401860\\ncompany_query_cached_linked_transit_route_anchor_entry_id", fillcolor="#f8f8f8"]; + "0x00401940" [label="0x00401940\\ncompany_reset_linked_transit_caches_and_reseed_empty_train_routes", fillcolor="#f8f8f8"]; + "0x004019e0" [label="0x004019e0\\ncompany_service_periodic_city_connection_finance_and_linked_transit_lanes", fillcolor="#f8f8f8"]; + "0x00401c50" [label="0x00401c50\\ncompany_evaluate_annual_finance_policy_and_publish_news", fillcolor="#f8f8f8"]; + "0x00404ce0" [label="0x00404ce0\\nsimulation_try_select_and_publish_company_start_or_city_connection_news", fillcolor="#f8f8f8"]; + "0x00405920" [label="0x00405920\\ncompany_query_min_linked_site_distance_to_xy", fillcolor="#f8f8f8"]; + "0x00406050" [label="0x00406050\\ncompany_evaluate_and_publish_city_connection_bonus_news", fillcolor="#f8f8f8"]; + "0x004078a0" [label="0x004078a0\\ncompany_select_preferred_available_locomotive_id", fillcolor="#f8f8f8"]; + "0x00407bd0" [label="0x00407bd0\\ncompany_rebuild_linked_transit_autoroute_site_score_cache", fillcolor="#f8f8f8"]; + "0x00408280" [label="0x00408280\\ncompany_select_best_owned_linked_transit_site_by_autoroute_score", fillcolor="#f8f8f8"]; + "0x00408380" [label="0x00408380\\ncompany_build_linked_transit_autoroute_entry", fillcolor="#f8f8f8"]; + "0x00408f70" [label="0x00408f70\\ncompany_compute_owned_linked_transit_site_score_total", fillcolor="#f8f8f8"]; + "0x00409300" [label="0x00409300\\ncompany_publish_train_upgrade_news", fillcolor="#f8f8f8"]; + "0x004093d0" [label="0x004093d0\\ncompany_rebuild_linked_transit_site_peer_cache", fillcolor="#f8f8f8"]; + "0x00409720" [label="0x00409720\\ncompany_service_linked_transit_site_caches", fillcolor="#f8f8f8"]; + "0x00409770" [label="0x00409770\\ntrain_try_append_linked_transit_autoroute_entry", fillcolor="#f8f8f8"]; + "0x00409830" [label="0x00409830\\ncompany_try_add_linked_transit_train_and_publish_news", fillcolor="#f8f8f8"]; + "0x00409950" [label="0x00409950\\ncompany_balance_linked_transit_train_roster", fillcolor="#f8f8f8"]; + "0x0040a590" [label="0x0040a590\\nsimulation_service_periodic_boundary_work", fillcolor="#f8f8f8"]; + "0x0040ab50" [label="0x0040ab50\\nsimulation_advance_to_target_calendar_point", fillcolor="#f8f8f8"]; + "0x0041d550" [label="0x0041d550\\nlocomotive_era_and_engine_type_pass_company_policy_gate", fillcolor="#f8f8f8"]; + "0x00423d70" [label="0x00423d70\\ncompany_repay_bond_slot_and_compact_debt_table", fillcolor="#f8f8f8"]; + "0x00423e40" [label="0x00423e40\\ncompany_compute_weighted_average_bond_interest_rate", fillcolor="#f8f8f8"]; + "0x00423eb0" [label="0x00423eb0\\ncompany_query_cached_share_price_scalar", fillcolor="#f8f8f8"]; + "0x00423ec0" [label="0x00423ec0\\ncompany_adjust_available_track_laying_capacity_with_floor_zero", fillcolor="#f8f8f8"]; + "0x00424010" [label="0x00424010\\ncompany_has_territory_access_rights", fillcolor="#f8f8f8"]; + "0x00424030" [label="0x00424030\\ncompany_set_territory_access_rights_byte", fillcolor="#f8f8f8"]; + "0x004240a0" [label="0x004240a0\\ncompany_query_available_track_laying_capacity_or_unlimited", fillcolor="#f8f8f8"]; + "0x00424580" [label="0x00424580\\ncompany_compute_prime_rate_from_issue39_scenario_baseline", fillcolor="#f8f8f8"]; + "0x004246b0" [label="0x004246b0\\ncompany_compute_five_year_weighted_shareholder_return", fillcolor="#f8f8f8"]; + "0x004248d0" [label="0x004248d0\\ncompany_compute_cached_recent_per_share_performance_subscore", fillcolor="#f8f8f8"]; + "0x00424fd0" [label="0x00424fd0\\ncompany_compute_public_support_adjusted_share_price_scalar", fillcolor="#f8f8f8"]; + "0x00425320" [label="0x00425320\\ncompany_compute_connection_bonus_value_ladder", fillcolor="#f8f8f8"]; + "0x00425a90" [label="0x00425a90\\ncompany_declare_bankruptcy_and_halve_bond_debt", fillcolor="#f8f8f8"]; + "0x004261b0" [label="0x004261b0\\ncompany_count_unassigned_shares_after_active_chairman_holdings", fillcolor="#f8f8f8"]; + "0x00426260" [label="0x00426260\\ncompany_compute_board_approved_dividend_rate_ceiling", fillcolor="#f8f8f8"]; + "0x004264c0" [label="0x004264c0\\ncompany_count_owned_trains", fillcolor="#f8f8f8"]; + "0x00426590" [label="0x00426590\\ncompany_count_linked_transit_sites", fillcolor="#f8f8f8"]; + "0x00426be0" [label="0x00426be0\\ncompany_can_purchase_territory_access_rights", fillcolor="#f8f8f8"]; + "0x00426d60" [label="0x00426d60\\ncompany_deactivate_and_clear_chairman_share_links", fillcolor="#f8f8f8"]; + "0x00426ef0" [label="0x00426ef0\\ncompany_get_linked_chairman_profile_record", fillcolor="#f8f8f8"]; + "0x004273c0" [label="0x004273c0\\ncompany_repurchase_public_shares_and_reduce_capital", fillcolor="#f8f8f8"]; + "0x00427450" [label="0x00427450\\ncompany_issue_public_shares_and_raise_capital", fillcolor="#f8f8f8"]; + "0x00427540" [label="0x00427540\\ncompany_compute_bond_interest_rate_quote", fillcolor="#f8f8f8"]; + "0x00427590" [label="0x00427590\\ncompany_connection_bonus_lane_is_unlocked", fillcolor="#f8f8f8"]; + "0x004275c0" [label="0x004275c0\\ncompany_issue_bond_and_record_terms", fillcolor="#f8f8f8"]; + "0x00428a10" [label="0x00428a10\\ncompany_clear_selected_chairman_if_current_profile", fillcolor="#f8f8f8"]; + "0x00429990" [label="0x00429990\\ncompany_collection_get_nth_active_company_id", fillcolor="#f8f8f8"]; + "0x004299f0" [label="0x004299f0\\ncompany_collection_count_active_companies_before_company_id", fillcolor="#f8f8f8"]; + "0x00429a50" [label="0x00429a50\\ncompany_collection_count_active_companies", fillcolor="#f8f8f8"]; + "0x00429c10" [label="0x00429c10\\ncompany_collection_refresh_active_company_linked_transit_site_peer_caches", fillcolor="#f8f8f8"]; + "0x00429c70" [label="0x00429c70\\ncompany_read_derived_financial_report_metric_slot", fillcolor="#f8f8f8"]; + "0x0042a040" [label="0x0042a040\\ncompany_add_delta_into_stat_series_and_current_slot", fillcolor="#f8f8f8"]; + "0x0042a080" [label="0x0042a080\\ncompany_add_delta_into_stat_series_current_slot_and_optional_cash_totals", fillcolor="#f8f8f8"]; + "0x0042a0e0" [label="0x0042a0e0\\ncompany_query_highest_coupon_bond_slot_index", fillcolor="#f8f8f8"]; + "0x0042a2e0" [label="0x0042a2e0\\ncompany_read_control_transfer_metric_slot", fillcolor="#f8f8f8"]; + "0x0042a5d0" [label="0x0042a5d0\\ncompany_read_year_or_control_transfer_metric_value", fillcolor="#f8f8f8"]; + "0x00436590" [label="0x00436590\\nscenario_state_compute_issue_opinion_multiplier", fillcolor="#f8f8f8"]; + "0x00436710" [label="0x00436710\\nscenario_state_sum_issue_opinion_terms_raw", fillcolor="#f8f8f8"]; + "0x00437b20" [label="0x00437b20\\nsimulation_run_chunked_fast_forward_burst", fillcolor="#f8f8f8"]; + "0x00439140" [label="0x00439140\\nsimulation_frame_accumulate_and_step_world", fillcolor="#f8f8f8"]; + "0x00461cd0" [label="0x00461cd0\\nlocomotive_collection_select_best_era_matched_non_electric_fallback_id", fillcolor="#f8f8f8"]; + "0x004768c0" [label="0x004768c0\\nchairman_profile_owns_all_company_shares", fillcolor="#f8f8f8"]; + "0x00482d10" [label="0x00482d10\\nruntime_query_cached_local_exe_version_float", fillcolor="#f8f8f8"]; + "0x00482d80" [label="0x00482d80\\nruntime_query_cached_local_exe_version_string", fillcolor="#f8f8f8"]; + "0x00482e00" [label="0x00482e00\\nruntime_query_hundredths_scaled_build_version", fillcolor="#f8f8f8"]; + "0x004a94b0" [label="0x004a94b0\\ntrain_finalize_aux_route_entry_buffer_preserving_subflags", fillcolor="#f8f8f8"]; + "0x004ab980" [label="0x004ab980\\ntrain_set_route_operating_mode_and_scalar", fillcolor="#f8f8f8"]; + "0x004b2c10" [label="0x004b2c10\\ntrain_route_list_validate_reachability_and_station_pair", fillcolor="#f8f8f8"]; + "0x004b2f00" [label="0x004b2f00\\ntrain_route_list_select_entry_and_refresh_linked_site_state", fillcolor="#f8f8f8"]; + "0x004b3000" [label="0x004b3000\\ntrain_route_list_remove_entry_and_compact", fillcolor="#f8f8f8"]; + "0x004b3160" [label="0x004b3160\\ntrain_route_list_insert_staged_entry_at_index", fillcolor="#f8f8f8"]; + "0x004e39e0" [label="0x004e39e0\\ncompany_query_display_year_or_current_year", fillcolor="#f8f8f8"]; + "0x00517cf0" [label="0x00517cf0\\nindexed_collection_slot_count", fillcolor="#f8f8f8"]; + "0x00517d40" [label="0x00517d40\\nindexed_collection_entry_id_is_live", fillcolor="#f8f8f8"]; + "0x00518140" [label="0x00518140\\nindexed_collection_resolve_live_entry_by_id", fillcolor="#f8f8f8"]; + "0x00518380" [label="0x00518380\\nindexed_collection_get_nth_live_entry_id", fillcolor="#f8f8f8"]; + } + subgraph cluster_support { + label="support"; + color="#cccccc"; + "0x0051db80" [label="0x0051db80\\nmath_measure_float_xy_pair_distance", fillcolor="#f8f8f8"]; + "0x00559520" [label="0x00559520\\nsurface_init_rgba_pixel_buffer", fillcolor="#f8f8f8"]; + "0x0055d8d0" [label="0x0055d8d0\\ndisplay_get_primary_adapter_descriptor", fillcolor="#f8f8f8"]; + "0x005a152e" [label="0x005a152e\\nmath_abs_double_with_crt_special_case_handling", fillcolor="#f8f8f8"]; + } + "0x004010f0" -> "0x00406050"; + "0x004010f0" -> "0x00424010"; + "0x004014b0" -> "0x004019e0"; + "0x004014b0" -> "0x00426590"; + "0x004014b0" -> "0x0051c920"; + "0x00401860" -> "0x004801a0"; + "0x00401940" -> "0x00409720"; + "0x00401940" -> "0x00409770"; + "0x00401940" -> "0x004b3000"; + "0x004019e0" -> "0x004014b0"; + "0x004019e0" -> "0x00401c50"; + "0x004019e0" -> "0x00404ce0"; + "0x004019e0" -> "0x00406050"; + "0x004019e0" -> "0x004078a0"; + "0x004019e0" -> "0x00407bd0"; + "0x004019e0" -> "0x00409300"; + "0x004019e0" -> "0x004093d0"; + "0x004019e0" -> "0x00409830"; + "0x004019e0" -> "0x00409950"; + "0x004019e0" -> "0x0041d550"; + "0x004019e0" -> "0x0049bd40"; + "0x00401c50" -> "0x004019e0"; + "0x00401c50" -> "0x00423d70"; + "0x00401c50" -> "0x00424fd0"; + "0x00401c50" -> "0x00425a90"; + "0x00401c50" -> "0x004261b0"; + "0x00401c50" -> "0x00426260"; + "0x00401c50" -> "0x004273c0"; + "0x00401c50" -> "0x00427450"; + "0x00401c50" -> "0x004275c0"; + "0x00401c50" -> "0x0042a0e0"; + "0x00401c50" -> "0x0042a5d0"; + "0x00402c90" -> "0x00518140"; + "0x00402cb0" -> "0x00404640"; + "0x00402cb0" -> "0x004046a0"; + "0x00402cb0" -> "0x00404c60"; + "0x00402cb0" -> "0x00404ce0"; + "0x00402cb0" -> "0x0040ef10"; + "0x00402cb0" -> "0x004134d0"; + "0x00402cb0" -> "0x00417840"; + "0x00402cb0" -> "0x004197e0"; + "0x00402cb0" -> "0x00482e00"; + "0x00402cb0" -> "0x004a01a0"; + "0x00404640" -> "0x00402cb0"; + "0x00404640" -> "0x004046a0"; + "0x004046a0" -> "0x00402cb0"; + "0x004046a0" -> "0x00404640"; + "0x004046a0" -> "0x00406050"; + "0x004046a0" -> "0x00420280"; + "0x00404c60" -> "0x00402cb0"; + "0x00404c60" -> "0x00404ce0"; + "0x00404ce0" -> "0x004010f0"; + "0x00404ce0" -> "0x00404c60"; + "0x00404ce0" -> "0x00406050"; + "0x00404ce0" -> "0x00420030"; + "0x00404ce0" -> "0x00424010"; + "0x00404ce0" -> "0x0042a5d0"; + "0x00405920" -> "0x00406050"; + "0x00405920" -> "0x0047efe0"; + "0x00406050" -> "0x004010f0"; + "0x00406050" -> "0x004046a0"; + "0x00406050" -> "0x00405920"; + "0x00406050" -> "0x00425320"; + "0x00406050" -> "0x00426590"; + "0x00406050" -> "0x00426ef0"; + "0x00406050" -> "0x00427590"; + "0x00406050" -> "0x0042a5d0"; + "0x004078a0" -> "0x004019e0"; + "0x004078a0" -> "0x00409300"; + "0x004078a0" -> "0x00409830"; + "0x004078a0" -> "0x0041d550"; + "0x004078a0" -> "0x00461cd0"; + "0x00407bd0" -> "0x0047e330"; + "0x00407bd0" -> "0x004a65b0"; + "0x00408280" -> "0x00408380"; + "0x00408380" -> "0x00408280"; + "0x00408380" -> "0x00408f70"; + "0x00408380" -> "0x00409770"; + "0x00408f70" -> "0x00409950"; + "0x00409300" -> "0x004078a0"; + "0x00409300" -> "0x00409950"; + "0x004093d0" -> "0x00405920"; + "0x004093d0" -> "0x00407bd0"; + "0x004093d0" -> "0x0047efe0"; + "0x004093d0" -> "0x004801a0"; + "0x004093d0" -> "0x004a6630"; + "0x00409720" -> "0x00407bd0"; + "0x00409720" -> "0x004093d0"; + "0x00409770" -> "0x00408380"; + "0x00409770" -> "0x00409720"; + "0x00409770" -> "0x004b2f00"; + "0x00409770" -> "0x004b3160"; + "0x00409830" -> "0x004078a0"; + "0x00409830" -> "0x00408380"; + "0x00409830" -> "0x00409950"; + "0x00409830" -> "0x004b3160"; + "0x00409950" -> "0x00408f70"; + "0x00409950" -> "0x00409300"; + "0x00409950" -> "0x00409830"; + "0x00409950" -> "0x004264c0"; + "0x00409950" -> "0x00426590"; + "0x0040a590" -> "0x00413580"; + "0x0040a590" -> "0x00445de0"; + "0x0040ab50" -> "0x00437b20"; + "0x0040ab50" -> "0x00439140"; + "0x0040e360" -> "0x0040eba0"; + "0x0040e360" -> "0x0040ee10"; + "0x0040e450" -> "0x004133b0"; + "0x0040e450" -> "0x00414470"; + "0x0040e450" -> "0x00416e20"; + "0x0040e450" -> "0x00418a60"; + "0x0040eba0" -> "0x0040e360"; + "0x0040eba0" -> "0x0040ee10"; + "0x0040eba0" -> "0x0040ef10"; + "0x0040eba0" -> "0x0040f6d0"; + "0x0040eba0" -> "0x00481480"; + "0x0040eba0" -> "0x004814c0"; + "0x0040eba0" -> "0x00508bb0"; + "0x0040ee10" -> "0x0040e360"; + "0x0040ee10" -> "0x004133b0"; + "0x0040ee10" -> "0x00415f20"; + "0x0040ee10" -> "0x00434050"; + "0x0040ef10" -> "0x0040eba0"; + "0x0040ef10" -> "0x004101e0"; + "0x0040ef10" -> "0x00418be0"; + "0x0040f6d0" -> "0x0040eba0"; + "0x0040f6d0" -> "0x004134d0"; + "0x0040f6d0" -> "0x00418be0"; + "0x0040f6d0" -> "0x00481390"; + "0x0040fbe0" -> "0x0040fef0"; + "0x0040fbe0" -> "0x00467f50"; + "0x0040fef0" -> "0x0040fbe0"; + "0x0040fef0" -> "0x00467f50"; + "0x004101e0" -> "0x0040fef0"; + "0x004101e0" -> "0x00436590"; + "0x004101e0" -> "0x00482e00"; + "0x00412ca0" -> "0x004235c0"; + "0x004133b0" -> "0x0040e450"; + "0x004133b0" -> "0x0040ee10"; + "0x004133b0" -> "0x00413f50"; + "0x004133b0" -> "0x00414480"; + "0x004134d0" -> "0x0040f6d0"; + "0x004134d0" -> "0x00422ee0"; + "0x00413580" -> "0x004101e0"; + "0x00413f50" -> "0x004133b0"; + "0x00414470" -> "0x0040e450"; + "0x00414470" -> "0x00418a60"; + "0x00414480" -> "0x004133b0"; + "0x00414e10" -> "0x00416620"; + "0x00414fa0" -> "0x00415020"; + "0x00415020" -> "0x00414fa0"; + "0x00415570" -> "0x00416620"; + "0x00415f20" -> "0x0040ee10"; + "0x00415f20" -> "0x004160c0"; + "0x004160c0" -> "0x00415f20"; + "0x00416170" -> "0x004160c0"; + "0x00416170" -> "0x00418a60"; + "0x00416170" -> "0x00418be0"; + "0x00416620" -> "0x00414e10"; + "0x00416620" -> "0x00415570"; + "0x00416620" -> "0x00416ec0"; + "0x00416620" -> "0x004197e0"; + "0x00416620" -> "0x00494240"; + "0x00416e20" -> "0x0040e450"; + "0x00416e20" -> "0x00418be0"; + "0x00416e20" -> "0x00517cf0"; + "0x00416e20" -> "0x00518140"; + "0x00416e20" -> "0x00518380"; + "0x00416ec0" -> "0x00416620"; + "0x00416ec0" -> "0x00418be0"; + "0x00417790" -> "0x00417840"; + "0x00417840" -> "0x00402cb0"; + "0x00417840" -> "0x00417790"; + "0x00417840" -> "0x004197e0"; + "0x00418040" -> "0x00418be0"; + "0x004185a0" -> "0x00418610"; + "0x004185a0" -> "0x00418a60"; + "0x00418610" -> "0x00415020"; + "0x00418610" -> "0x004185a0"; + "0x00418610" -> "0x00418be0"; + "0x00418610" -> "0x004197e0"; + "0x00418a60" -> "0x0040e450"; + "0x00418a60" -> "0x00415570"; + "0x00418a60" -> "0x00416170"; + "0x00418a60" -> "0x004185a0"; + "0x00418be0" -> "0x0040ef10"; + "0x00418be0" -> "0x0040f6d0"; + "0x00418be0" -> "0x00416170"; + "0x00418be0" -> "0x00416e20"; + "0x00418be0" -> "0x00416ec0"; + "0x00418be0" -> "0x00418040"; + "0x00418be0" -> "0x00418610"; + "0x004197e0" -> "0x00402cb0"; + "0x004197e0" -> "0x00417840"; + "0x004197e0" -> "0x00424010"; + "0x004197e0" -> "0x004240a0"; + "0x004197e0" -> "0x00494cb0"; + "0x0041d550" -> "0x004078a0"; + "0x0041d550" -> "0x00436710"; + "0x0041d550" -> "0x00461cd0"; + "0x0041d550" -> "0x004cd680"; + "0x0041d550" -> "0x004cf0d0"; + "0x0041e220" -> "0x0042c690"; + "0x0041e2b0" -> "0x0041e220"; + "0x0041e2b0" -> "0x0041ea50"; + "0x0041e650" -> "0x004e9460"; + "0x0041e650" -> "0x00517cf0"; + "0x0041e650" -> "0x00518140"; + "0x0041e650" -> "0x00518380"; + "0x0041ea50" -> "0x0041e2b0"; + "0x0041ea50" -> "0x00518140"; + "0x0041ea50" -> "0x00518380"; + "0x0041f9b0" -> "0x004235c0"; + "0x00420030" -> "0x004207d0"; + "0x00420030" -> "0x0047efe0"; + "0x00420280" -> "0x004207d0"; + "0x004207d0" -> "0x00420030"; + "0x004207d0" -> "0x00420280"; + "0x004207d0" -> "0x0047efe0"; + "0x00421b60" -> "0x004384d0"; + "0x00421c20" -> "0x004235c0"; + "0x00422320" -> "0x0040a590"; + "0x00422320" -> "0x004228b0"; + "0x004228b0" -> "0x00422320"; + "0x004228b0" -> "0x00422be0"; + "0x00422900" -> "0x004235c0"; + "0x00422a70" -> "0x004134d0"; + "0x00422a70" -> "0x004197e0"; + "0x00422a70" -> "0x00422ee0"; + "0x00422a70" -> "0x00430270"; + "0x00422be0" -> "0x004235c0"; + "0x00422ee0" -> "0x004134d0"; + "0x00422ee0" -> "0x004235c0"; + "0x004234e0" -> "0x004d0420"; + "0x004235c0" -> "0x00412ca0"; + "0x004235c0" -> "0x0041f9b0"; + "0x004235c0" -> "0x0041fac0"; + "0x004235c0" -> "0x00422900"; + "0x004235c0" -> "0x00422be0"; + "0x004235c0" -> "0x00422ee0"; + "0x004235c0" -> "0x004234e0"; + "0x00423d30" -> "0x00422900"; + "0x00423d30" -> "0x00437b20"; + "0x00423d70" -> "0x0042a040"; + "0x00423d70" -> "0x0042a080"; + "0x00423e40" -> "0x00425320"; + "0x00423e40" -> "0x00427540"; + "0x00423e40" -> "0x004c23a0"; + "0x00423eb0" -> "0x00424fd0"; + "0x00423eb0" -> "0x004c2720"; + "0x00423ec0" -> "0x004240a0"; + "0x00423ec0" -> "0x00493cf0"; + "0x00424010" -> "0x004c1b60"; + "0x00424010" -> "0x004c5fc9"; + "0x00424030" -> "0x004c5fc9"; + "0x004240a0" -> "0x004197e0"; + "0x004240a0" -> "0x00493cf0"; + "0x004240a0" -> "0x0049d380"; + "0x00424580" -> "0x00425880"; + "0x00424580" -> "0x004258c0"; + "0x00424580" -> "0x00427540"; + "0x00424580" -> "0x00436710"; + "0x00424580" -> "0x004c23a0"; + "0x004246b0" -> "0x0042a2e0"; + "0x004248d0" -> "0x00424fd0"; + "0x004248d0" -> "0x0042a5d0"; + "0x00424fd0" -> "0x00423eb0"; + "0x00424fd0" -> "0x004248d0"; + "0x00424fd0" -> "0x00425a90"; + "0x00424fd0" -> "0x004273c0"; + "0x00424fd0" -> "0x00427450"; + "0x00424fd0" -> "0x00436590"; + "0x00424fd0" -> "0x004ebd10"; + "0x00425320" -> "0x00406050"; + "0x00425320" -> "0x00423e40"; + "0x00425320" -> "0x00424580"; + "0x00425320" -> "0x00427540"; + "0x00425320" -> "0x00427590"; + "0x00425320" -> "0x0042a5d0"; + "0x00425880" -> "0x00424580"; + "0x00425880" -> "0x0042a5d0"; + "0x00425880" -> "0x004e9b20"; + "0x004258c0" -> "0x00424580"; + "0x004258c0" -> "0x0042a5d0"; + "0x004258c0" -> "0x004e9b20"; + "0x00425a90" -> "0x00424fd0"; + "0x00425a90" -> "0x0042a040"; + "0x00426260" -> "0x004c5140"; + "0x004264c0" -> "0x00409950"; + "0x004264c0" -> "0x004e7670"; + "0x00426590" -> "0x00406050"; + "0x00426590" -> "0x0047efe0"; + "0x00426be0" -> "0x004c1b60"; + "0x00426be0" -> "0x004c5fc9"; + "0x00426ef0" -> "0x004e5cf0"; + "0x00426ef0" -> "0x00518140"; + "0x004273c0" -> "0x00401c50"; + "0x004273c0" -> "0x00424fd0"; + "0x004273c0" -> "0x0042a040"; + "0x004273c0" -> "0x0042a080"; + "0x004273c0" -> "0x004c46d0"; + "0x00427450" -> "0x00401c50"; + "0x00427450" -> "0x00424fd0"; + "0x00427450" -> "0x00425320"; + "0x00427450" -> "0x004c3f30"; + "0x00427540" -> "0x00424580"; + "0x00427540" -> "0x00425320"; + "0x00427540" -> "0x004275c0"; + "0x00427590" -> "0x00406050"; + "0x00427590" -> "0x00425320"; + "0x004275c0" -> "0x00401c50"; + "0x004275c0" -> "0x00427540"; + "0x004275c0" -> "0x004c3890"; + "0x00429990" -> "0x00518380"; + "0x004299f0" -> "0x00429990"; + "0x004299f0" -> "0x00518380"; + "0x00429a50" -> "0x00518140"; + "0x00429a50" -> "0x00518380"; + "0x00429c10" -> "0x004093d0"; + "0x00429c70" -> "0x0042a5d0"; + "0x0042a040" -> "0x00423d70"; + "0x0042a040" -> "0x00425a90"; + "0x0042a040" -> "0x004273c0"; + "0x0042a040" -> "0x004c5fc9"; + "0x0042a080" -> "0x004273c0"; + "0x0042a080" -> "0x0042a040"; + "0x0042a0e0" -> "0x00401c50"; + "0x0042a2e0" -> "0x004246b0"; + "0x0042a2e0" -> "0x00424fd0"; + "0x0042a2e0" -> "0x00429c70"; + "0x0042a5d0" -> "0x00429c70"; + "0x0042a5d0" -> "0x0042a2e0"; + "0x0042c690" -> "0x0041e220"; + "0x0042c690" -> "0x0042cdf0"; + "0x0042cab0" -> "0x0040fef0"; + "0x0042cab0" -> "0x004101e0"; + "0x0042cdf0" -> "0x0042c690"; + "0x0042d700" -> "0x004d9970"; + "0x0042d700" -> "0x004da0f0"; + "0x0042d740" -> "0x004d9d10"; + "0x0042d740" -> "0x004da0f0"; + "0x0042db20" -> "0x0042df30"; + "0x0042db20" -> "0x0042df70"; + "0x0042db20" -> "0x0042dfb0"; + "0x0042db20" -> "0x0042dff0"; + "0x0042db20" -> "0x0042e050"; + "0x0042db20" -> "0x00433130"; + "0x0042df30" -> "0x0042db20"; + "0x0042df70" -> "0x0042df30"; + "0x0042dfb0" -> "0x0042df30"; + "0x0042dff0" -> "0x0042df30"; + "0x0042dff0" -> "0x0042df70"; + "0x0042dff0" -> "0x0042dfb0"; + "0x0042e050" -> "0x004db8b0"; + "0x00430270" -> "0x00422a70"; + "0x00430b50" -> "0x00431b20"; + "0x00430b50" -> "0x00432ea0"; + "0x00431b20" -> "0x00424030"; + "0x00431b20" -> "0x00430270"; + "0x00431b20" -> "0x00434890"; + "0x00431b20" -> "0x004348c0"; + "0x004323a0" -> "0x00424fd0"; + "0x004323a0" -> "0x0042d700"; + "0x004323a0" -> "0x00430b50"; + "0x004323a0" -> "0x00431b20"; + "0x004323a0" -> "0x00432f40"; + "0x00432ea0" -> "0x00430b50"; + "0x00432f40" -> "0x0040a590"; + "0x00432f40" -> "0x00424fd0"; + "0x00432f40" -> "0x004323a0"; + "0x00432f40" -> "0x0047d120"; + "0x00432f40" -> "0x004e51ea"; + "0x00432f40" -> "0x00517cf0"; + "0x00432f40" -> "0x00518140"; + "0x00432f40" -> "0x00518380"; + "0x00433130" -> "0x0042db20"; + "0x00433130" -> "0x00517cf0"; + "0x00433130" -> "0x00518140"; + "0x00433130" -> "0x00518380"; + "0x004333f0" -> "0x004336a0"; + "0x004333f0" -> "0x004839b0"; + "0x004333f0" -> "0x004839e0"; + "0x004333f0" -> "0x0051c920"; + "0x004336a0" -> "0x004333f0"; + "0x004336a0" -> "0x00502c00"; + "0x00433b00" -> "0x00512c50"; + "0x00434050" -> "0x00445de0"; + "0x00434050" -> "0x00482160"; + "0x00434050" -> "0x004b9e10"; + "0x00434050" -> "0x004bb9e0"; + "0x00434300" -> "0x00443a50"; + "0x00434300" -> "0x00446d40"; + "0x00434300" -> "0x00482ec0"; + "0x004348c0" -> "0x00434890"; + "0x00436590" -> "0x00424fd0"; + "0x00436590" -> "0x004ebd10"; + "0x00436710" -> "0x00424580"; + "0x00437220" -> "0x004384d0"; + "0x00437220" -> "0x0047bc80"; + "0x004377a0" -> "0x004cc2d0"; + "0x00437b20" -> "0x004384d0"; + "0x004384d0" -> "0x004133b0"; + "0x004384d0" -> "0x0041ea50"; + "0x004384d0" -> "0x00421b60"; + "0x004384d0" -> "0x00421c20"; + "0x004384d0" -> "0x00437220"; + "0x004384d0" -> "0x004377a0"; + "0x004384d0" -> "0x00437b20"; + "0x004384d0" -> "0x0044fb70"; + "0x004384d0" -> "0x0047d440"; + "0x004384d0" -> "0x004882e0"; + "0x00438890" -> "0x004384d0"; + "0x00438890" -> "0x00445ac0"; + "0x00438890" -> "0x005033d0"; + "0x00439140" -> "0x0040ab50"; + "0x00439140" -> "0x0043db00"; + "0x00439140" -> "0x00483f70"; + "0x00439140" -> "0x004b9d70"; + "0x00439140" -> "0x004b9d80"; + "0x00439140" -> "0x004c8670"; + "0x00439140" -> "0x004c8680"; + "0x00439140" -> "0x004dc7d0"; + "0x00439140" -> "0x004dc7e0"; + "0x00439140" -> "0x004e0720"; + "0x00439140" -> "0x004e1f50"; + "0x00439140" -> "0x004e1f60"; + "0x00439140" -> "0x004e4ee0"; + "0x00439140" -> "0x004f2e80"; + "0x00439140" -> "0x004f2e90"; + "0x00439140" -> "0x004fe120"; + "0x00439140" -> "0x004fe130"; + "0x00439140" -> "0x0050f740"; + "0x00439140" -> "0x0050f750"; + "0x0043f640" -> "0x00420030"; + "0x0043f640" -> "0x004207d0"; + "0x0043f640" -> "0x0046b780"; + "0x0043f640" -> "0x0047e240"; + "0x0043f640" -> "0x0047e690"; + "0x0043f640" -> "0x0047efe0"; + "0x0043f640" -> "0x00504ae0"; + "0x00442400" -> "0x0047be50"; + "0x00442400" -> "0x004839b0"; + "0x00442400" -> "0x004839e0"; + "0x00442400" -> "0x00502220"; + "0x00443a50" -> "0x00438890"; + "0x00443a50" -> "0x00482ec0"; + "0x00445ac0" -> "0x00443a50"; + "0x00445ac0" -> "0x00446d40"; + "0x00445ac0" -> "0x004dd010"; + "0x00445de0" -> "0x00434050"; + "0x00445de0" -> "0x00444dd0"; + "0x00445de0" -> "0x00446240"; + "0x00445de0" -> "0x004dd010"; + "0x00446240" -> "0x00445de0"; + "0x00461cd0" -> "0x004078a0"; + "0x00461cd0" -> "0x0041d550"; + "0x00464410" -> "0x00484590"; + "0x00464410" -> "0x004853c0"; + "0x00464410" -> "0x004886e0"; + "0x00464410" -> "0x00489830"; + "0x00464410" -> "0x00489a20"; + "0x00464410" -> "0x0051ebc0"; + "0x00467c30" -> "0x00467eb0"; + "0x00467df0" -> "0x00467eb0"; + "0x00467df0" -> "0x00467f20"; + "0x00467df0" -> "0x004680b0"; + "0x00467eb0" -> "0x0041e650"; + "0x00467eb0" -> "0x00467c30"; + "0x00467eb0" -> "0x00467df0"; + "0x00467eb0" -> "0x0047e690"; + "0x00467f20" -> "0x00467df0"; + "0x00467f50" -> "0x0040fef0"; + "0x00467f50" -> "0x00467c30"; + "0x00467f50" -> "0x00467eb0"; + "0x004680b0" -> "0x00467df0"; + "0x004682c0" -> "0x00467c30"; + "0x004682c0" -> "0x00517cf0"; + "0x004682c0" -> "0x00518140"; + "0x004682c0" -> "0x00518380"; + "0x00468300" -> "0x00467c30"; + "0x00469720" -> "0x005519f0"; + "0x0046a6c0" -> "0x00482d80"; + "0x0046b780" -> "0x00438890"; + "0x0046b780" -> "0x00445ac0"; + "0x004768c0" -> "0x004e5cf0"; + "0x00477820" -> "0x0047d440"; + "0x00477860" -> "0x0047d440"; + "0x0047bc80" -> "0x00437220"; + "0x0047bc80" -> "0x0047be50"; + "0x0047be50" -> "0x0047bc80"; + "0x0047be50" -> "0x00502220"; + "0x0047d080" -> "0x004c6f30"; + "0x0047d080" -> "0x004c98a0"; + "0x0047d120" -> "0x00432f40"; + "0x0047d440" -> "0x004377a0"; + "0x0047d440" -> "0x00477820"; + "0x0047d440" -> "0x00477860"; + "0x0047e240" -> "0x0041e220"; + "0x0047e330" -> "0x0047e240"; + "0x0047e330" -> "0x00518380"; + "0x0047f010" -> "0x0047e690"; + "0x0047fdb0" -> "0x0051db80"; + "0x004801a0" -> "0x00401860"; + "0x004801a0" -> "0x004093d0"; + "0x00480210" -> "0x00417840"; + "0x00480210" -> "0x00481390"; + "0x00480210" -> "0x00493cf0"; + "0x00480590" -> "0x004813d0"; + "0x00480bb0" -> "0x0040ef10"; + "0x00480bb0" -> "0x004682c0"; + "0x00480bb0" -> "0x00493cf0"; + "0x00480bb0" -> "0x004a01a0"; + "0x00480bb0" -> "0x004a45f0"; + "0x00481390" -> "0x0040f6d0"; + "0x00481390" -> "0x00480210"; + "0x00481390" -> "0x00518140"; + "0x004813d0" -> "0x00429c10"; + "0x004813d0" -> "0x00480590"; + "0x00481480" -> "0x0047fdb0"; + "0x004814c0" -> "0x0047dd10"; + "0x00482160" -> "0x00434050"; + "0x00482160" -> "0x00469720"; + "0x00482d10" -> "0x00482d80"; + "0x00482d10" -> "0x00482e00"; + "0x00482d80" -> "0x0046a6c0"; + "0x00482d80" -> "0x00482d10"; + "0x00482e00" -> "0x00402cb0"; + "0x00482e00" -> "0x00482d10"; + "0x00482e00" -> "0x004a65b0"; + "0x00482ec0" -> "0x00438890"; + "0x00482ec0" -> "0x00443a50"; + "0x00482ec0" -> "0x004840e0"; + "0x00482ec0" -> "0x004b8dc0"; + "0x00482ec0" -> "0x004b8e60"; + "0x00482ec0" -> "0x004c7bc0"; + "0x00482ec0" -> "0x004c7fc0"; + "0x00482ec0" -> "0x004dfbe0"; + "0x00482ec0" -> "0x004dfd70"; + "0x00482ec0" -> "0x004ea620"; + "0x00482ec0" -> "0x004ea730"; + "0x00482ec0" -> "0x004efe80"; + "0x00482ec0" -> "0x00504010"; + "0x00482ec0" -> "0x005174e0"; + "0x00482ec0" -> "0x00517570"; + "0x004839b0" -> "0x004333f0"; + "0x004839e0" -> "0x004333f0"; + "0x004840e0" -> "0x00482ec0"; + "0x004840e0" -> "0x00483f70"; + "0x004840e0" -> "0x00521390"; + "0x00484910" -> "0x0051eea0"; + "0x00484980" -> "0x00484590"; + "0x00484980" -> "0x00484910"; + "0x00484980" -> "0x0051ef20"; + "0x00484a60" -> "0x004853c0"; + "0x00485060" -> "0x00484910"; + "0x00485060" -> "0x00484d70"; + "0x004852e0" -> "0x00484910"; + "0x004852e0" -> "0x00484d70"; + "0x004853c0" -> "0x00484910"; + "0x004853c0" -> "0x00484d70"; + "0x004853c0" -> "0x00485060"; + "0x004882e0" -> "0x004384d0"; + "0x00489a20" -> "0x004886e0"; + "0x00489a20" -> "0x00489830"; + "0x00489f80" -> "0x0049d380"; + "0x00489f80" -> "0x004a01a0"; + "0x00489f80" -> "0x004a4380"; + "0x00489f80" -> "0x004a45f0"; + "0x00489f80" -> "0x004a4ce0"; + "0x00489f80" -> "0x004a4ff0"; + "0x00493cf0" -> "0x00423ec0"; + "0x00493cf0" -> "0x004240a0"; + "0x00493cf0" -> "0x004955b0"; + "0x00493cf0" -> "0x004a01a0"; + "0x00494240" -> "0x00416620"; + "0x00494240" -> "0x00518140"; + "0x00494cb0" -> "0x0049bd40"; + "0x00494e40" -> "0x004a42b0"; + "0x00494e90" -> "0x004a42b0"; + "0x00494eb0" -> "0x004a4340"; + "0x00494ed0" -> "0x004a4ce0"; + "0x00494f00" -> "0x004a01a0"; + "0x00494fb0" -> "0x004950f0"; + "0x00494fb0" -> "0x004a6360"; + "0x004950f0" -> "0x00494fb0"; + "0x004950f0" -> "0x0049d380"; + "0x004950f0" -> "0x004a45f0"; + "0x004950f0" -> "0x004a4ce0"; + "0x004952f0" -> "0x0049c900"; + "0x004952f0" -> "0x0049d380"; + "0x004952f0" -> "0x004a01a0"; + "0x004953c0" -> "0x0049c900"; + "0x004953c0" -> "0x0049d380"; + "0x004955b0" -> "0x00493cf0"; + "0x0049bd40" -> "0x004019e0"; + "0x0049bd40" -> "0x00402cb0"; + "0x0049bd40" -> "0x00494cb0"; + "0x0049bd40" -> "0x0049d380"; + "0x0049bd40" -> "0x004a6630"; + "0x0049bd40" -> "0x0051db80"; + "0x0049c900" -> "0x00494cb0"; + "0x0049c900" -> "0x004952f0"; + "0x0049c900" -> "0x004953c0"; + "0x0049c900" -> "0x0049d380"; + "0x0049c900" -> "0x005a152e"; + "0x0049d380" -> "0x004240a0"; + "0x0049d380" -> "0x00494cb0"; + "0x0049d380" -> "0x004952f0"; + "0x0049d380" -> "0x004953c0"; + "0x0049d380" -> "0x0049bd40"; + "0x0049d380" -> "0x0049c900"; + "0x0049d380" -> "0x004a01a0"; + "0x0049d380" -> "0x0051db80"; + "0x0049d380" -> "0x005a152e"; + "0x004a01a0" -> "0x00402cb0"; + "0x004a01a0" -> "0x00480bb0"; + "0x004a01a0" -> "0x00493cf0"; + "0x004a01a0" -> "0x00494f00"; + "0x004a01a0" -> "0x004952f0"; + "0x004a01a0" -> "0x0049d380"; + "0x004a01a0" -> "0x004a42b0"; + "0x004a01a0" -> "0x004a4340"; + "0x004a01a0" -> "0x00518140"; + "0x004a42b0" -> "0x00494e40"; + "0x004a42b0" -> "0x00494e90"; + "0x004a42b0" -> "0x004a01a0"; + "0x004a4340" -> "0x00494eb0"; + "0x004a4340" -> "0x004a01a0"; + "0x004a4380" -> "0x00489f80"; + "0x004a4380" -> "0x00494e90"; + "0x004a4380" -> "0x00494eb0"; + "0x004a4380" -> "0x00494f00"; + "0x004a4380" -> "0x004a42b0"; + "0x004a4380" -> "0x004a45f0"; + "0x004a45f0" -> "0x00480bb0"; + "0x004a45f0" -> "0x00489f80"; + "0x004a45f0" -> "0x00494eb0"; + "0x004a45f0" -> "0x00494f00"; + "0x004a45f0" -> "0x00495020"; + "0x004a45f0" -> "0x004950f0"; + "0x004a45f0" -> "0x004a42b0"; + "0x004a45f0" -> "0x004a4380"; + "0x004a45f0" -> "0x004a4ce0"; + "0x004a4c00" -> "0x004a4ce0"; + "0x004a4c00" -> "0x004a6360"; + "0x004a4ce0" -> "0x00489f80"; + "0x004a4ce0" -> "0x00494ed0"; + "0x004a4ce0" -> "0x004950f0"; + "0x004a4ce0" -> "0x004a4340"; + "0x004a4ce0" -> "0x004a6360"; + "0x004a4ff0" -> "0x00489f80"; + "0x004a4ff0" -> "0x00494f00"; + "0x004a4ff0" -> "0x004a42b0"; + "0x004a5280" -> "0x004a65b0"; + "0x004a5900" -> "0x00424010"; + "0x004a5900" -> "0x004a5280"; + "0x004a5900" -> "0x004a62c0"; + "0x004a5900" -> "0x004a65b0"; + "0x004a5fc0" -> "0x004a4ff0"; + "0x004a5fc0" -> "0x004a6320"; + "0x004a62c0" -> "0x004a5900"; + "0x004a62c0" -> "0x004a5fc0"; + "0x004a6320" -> "0x004a5fc0"; + "0x004a6320" -> "0x004a6630"; + "0x004a6360" -> "0x00494fb0"; + "0x004a6360" -> "0x004a4c00"; + "0x004a6360" -> "0x004a4ce0"; + "0x004a65b0" -> "0x00482e00"; + "0x004a65b0" -> "0x004a5280"; + "0x004a65b0" -> "0x004a5900"; + "0x004a65b0" -> "0x004a6630"; + "0x004a6630" -> "0x004093d0"; + "0x004a6630" -> "0x0049bd40"; + "0x004a6630" -> "0x004a65b0"; + "0x004a6630" -> "0x004b2c10"; + "0x004a94b0" -> "0x00434050"; + "0x004ab980" -> "0x00434050"; + "0x004b2c10" -> "0x004a6630"; + "0x004b2f00" -> "0x004b3000"; + "0x004b3000" -> "0x004b2f00"; + "0x004b3160" -> "0x00516d00"; + "0x004b8dc0" -> "0x004b8e60"; + "0x004b9a20" -> "0x004b99c0"; + "0x004b9d70" -> "0x00439140"; + "0x004b9d80" -> "0x00439140"; + "0x004b9e10" -> "0x004bb9e0"; + "0x004b9e10" -> "0x00513130"; + "0x004b9fd0" -> "0x0047e240"; + "0x004b9fd0" -> "0x004b99c0"; + "0x004ba3d0" -> "0x004b9a20"; + "0x004ba3d0" -> "0x004bad20"; + "0x004ba3d0" -> "0x00517d40"; + "0x004ba3d0" -> "0x00518140"; + "0x004ba3d0" -> "0x0051c920"; + "0x004bad20" -> "0x004ba3d0"; + "0x004baef0" -> "0x004b9a20"; + "0x004baef0" -> "0x004ba3d0"; + "0x004baef0" -> "0x004bad20"; + "0x004baef0" -> "0x004bb9e0"; + "0x004bb9e0" -> "0x00434050"; + "0x004bb9e0" -> "0x004b9a20"; + "0x004bb9e0" -> "0x004b9e10"; + "0x004bb9e0" -> "0x004bad20"; + "0x004bb9e0" -> "0x004c98a0"; + "0x004bc0a0" -> "0x004baef0"; + "0x004bc0a0" -> "0x004bc100"; + "0x004bc0a0" -> "0x0053fa50"; + "0x004bc100" -> "0x004bc0a0"; + "0x004bfb30" -> "0x0042a5d0"; + "0x004bfb30" -> "0x004c1ab0"; + "0x004bfb30" -> "0x004c6b40"; + "0x004c0160" -> "0x004246b0"; + "0x004c0160" -> "0x004e5130"; + "0x004c1610" -> "0x004c2ca0"; + "0x004c16f0" -> "0x00518140"; + "0x004c1730" -> "0x0042a5d0"; + "0x004c1730" -> "0x004c5540"; + "0x004c1ab0" -> "0x004bfb30"; + "0x004c1ab0" -> "0x004c1730"; + "0x004c1ab0" -> "0x004c5540"; + "0x004c1b60" -> "0x004c1d30"; + "0x004c1b60" -> "0x004c1d70"; + "0x004c1b60" -> "0x004c22e0"; + "0x004c1d30" -> "0x004c1b60"; + "0x004c1d70" -> "0x00424010"; + "0x004c1d70" -> "0x0054f710"; + "0x004c1ec0" -> "0x004c1610"; + "0x004c1ec0" -> "0x004c5540"; + "0x004c22e0" -> "0x004c1b60"; + "0x004c23a0" -> "0x00423e40"; + "0x004c23a0" -> "0x00424580"; + "0x004c23a0" -> "0x00425320"; + "0x004c23a0" -> "0x0042a5d0"; + "0x004c2720" -> "0x00423eb0"; + "0x004c2720" -> "0x004c0160"; + "0x004c2ca0" -> "0x00434870"; + "0x004c2ca0" -> "0x004c5540"; + "0x004c2ca0" -> "0x004c56a0"; + "0x004c2ca0" -> "0x004e5cf0"; + "0x004c2ca0" -> "0x00540a47"; + "0x004c2ca0" -> "0x005639d2"; + "0x004c3470" -> "0x00429990"; + "0x004c3470" -> "0x004299f0"; + "0x004c3470" -> "0x00429a50"; + "0x004c3470" -> "0x004c2ca0"; + "0x004c3470" -> "0x004c3540"; + "0x004c3470" -> "0x004c3550"; + "0x004c3540" -> "0x004c3470"; + "0x004c3550" -> "0x004c3470"; + "0x004c3560" -> "0x004c3890"; + "0x004c3560" -> "0x004c98a0"; + "0x004c3890" -> "0x004275c0"; + "0x004c3890" -> "0x004c3560"; + "0x004c3890" -> "0x004c56a0"; + "0x004c3b50" -> "0x004c3f30"; + "0x004c3b50" -> "0x004c98a0"; + "0x004c3f30" -> "0x00427450"; + "0x004c3f30" -> "0x004c56a0"; + "0x004c4300" -> "0x004c46d0"; + "0x004c4300" -> "0x004c98a0"; + "0x004c46d0" -> "0x004273c0"; + "0x004c46d0" -> "0x004c4300"; + "0x004c46d0" -> "0x004c56a0"; + "0x004c4c70" -> "0x004c4e30"; + "0x004c4c70" -> "0x004c5140"; + "0x004c4c70" -> "0x004c5360"; + "0x004c4c70" -> "0x0053f9c0"; + "0x004c4e30" -> "0x004c5360"; + "0x004c4e30" -> "0x004c98a0"; + "0x004c5140" -> "0x00426260"; + "0x004c5140" -> "0x004c5360"; + "0x004c5140" -> "0x004c98a0"; + "0x004c5360" -> "0x004c4c70"; + "0x004c5360" -> "0x004c4e30"; + "0x004c5360" -> "0x004c5140"; + "0x004c5360" -> "0x004c56a0"; + "0x004c5540" -> "0x004c1730"; + "0x004c5540" -> "0x004c1ab0"; + "0x004c5540" -> "0x004c1d30"; + "0x004c5540" -> "0x004c1d70"; + "0x004c5540" -> "0x004c1ec0"; + "0x004c5540" -> "0x004c22e0"; + "0x004c5540" -> "0x004c2ca0"; + "0x004c5540" -> "0x0053fa50"; + "0x004c56a0" -> "0x00423d70"; + "0x004c56a0" -> "0x00426d60"; + "0x004c56a0" -> "0x004c2ca0"; + "0x004c56a0" -> "0x004c3890"; + "0x004c56a0" -> "0x004c3f30"; + "0x004c56a0" -> "0x004c46d0"; + "0x004c56a0" -> "0x004c5360"; + "0x004c56a0" -> "0x004c5a0e"; + "0x004c56a0" -> "0x004c5b99"; + "0x004c56a0" -> "0x004c5fc9"; + "0x004c56a0" -> "0x004ddbd0"; + "0x004c56a0" -> "0x004ec640"; + "0x004c56a0" -> "0x0050ccc0"; + "0x004c5a0e" -> "0x00428a10"; + "0x004c5a0e" -> "0x004c56a0"; + "0x004c5b99" -> "0x00425a90"; + "0x004c5b99" -> "0x004c56a0"; + "0x004c5fc9" -> "0x00424030"; + "0x004c5fc9" -> "0x0042a040"; + "0x004c5fc9" -> "0x004c56a0"; + "0x004c6b40" -> "0x004bfb30"; + "0x004c6b40" -> "0x004c6c30"; + "0x004c6c30" -> "0x00434870"; + "0x004c6f30" -> "0x0047d080"; + "0x004c6f30" -> "0x004c6bb0"; + "0x004c6f30" -> "0x004c6c30"; + "0x004c6f30" -> "0x004ddbd0"; + "0x004c7200" -> "0x004c6b40"; + "0x004c7200" -> "0x004c6bb0"; + "0x004c7200" -> "0x004c6c30"; + "0x004c7bc0" -> "0x004c7fc0"; + "0x004c7fc0" -> "0x0053fa50"; + "0x004c8670" -> "0x00439140"; + "0x004c8680" -> "0x00439140"; + "0x004c98a0" -> "0x004ee0e0"; + "0x004ca1c0" -> "0x004cc2d0"; + "0x004ca1c0" -> "0x004cecc0"; + "0x004cb2b0" -> "0x004ca790"; + "0x004cc250" -> "0x004ca1c0"; + "0x004cc250" -> "0x004cc2d0"; + "0x004cc250" -> "0x004cecc0"; + "0x004cc2d0" -> "0x004c9da0"; + "0x004ce070" -> "0x004ca540"; + "0x004ce070" -> "0x004ca790"; + "0x004ce070" -> "0x004ca910"; + "0x004ce070" -> "0x004cadf0"; + "0x004ce070" -> "0x004cb2b0"; + "0x004ce070" -> "0x004cc980"; + "0x004ce070" -> "0x004cd070"; + "0x004ce070" -> "0x004cd680"; + "0x004ce070" -> "0x004cdbd0"; + "0x004ce070" -> "0x004cf910"; + "0x004ce070" -> "0x004d3000"; + "0x004ce070" -> "0x004d3020"; + "0x004ce070" -> "0x004d3060"; + "0x004ce070" -> "0x004d3080"; + "0x004ce070" -> "0x004d30a0"; + "0x004ce070" -> "0x004d4110"; + "0x004ce070" -> "0x004d4130"; + "0x004cecc0" -> "0x004cc2d0"; + "0x004cf0d0" -> "0x004cd680"; + "0x004d0420" -> "0x004234e0"; + "0x004d0420" -> "0x004d30a0"; + "0x004d30a0" -> "0x004d0420"; + "0x004d4500" -> "0x0053fa50"; + "0x004d57c0" -> "0x0053fa50"; + "0x004d5d00" -> "0x004d6090"; + "0x004d5d00" -> "0x004d6d60"; + "0x004d5d00" -> "0x004d7060"; + "0x004d5f50" -> "0x004d6090"; + "0x004d5f50" -> "0x004d6d60"; + "0x004d5f50" -> "0x004d7060"; + "0x004d6090" -> "0x004d6d60"; + "0x004d6090" -> "0x004d7060"; + "0x004d67f0" -> "0x004d6d60"; + "0x004d67f0" -> "0x004d7060"; + "0x004d6d60" -> "0x0053fa50"; + "0x004d7060" -> "0x004d5d00"; + "0x004d7060" -> "0x004d5f50"; + "0x004d7060" -> "0x004d6090"; + "0x004d7060" -> "0x004d67f0"; + "0x004d77b0" -> "0x004d9390"; + "0x004d77b0" -> "0x004d9970"; + "0x004d77b0" -> "0x004daf40"; + "0x004d8120" -> "0x004d9ed0"; + "0x004d8120" -> "0x004da640"; + "0x004d8120" -> "0x004da700"; + "0x004d88f0" -> "0x004d9390"; + "0x004d88f0" -> "0x004da7c0"; + "0x004d88f0" -> "0x004da860"; + "0x004d88f0" -> "0x004da920"; + "0x004d88f0" -> "0x004db120"; + "0x004d88f0" -> "0x004dbf93"; + "0x004d8d50" -> "0x004dbf93"; + "0x004d8ea0" -> "0x004db520"; + "0x004d8ea0" -> "0x004db5e0"; + "0x004d8ea0" -> "0x004db6a0"; + "0x004d8ea0" -> "0x004dbfca"; + "0x004d91e0" -> "0x004d8d50"; + "0x004d91e0" -> "0x004db120"; + "0x004d9360" -> "0x004d7ef0"; + "0x004d9390" -> "0x004d77b0"; + "0x004d9390" -> "0x004d88f0"; + "0x004d9390" -> "0x004d9f50"; + "0x004d9390" -> "0x004daf40"; + "0x004d9390" -> "0x004dbb80"; + "0x004d9970" -> "0x0042d700"; + "0x004d9970" -> "0x004d9ed0"; + "0x004d9970" -> "0x004da640"; + "0x004d9970" -> "0x004da700"; + "0x004d9d10" -> "0x0042d740"; + "0x004d9d10" -> "0x004da0f0"; + "0x004d9d10" -> "0x004dbb80"; + "0x004d9dc0" -> "0x004d57c0"; + "0x004d9dc0" -> "0x004da640"; + "0x004d9dc0" -> "0x004da700"; + "0x004d9e40" -> "0x004d6d60"; + "0x004d9e40" -> "0x004da7c0"; + "0x004d9e40" -> "0x004da860"; + "0x004d9ed0" -> "0x004d8120"; + "0x004d9ed0" -> "0x004d9970"; + "0x004d9f50" -> "0x004d9390"; + "0x004d9f50" -> "0x004db120"; + "0x004d9f50" -> "0x004dbb80"; + "0x004da0f0" -> "0x0042d740"; + "0x004da0f0" -> "0x0042df30"; + "0x004da0f0" -> "0x0042df70"; + "0x004da0f0" -> "0x0042dfb0"; + "0x004da0f0" -> "0x0042dff0"; + "0x004da0f0" -> "0x004d9970"; + "0x004da0f0" -> "0x004d9d10"; + "0x004da0f0" -> "0x004d9f50"; + "0x004da0f0" -> "0x004dbfca"; + "0x004da640" -> "0x004d8120"; + "0x004da640" -> "0x004d9970"; + "0x004da640" -> "0x004d9dc0"; + "0x004da700" -> "0x004d8120"; + "0x004da700" -> "0x004d9970"; + "0x004da700" -> "0x004d9dc0"; + "0x004da7c0" -> "0x004d88f0"; + "0x004da7c0" -> "0x004d9e40"; + "0x004da7c0" -> "0x004da0f0"; + "0x004da860" -> "0x004d88f0"; + "0x004da860" -> "0x004d9e40"; + "0x004da860" -> "0x004da0f0"; + "0x004da920" -> "0x004d88f0"; + "0x004da920" -> "0x004da0f0"; + "0x004da9a0" -> "0x004da0f0"; + "0x004da9a0" -> "0x004db120"; + "0x004da9a0" -> "0x004dbf93"; + "0x004dab60" -> "0x004d8d50"; + "0x004dab60" -> "0x004d9d10"; + "0x004dab60" -> "0x004da9a0"; + "0x004daf40" -> "0x004db6a0"; + "0x004daf40" -> "0x004db6f0"; + "0x004db120" -> "0x004d8120"; + "0x004db120" -> "0x004d88f0"; + "0x004db120" -> "0x004d9970"; + "0x004db120" -> "0x004d9f50"; + "0x004db120" -> "0x004dab60"; + "0x004db520" -> "0x004d7ef0"; + "0x004db520" -> "0x004d8ea0"; + "0x004db520" -> "0x004db120"; + "0x004db5e0" -> "0x004d7ef0"; + "0x004db5e0" -> "0x004db120"; + "0x004db5e0" -> "0x004db520"; + "0x004db6a0" -> "0x004d8ea0"; + "0x004db6a0" -> "0x004daf40"; + "0x004db6a0" -> "0x004db120"; + "0x004db6a0" -> "0x004db6f0"; + "0x004db6f0" -> "0x004d7ef0"; + "0x004db6f0" -> "0x004daf40"; + "0x004db6f0" -> "0x004db120"; + "0x004db6f0" -> "0x004db6a0"; + "0x004db8b0" -> "0x0042e050"; + "0x004db8b0" -> "0x00432ea0"; + "0x004db8b0" -> "0x004c98a0"; + "0x004db8b0" -> "0x004d7ef0"; + "0x004db8b0" -> "0x004db120"; + "0x004dba90" -> "0x004c98a0"; + "0x004dba90" -> "0x004d7ef0"; + "0x004dba90" -> "0x004db120"; + "0x004dbb80" -> "0x004d9360"; + "0x004dbb80" -> "0x004d9d10"; + "0x004dbb80" -> "0x004d9f50"; + "0x004dbb80" -> "0x004db520"; + "0x004dbb80" -> "0x004db5e0"; + "0x004dbb80" -> "0x004db8b0"; + "0x004dbb80" -> "0x004dba90"; + "0x004dbb80" -> "0x004dbf93"; + "0x004dbb80" -> "0x004dbfca"; + "0x004dbe7a" -> "0x004c98a0"; + "0x004dbf93" -> "0x004d88f0"; + "0x004dbf93" -> "0x004d8d50"; + "0x004dbf93" -> "0x004da0f0"; + "0x004dbf93" -> "0x004da9a0"; + "0x004dbf93" -> "0x004dbb80"; + "0x004dbfca" -> "0x004d8ea0"; + "0x004dbfca" -> "0x004dab60"; + "0x004dbfca" -> "0x004db120"; + "0x004dc670" -> "0x0053fa50"; + "0x004dc7d0" -> "0x00439140"; + "0x004dc7e0" -> "0x00439140"; + "0x004dc7f0" -> "0x004fe120"; + "0x004dc7f0" -> "0x00501e50"; + "0x004dd010" -> "0x004839b0"; + "0x004ddbd0" -> "0x004d4500"; + "0x004dfbe0" -> "0x004dfd70"; + "0x004dfbe0" -> "0x004dfdf0"; + "0x004dfbe0" -> "0x0053fa50"; + "0x004dfdf0" -> "0x0053fa50"; + "0x004e0960" -> "0x004e0b20"; + "0x004e0960" -> "0x004e0ba0"; + "0x004e0b20" -> "0x004e0e40"; + "0x004e0b20" -> "0x0053fa50"; + "0x004e0ba0" -> "0x0053f830"; + "0x004e0e40" -> "0x004e0b20"; + "0x004e1d60" -> "0x004e2c10"; + "0x004e1f50" -> "0x00439140"; + "0x004e1f60" -> "0x00439140"; + "0x004e2c10" -> "0x004e3a00"; + "0x004e2c10" -> "0x004e3a80"; + "0x004e2c10" -> "0x004e45d0"; + "0x004e39e0" -> "0x004e5cf0"; + "0x004e3a00" -> "0x00429990"; + "0x004e3a00" -> "0x00429a50"; + "0x004e3a00" -> "0x004e2c10"; + "0x004e3a80" -> "0x004ddbd0"; + "0x004e3a80" -> "0x004e2c10"; + "0x004e3a80" -> "0x004e3a00"; + "0x004e3a80" -> "0x004e45d0"; + "0x004e3a80" -> "0x004e5300"; + "0x004e3a80" -> "0x004e5a80"; + "0x004e3a80" -> "0x004e5cf0"; + "0x004e45d0" -> "0x00477820"; + "0x004e45d0" -> "0x004e2c10"; + "0x004e45d0" -> "0x004e39e0"; + "0x004e45d0" -> "0x004e3a00"; + "0x004e45d0" -> "0x004e3a80"; + "0x004e45d0" -> "0x00518380"; + "0x004e4b10" -> "0x004e4ee0"; + "0x004e4ee0" -> "0x004e2c10"; + "0x004e4ee0" -> "0x004e4b10"; + "0x004e5130" -> "0x004c0160"; + "0x004e5130" -> "0x004ea060"; + "0x004e51ea" -> "0x00432f40"; + "0x004e51ea" -> "0x004ea060"; + "0x004e5300" -> "0x00429a50"; + "0x004e5300" -> "0x004348c0"; + "0x004e5a80" -> "0x00434870"; + "0x004e5a80" -> "0x004e5cf0"; + "0x004e5cf0" -> "0x00426ef0"; + "0x004e5cf0" -> "0x0042a5d0"; + "0x004e5cf0" -> "0x004768c0"; + "0x004e5cf0" -> "0x004c56a0"; + "0x004e5cf0" -> "0x004e39e0"; + "0x004e68e0" -> "0x00429a50"; + "0x004e68e0" -> "0x0042a5d0"; + "0x004e6ef0" -> "0x00477820"; + "0x004e6ef0" -> "0x00477860"; + "0x004e7670" -> "0x004264c0"; + "0x004e7670" -> "0x004e39e0"; + "0x004e8bb0" -> "0x00426590"; + "0x004e9460" -> "0x0041e220"; + "0x004e9460" -> "0x0041e650"; + "0x004e9b20" -> "0x00425880"; + "0x004e9b20" -> "0x004258c0"; + "0x004e9b20" -> "0x0042a5d0"; + "0x004e9b20" -> "0x004ea060"; + "0x004ea060" -> "0x004e5130"; + "0x004ea060" -> "0x004e51ea"; + "0x004ea060" -> "0x004e5300"; + "0x004ea060" -> "0x004e5a80"; + "0x004ea060" -> "0x004e68e0"; + "0x004ea060" -> "0x004e6ef0"; + "0x004ea060" -> "0x004e7670"; + "0x004ea060" -> "0x004e8270"; + "0x004ea060" -> "0x004e8bb0"; + "0x004ea060" -> "0x004e9460"; + "0x004ea060" -> "0x004e9b20"; + "0x004ea620" -> "0x004e3a80"; + "0x004ea620" -> "0x004e5300"; + "0x004ea620" -> "0x004e5a80"; + "0x004ea620" -> "0x004e5cf0"; + "0x004ea620" -> "0x004ea720"; + "0x004ea620" -> "0x004ea730"; + "0x004ea620" -> "0x0053fa50"; + "0x004ea720" -> "0x004ea620"; + "0x004ea720" -> "0x004ea730"; + "0x004ea730" -> "0x004ea620"; + "0x004eb890" -> "0x004ebd10"; + "0x004ebd10" -> "0x004eb890"; + "0x004ec640" -> "0x004c56a0"; + "0x004ec640" -> "0x004ebd10"; + "0x004ee0e0" -> "0x00484910"; + "0x004ee0e0" -> "0x004c98a0"; + "0x004ee1d0" -> "0x00484910"; + "0x004ee3a0" -> "0x00482ec0"; + "0x004ee810" -> "0x0053f830"; + "0x004ee950" -> "0x004efe80"; + "0x004ee950" -> "0x0053f830"; + "0x004eed30" -> "0x004ee950"; + "0x004f2e80" -> "0x00439140"; + "0x004f2e80" -> "0x004f3a10"; + "0x004f2e90" -> "0x00439140"; + "0x004f38a0" -> "0x004f3a10"; + "0x004f38a0" -> "0x0053fa50"; + "0x004f38f0" -> "0x004c98a0"; + "0x004f3a10" -> "0x004f38a0"; + "0x004fe130" -> "0x00439140"; + "0x004fe130" -> "0x00501e50"; + "0x00500640" -> "0x0053fa50"; + "0x00502030" -> "0x00504010"; + "0x00502030" -> "0x00552560"; + "0x00502160" -> "0x00484910"; + "0x00502160" -> "0x005021c0"; + "0x00502160" -> "0x00504010"; + "0x005021c0" -> "0x00484910"; + "0x005021c0" -> "0x00502160"; + "0x005021c0" -> "0x00504010"; + "0x00502220" -> "0x00442400"; + "0x00502220" -> "0x0047be50"; + "0x00502220" -> "0x00502c00"; + "0x00502220" -> "0x0053f830"; + "0x00502220" -> "0x00559520"; + "0x00502720" -> "0x004ee3a0"; + "0x005027b0" -> "0x004333f0"; + "0x005027b0" -> "0x004336a0"; + "0x005027b0" -> "0x00502220"; + "0x005027b0" -> "0x00502c00"; + "0x00502910" -> "0x005027b0"; + "0x00502910" -> "0x00502c00"; + "0x00502c00" -> "0x004336a0"; + "0x00502c00" -> "0x00438890"; + "0x00502c00" -> "0x00482d80"; + "0x00502c00" -> "0x004eb0b0"; + "0x00502c00" -> "0x005027b0"; + "0x00502c00" -> "0x00502910"; + "0x00502c00" -> "0x005033d0"; + "0x005033d0" -> "0x0042a970"; + "0x005033d0" -> "0x00484910"; + "0x005033d0" -> "0x004eb0b0"; + "0x005033d0" -> "0x004fe120"; + "0x005033d0" -> "0x00501e50"; + "0x005033d0" -> "0x00501f20"; + "0x005033d0" -> "0x00502220"; + "0x005033d0" -> "0x00502550"; + "0x005033d0" -> "0x00502910"; + "0x005033d0" -> "0x00502c00"; + "0x005033d0" -> "0x00504010"; + "0x005033d0" -> "0x005411c0"; + "0x00504010" -> "0x00502030"; + "0x00504010" -> "0x00502160"; + "0x00504010" -> "0x005021c0"; + "0x00504010" -> "0x00502550"; + "0x00504010" -> "0x00502910"; + "0x00504010" -> "0x00502c00"; + "0x00504010" -> "0x0053f830"; + "0x00504010" -> "0x0053f9c0"; + "0x00504010" -> "0x0053fa50"; + "0x00504ae0" -> "0x0043f640"; + "0x00504ae0" -> "0x00504a90"; + "0x00504ba0" -> "0x0047e240"; + "0x00504ba0" -> "0x00504a90"; + "0x00504ba0" -> "0x00504ae0"; + "0x00504bea" -> "0x0047e240"; + "0x00504bea" -> "0x00504ae0"; + "0x00505760" -> "0x0047e330"; + "0x00505760" -> "0x00504ba0"; + "0x005068c0" -> "0x0053fa50"; + "0x00508bb0" -> "0x00508550"; + "0x005091b0" -> "0x00508bb0"; + "0x00509d80" -> "0x0053fa50"; + "0x0050a530" -> "0x00508bb0"; + "0x0050c500" -> "0x0050c940"; + "0x0050c940" -> "0x0050c500"; + "0x0050ccc0" -> "0x004c56a0"; + "0x0050ccc0" -> "0x0050c940"; + "0x0050e400" -> "0x0053fa50"; + "0x0050f740" -> "0x00439140"; + "0x0050f740" -> "0x00512c50"; + "0x0050f750" -> "0x00439140"; + "0x0050f790" -> "0x0050f760"; + "0x0050f790" -> "0x0050f890"; + "0x0050f890" -> "0x0050f760"; + "0x0050f890" -> "0x0050f790"; + "0x0050f890" -> "0x00511500"; + "0x0050fc00" -> "0x005519f0"; + "0x0050fc00" -> "0x00552560"; + "0x00511500" -> "0x0050f890"; + "0x00511500" -> "0x0050fc00"; + "0x00511500" -> "0x00512080"; + "0x00511500" -> "0x00512c50"; + "0x00511500" -> "0x0053fa50"; + "0x00512080" -> "0x00511500"; + "0x00512c50" -> "0x00433b00"; + "0x00512c50" -> "0x00511500"; + "0x00512c50" -> "0x00512080"; + "0x005130f0" -> "0x00518140"; + "0x005131a0" -> "0x00513220"; + "0x00513220" -> "0x004c98a0"; + "0x00514110" -> "0x00514420"; + "0x00514160" -> "0x00513720"; + "0x00514160" -> "0x00514420"; + "0x00514160" -> "0x00514620"; + "0x00514160" -> "0x00514690"; + "0x00514420" -> "0x00512f80"; + "0x00514420" -> "0x00514160"; + "0x00514420" -> "0x00514620"; + "0x00514420" -> "0x0053fa50"; + "0x00514690" -> "0x004ab980"; + "0x00514690" -> "0x004b2c10"; + "0x00514690" -> "0x004b3000"; + "0x00514690" -> "0x004b3160"; + "0x00514690" -> "0x00512c50"; + "0x00514690" -> "0x005130f0"; + "0x00514690" -> "0x00513220"; + "0x00514690" -> "0x00514160"; + "0x00516d00" -> "0x004b3160"; + "0x00516d00" -> "0x004c98a0"; + "0x00516d00" -> "0x00516be0"; + "0x005174e0" -> "0x0053fa50"; + "0x00517570" -> "0x00484910"; + "0x00517570" -> "0x005174e0"; + "0x00517cf0" -> "0x00518380"; + "0x00517d40" -> "0x004ba3d0"; + "0x00517d40" -> "0x00518140"; + "0x0051c920" -> "0x004ba3d0"; + "0x0051db80" -> "0x00402cb0"; + "0x0051db80" -> "0x0049bd40"; + "0x0051db80" -> "0x0049d380"; + "0x0051db80" -> "0x00552900"; + "0x0051ef20" -> "0x0051ebc0"; + "0x0051ef20" -> "0x0051eea0"; + "0x005204b0" -> "0x00443a50"; + "0x00520620" -> "0x005204b0"; + "0x00521390" -> "0x00521060"; + "0x0053f830" -> "0x004e0ba0"; + "0x0053f830" -> "0x00502220"; + "0x0053f830" -> "0x00504010"; + "0x0053f9c0" -> "0x004c4c70"; + "0x0053f9c0" -> "0x00558130"; + "0x00540a47" -> "0x005639d2"; + "0x005411c0" -> "0x005033d0"; + "0x0054fb10" -> "0x0054f710"; + "0x005519f0" -> "0x0054fb10"; + "0x00552900" -> "0x0051db80"; + "0x00558130" -> "0x0053f9c0"; + "0x0055d8d0" -> "0x00484a60"; + "0x005a152e" -> "0x0049c900"; + "0x005a152e" -> "0x0049d380"; +} diff --git a/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-subgraph.md b/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-subgraph.md new file mode 100644 index 0000000..f4ead75 --- /dev/null +++ b/artifacts/exports/rt3-1.06/runtime-effect-service-depth7-subgraph.md @@ -0,0 +1,2232 @@ +# Scenario Runtime Effect Service Subgraph (Depth 7) + +- Nodes: `525` +- Edges: `1235` +- Seeds: `0x00430b50`, `0x00431b20`, `0x004323a0`, `0x00432ea0` +- Graphviz: `runtime-effect-service-depth7-subgraph.dot` + +## Nodes + +| Address | Name | Subsystem | Confidence | +| --- | --- | --- | --- | +| `0x004010f0` | `city_compute_connection_bonus_candidate_weight` | `map` | `4` | +| `0x004014b0` | `company_try_buy_unowned_industry_near_city_and_publish_news` | `simulation` | `2` | +| `0x00401860` | `company_query_cached_linked_transit_route_anchor_entry_id` | `simulation` | `3` | +| `0x00401940` | `company_reset_linked_transit_caches_and_reseed_empty_train_routes` | `simulation` | `2` | +| `0x004019e0` | `company_service_periodic_city_connection_finance_and_linked_transit_lanes` | `simulation` | `2` | +| `0x00401c50` | `company_evaluate_annual_finance_policy_and_publish_news` | `simulation` | `2` | +| `0x00402c90` | `placed_structure_resolve_linked_candidate_record` | `map` | `2` | +| `0x00402cb0` | `city_connection_try_build_route_with_optional_direct_site_placement` | `map` | `3` | +| `0x00404640` | `city_connection_bonus_try_compact_route_builder_from_region_entry` | `map` | `3` | +| `0x004046a0` | `city_connection_bonus_build_peer_route_candidate` | `map` | `4` | +| `0x00404c60` | `city_connection_try_build_route_between_region_entry_pair` | `map` | `3` | +| `0x00404ce0` | `simulation_try_select_and_publish_company_start_or_city_connection_news` | `simulation` | `3` | +| `0x00405920` | `company_query_min_linked_site_distance_to_xy` | `simulation` | `4` | +| `0x00406050` | `company_evaluate_and_publish_city_connection_bonus_news` | `simulation` | `4` | +| `0x004078a0` | `company_select_preferred_available_locomotive_id` | `simulation` | `3` | +| `0x00407bd0` | `company_rebuild_linked_transit_autoroute_site_score_cache` | `simulation` | `3` | +| `0x00408280` | `company_select_best_owned_linked_transit_site_by_autoroute_score` | `simulation` | `3` | +| `0x00408380` | `company_build_linked_transit_autoroute_entry` | `simulation` | `3` | +| `0x00408f70` | `company_compute_owned_linked_transit_site_score_total` | `simulation` | `3` | +| `0x00409300` | `company_publish_train_upgrade_news` | `simulation` | `3` | +| `0x004093d0` | `company_rebuild_linked_transit_site_peer_cache` | `simulation` | `3` | +| `0x00409720` | `company_service_linked_transit_site_caches` | `simulation` | `3` | +| `0x00409770` | `train_try_append_linked_transit_autoroute_entry` | `simulation` | `3` | +| `0x00409830` | `company_try_add_linked_transit_train_and_publish_news` | `simulation` | `3` | +| `0x00409950` | `company_balance_linked_transit_train_roster` | `simulation` | `3` | +| `0x0040a590` | `simulation_service_periodic_boundary_work` | `simulation` | `3` | +| `0x0040ab50` | `simulation_advance_to_target_calendar_point` | `simulation` | `3` | +| `0x0040e360` | `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` | `map` | `2` | +| `0x0040e450` | `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` | `map` | `2` | +| `0x0040eba0` | `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` | `map` | `2` | +| `0x0040ee10` | `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` | `map` | `2` | +| `0x0040ef10` | `placed_structure_finalize_creation_or_rebuild_local_runtime_state` | `map` | `3` | +| `0x0040f6d0` | `placed_structure_construct_entry_from_candidate_and_world_args` | `map` | `3` | +| `0x0040fbe0` | `placed_structure_endpoint_pair_has_shared_route_entry_key` | `map` | `3` | +| `0x0040fef0` | `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` | `map` | `3` | +| `0x004101e0` | `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` | `map` | `3` | +| `0x00412ca0` | `world_region_pick_commercial_profile_label_by_region_rank` | `map` | `4` | +| `0x004133b0` | `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` | `map` | `2` | +| `0x004134d0` | `placed_structure_collection_allocate_and_construct_entry` | `map` | `3` | +| `0x00413580` | `placed_structure_collection_refresh_quarter_subset_route_style_state` | `map` | `3` | +| `0x00413f50` | `placed_structure_local_runtime_site_id_queue_pop_next` | `map` | `3` | +| `0x00414470` | `placed_structure_cache_projected_rect_profile_slot_id` | `map` | `3` | +| `0x00414480` | `placed_structure_local_runtime_site_id_queue_count` | `map` | `3` | +| `0x00414e10` | `world_grid_refresh_projected_rect_surface_and_region_byte_tables` | `map` | `2` | +| `0x00414fa0` | `world_grid_count_flagged_cells_and_collect_float_samples` | `map` | `3` | +| `0x00415020` | `world_grid_refresh_flagged_region_float_extrema_and_mean` | `map` | `3` | +| `0x00415570` | `placed_structure_try_select_projected_rect_profile_slot` | `map` | `2` | +| `0x00415f20` | `placed_structure_recursive_collect_connected_component_tile_bounds` | `map` | `3` | +| `0x004160c0` | `placed_structure_collect_connected_component_tile_bounds_with_version_gate` | `map` | `3` | +| `0x00416170` | `placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh` | `map` | `3` | +| `0x00416620` | `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` | `map` | `2` | +| `0x00416e20` | `indexed_collection_resolve_live_entry_id_by_stem_string` | `map` | `3` | +| `0x00416ec0` | `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` | `map` | `2` | +| `0x00417790` | `map_angle_rotate_grid_offset_pair_into_world_offset_pair` | `map` | `2` | +| `0x00417840` | `placed_structure_project_candidate_grid_extent_offset_by_rotation` | `map` | `3` | +| `0x00418040` | `placed_structure_render_local_runtime_overlay_payload_from_projected_bounds` | `map` | `2` | +| `0x004185a0` | `world_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples` | `map` | `2` | +| `0x00418610` | `world_grid_refresh_projected_rect_sample_band_and_flag_mask` | `map` | `2` | +| `0x00418a60` | `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` | `map` | `2` | +| `0x00418be0` | `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` | `map` | `2` | +| `0x004197e0` | `placed_structure_validate_projected_candidate_placement` | `map` | `3` | +| `0x0041d550` | `locomotive_era_and_engine_type_pass_company_policy_gate` | `simulation` | `2` | +| `0x0041e220` | `structure_candidate_is_enabled_for_current_year` | `map` | `3` | +| `0x0041e2b0` | `structure_candidate_rebuild_local_service_metrics` | `map` | `3` | +| `0x0041e650` | `structure_candidate_query_route_style_or_local_availability_metric` | `map` | `3` | +| `0x0041ea50` | `world_setup_building_collection_phase` | `map` | `3` | +| `0x0041f9b0` | `world_region_count_structure_profiles_before_year_for_category` | `map` | `4` | +| `0x0041fac0` | `world_region_read_structure_profile_label_and_weight_by_index` | `map` | `4` | +| `0x00420030` | `city_connection_bonus_exists_matching_peer_site` | `map` | `4` | +| `0x00420280` | `city_connection_bonus_select_first_matching_peer_site` | `map` | `4` | +| `0x004207d0` | `city_site_format_connection_bonus_status_label` | `map` | `4` | +| `0x00421b60` | `world_region_collection_seed_default_regions` | `map` | `4` | +| `0x00421c20` | `world_region_collection_run_building_population_pass` | `map` | `4` | +| `0x00422320` | `world_region_normalize_cached_structure_balance_scalars` | `map` | `3` | +| `0x004228b0` | `world_region_count_linked_placed_structures_by_category` | `map` | `3` | +| `0x00422900` | `world_region_accumulate_structure_category_totals` | `map` | `3` | +| `0x00422a70` | `world_region_validate_and_commit_candidate_placement` | `map` | `3` | +| `0x00422be0` | `world_region_count_placed_structures_for_category` | `map` | `3` | +| `0x00422ee0` | `world_region_try_place_candidate_structure` | `map` | `4` | +| `0x004234e0` | `world_region_query_projected_structure_count_scalar_by_category` | `map` | `3` | +| `0x004235c0` | `world_region_balance_structure_demand_and_place_candidates` | `map` | `4` | +| `0x00423d30` | `world_region_refresh_cached_category_totals_and_weight_slots` | `map` | `3` | +| `0x00423d70` | `company_repay_bond_slot_and_compact_debt_table` | `simulation` | `4` | +| `0x00423e40` | `company_compute_weighted_average_bond_interest_rate` | `simulation` | `4` | +| `0x00423eb0` | `company_query_cached_share_price_scalar` | `simulation` | `3` | +| `0x00423ec0` | `company_adjust_available_track_laying_capacity_with_floor_zero` | `simulation` | `2` | +| `0x00424010` | `company_has_territory_access_rights` | `simulation` | `4` | +| `0x00424030` | `company_set_territory_access_rights_byte` | `simulation` | `4` | +| `0x004240a0` | `company_query_available_track_laying_capacity_or_unlimited` | `simulation` | `2` | +| `0x00424580` | `company_compute_prime_rate_from_issue39_scenario_baseline` | `simulation` | `4` | +| `0x004246b0` | `company_compute_five_year_weighted_shareholder_return` | `simulation` | `3` | +| `0x004248d0` | `company_compute_cached_recent_per_share_performance_subscore` | `simulation` | `3` | +| `0x00424fd0` | `company_compute_public_support_adjusted_share_price_scalar` | `simulation` | `3` | +| `0x00425320` | `company_compute_connection_bonus_value_ladder` | `simulation` | `4` | +| `0x00425880` | `company_compute_negative_cash_balance_interest_rate` | `shell` | `4` | +| `0x004258c0` | `company_compute_positive_cash_balance_interest_rate` | `shell` | `4` | +| `0x00425a90` | `company_declare_bankruptcy_and_halve_bond_debt` | `simulation` | `4` | +| `0x004261b0` | `company_count_unassigned_shares_after_active_chairman_holdings` | `simulation` | `4` | +| `0x00426260` | `company_compute_board_approved_dividend_rate_ceiling` | `simulation` | `4` | +| `0x004264c0` | `company_count_owned_trains` | `simulation` | `3` | +| `0x00426590` | `company_count_linked_transit_sites` | `simulation` | `4` | +| `0x00426be0` | `company_can_purchase_territory_access_rights` | `simulation` | `4` | +| `0x00426d60` | `company_deactivate_and_clear_chairman_share_links` | `simulation` | `4` | +| `0x00426ef0` | `company_get_linked_chairman_profile_record` | `simulation` | `4` | +| `0x004273c0` | `company_repurchase_public_shares_and_reduce_capital` | `simulation` | `3` | +| `0x00427450` | `company_issue_public_shares_and_raise_capital` | `simulation` | `3` | +| `0x00427540` | `company_compute_bond_interest_rate_quote` | `simulation` | `3` | +| `0x00427590` | `company_connection_bonus_lane_is_unlocked` | `simulation` | `4` | +| `0x004275c0` | `company_issue_bond_and_record_terms` | `simulation` | `3` | +| `0x00428a10` | `company_clear_selected_chairman_if_current_profile` | `simulation` | `4` | +| `0x00429990` | `company_collection_get_nth_active_company_id` | `simulation` | `4` | +| `0x004299f0` | `company_collection_count_active_companies_before_company_id` | `simulation` | `4` | +| `0x00429a50` | `company_collection_count_active_companies` | `simulation` | `4` | +| `0x00429c10` | `company_collection_refresh_active_company_linked_transit_site_peer_caches` | `simulation` | `3` | +| `0x00429c70` | `company_read_derived_financial_report_metric_slot` | `simulation` | `3` | +| `0x0042a040` | `company_add_delta_into_stat_series_and_current_slot` | `simulation` | `3` | +| `0x0042a080` | `company_add_delta_into_stat_series_current_slot_and_optional_cash_totals` | `simulation` | `3` | +| `0x0042a0e0` | `company_query_highest_coupon_bond_slot_index` | `simulation` | `3` | +| `0x0042a2e0` | `company_read_control_transfer_metric_slot` | `simulation` | `3` | +| `0x0042a5d0` | `company_read_year_or_control_transfer_metric_value` | `simulation` | `3` | +| `0x0042a970` | `shell_open_file_dialog_copy_selected_path_and_restore_cwd` | `shell` | `3` | +| `0x0042c690` | `placed_structure_rebuild_candidate_cargo_service_bitsets` | `map` | `3` | +| `0x0042cab0` | `placed_structure_accumulate_candidate_metric_or_emit_route_style_peer_link` | `map` | `3` | +| `0x0042cdf0` | `placed_structure_refresh_candidate_service_state` | `map` | `4` | +| `0x0042d700` | `scenario_event_query_standalone_condition_row_list_class_and_modifier_flags` | `scenario` | `2` | +| `0x0042d740` | `scenario_event_query_grouped_effect_row_list_type_flags` | `scenario` | `2` | +| `0x0042db20` | `scenario_event_refresh_runtime_record_from_packed_state` | `scenario` | `2` | +| `0x0042df30` | `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` | `scenario` | `2` | +| `0x0042df70` | `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` | `scenario` | `2` | +| `0x0042dfb0` | `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` | `scenario` | `2` | +| `0x0042dff0` | `scenario_event_condition_row_list_has_any_class_bit012_or_special_fallback` | `scenario` | `2` | +| `0x0042e050` | `scenario_event_clone_runtime_record_deep_copy` | `scenario` | `2` | +| `0x00430270` | `world_try_place_random_structure_batch_from_compact_record` | `map` | `3` | +| `0x00430b50` | `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` | `scenario` | `3` | +| `0x00431b20` | `world_apply_compact_runtime_effect_record_to_resolved_targets` | `map` | `3` | +| `0x004323a0` | `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` | `scenario` | `3` | +| `0x00432ea0` | `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` | `scenario` | `3` | +| `0x00432f40` | `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` | `scenario` | `3` | +| `0x00433130` | `scenario_event_collection_refresh_runtime_records_from_packed_state` | `scenario` | `3` | +| `0x004333f0` | `shell_setup_build_file_list_records_from_current_root_and_pattern` | `shell` | `3` | +| `0x004336a0` | `shell_setup_file_list_construct_and_scan_dataset` | `shell` | `3` | +| `0x00433b00` | `shell_can_open_trainbuy_window_or_warn` | `shell` | `4` | +| `0x00434050` | `shell_has_auxiliary_preview_owner` | `shell` | `4` | +| `0x00434300` | `world_runtime_release_global_services` | `map` | `3` | +| `0x00434870` | `scenario_state_get_selected_chairman_company_record` | `map` | `4` | +| `0x00434890` | `scenario_state_set_selected_chairman_profile` | `map` | `4` | +| `0x004348c0` | `scenario_state_get_selected_chairman_profile_record` | `map` | `4` | +| `0x00436590` | `scenario_state_compute_issue_opinion_multiplier` | `simulation` | `4` | +| `0x00436710` | `scenario_state_sum_issue_opinion_terms_raw` | `simulation` | `4` | +| `0x00437220` | `world_build_chairman_profile_slot_records` | `map` | `4` | +| `0x004377a0` | `world_seed_default_chairman_profile_slots` | `map` | `4` | +| `0x00437b20` | `simulation_run_chunked_fast_forward_burst` | `simulation` | `3` | +| `0x004384d0` | `world_run_post_load_generation_pipeline` | `map` | `4` | +| `0x00438890` | `shell_active_mode_run_profile_startup_and_load_dispatch` | `map` | `4` | +| `0x00439140` | `simulation_frame_accumulate_and_step_world` | `simulation` | `4` | +| `0x0043db00` | `world_view_service_shell_input_pan_and_hover` | `shell` | `4` | +| `0x0043f640` | `world_render_station_candidate_service_map_overlay` | `render` | `4` | +| `0x00442400` | `shell_setup_load_selected_profile_bundle_into_payload_record` | `shell` | `3` | +| `0x00443a50` | `world_entry_transition_and_runtime_bringup` | `map` | `4` | +| `0x00444dd0` | `map_bundle_open_reference_databases` | `map` | `3` | +| `0x00445ac0` | `shell_map_file_entry_coordinator` | `map` | `4` | +| `0x00445de0` | `shell_map_file_world_bundle_coordinator` | `map` | `4` | +| `0x00446240` | `world_runtime_serialize_smp_bundle` | `map` | `3` | +| `0x00446d40` | `world_load_saved_runtime_state_bundle` | `map` | `4` | +| `0x0044fb70` | `world_compute_transport_and_pricing_grid` | `map` | `3` | +| `0x00461cd0` | `locomotive_collection_select_best_era_matched_non_electric_fallback_id` | `simulation` | `2` | +| `0x00464410` | `shell_dispatch_ui_command` | `shell` | `4` | +| `0x00467c30` | `placed_structure_route_link_recompute_endpoint_pair_state` | `map` | `3` | +| `0x00467df0` | `placed_structure_route_link_detach_current_owner_chain` | `map` | `3` | +| `0x00467eb0` | `placed_structure_route_link_attach_site_owner` | `map` | `3` | +| `0x00467f20` | `placed_structure_route_link_attach_route_node_owner` | `map` | `3` | +| `0x00467f50` | `placed_structure_route_link_allocate_site_pair_for_candidate_class` | `map` | `3` | +| `0x004680b0` | `placed_structure_route_link_release_and_detach` | `map` | `3` | +| `0x004682c0` | `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` | `map` | `3` | +| `0x00468300` | `placed_structure_route_link_rebuild_route_style_grid_counters_and_endpoint_state` | `map` | `3` | +| `0x00469720` | `multiplayer_preview_dataset_service_frame` | `shell` | `3` | +| `0x0046a6c0` | `multiplayer_session_event_publish_registration_field` | `shell` | `3` | +| `0x0046b780` | `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` | `shell` | `4` | +| `0x004768c0` | `chairman_profile_owns_all_company_shares` | `simulation` | `4` | +| `0x00477820` | `profile_collection_count_active_chairman_records` | `map` | `4` | +| `0x00477860` | `profile_collection_get_nth_active_chairman_record` | `map` | `4` | +| `0x0047bc80` | `shell_setup_payload_seed_unique_row_category_bytes_and_marker_slots` | `shell` | `3` | +| `0x0047be50` | `shell_setup_profile_copy_payload_scroll_count_and_campaign_byte_and_seed_row_categories` | `shell` | `3` | +| `0x0047d080` | `start_new_company_dialog_open` | `shell` | `4` | +| `0x0047d120` | `start_new_company_dialog_commit_create_company` | `shell` | `4` | +| `0x0047d440` | `world_conditionally_seed_named_starting_railroad_companies` | `map` | `4` | +| `0x0047dd10` | `placed_structure_remove_site_id_from_proximity_bucket_lists` | `map` | `3` | +| `0x0047e240` | `placed_structure_query_candidate_local_service_metrics` | `map` | `3` | +| `0x0047e330` | `placed_structure_count_candidates_with_local_service_metrics` | `map` | `3` | +| `0x0047e690` | `placed_structure_query_candidate_directional_route_overlay_summary` | `map` | `3` | +| `0x0047efe0` | `placed_structure_query_linked_company_id` | `map` | `4` | +| `0x0047f010` | `placed_structure_append_unique_route_entry` | `map` | `4` | +| `0x0047fdb0` | `placed_structure_append_nearby_transit_site_distance_bucket_entry` | `map` | `3` | +| `0x004801a0` | `placed_structure_is_linked_transit_site_reachable_from_company_route_anchor` | `map` | `3` | +| `0x00480210` | `placed_structure_construct_linked_site_record_from_anchor_and_coords` | `map` | `3` | +| `0x00480590` | `placed_structure_teardown_linked_site_runtime_state_before_removal` | `map` | `3` | +| `0x00480bb0` | `placed_structure_refresh_linked_site_display_name_and_route_anchor` | `map` | `3` | +| `0x00481390` | `placed_structure_collection_allocate_and_construct_linked_site_record` | `map` | `3` | +| `0x004813d0` | `placed_structure_collection_remove_linked_site_record` | `map` | `3` | +| `0x00481480` | `placed_structure_collection_append_site_into_all_proximity_bucket_lists` | `map` | `3` | +| `0x004814c0` | `placed_structure_collection_remove_site_id_from_all_proximity_bucket_lists` | `map` | `3` | +| `0x00482160` | `shell_state_service_active_mode_frame` | `shell` | `4` | +| `0x00482d10` | `runtime_query_cached_local_exe_version_float` | `simulation` | `3` | +| `0x00482d80` | `runtime_query_cached_local_exe_version_string` | `simulation` | `3` | +| `0x00482e00` | `runtime_query_hundredths_scaled_build_version` | `simulation` | `3` | +| `0x00482ec0` | `shell_transition_mode` | `bootstrap` | `4` | +| `0x004839b0` | `shell_setup_query_file_list_uses_map_extension_pattern` | `shell` | `3` | +| `0x004839e0` | `shell_setup_query_file_list_root_dir_name` | `shell` | `3` | +| `0x00483f70` | `shell_service_pump_iteration` | `shell` | `4` | +| `0x004840e0` | `bootstrap_init_shell_window_services` | `bootstrap` | `4` | +| `0x00484590` | `shell_init_graphics_preset_state` | `shell` | `3` | +| `0x00484910` | `shell_save_graphics_config` | `shell` | `4` | +| `0x00484980` | `shell_load_graphics_config_or_init_defaults` | `shell` | `4` | +| `0x00484a60` | `shell_match_legacy_gpu_profile_token` | `shell` | `4` | +| `0x00484d70` | `shell_apply_graphics_option_runtime_effects` | `shell` | `3` | +| `0x00485060` | `shell_set_graphics_option_with_fanout` | `shell` | `4` | +| `0x004852e0` | `shell_apply_default_graphics_master_profile` | `shell` | `4` | +| `0x004853c0` | `shell_apply_graphics_preset_bundle` | `shell` | `4` | +| `0x004882e0` | `world_region_border_overlay_rebuild` | `map` | `4` | +| `0x004886e0` | `scenario_text_export_build_language_file` | `scenario` | `4` | +| `0x00489830` | `scenario_text_export_report_language_file` | `scenario` | `3` | +| `0x00489a20` | `scenario_text_export_batch_process_maps` | `scenario` | `4` | +| `0x00489f80` | `route_entry_assign_aux_tracker_group_id` | `map` | `3` | +| `0x00493cf0` | `route_entry_collection_create_endpoint_entry_from_coords_and_policy` | `map` | `3` | +| `0x00494240` | `route_entry_collection_query_rect_window_passes_entry_type_gate` | `map` | `2` | +| `0x00494cb0` | `route_entry_collection_try_find_route_entry_covering_point_window` | `map` | `3` | +| `0x00494e40` | `aux_route_entry_tracker_reset` | `map` | `2` | +| `0x00494e90` | `aux_route_entry_tracker_seed_owner_entry_id` | `map` | `2` | +| `0x00494eb0` | `aux_route_entry_tracker_adjust_refcount` | `map` | `2` | +| `0x00494ed0` | `aux_route_entry_tracker_contains_endpoint_entry_id` | `map` | `2` | +| `0x00494f00` | `aux_route_entry_tracker_merge_or_bind_endpoint_entry` | `map` | `3` | +| `0x00494fb0` | `aux_route_entry_tracker_refresh_boolean_class_latch_and_notify_owner` | `map` | `3` | +| `0x00495020` | `aux_route_entry_tracker_refresh_cached_match_fields_and_maybe_split_duplicate_pair` | `map` | `3` | +| `0x004950f0` | `aux_route_entry_tracker_replace_matching_endpoint_entry_and_refresh_latch` | `map` | `3` | +| `0x004952f0` | `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` | `map` | `4` | +| `0x004953c0` | `math_normalize_subtracted_angle_delta_and_report_wrap` | `map` | `4` | +| `0x004955b0` | `route_entry_collection_map_track_lay_mode_to_endpoint_policy_byte` | `map` | `3` | +| `0x0049bd40` | `route_entry_collection_run_initial_candidate_path_sweep` | `map` | `3` | +| `0x0049c900` | `route_entry_collection_try_extend_search_frontier_toward_target_coords` | `map` | `3` | +| `0x0049d380` | `route_entry_collection_search_path_between_entry_or_coord_endpoints` | `map` | `3` | +| `0x004a01a0` | `route_entry_collection_try_build_path_between_optional_endpoint_entries` | `map` | `3` | +| `0x004a42b0` | `aux_route_entry_tracker_collection_allocate_entry` | `map` | `3` | +| `0x004a4340` | `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` | `map` | `3` | +| `0x004a4380` | `aux_route_entry_tracker_collection_try_split_route_entry_chain_into_fresh_group` | `map` | `3` | +| `0x004a45f0` | `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` | `map` | `3` | +| `0x004a4c00` | `aux_route_entry_tracker_route_entry_pair_pass_adjacent_chain_transfer_gate` | `map` | `3` | +| `0x004a4ce0` | `aux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups` | `map` | `3` | +| `0x004a4ff0` | `aux_route_entry_tracker_collection_reseed_group_from_route_entry_component` | `map` | `3` | +| `0x004a5280` | `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` | `map` | `3` | +| `0x004a5900` | `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` | `map` | `3` | +| `0x004a5fc0` | `aux_route_entry_tracker_collection_refresh_component_labels_and_reseed_invalid_groups` | `map` | `3` | +| `0x004a62c0` | `aux_route_entry_tracker_query_tracker_component_labels_match` | `map` | `3` | +| `0x004a6320` | `aux_route_entry_tracker_collection_query_component_label_by_tracker_id` | `map` | `3` | +| `0x004a6360` | `aux_route_entry_tracker_collection_refresh_owner_adjacent_compatible_group_links` | `map` | `3` | +| `0x004a65b0` | `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` | `map` | `3` | +| `0x004a6630` | `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` | `map` | `3` | +| `0x004a94b0` | `train_finalize_aux_route_entry_buffer_preserving_subflags` | `simulation` | `3` | +| `0x004ab980` | `train_set_route_operating_mode_and_scalar` | `simulation` | `4` | +| `0x004b2c10` | `train_route_list_validate_reachability_and_station_pair` | `simulation` | `4` | +| `0x004b2f00` | `train_route_list_select_entry_and_refresh_linked_site_state` | `simulation` | `4` | +| `0x004b3000` | `train_route_list_remove_entry_and_compact` | `simulation` | `4` | +| `0x004b3160` | `train_route_list_insert_staged_entry_at_index` | `simulation` | `4` | +| `0x004b8dc0` | `shell_campaign_window_destroy` | `shell` | `4` | +| `0x004b8e60` | `shell_campaign_window_construct` | `shell` | `4` | +| `0x004b99c0` | `structure_candidate_collection_get_nth_active_candidate_id` | `map` | `4` | +| `0x004b9a20` | `shell_building_detail_refresh_flagged_service_capability_rows` | `shell` | `3` | +| `0x004b9d70` | `shell_has_live_building_detail_window` | `shell` | `4` | +| `0x004b9d80` | `shell_mark_building_detail_window_dirty` | `shell` | `4` | +| `0x004b9e10` | `shell_building_detail_submit_aux_owner_subject_sync_request` | `shell` | `3` | +| `0x004b9fd0` | `shell_building_detail_present_flagged_service_capability_popup` | `shell` | `3` | +| `0x004ba3d0` | `shell_building_detail_refresh_subject_cargo_and_service_rows` | `shell` | `3` | +| `0x004bad20` | `shell_building_detail_refresh_subject_pair_value_rows` | `shell` | `3` | +| `0x004baef0` | `shell_building_detail_window_refresh_controls` | `shell` | `4` | +| `0x004bb9e0` | `shell_building_detail_window_handle_message` | `shell` | `4` | +| `0x004bc0a0` | `shell_building_detail_window_construct` | `shell` | `4` | +| `0x004bc100` | `shell_open_or_focus_building_detail_window` | `shell` | `4` | +| `0x004bfb30` | `shell_format_company_financial_summary_card` | `shell` | `4` | +| `0x004c0160` | `shell_format_company_stock_data_panel` | `shell` | `4` | +| `0x004c1610` | `shell_company_detail_bind_bond_row_band_for_active_panel` | `shell` | `4` | +| `0x004c16f0` | `shell_company_detail_resolve_selected_company` | `shell` | `4` | +| `0x004c1730` | `shell_company_detail_render_financial_history_panel` | `shell` | `4` | +| `0x004c1ab0` | `shell_company_detail_render_company_summary_card` | `shell` | `4` | +| `0x004c1b60` | `shell_company_detail_refresh_selected_territory_access_summary` | `shell` | `4` | +| `0x004c1d30` | `shell_company_detail_select_territory_access_row` | `shell` | `4` | +| `0x004c1d70` | `shell_company_detail_render_territory_access_row` | `shell` | `4` | +| `0x004c1ec0` | `shell_company_detail_render_bond_maturity_and_repay_panel` | `shell` | `4` | +| `0x004c22e0` | `shell_company_detail_sync_selected_territory_from_picker` | `shell` | `4` | +| `0x004c23a0` | `shell_company_detail_render_debt_credit_and_rate_summary_panel` | `shell` | `4` | +| `0x004c2720` | `shell_company_detail_render_share_value_and_dividend_summary_panel` | `shell` | `4` | +| `0x004c2ca0` | `shell_company_detail_window_refresh_controls` | `shell` | `4` | +| `0x004c3470` | `shell_company_detail_step_selected_active_company_delta` | `shell` | `4` | +| `0x004c3540` | `shell_company_detail_select_next_active_company` | `shell` | `4` | +| `0x004c3550` | `shell_company_detail_select_previous_active_company` | `shell` | `4` | +| `0x004c3560` | `shell_company_detail_render_issue_bond_offer_dialog` | `shell` | `4` | +| `0x004c3890` | `shell_company_detail_issue_bond_offer_flow` | `shell` | `4` | +| `0x004c3b50` | `shell_company_detail_render_issue_stock_offer_dialog` | `shell` | `4` | +| `0x004c3f30` | `shell_company_detail_issue_stock_offer_flow` | `shell` | `4` | +| `0x004c4300` | `shell_company_detail_render_stock_buyback_offer_dialog` | `shell` | `4` | +| `0x004c46d0` | `shell_company_detail_buyback_stock_flow` | `shell` | `4` | +| `0x004c4c70` | `shell_company_detail_setup_dividend_rate_adjust_controls` | `shell` | `4` | +| `0x004c4e30` | `shell_company_detail_render_change_dividend_rate_dialog` | `shell` | `4` | +| `0x004c5140` | `shell_company_detail_handle_change_dividend_rate_dialog_message` | `shell` | `4` | +| `0x004c5360` | `shell_company_detail_change_dividend_rate_flow` | `shell` | `4` | +| `0x004c5540` | `shell_company_detail_window_construct` | `shell` | `4` | +| `0x004c56a0` | `shell_company_detail_window_handle_message` | `shell` | `4` | +| `0x004c5a0e` | `shell_company_detail_resign_chairmanship_flow` | `shell` | `4` | +| `0x004c5b99` | `shell_company_detail_bankruptcy_flow` | `shell` | `4` | +| `0x004c5fc9` | `shell_company_detail_buy_territory_access_rights_flow` | `shell` | `4` | +| `0x004c6b40` | `shell_company_list_format_company_or_start_row` | `shell` | `4` | +| `0x004c6bb0` | `shell_company_list_activate_or_shift_center_company` | `shell` | `4` | +| `0x004c6c30` | `shell_company_list_window_refresh_rows` | `shell` | `4` | +| `0x004c6f30` | `shell_company_list_window_handle_message` | `shell` | `4` | +| `0x004c7200` | `shell_company_list_window_construct` | `shell` | `4` | +| `0x004c7bc0` | `shell_credits_window_destroy` | `shell` | `4` | +| `0x004c7fc0` | `shell_credits_window_construct` | `shell` | `4` | +| `0x004c8670` | `shell_mark_custom_modal_dialog_dirty` | `shell` | `4` | +| `0x004c8680` | `shell_has_live_custom_modal_dialog` | `shell` | `4` | +| `0x004c98a0` | `shell_open_custom_modal_dialog_with_callbacks` | `shell` | `4` | +| `0x004c9da0` | `map_editor_chairman_slot_panel_format_slot_card` | `map` | `4` | +| `0x004ca1c0` | `map_editor_chairman_slot_panel_refresh_slot_counters` | `map` | `3` | +| `0x004ca540` | `map_editor_available_chairman_panel_construct` | `map` | `4` | +| `0x004ca790` | `map_editor_scenario_metadata_panel_refresh_controls` | `map` | `4` | +| `0x004ca910` | `map_editor_building_density_panel_refresh_controls` | `map` | `4` | +| `0x004cadf0` | `map_editor_economic_cost_slider_panel_construct` | `map` | `4` | +| `0x004cb2b0` | `map_editor_scenario_special_conditions_panel_construct` | `map` | `4` | +| `0x004cc250` | `map_editor_chairman_slot_panel_refresh_slot_list` | `map` | `4` | +| `0x004cc2d0` | `map_editor_chairman_slot_panel_construct` | `map` | `4` | +| `0x004cc980` | `map_editor_city_region_panel_construct` | `map` | `4` | +| `0x004cd070` | `map_editor_territory_panel_construct` | `map` | `4` | +| `0x004cd680` | `map_editor_locomotive_availability_panel_construct` | `map` | `4` | +| `0x004cdbd0` | `map_editor_industry_availability_panel_construct` | `map` | `4` | +| `0x004ce070` | `map_editor_panel_select_active_section` | `map` | `4` | +| `0x004cecc0` | `map_editor_chairman_slot_panel_handle_message` | `map` | `4` | +| `0x004cf0d0` | `map_editor_locomotive_availability_panel_handle_message` | `map` | `4` | +| `0x004cf910` | `map_editor_port_warehouse_cargo_panel_construct` | `map` | `4` | +| `0x004d0420` | `map_editor_city_count_stats_report` | `map` | `4` | +| `0x004d3000` | `map_editor_cargo_stats_panel_construct` | `map` | `4` | +| `0x004d3020` | `map_editor_city_region_growth_stats_panel_construct` | `map` | `4` | +| `0x004d3060` | `map_editor_tree_stats_panel_construct` | `map` | `4` | +| `0x004d3080` | `map_editor_general_validation_panel_construct` | `map` | `4` | +| `0x004d30a0` | `map_editor_city_count_stats_panel_construct` | `map` | `4` | +| `0x004d4110` | `map_editor_event_variable_values_panel_construct` | `map` | `4` | +| `0x004d4130` | `map_editor_event_validation_panel_construct` | `map` | `4` | +| `0x004d4500` | `shell_ensure_editor_panel_window` | `shell` | `4` | +| `0x004d57c0` | `shell_event_conditions_window_construct` | `shell` | `3` | +| `0x004d5d00` | `shell_event_effects_window_refresh_effect_type_selector` | `shell` | `3` | +| `0x004d5f50` | `shell_event_effects_window_refresh_selected_effect_parameter_rows` | `shell` | `3` | +| `0x004d6090` | `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` | `shell` | `3` | +| `0x004d67f0` | `shell_event_effects_window_commit_current_editor_state_into_staged_row` | `shell` | `3` | +| `0x004d6d60` | `shell_event_effects_window_construct` | `shell` | `3` | +| `0x004d7060` | `shell_event_effects_window_handle_message` | `shell` | `3` | +| `0x004d77b0` | `shell_event_conditions_window_refresh_grouped_effect_summary_band_affordances` | `shell` | `3` | +| `0x004d7ef0` | `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` | `shell` | `3` | +| `0x004d8120` | `shell_event_conditions_window_refresh_condition_row_list_panel` | `shell` | `3` | +| `0x004d88f0` | `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` | `shell` | `3` | +| `0x004d8d50` | `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` | `shell` | `3` | +| `0x004d8ea0` | `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` | `shell` | `3` | +| `0x004d91e0` | `shell_event_conditions_window_commit_selected_event_summary_headers_and_group_mode` | `shell` | `3` | +| `0x004d9360` | `shell_event_conditions_window_remove_selected_event_and_refresh_selector` | `shell` | `3` | +| `0x004d9390` | `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` | `shell` | `3` | +| `0x004d9970` | `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` | `shell` | `3` | +| `0x004d9d10` | `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` | `shell` | `3` | +| `0x004d9dc0` | `shell_open_event_conditions_modal_and_return_result` | `shell` | `3` | +| `0x004d9e40` | `shell_open_event_effects_modal_and_return_result` | `shell` | `3` | +| `0x004d9ed0` | `shell_event_conditions_window_remove_selected_condition_row` | `shell` | `3` | +| `0x004d9f50` | `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` | `shell` | `3` | +| `0x004da0f0` | `shell_event_conditions_window_refresh_controls` | `shell` | `3` | +| `0x004da640` | `shell_event_conditions_window_append_default_condition_row_via_modal` | `shell` | `3` | +| `0x004da700` | `shell_event_conditions_window_edit_selected_condition_row_via_modal` | `shell` | `3` | +| `0x004da7c0` | `shell_event_effects_window_append_grouped_effect_row_via_modal` | `shell` | `3` | +| `0x004da860` | `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` | `shell` | `3` | +| `0x004da920` | `shell_event_effects_window_remove_selected_grouped_effect_row` | `shell` | `3` | +| `0x004da9a0` | `shell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event` | `shell` | `3` | +| `0x004dab60` | `shell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip` | `shell` | `3` | +| `0x004daf40` | `shell_event_conditions_window_reset_selected_event_summary_placeholders` | `shell` | `3` | +| `0x004db120` | `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` | `shell` | `3` | +| `0x004db520` | `shell_event_conditions_window_select_previous_event_and_refresh` | `shell` | `3` | +| `0x004db5e0` | `shell_event_conditions_window_select_next_event_and_refresh` | `shell` | `3` | +| `0x004db6a0` | `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` | `shell` | `3` | +| `0x004db6f0` | `shell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection` | `shell` | `3` | +| `0x004db8b0` | `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` | `shell` | `3` | +| `0x004dba90` | `shell_event_conditions_window_rename_selected_event_via_name_modal` | `shell` | `3` | +| `0x004dbb80` | `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` | `shell` | `3` | +| `0x004dbe7a` | `shell_event_conditions_window_open_choice_event_single_player_only_warning_modal` | `shell` | `3` | +| `0x004dbf93` | `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` | `shell` | `3` | +| `0x004dbfca` | `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` | `shell` | `3` | +| `0x004dc670` | `shell_file_options_dialog_construct` | `shell` | `4` | +| `0x004dc7d0` | `shell_has_file_options_dialog` | `shell` | `4` | +| `0x004dc7e0` | `shell_mark_file_options_dialog_dirty` | `shell` | `4` | +| `0x004dc7f0` | `shell_file_options_dialog_handle_message` | `shell` | `4` | +| `0x004dd010` | `shell_file_request_dialog_collect_target_path` | `shell` | `4` | +| `0x004ddbd0` | `shell_detail_panel_transition_manager` | `shell` | `3` | +| `0x004dfbe0` | `shell_game_window_construct` | `shell` | `4` | +| `0x004dfd70` | `shell_game_window_destroy` | `shell` | `4` | +| `0x004dfdf0` | `shell_ensure_game_message_window` | `shell` | `4` | +| `0x004e0720` | `game_message_window_service_if_present` | `shell` | `4` | +| `0x004e0960` | `game_uppermost_window_refresh_controls` | `shell` | `4` | +| `0x004e0b20` | `game_uppermost_window_construct` | `shell` | `4` | +| `0x004e0ba0` | `game_uppermost_window_handle_message` | `shell` | `4` | +| `0x004e0e40` | `shell_ensure_game_uppermost_window` | `shell` | `4` | +| `0x004e1d60` | `shell_load_screen_refresh_page_strip_and_page_kind_controls` | `shell` | `4` | +| `0x004e1f50` | `shell_has_live_load_screen_window` | `shell` | `4` | +| `0x004e1f60` | `shell_mark_load_screen_window_dirty` | `shell` | `4` | +| `0x004e2c10` | `shell_load_screen_select_page_subject_and_refresh` | `shell` | `4` | +| `0x004e39e0` | `company_query_display_year_or_current_year` | `simulation` | `4` | +| `0x004e3a00` | `shell_load_screen_step_selected_company_delta` | `shell` | `4` | +| `0x004e3a80` | `shell_load_screen_window_handle_message` | `shell` | `4` | +| `0x004e45d0` | `shell_load_screen_profile_stock_holdings_page_handle_message` | `shell` | `4` | +| `0x004e4b10` | `shell_load_screen_reset_runtime_state_and_seed_selection` | `shell` | `3` | +| `0x004e4ee0` | `shell_open_or_focus_load_screen_page` | `shell` | `4` | +| `0x004e5130` | `shell_load_screen_render_company_stock_data_panel` | `shell` | `4` | +| `0x004e51ea` | `shell_load_screen_render_game_status_briefing_panel` | `shell` | `4` | +| `0x004e5300` | `shell_load_screen_render_player_detail_stock_holdings_panel` | `shell` | `4` | +| `0x004e5a80` | `shell_render_company_overview_panel_header_and_optional_change_affordance` | `shell` | `4` | +| `0x004e5cf0` | `shell_format_company_governance_and_economy_status_panel` | `shell` | `4` | +| `0x004e68e0` | `shell_load_screen_render_company_list_panel` | `shell` | `4` | +| `0x004e6ef0` | `shell_load_screen_render_player_list_panel` | `shell` | `4` | +| `0x004e7670` | `shell_load_screen_render_company_train_list_panel` | `shell` | `4` | +| `0x004e8270` | `shell_load_screen_render_company_industry_list_panel` | `shell` | `4` | +| `0x004e8bb0` | `shell_load_screen_render_company_station_list_panel` | `shell` | `4` | +| `0x004e9460` | `shell_load_screen_render_map_cargo_list_panel` | `shell` | `4` | +| `0x004e9b20` | `shell_load_screen_render_company_report_history_panel` | `shell` | `4` | +| `0x004ea060` | `shell_load_screen_render_active_page_panel` | `shell` | `4` | +| `0x004ea620` | `shell_load_screen_window_construct` | `shell` | `4` | +| `0x004ea720` | `shell_load_screen_window_is_open` | `shell` | `4` | +| `0x004ea730` | `shell_load_screen_window_destroy` | `shell` | `4` | +| `0x004eb0b0` | `shell_open_grayscale_map_tga_picker_and_stage_selection` | `shell` | `3` | +| `0x004eb890` | `shell_present_merger_vote_outcome_dialog` | `shell` | `4` | +| `0x004ebd10` | `shell_resolve_merger_vote_and_commit_outcome` | `shell` | `4` | +| `0x004ec640` | `shell_company_detail_attempt_merger_flow` | `shell` | `4` | +| `0x004ee0e0` | `multiplayer_open_staged_text_entry_dialog` | `shell` | `3` | +| `0x004ee1d0` | `multiplayer_commit_staged_text_entry` | `shell` | `3` | +| `0x004ee3a0` | `multiplayer_reset_tool_globals` | `shell` | `3` | +| `0x004ee810` | `multiplayer_publish_wrapped_chat_message` | `shell` | `4` | +| `0x004ee950` | `multiplayer_load_selected_map_preview_surface` | `shell` | `4` | +| `0x004eed30` | `multiplayer_sync_selected_map_entry` | `shell` | `3` | +| `0x004efe80` | `multiplayer_window_init_globals` | `shell` | `4` | +| `0x004f2e80` | `shell_has_live_overview_window` | `shell` | `4` | +| `0x004f2e90` | `shell_mark_overview_window_dirty` | `shell` | `4` | +| `0x004f38a0` | `shell_overview_window_construct` | `shell` | `4` | +| `0x004f38f0` | `shell_overview_window_handle_message` | `shell` | `4` | +| `0x004f3a10` | `shell_open_or_focus_overview_window` | `shell` | `4` | +| `0x004fe120` | `shell_has_settings_window` | `shell` | `4` | +| `0x004fe130` | `shell_mark_settings_window_dirty` | `shell` | `4` | +| `0x00500640` | `shell_settings_window_construct` | `shell` | `4` | +| `0x00501e50` | `shell_open_settings_window` | `shell` | `4` | +| `0x00501f20` | `shell_query_registry_open_command_for_http_or_rtf_target` | `shell` | `3` | +| `0x00502030` | `shell_setup_window_draw_table_driven_payload_category_row` | `shell` | `3` | +| `0x00502160` | `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` | `shell` | `3` | +| `0x005021c0` | `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` | `shell` | `3` | +| `0x00502220` | `shell_setup_window_publish_selected_profile_labels_and_preview_surface` | `shell` | `3` | +| `0x00502550` | `shell_setup_window_refresh_selection_lists_and_summary_fields` | `shell` | `3` | +| `0x00502720` | `paint_terrain_tool_init_globals` | `shell` | `4` | +| `0x005027b0` | `shell_setup_window_refresh_file_backed_selection_list_panel` | `shell` | `3` | +| `0x00502910` | `shell_setup_window_refresh_mode_dependent_lists` | `shell` | `3` | +| `0x00502c00` | `shell_setup_window_select_launch_mode_and_apply_shell_state` | `shell` | `4` | +| `0x005033d0` | `shell_setup_window_handle_message` | `shell` | `3` | +| `0x00504010` | `shell_setup_window_construct` | `shell` | `4` | +| `0x00504a90` | `shell_station_detail_clear_active_candidate_service_preview` | `shell` | `4` | +| `0x00504ae0` | `shell_station_detail_set_active_candidate_service_preview` | `shell` | `4` | +| `0x00504ba0` | `shell_station_detail_update_candidate_service_entry` | `shell` | `4` | +| `0x00504bea` | `shell_station_detail_format_candidate_local_service_summary` | `shell` | `4` | +| `0x00505760` | `shell_station_detail_refresh_candidate_service_rows` | `shell` | `4` | +| `0x005068c0` | `shell_station_detail_window_construct` | `shell` | `4` | +| `0x00508550` | `station_place_format_selected_site_summary` | `shell` | `3` | +| `0x00508bb0` | `station_place_world_surface_sync_and_dispatch` | `shell` | `4` | +| `0x005091b0` | `station_place_window_handle_message` | `shell` | `4` | +| `0x00509d80` | `station_place_window_construct` | `shell` | `4` | +| `0x0050a530` | `station_place_window_service_frame` | `shell` | `3` | +| `0x0050c500` | `shell_present_chairmanship_takeover_vote_outcome_dialog` | `shell` | `4` | +| `0x0050c940` | `shell_resolve_chairmanship_takeover_vote_and_commit_outcome` | `shell` | `4` | +| `0x0050ccc0` | `shell_company_detail_attempt_chairmanship_takeover_flow` | `shell` | `4` | +| `0x0050e400` | `track_lay_window_construct` | `shell` | `4` | +| `0x0050f740` | `shell_has_live_trainbuy_window` | `shell` | `4` | +| `0x0050f750` | `shell_mark_trainbuy_window_dirty` | `shell` | `4` | +| `0x0050f760` | `shell_trainbuy_window_query_selected_locomotive_id` | `shell` | `4` | +| `0x0050f790` | `shell_trainbuy_window_compute_selected_upgrade_total_and_count` | `shell` | `4` | +| `0x0050f890` | `shell_trainbuy_window_render_selected_train_upgrade_summary` | `shell` | `4` | +| `0x0050fc00` | `shell_trainbuy_window_render_selected_train_route_and_state_panel` | `shell` | `4` | +| `0x00511500` | `shell_trainbuy_window_construct` | `shell` | `4` | +| `0x00512080` | `shell_trainbuy_window_refresh_controls` | `shell` | `4` | +| `0x00512c50` | `shell_open_or_focus_trainbuy_window` | `shell` | `4` | +| `0x00512f80` | `shell_trainbuy_window_refresh_selection_side_toggle` | `shell` | `4` | +| `0x005130f0` | `shell_trainbuy_window_query_selected_train_record` | `shell` | `4` | +| `0x00513130` | `shell_trainbuy_window_query_selected_train_id` | `shell` | `4` | +| `0x005131a0` | `shell_trainbuy_window_selected_train_belongs_to_selected_company` | `shell` | `4` | +| `0x00513220` | `shell_trainbuy_window_warn_selected_train_not_owned_by_current_company` | `shell` | `4` | +| `0x00513720` | `shell_trainbuy_window_refresh_selection_column_empty_state_labels` | `shell` | `4` | +| `0x00514110` | `shell_train_detail_window_refresh_selected_train_name_label` | `shell` | `4` | +| `0x00514160` | `shell_train_detail_window_refresh_controls` | `shell` | `4` | +| `0x00514420` | `shell_train_detail_window_construct` | `shell` | `4` | +| `0x00514620` | `shell_open_or_focus_train_detail_window` | `shell` | `4` | +| `0x00514690` | `shell_train_detail_window_handle_message` | `shell` | `4` | +| `0x00516be0` | `tutorial_advance_step_and_refresh_expected_control_ids` | `shell` | `4` | +| `0x00516d00` | `tutorial_validate_train_route_station_indicator_step` | `shell` | `4` | +| `0x005174e0` | `shell_video_window_construct` | `shell` | `4` | +| `0x00517570` | `shell_video_window_destroy` | `shell` | `4` | +| `0x00517cf0` | `indexed_collection_slot_count` | `simulation` | `4` | +| `0x00517d40` | `indexed_collection_entry_id_is_live` | `simulation` | `4` | +| `0x00518140` | `indexed_collection_resolve_live_entry_by_id` | `simulation` | `4` | +| `0x00518380` | `indexed_collection_get_nth_live_entry_id` | `simulation` | `4` | +| `0x0051c920` | `localization_lookup_display_label_by_stem_or_fallback` | `shell` | `4` | +| `0x0051db80` | `math_measure_float_xy_pair_distance` | `support` | `4` | +| `0x0051ebc0` | `shell_reset_display_runtime_defaults` | `shell` | `3` | +| `0x0051eea0` | `shell_save_display_runtime_config` | `shell` | `4` | +| `0x0051ef20` | `shell_load_display_runtime_config_or_init_defaults` | `shell` | `4` | +| `0x005204b0` | `shell_flush_deferred_work_queues` | `shell` | `4` | +| `0x00520620` | `shell_service_frame_cycle` | `shell` | `4` | +| `0x00521060` | `bootstrap_init_shell_service_bundle` | `bootstrap` | `4` | +| `0x00521390` | `bootstrap_destroy_shell_service_bundle` | `bootstrap` | `4` | +| `0x0053f830` | `shell_window_find_registered_child_control_by_id` | `shell` | `3` | +| `0x0053f9c0` | `shell_window_register_child_control_sorted_by_priority_and_optional_tag` | `shell` | `3` | +| `0x0053fa50` | `shell_window_bind_resource_and_initialize_child_control_links` | `shell` | `4` | +| `0x00540a47` | `shell_control_refresh_matching_dynamic_text_payload` | `shell` | `3` | +| `0x005411c0` | `shell_query_tga_header_is_supported_truecolor_image` | `shell` | `3` | +| `0x0054f710` | `shell_queue_callout_segment_marker` | `shell` | `2` | +| `0x0054fb10` | `shell_queue_callout_leader_path` | `shell` | `3` | +| `0x005519f0` | `shell_publish_text_callout_presentation` | `shell` | `3` | +| `0x00552560` | `shell_queue_world_anchor_marker` | `shell` | `3` | +| `0x00552900` | `shell_queue_projected_world_anchor_quad` | `shell` | `3` | +| `0x00558130` | `shell_child_control_set_owner_resolve_caption_and_refresh` | `shell` | `3` | +| `0x00559520` | `surface_init_rgba_pixel_buffer` | `support` | `3` | +| `0x0055d8d0` | `display_get_primary_adapter_descriptor` | `support` | `4` | +| `0x005639d2` | `shell_control_release_dynamic_text_payload` | `shell` | `3` | +| `0x005a152e` | `math_abs_double_with_crt_special_case_handling` | `support` | `4` | + +## Edges + +- `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00424010` `company_has_territory_access_rights` +- `0x004014b0` `company_try_buy_unowned_industry_near_city_and_publish_news` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00426590` `company_count_linked_transit_sites` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x00401860` `company_query_cached_linked_transit_route_anchor_entry_id` + -> `0x004801a0` `placed_structure_is_linked_transit_site_reachable_from_company_route_anchor` +- `0x00401940` `company_reset_linked_transit_caches_and_reseed_empty_train_routes` + -> `0x00409720` `company_service_linked_transit_site_caches` + -> `0x00409770` `train_try_append_linked_transit_autoroute_entry` + -> `0x004b3000` `train_route_list_remove_entry_and_compact` +- `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x004014b0` `company_try_buy_unowned_industry_near_city_and_publish_news` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x00409300` `company_publish_train_upgrade_news` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x00409830` `company_try_add_linked_transit_train_and_publish_news` + -> `0x00409950` `company_balance_linked_transit_train_roster` + -> `0x0041d550` `locomotive_era_and_engine_type_pass_company_policy_gate` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` +- `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x004261b0` `company_count_unassigned_shares_after_active_chairman_holdings` + -> `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x00427450` `company_issue_public_shares_and_raise_capital` + -> `0x004275c0` `company_issue_bond_and_record_terms` + -> `0x0042a0e0` `company_query_highest_coupon_bond_slot_index` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00402c90` `placed_structure_resolve_linked_candidate_record` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` +- `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00420280` `city_connection_bonus_select_first_matching_peer_site` +- `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` +- `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x00426590` `company_count_linked_transit_sites` + -> `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x00427590` `company_connection_bonus_lane_is_unlocked` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00409300` `company_publish_train_upgrade_news` + -> `0x00409830` `company_try_add_linked_transit_train_and_publish_news` + -> `0x0041d550` `locomotive_era_and_engine_type_pass_company_policy_gate` + -> `0x00461cd0` `locomotive_collection_select_best_era_matched_non_electric_fallback_id` +- `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x0047e330` `placed_structure_count_candidates_with_local_service_metrics` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x00408280` `company_select_best_owned_linked_transit_site_by_autoroute_score` + -> `0x00408380` `company_build_linked_transit_autoroute_entry` +- `0x00408380` `company_build_linked_transit_autoroute_entry` + -> `0x00408280` `company_select_best_owned_linked_transit_site_by_autoroute_score` + -> `0x00408f70` `company_compute_owned_linked_transit_site_score_total` + -> `0x00409770` `train_try_append_linked_transit_autoroute_entry` +- `0x00408f70` `company_compute_owned_linked_transit_site_score_total` + -> `0x00409950` `company_balance_linked_transit_train_roster` +- `0x00409300` `company_publish_train_upgrade_news` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x00409950` `company_balance_linked_transit_train_roster` +- `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x0047efe0` `placed_structure_query_linked_company_id` + -> `0x004801a0` `placed_structure_is_linked_transit_site_reachable_from_company_route_anchor` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x00409720` `company_service_linked_transit_site_caches` + -> `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` +- `0x00409770` `train_try_append_linked_transit_autoroute_entry` + -> `0x00408380` `company_build_linked_transit_autoroute_entry` + -> `0x00409720` `company_service_linked_transit_site_caches` + -> `0x004b2f00` `train_route_list_select_entry_and_refresh_linked_site_state` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` +- `0x00409830` `company_try_add_linked_transit_train_and_publish_news` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x00408380` `company_build_linked_transit_autoroute_entry` + -> `0x00409950` `company_balance_linked_transit_train_roster` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` +- `0x00409950` `company_balance_linked_transit_train_roster` + -> `0x00408f70` `company_compute_owned_linked_transit_site_score_total` + -> `0x00409300` `company_publish_train_upgrade_news` + -> `0x00409830` `company_try_add_linked_transit_train_and_publish_news` + -> `0x004264c0` `company_count_owned_trains` + -> `0x00426590` `company_count_linked_transit_sites` +- `0x0040a590` `simulation_service_periodic_boundary_work` + -> `0x00413580` `placed_structure_collection_refresh_quarter_subset_route_style_state` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` +- `0x0040ab50` `simulation_advance_to_target_calendar_point` + -> `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` +- `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x00414470` `placed_structure_cache_projected_rect_profile_slot_id` + -> `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x00481480` `placed_structure_collection_append_site_into_all_proximity_bucket_lists` + -> `0x004814c0` `placed_structure_collection_remove_site_id_from_all_proximity_bucket_lists` + -> `0x00508bb0` `station_place_world_surface_sync_and_dispatch` +- `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` + -> `0x00434050` `shell_has_auxiliary_preview_owner` +- `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` +- `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` + -> `0x00481390` `placed_structure_collection_allocate_and_construct_linked_site_record` +- `0x0040fbe0` `placed_structure_endpoint_pair_has_shared_route_entry_key` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x00467f50` `placed_structure_route_link_allocate_site_pair_for_candidate_class` +- `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x0040fbe0` `placed_structure_endpoint_pair_has_shared_route_entry_key` + -> `0x00467f50` `placed_structure_route_link_allocate_site_pair_for_candidate_class` +- `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x00436590` `scenario_state_compute_issue_opinion_multiplier` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` +- `0x00412ca0` `world_region_pick_commercial_profile_label_by_region_rank` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x00413f50` `placed_structure_local_runtime_site_id_queue_pop_next` + -> `0x00414480` `placed_structure_local_runtime_site_id_queue_count` +- `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x00422ee0` `world_region_try_place_candidate_structure` +- `0x00413580` `placed_structure_collection_refresh_quarter_subset_route_style_state` + -> `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` +- `0x00413f50` `placed_structure_local_runtime_site_id_queue_pop_next` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` +- `0x00414470` `placed_structure_cache_projected_rect_profile_slot_id` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x00414480` `placed_structure_local_runtime_site_id_queue_count` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` +- `0x00414e10` `world_grid_refresh_projected_rect_surface_and_region_byte_tables` + -> `0x00416620` `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` +- `0x00414fa0` `world_grid_count_flagged_cells_and_collect_float_samples` + -> `0x00415020` `world_grid_refresh_flagged_region_float_extrema_and_mean` +- `0x00415020` `world_grid_refresh_flagged_region_float_extrema_and_mean` + -> `0x00414fa0` `world_grid_count_flagged_cells_and_collect_float_samples` +- `0x00415570` `placed_structure_try_select_projected_rect_profile_slot` + -> `0x00416620` `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` +- `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x004160c0` `placed_structure_collect_connected_component_tile_bounds_with_version_gate` +- `0x004160c0` `placed_structure_collect_connected_component_tile_bounds_with_version_gate` + -> `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` +- `0x00416170` `placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh` + -> `0x004160c0` `placed_structure_collect_connected_component_tile_bounds_with_version_gate` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` +- `0x00416620` `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` + -> `0x00414e10` `world_grid_refresh_projected_rect_surface_and_region_byte_tables` + -> `0x00415570` `placed_structure_try_select_projected_rect_profile_slot` + -> `0x00416ec0` `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00494240` `route_entry_collection_query_rect_window_passes_entry_type_gate` +- `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00416ec0` `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` + -> `0x00416620` `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` +- `0x00417790` `map_angle_rotate_grid_offset_pair_into_world_offset_pair` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` +- `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00417790` `map_angle_rotate_grid_offset_pair_into_world_offset_pair` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` +- `0x00418040` `placed_structure_render_local_runtime_overlay_payload_from_projected_bounds` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` +- `0x004185a0` `world_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples` + -> `0x00418610` `world_grid_refresh_projected_rect_sample_band_and_flag_mask` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x00418610` `world_grid_refresh_projected_rect_sample_band_and_flag_mask` + -> `0x00415020` `world_grid_refresh_flagged_region_float_extrema_and_mean` + -> `0x004185a0` `world_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples` + -> `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` +- `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00415570` `placed_structure_try_select_projected_rect_profile_slot` + -> `0x00416170` `placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh` + -> `0x004185a0` `world_grid_toggle_flagged_mask_bit0_for_nonsentinel_rect_samples` +- `0x00418be0` `placed_structure_build_local_runtime_record_from_candidate_stem_and_projected_scratch` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x00416170` `placed_structure_map_tile_range_to_connected_component_records_with_optional_bounds_refresh` + -> `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x00416ec0` `placed_structure_build_projected_runtime_scratch_from_candidate_and_coords` + -> `0x00418040` `placed_structure_render_local_runtime_overlay_payload_from_projected_bounds` + -> `0x00418610` `world_grid_refresh_projected_rect_sample_band_and_flag_mask` +- `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` +- `0x0041d550` `locomotive_era_and_engine_type_pass_company_policy_gate` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x00436710` `scenario_state_sum_issue_opinion_terms_raw` + -> `0x00461cd0` `locomotive_collection_select_best_era_matched_non_electric_fallback_id` + -> `0x004cd680` `map_editor_locomotive_availability_panel_construct` + -> `0x004cf0d0` `map_editor_locomotive_availability_panel_handle_message` +- `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0042c690` `placed_structure_rebuild_candidate_cargo_service_bitsets` +- `0x0041e2b0` `structure_candidate_rebuild_local_service_metrics` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0041ea50` `world_setup_building_collection_phase` +- `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` + -> `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0041ea50` `world_setup_building_collection_phase` + -> `0x0041e2b0` `structure_candidate_rebuild_local_service_metrics` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0041f9b0` `world_region_count_structure_profiles_before_year_for_category` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x004207d0` `city_site_format_connection_bonus_status_label` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00420280` `city_connection_bonus_select_first_matching_peer_site` + -> `0x004207d0` `city_site_format_connection_bonus_status_label` +- `0x004207d0` `city_site_format_connection_bonus_status_label` + -> `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x00420280` `city_connection_bonus_select_first_matching_peer_site` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00421b60` `world_region_collection_seed_default_regions` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x00421c20` `world_region_collection_run_building_population_pass` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422320` `world_region_normalize_cached_structure_balance_scalars` + -> `0x0040a590` `simulation_service_periodic_boundary_work` + -> `0x004228b0` `world_region_count_linked_placed_structures_by_category` +- `0x004228b0` `world_region_count_linked_placed_structures_by_category` + -> `0x00422320` `world_region_normalize_cached_structure_balance_scalars` + -> `0x00422be0` `world_region_count_placed_structures_for_category` +- `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422a70` `world_region_validate_and_commit_candidate_placement` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00422ee0` `world_region_try_place_candidate_structure` + -> `0x00430270` `world_try_place_random_structure_batch_from_compact_record` +- `0x00422be0` `world_region_count_placed_structures_for_category` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422ee0` `world_region_try_place_candidate_structure` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x004234e0` `world_region_query_projected_structure_count_scalar_by_category` + -> `0x004d0420` `map_editor_city_count_stats_report` +- `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` + -> `0x00412ca0` `world_region_pick_commercial_profile_label_by_region_rank` + -> `0x0041f9b0` `world_region_count_structure_profiles_before_year_for_category` + -> `0x0041fac0` `world_region_read_structure_profile_label_and_weight_by_index` + -> `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x00422be0` `world_region_count_placed_structures_for_category` + -> `0x00422ee0` `world_region_try_place_candidate_structure` + -> `0x004234e0` `world_region_query_projected_structure_count_scalar_by_category` +- `0x00423d30` `world_region_refresh_cached_category_totals_and_weight_slots` + -> `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x00437b20` `simulation_run_chunked_fast_forward_burst` +- `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` + -> `0x0042a080` `company_add_delta_into_stat_series_current_slot_and_optional_cash_totals` +- `0x00423e40` `company_compute_weighted_average_bond_interest_rate` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x004c23a0` `shell_company_detail_render_debt_credit_and_rate_summary_panel` +- `0x00423eb0` `company_query_cached_share_price_scalar` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x004c2720` `shell_company_detail_render_share_value_and_dividend_summary_panel` +- `0x00423ec0` `company_adjust_available_track_laying_capacity_with_floor_zero` + -> `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` +- `0x00424010` `company_has_territory_access_rights` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x00424030` `company_set_territory_access_rights_byte` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` +- `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x00425880` `company_compute_negative_cash_balance_interest_rate` + -> `0x004258c0` `company_compute_positive_cash_balance_interest_rate` + -> `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x00436710` `scenario_state_sum_issue_opinion_terms_raw` + -> `0x004c23a0` `shell_company_detail_render_debt_credit_and_rate_summary_panel` +- `0x004246b0` `company_compute_five_year_weighted_shareholder_return` + -> `0x0042a2e0` `company_read_control_transfer_metric_slot` +- `0x004248d0` `company_compute_cached_recent_per_share_performance_subscore` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x00423eb0` `company_query_cached_share_price_scalar` + -> `0x004248d0` `company_compute_cached_recent_per_share_performance_subscore` + -> `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x00427450` `company_issue_public_shares_and_raise_capital` + -> `0x00436590` `scenario_state_compute_issue_opinion_multiplier` + -> `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` +- `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00423e40` `company_compute_weighted_average_bond_interest_rate` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x00427590` `company_connection_bonus_lane_is_unlocked` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00425880` `company_compute_negative_cash_balance_interest_rate` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x004258c0` `company_compute_positive_cash_balance_interest_rate` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` +- `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` +- `0x004264c0` `company_count_owned_trains` + -> `0x00409950` `company_balance_linked_transit_train_roster` + -> `0x004e7670` `shell_load_screen_render_company_train_list_panel` +- `0x00426590` `company_count_linked_transit_sites` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00426be0` `company_can_purchase_territory_access_rights` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` + -> `0x0042a080` `company_add_delta_into_stat_series_current_slot_and_optional_cash_totals` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` +- `0x00427450` `company_issue_public_shares_and_raise_capital` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` +- `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x004275c0` `company_issue_bond_and_record_terms` +- `0x00427590` `company_connection_bonus_lane_is_unlocked` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` +- `0x004275c0` `company_issue_bond_and_record_terms` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00427540` `company_compute_bond_interest_rate_quote` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` +- `0x00429990` `company_collection_get_nth_active_company_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x004299f0` `company_collection_count_active_companies_before_company_id` + -> `0x00429990` `company_collection_get_nth_active_company_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00429a50` `company_collection_count_active_companies` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00429c10` `company_collection_refresh_active_company_linked_transit_site_peer_caches` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` +- `0x00429c70` `company_read_derived_financial_report_metric_slot` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x0042a080` `company_add_delta_into_stat_series_current_slot_and_optional_cash_totals` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` +- `0x0042a0e0` `company_query_highest_coupon_bond_slot_index` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` +- `0x0042a2e0` `company_read_control_transfer_metric_slot` + -> `0x004246b0` `company_compute_five_year_weighted_shareholder_return` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x00429c70` `company_read_derived_financial_report_metric_slot` +- `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x00429c70` `company_read_derived_financial_report_metric_slot` + -> `0x0042a2e0` `company_read_control_transfer_metric_slot` +- `0x0042c690` `placed_structure_rebuild_candidate_cargo_service_bitsets` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0042cdf0` `placed_structure_refresh_candidate_service_state` +- `0x0042cab0` `placed_structure_accumulate_candidate_metric_or_emit_route_style_peer_link` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` +- `0x0042cdf0` `placed_structure_refresh_candidate_service_state` + -> `0x0042c690` `placed_structure_rebuild_candidate_cargo_service_bitsets` +- `0x0042d700` `scenario_event_query_standalone_condition_row_list_class_and_modifier_flags` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x0042d740` `scenario_event_query_grouped_effect_row_list_type_flags` + -> `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x0042db20` `scenario_event_refresh_runtime_record_from_packed_state` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` + -> `0x0042df70` `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` + -> `0x0042dfb0` `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` + -> `0x0042dff0` `scenario_event_condition_row_list_has_any_class_bit012_or_special_fallback` + -> `0x0042e050` `scenario_event_clone_runtime_record_deep_copy` + -> `0x00433130` `scenario_event_collection_refresh_runtime_records_from_packed_state` +- `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` + -> `0x0042db20` `scenario_event_refresh_runtime_record_from_packed_state` +- `0x0042df70` `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` +- `0x0042dfb0` `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` +- `0x0042dff0` `scenario_event_condition_row_list_has_any_class_bit012_or_special_fallback` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` + -> `0x0042df70` `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` + -> `0x0042dfb0` `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` +- `0x0042e050` `scenario_event_clone_runtime_record_deep_copy` + -> `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` +- `0x00430270` `world_try_place_random_structure_batch_from_compact_record` + -> `0x00422a70` `world_region_validate_and_commit_candidate_placement` +- `0x00430b50` `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` + -> `0x00431b20` `world_apply_compact_runtime_effect_record_to_resolved_targets` + -> `0x00432ea0` `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` +- `0x00431b20` `world_apply_compact_runtime_effect_record_to_resolved_targets` + -> `0x00424030` `company_set_territory_access_rights_byte` + -> `0x00430270` `world_try_place_random_structure_batch_from_compact_record` + -> `0x00434890` `scenario_state_set_selected_chairman_profile` + -> `0x004348c0` `scenario_state_get_selected_chairman_profile_record` +- `0x004323a0` `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x0042d700` `scenario_event_query_standalone_condition_row_list_class_and_modifier_flags` + -> `0x00430b50` `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` + -> `0x00431b20` `world_apply_compact_runtime_effect_record_to_resolved_targets` + -> `0x00432f40` `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` +- `0x00432ea0` `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` + -> `0x00430b50` `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` +- `0x00432f40` `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` + -> `0x0040a590` `simulation_service_periodic_boundary_work` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x004323a0` `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` + -> `0x0047d120` `start_new_company_dialog_commit_create_company` + -> `0x004e51ea` `shell_load_screen_render_game_status_briefing_panel` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00433130` `scenario_event_collection_refresh_runtime_records_from_packed_state` + -> `0x0042db20` `scenario_event_refresh_runtime_record_from_packed_state` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00433b00` `shell_can_open_trainbuy_window_or_warn` + -> `0x00512c50` `shell_open_or_focus_trainbuy_window` +- `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` + -> `0x00482160` `shell_state_service_active_mode_frame` + -> `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bb9e0` `shell_building_detail_window_handle_message` +- `0x00434300` `world_runtime_release_global_services` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00446d40` `world_load_saved_runtime_state_bundle` + -> `0x00482ec0` `shell_transition_mode` +- `0x004348c0` `scenario_state_get_selected_chairman_profile_record` + -> `0x00434890` `scenario_state_set_selected_chairman_profile` +- `0x00436590` `scenario_state_compute_issue_opinion_multiplier` + -> `0x00424fd0` `company_compute_public_support_adjusted_share_price_scalar` + -> `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` +- `0x00436710` `scenario_state_sum_issue_opinion_terms_raw` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` +- `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x0047bc80` `shell_setup_payload_seed_unique_row_category_bytes_and_marker_slots` +- `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` +- `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x0041ea50` `world_setup_building_collection_phase` + -> `0x00421b60` `world_region_collection_seed_default_regions` + -> `0x00421c20` `world_region_collection_run_building_population_pass` + -> `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x0044fb70` `world_compute_transport_and_pricing_grid` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004882e0` `world_region_border_overlay_rebuild` +- `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x00439140` `simulation_frame_accumulate_and_step_world` + -> `0x0040ab50` `simulation_advance_to_target_calendar_point` + -> `0x0043db00` `world_view_service_shell_input_pan_and_hover` + -> `0x00483f70` `shell_service_pump_iteration` + -> `0x004b9d70` `shell_has_live_building_detail_window` + -> `0x004b9d80` `shell_mark_building_detail_window_dirty` + -> `0x004c8670` `shell_mark_custom_modal_dialog_dirty` + -> `0x004c8680` `shell_has_live_custom_modal_dialog` + -> `0x004dc7d0` `shell_has_file_options_dialog` + -> `0x004dc7e0` `shell_mark_file_options_dialog_dirty` + -> `0x004e0720` `game_message_window_service_if_present` + -> `0x004e1f50` `shell_has_live_load_screen_window` + -> `0x004e1f60` `shell_mark_load_screen_window_dirty` + -> `0x004e4ee0` `shell_open_or_focus_load_screen_page` + -> `0x004f2e80` `shell_has_live_overview_window` + -> `0x004f2e90` `shell_mark_overview_window_dirty` + -> `0x004fe120` `shell_has_settings_window` + -> `0x004fe130` `shell_mark_settings_window_dirty` + -> `0x0050f740` `shell_has_live_trainbuy_window` + -> `0x0050f750` `shell_mark_trainbuy_window_dirty` +- `0x0043f640` `world_render_station_candidate_service_map_overlay` + -> `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x004207d0` `city_site_format_connection_bonus_status_label` + -> `0x0046b780` `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x0047e690` `placed_structure_query_candidate_directional_route_overlay_summary` + -> `0x0047efe0` `placed_structure_query_linked_company_id` + -> `0x00504ae0` `shell_station_detail_set_active_candidate_service_preview` +- `0x00442400` `shell_setup_load_selected_profile_bundle_into_payload_record` + -> `0x0047be50` `shell_setup_profile_copy_payload_scroll_count_and_campaign_byte_and_seed_row_categories` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` +- `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00482ec0` `shell_transition_mode` +- `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00446d40` `world_load_saved_runtime_state_bundle` + -> `0x004dd010` `shell_file_request_dialog_collect_target_path` +- `0x00445de0` `shell_map_file_world_bundle_coordinator` + -> `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x00444dd0` `map_bundle_open_reference_databases` + -> `0x00446240` `world_runtime_serialize_smp_bundle` + -> `0x004dd010` `shell_file_request_dialog_collect_target_path` +- `0x00446240` `world_runtime_serialize_smp_bundle` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` +- `0x00461cd0` `locomotive_collection_select_best_era_matched_non_electric_fallback_id` + -> `0x004078a0` `company_select_preferred_available_locomotive_id` + -> `0x0041d550` `locomotive_era_and_engine_type_pass_company_policy_gate` +- `0x00464410` `shell_dispatch_ui_command` + -> `0x00484590` `shell_init_graphics_preset_state` + -> `0x004853c0` `shell_apply_graphics_preset_bundle` + -> `0x004886e0` `scenario_text_export_build_language_file` + -> `0x00489830` `scenario_text_export_report_language_file` + -> `0x00489a20` `scenario_text_export_batch_process_maps` + -> `0x0051ebc0` `shell_reset_display_runtime_defaults` +- `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` + -> `0x00467eb0` `placed_structure_route_link_attach_site_owner` +- `0x00467df0` `placed_structure_route_link_detach_current_owner_chain` + -> `0x00467eb0` `placed_structure_route_link_attach_site_owner` + -> `0x00467f20` `placed_structure_route_link_attach_route_node_owner` + -> `0x004680b0` `placed_structure_route_link_release_and_detach` +- `0x00467eb0` `placed_structure_route_link_attach_site_owner` + -> `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` + -> `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` + -> `0x00467df0` `placed_structure_route_link_detach_current_owner_chain` + -> `0x0047e690` `placed_structure_query_candidate_directional_route_overlay_summary` +- `0x00467f20` `placed_structure_route_link_attach_route_node_owner` + -> `0x00467df0` `placed_structure_route_link_detach_current_owner_chain` +- `0x00467f50` `placed_structure_route_link_allocate_site_pair_for_candidate_class` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` + -> `0x00467eb0` `placed_structure_route_link_attach_site_owner` +- `0x004680b0` `placed_structure_route_link_release_and_detach` + -> `0x00467df0` `placed_structure_route_link_detach_current_owner_chain` +- `0x004682c0` `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` + -> `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00468300` `placed_structure_route_link_rebuild_route_style_grid_counters_and_endpoint_state` + -> `0x00467c30` `placed_structure_route_link_recompute_endpoint_pair_state` +- `0x00469720` `multiplayer_preview_dataset_service_frame` + -> `0x005519f0` `shell_publish_text_callout_presentation` +- `0x0046a6c0` `multiplayer_session_event_publish_registration_field` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` +- `0x0046b780` `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00445ac0` `shell_map_file_entry_coordinator` +- `0x004768c0` `chairman_profile_owns_all_company_shares` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` +- `0x00477860` `profile_collection_get_nth_active_chairman_record` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` +- `0x0047bc80` `shell_setup_payload_seed_unique_row_category_bytes_and_marker_slots` + -> `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x0047be50` `shell_setup_profile_copy_payload_scroll_count_and_campaign_byte_and_seed_row_categories` +- `0x0047be50` `shell_setup_profile_copy_payload_scroll_count_and_campaign_byte_and_seed_row_categories` + -> `0x0047bc80` `shell_setup_payload_seed_unique_row_category_bytes_and_marker_slots` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` +- `0x0047d080` `start_new_company_dialog_open` + -> `0x004c6f30` `shell_company_list_window_handle_message` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x0047d120` `start_new_company_dialog_commit_create_company` + -> `0x00432f40` `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` +- `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x00477860` `profile_collection_get_nth_active_chairman_record` +- `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` +- `0x0047e330` `placed_structure_count_candidates_with_local_service_metrics` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0047f010` `placed_structure_append_unique_route_entry` + -> `0x0047e690` `placed_structure_query_candidate_directional_route_overlay_summary` +- `0x0047fdb0` `placed_structure_append_nearby_transit_site_distance_bucket_entry` + -> `0x0051db80` `math_measure_float_xy_pair_distance` +- `0x004801a0` `placed_structure_is_linked_transit_site_reachable_from_company_route_anchor` + -> `0x00401860` `company_query_cached_linked_transit_route_anchor_entry_id` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` +- `0x00480210` `placed_structure_construct_linked_site_record_from_anchor_and_coords` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00481390` `placed_structure_collection_allocate_and_construct_linked_site_record` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` +- `0x00480590` `placed_structure_teardown_linked_site_runtime_state_before_removal` + -> `0x004813d0` `placed_structure_collection_remove_linked_site_record` +- `0x00480bb0` `placed_structure_refresh_linked_site_display_name_and_route_anchor` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x004682c0` `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x004a45f0` `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` +- `0x00481390` `placed_structure_collection_allocate_and_construct_linked_site_record` + -> `0x0040f6d0` `placed_structure_construct_entry_from_candidate_and_world_args` + -> `0x00480210` `placed_structure_construct_linked_site_record_from_anchor_and_coords` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004813d0` `placed_structure_collection_remove_linked_site_record` + -> `0x00429c10` `company_collection_refresh_active_company_linked_transit_site_peer_caches` + -> `0x00480590` `placed_structure_teardown_linked_site_runtime_state_before_removal` +- `0x00481480` `placed_structure_collection_append_site_into_all_proximity_bucket_lists` + -> `0x0047fdb0` `placed_structure_append_nearby_transit_site_distance_bucket_entry` +- `0x004814c0` `placed_structure_collection_remove_site_id_from_all_proximity_bucket_lists` + -> `0x0047dd10` `placed_structure_remove_site_id_from_proximity_bucket_lists` +- `0x00482160` `shell_state_service_active_mode_frame` + -> `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x00469720` `multiplayer_preview_dataset_service_frame` +- `0x00482d10` `runtime_query_cached_local_exe_version_float` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` +- `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x0046a6c0` `multiplayer_session_event_publish_registration_field` + -> `0x00482d10` `runtime_query_cached_local_exe_version_float` +- `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00482d10` `runtime_query_cached_local_exe_version_float` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x00482ec0` `shell_transition_mode` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` + -> `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` + -> `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004efe80` `multiplayer_window_init_globals` + -> `0x00504010` `shell_setup_window_construct` + -> `0x005174e0` `shell_video_window_construct` + -> `0x00517570` `shell_video_window_destroy` +- `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x00482ec0` `shell_transition_mode` + -> `0x00483f70` `shell_service_pump_iteration` + -> `0x00521390` `bootstrap_destroy_shell_service_bundle` +- `0x00484910` `shell_save_graphics_config` + -> `0x0051eea0` `shell_save_display_runtime_config` +- `0x00484980` `shell_load_graphics_config_or_init_defaults` + -> `0x00484590` `shell_init_graphics_preset_state` + -> `0x00484910` `shell_save_graphics_config` + -> `0x0051ef20` `shell_load_display_runtime_config_or_init_defaults` +- `0x00484a60` `shell_match_legacy_gpu_profile_token` + -> `0x004853c0` `shell_apply_graphics_preset_bundle` +- `0x00485060` `shell_set_graphics_option_with_fanout` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00484d70` `shell_apply_graphics_option_runtime_effects` +- `0x004852e0` `shell_apply_default_graphics_master_profile` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00484d70` `shell_apply_graphics_option_runtime_effects` +- `0x004853c0` `shell_apply_graphics_preset_bundle` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00484d70` `shell_apply_graphics_option_runtime_effects` + -> `0x00485060` `shell_set_graphics_option_with_fanout` +- `0x004882e0` `world_region_border_overlay_rebuild` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x00489a20` `scenario_text_export_batch_process_maps` + -> `0x004886e0` `scenario_text_export_build_language_file` + -> `0x00489830` `scenario_text_export_report_language_file` +- `0x00489f80` `route_entry_assign_aux_tracker_group_id` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x004a4380` `aux_route_entry_tracker_collection_try_split_route_entry_chain_into_fresh_group` + -> `0x004a45f0` `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` + -> `0x004a4ce0` `aux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups` + -> `0x004a4ff0` `aux_route_entry_tracker_collection_reseed_group_from_route_entry_component` +- `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` + -> `0x00423ec0` `company_adjust_available_track_laying_capacity_with_floor_zero` + -> `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x004955b0` `route_entry_collection_map_track_lay_mode_to_endpoint_policy_byte` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x00494240` `route_entry_collection_query_rect_window_passes_entry_type_gate` + -> `0x00416620` `placed_structure_publish_projected_runtime_rect_globals_and_validate_side_windows` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` +- `0x00494e40` `aux_route_entry_tracker_reset` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` +- `0x00494e90` `aux_route_entry_tracker_seed_owner_entry_id` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` +- `0x00494eb0` `aux_route_entry_tracker_adjust_refcount` + -> `0x004a4340` `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` +- `0x00494ed0` `aux_route_entry_tracker_contains_endpoint_entry_id` + -> `0x004a4ce0` `aux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups` +- `0x00494f00` `aux_route_entry_tracker_merge_or_bind_endpoint_entry` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x00494fb0` `aux_route_entry_tracker_refresh_boolean_class_latch_and_notify_owner` + -> `0x004950f0` `aux_route_entry_tracker_replace_matching_endpoint_entry_and_refresh_latch` + -> `0x004a6360` `aux_route_entry_tracker_collection_refresh_owner_adjacent_compatible_group_links` +- `0x004950f0` `aux_route_entry_tracker_replace_matching_endpoint_entry_and_refresh_latch` + -> `0x00494fb0` `aux_route_entry_tracker_refresh_boolean_class_latch_and_notify_owner` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004a45f0` `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` + -> `0x004a4ce0` `aux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups` +- `0x004952f0` `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` + -> `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x004953c0` `math_normalize_subtracted_angle_delta_and_report_wrap` + -> `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` +- `0x004955b0` `route_entry_collection_map_track_lay_mode_to_endpoint_policy_byte` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` +- `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` + -> `0x0051db80` `math_measure_float_xy_pair_distance` +- `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` + -> `0x004952f0` `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` + -> `0x004953c0` `math_normalize_subtracted_angle_delta_and_report_wrap` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x005a152e` `math_abs_double_with_crt_special_case_handling` +- `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004240a0` `company_query_available_track_laying_capacity_or_unlimited` + -> `0x00494cb0` `route_entry_collection_try_find_route_entry_covering_point_window` + -> `0x004952f0` `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` + -> `0x004953c0` `math_normalize_subtracted_angle_delta_and_report_wrap` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x0051db80` `math_measure_float_xy_pair_distance` + -> `0x005a152e` `math_abs_double_with_crt_special_case_handling` +- `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00480bb0` `placed_structure_refresh_linked_site_display_name_and_route_anchor` + -> `0x00493cf0` `route_entry_collection_create_endpoint_entry_from_coords_and_policy` + -> `0x00494f00` `aux_route_entry_tracker_merge_or_bind_endpoint_entry` + -> `0x004952f0` `math_compute_quadrant_adjusted_heading_angle_from_xy_pair` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` + -> `0x004a4340` `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` + -> `0x00494e40` `aux_route_entry_tracker_reset` + -> `0x00494e90` `aux_route_entry_tracker_seed_owner_entry_id` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x004a4340` `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` + -> `0x00494eb0` `aux_route_entry_tracker_adjust_refcount` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x004a4380` `aux_route_entry_tracker_collection_try_split_route_entry_chain_into_fresh_group` + -> `0x00489f80` `route_entry_assign_aux_tracker_group_id` + -> `0x00494e90` `aux_route_entry_tracker_seed_owner_entry_id` + -> `0x00494eb0` `aux_route_entry_tracker_adjust_refcount` + -> `0x00494f00` `aux_route_entry_tracker_merge_or_bind_endpoint_entry` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` + -> `0x004a45f0` `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` +- `0x004a45f0` `aux_route_entry_tracker_collection_refresh_route_entry_group_membership` + -> `0x00480bb0` `placed_structure_refresh_linked_site_display_name_and_route_anchor` + -> `0x00489f80` `route_entry_assign_aux_tracker_group_id` + -> `0x00494eb0` `aux_route_entry_tracker_adjust_refcount` + -> `0x00494f00` `aux_route_entry_tracker_merge_or_bind_endpoint_entry` + -> `0x00495020` `aux_route_entry_tracker_refresh_cached_match_fields_and_maybe_split_duplicate_pair` + -> `0x004950f0` `aux_route_entry_tracker_replace_matching_endpoint_entry_and_refresh_latch` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` + -> `0x004a4380` `aux_route_entry_tracker_collection_try_split_route_entry_chain_into_fresh_group` + -> `0x004a4ce0` `aux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups` +- `0x004a4c00` `aux_route_entry_tracker_route_entry_pair_pass_adjacent_chain_transfer_gate` + -> `0x004a4ce0` `aux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups` + -> `0x004a6360` `aux_route_entry_tracker_collection_refresh_owner_adjacent_compatible_group_links` +- `0x004a4ce0` `aux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups` + -> `0x00489f80` `route_entry_assign_aux_tracker_group_id` + -> `0x00494ed0` `aux_route_entry_tracker_contains_endpoint_entry_id` + -> `0x004950f0` `aux_route_entry_tracker_replace_matching_endpoint_entry_and_refresh_latch` + -> `0x004a4340` `aux_route_entry_tracker_collection_adjust_refcount_or_destroy` + -> `0x004a6360` `aux_route_entry_tracker_collection_refresh_owner_adjacent_compatible_group_links` +- `0x004a4ff0` `aux_route_entry_tracker_collection_reseed_group_from_route_entry_component` + -> `0x00489f80` `route_entry_assign_aux_tracker_group_id` + -> `0x00494f00` `aux_route_entry_tracker_merge_or_bind_endpoint_entry` + -> `0x004a42b0` `aux_route_entry_tracker_collection_allocate_entry` +- `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a62c0` `aux_route_entry_tracker_query_tracker_component_labels_match` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004a5fc0` `aux_route_entry_tracker_collection_refresh_component_labels_and_reseed_invalid_groups` + -> `0x004a4ff0` `aux_route_entry_tracker_collection_reseed_group_from_route_entry_component` + -> `0x004a6320` `aux_route_entry_tracker_collection_query_component_label_by_tracker_id` +- `0x004a62c0` `aux_route_entry_tracker_query_tracker_component_labels_match` + -> `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x004a5fc0` `aux_route_entry_tracker_collection_refresh_component_labels_and_reseed_invalid_groups` +- `0x004a6320` `aux_route_entry_tracker_collection_query_component_label_by_tracker_id` + -> `0x004a5fc0` `aux_route_entry_tracker_collection_refresh_component_labels_and_reseed_invalid_groups` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x004a6360` `aux_route_entry_tracker_collection_refresh_owner_adjacent_compatible_group_links` + -> `0x00494fb0` `aux_route_entry_tracker_refresh_boolean_class_latch_and_notify_owner` + -> `0x004a4c00` `aux_route_entry_tracker_route_entry_pair_pass_adjacent_chain_transfer_gate` + -> `0x004a4ce0` `aux_route_entry_tracker_collection_try_transfer_adjacent_chain_between_groups` +- `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` + -> `0x004b2c10` `train_route_list_validate_reachability_and_station_pair` +- `0x004a94b0` `train_finalize_aux_route_entry_buffer_preserving_subflags` + -> `0x00434050` `shell_has_auxiliary_preview_owner` +- `0x004ab980` `train_set_route_operating_mode_and_scalar` + -> `0x00434050` `shell_has_auxiliary_preview_owner` +- `0x004b2c10` `train_route_list_validate_reachability_and_station_pair` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x004b2f00` `train_route_list_select_entry_and_refresh_linked_site_state` + -> `0x004b3000` `train_route_list_remove_entry_and_compact` +- `0x004b3000` `train_route_list_remove_entry_and_compact` + -> `0x004b2f00` `train_route_list_select_entry_and_refresh_linked_site_state` +- `0x004b3160` `train_route_list_insert_staged_entry_at_index` + -> `0x00516d00` `tutorial_validate_train_route_station_indicator_step` +- `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` +- `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004b99c0` `structure_candidate_collection_get_nth_active_candidate_id` +- `0x004b9d70` `shell_has_live_building_detail_window` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004b9d80` `shell_mark_building_detail_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bb9e0` `shell_building_detail_window_handle_message` + -> `0x00513130` `shell_trainbuy_window_query_selected_train_id` +- `0x004b9fd0` `shell_building_detail_present_flagged_service_capability_popup` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x004b99c0` `structure_candidate_collection_get_nth_active_candidate_id` +- `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x00517d40` `indexed_collection_entry_id_is_live` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` +- `0x004baef0` `shell_building_detail_window_refresh_controls` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004bb9e0` `shell_building_detail_window_handle_message` +- `0x004bb9e0` `shell_building_detail_window_handle_message` + -> `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004bc0a0` `shell_building_detail_window_construct` + -> `0x004baef0` `shell_building_detail_window_refresh_controls` + -> `0x004bc100` `shell_open_or_focus_building_detail_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004bc100` `shell_open_or_focus_building_detail_window` + -> `0x004bc0a0` `shell_building_detail_window_construct` +- `0x004bfb30` `shell_format_company_financial_summary_card` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004c1ab0` `shell_company_detail_render_company_summary_card` + -> `0x004c6b40` `shell_company_list_format_company_or_start_row` +- `0x004c0160` `shell_format_company_stock_data_panel` + -> `0x004246b0` `company_compute_five_year_weighted_shareholder_return` + -> `0x004e5130` `shell_load_screen_render_company_stock_data_panel` +- `0x004c1610` `shell_company_detail_bind_bond_row_band_for_active_panel` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` +- `0x004c16f0` `shell_company_detail_resolve_selected_company` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c1ab0` `shell_company_detail_render_company_summary_card` + -> `0x004bfb30` `shell_format_company_financial_summary_card` + -> `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` + -> `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` +- `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` +- `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x0054f710` `shell_queue_callout_segment_marker` +- `0x004c1ec0` `shell_company_detail_render_bond_maturity_and_repay_panel` + -> `0x004c1610` `shell_company_detail_bind_bond_row_band_for_active_panel` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` +- `0x004c23a0` `shell_company_detail_render_debt_credit_and_rate_summary_panel` + -> `0x00423e40` `company_compute_weighted_average_bond_interest_rate` + -> `0x00424580` `company_compute_prime_rate_from_issue39_scenario_baseline` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x004c2720` `shell_company_detail_render_share_value_and_dividend_summary_panel` + -> `0x00423eb0` `company_query_cached_share_price_scalar` + -> `0x004c0160` `shell_format_company_stock_data_panel` +- `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x00434870` `scenario_state_get_selected_chairman_company_record` + -> `0x004c5540` `shell_company_detail_window_construct` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00540a47` `shell_control_refresh_matching_dynamic_text_payload` + -> `0x005639d2` `shell_control_release_dynamic_text_payload` +- `0x004c3470` `shell_company_detail_step_selected_active_company_delta` + -> `0x00429990` `company_collection_get_nth_active_company_id` + -> `0x004299f0` `company_collection_count_active_companies_before_company_id` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x004c3540` `shell_company_detail_select_next_active_company` + -> `0x004c3550` `shell_company_detail_select_previous_active_company` +- `0x004c3540` `shell_company_detail_select_next_active_company` + -> `0x004c3470` `shell_company_detail_step_selected_active_company_delta` +- `0x004c3550` `shell_company_detail_select_previous_active_company` + -> `0x004c3470` `shell_company_detail_step_selected_active_company_delta` +- `0x004c3560` `shell_company_detail_render_issue_bond_offer_dialog` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004275c0` `company_issue_bond_and_record_terms` + -> `0x004c3560` `shell_company_detail_render_issue_bond_offer_dialog` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c3b50` `shell_company_detail_render_issue_stock_offer_dialog` + -> `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x00427450` `company_issue_public_shares_and_raise_capital` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c4300` `shell_company_detail_render_stock_buyback_offer_dialog` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004273c0` `company_repurchase_public_shares_and_reduce_capital` + -> `0x004c4300` `shell_company_detail_render_stock_buyback_offer_dialog` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` +- `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5540` `shell_company_detail_window_construct` + -> `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x004c1ab0` `shell_company_detail_render_company_summary_card` + -> `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x004c1ec0` `shell_company_detail_render_bond_maturity_and_repay_panel` + -> `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00426d60` `company_deactivate_and_clear_chairman_share_links` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c5a0e` `shell_company_detail_resign_chairmanship_flow` + -> `0x004c5b99` `shell_company_detail_bankruptcy_flow` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` + -> `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004ec640` `shell_company_detail_attempt_merger_flow` + -> `0x0050ccc0` `shell_company_detail_attempt_chairmanship_takeover_flow` +- `0x004c5a0e` `shell_company_detail_resign_chairmanship_flow` + -> `0x00428a10` `company_clear_selected_chairman_if_current_profile` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5b99` `shell_company_detail_bankruptcy_flow` + -> `0x00425a90` `company_declare_bankruptcy_and_halve_bond_debt` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` + -> `0x00424030` `company_set_territory_access_rights_byte` + -> `0x0042a040` `company_add_delta_into_stat_series_and_current_slot` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c6b40` `shell_company_list_format_company_or_start_row` + -> `0x004bfb30` `shell_format_company_financial_summary_card` + -> `0x004c6c30` `shell_company_list_window_refresh_rows` +- `0x004c6c30` `shell_company_list_window_refresh_rows` + -> `0x00434870` `scenario_state_get_selected_chairman_company_record` +- `0x004c6f30` `shell_company_list_window_handle_message` + -> `0x0047d080` `start_new_company_dialog_open` + -> `0x004c6bb0` `shell_company_list_activate_or_shift_center_company` + -> `0x004c6c30` `shell_company_list_window_refresh_rows` + -> `0x004ddbd0` `shell_detail_panel_transition_manager` +- `0x004c7200` `shell_company_list_window_construct` + -> `0x004c6b40` `shell_company_list_format_company_or_start_row` + -> `0x004c6bb0` `shell_company_list_activate_or_shift_center_company` + -> `0x004c6c30` `shell_company_list_window_refresh_rows` +- `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` +- `0x004c7fc0` `shell_credits_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004c8670` `shell_mark_custom_modal_dialog_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004c8680` `shell_has_live_custom_modal_dialog` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004ee0e0` `multiplayer_open_staged_text_entry_dialog` +- `0x004ca1c0` `map_editor_chairman_slot_panel_refresh_slot_counters` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` + -> `0x004cecc0` `map_editor_chairman_slot_panel_handle_message` +- `0x004cb2b0` `map_editor_scenario_special_conditions_panel_construct` + -> `0x004ca790` `map_editor_scenario_metadata_panel_refresh_controls` +- `0x004cc250` `map_editor_chairman_slot_panel_refresh_slot_list` + -> `0x004ca1c0` `map_editor_chairman_slot_panel_refresh_slot_counters` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` + -> `0x004cecc0` `map_editor_chairman_slot_panel_handle_message` +- `0x004cc2d0` `map_editor_chairman_slot_panel_construct` + -> `0x004c9da0` `map_editor_chairman_slot_panel_format_slot_card` +- `0x004ce070` `map_editor_panel_select_active_section` + -> `0x004ca540` `map_editor_available_chairman_panel_construct` + -> `0x004ca790` `map_editor_scenario_metadata_panel_refresh_controls` + -> `0x004ca910` `map_editor_building_density_panel_refresh_controls` + -> `0x004cadf0` `map_editor_economic_cost_slider_panel_construct` + -> `0x004cb2b0` `map_editor_scenario_special_conditions_panel_construct` + -> `0x004cc980` `map_editor_city_region_panel_construct` + -> `0x004cd070` `map_editor_territory_panel_construct` + -> `0x004cd680` `map_editor_locomotive_availability_panel_construct` + -> `0x004cdbd0` `map_editor_industry_availability_panel_construct` + -> `0x004cf910` `map_editor_port_warehouse_cargo_panel_construct` + -> `0x004d3000` `map_editor_cargo_stats_panel_construct` + -> `0x004d3020` `map_editor_city_region_growth_stats_panel_construct` + -> `0x004d3060` `map_editor_tree_stats_panel_construct` + -> `0x004d3080` `map_editor_general_validation_panel_construct` + -> `0x004d30a0` `map_editor_city_count_stats_panel_construct` + -> `0x004d4110` `map_editor_event_variable_values_panel_construct` + -> `0x004d4130` `map_editor_event_validation_panel_construct` +- `0x004cecc0` `map_editor_chairman_slot_panel_handle_message` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` +- `0x004cf0d0` `map_editor_locomotive_availability_panel_handle_message` + -> `0x004cd680` `map_editor_locomotive_availability_panel_construct` +- `0x004d0420` `map_editor_city_count_stats_report` + -> `0x004234e0` `world_region_query_projected_structure_count_scalar_by_category` + -> `0x004d30a0` `map_editor_city_count_stats_panel_construct` +- `0x004d30a0` `map_editor_city_count_stats_panel_construct` + -> `0x004d0420` `map_editor_city_count_stats_report` +- `0x004d4500` `shell_ensure_editor_panel_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004d57c0` `shell_event_conditions_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004d5d00` `shell_event_effects_window_refresh_effect_type_selector` + -> `0x004d6090` `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004d7060` `shell_event_effects_window_handle_message` +- `0x004d5f50` `shell_event_effects_window_refresh_selected_effect_parameter_rows` + -> `0x004d6090` `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004d7060` `shell_event_effects_window_handle_message` +- `0x004d6090` `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004d7060` `shell_event_effects_window_handle_message` +- `0x004d67f0` `shell_event_effects_window_commit_current_editor_state_into_staged_row` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004d7060` `shell_event_effects_window_handle_message` +- `0x004d6d60` `shell_event_effects_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004d7060` `shell_event_effects_window_handle_message` + -> `0x004d5d00` `shell_event_effects_window_refresh_effect_type_selector` + -> `0x004d5f50` `shell_event_effects_window_refresh_selected_effect_parameter_rows` + -> `0x004d6090` `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` + -> `0x004d67f0` `shell_event_effects_window_commit_current_editor_state_into_staged_row` +- `0x004d77b0` `shell_event_conditions_window_refresh_grouped_effect_summary_band_affordances` + -> `0x004d9390` `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` +- `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9ed0` `shell_event_conditions_window_remove_selected_condition_row` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9390` `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` + -> `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` + -> `0x004da920` `shell_event_effects_window_remove_selected_grouped_effect_row` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` +- `0x004d8d50` `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` + -> `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` +- `0x004d8ea0` `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` + -> `0x004db520` `shell_event_conditions_window_select_previous_event_and_refresh` + -> `0x004db5e0` `shell_event_conditions_window_select_next_event_and_refresh` + -> `0x004db6a0` `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` + -> `0x004dbfca` `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` +- `0x004d91e0` `shell_event_conditions_window_commit_selected_event_summary_headers_and_group_mode` + -> `0x004d8d50` `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004d9360` `shell_event_conditions_window_remove_selected_event_and_refresh_selector` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` +- `0x004d9390` `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` + -> `0x004d77b0` `shell_event_conditions_window_refresh_grouped_effect_summary_band_affordances` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` + -> `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` +- `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x0042d700` `scenario_event_query_standalone_condition_row_list_class_and_modifier_flags` + -> `0x004d9ed0` `shell_event_conditions_window_remove_selected_condition_row` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x0042d740` `scenario_event_query_grouped_effect_row_list_type_flags` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` +- `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` + -> `0x004d57c0` `shell_event_conditions_window_construct` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` +- `0x004d9ed0` `shell_event_conditions_window_remove_selected_condition_row` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` +- `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004d9390` `shell_event_conditions_window_refresh_selected_event_mode_dependent_detail_rows` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` +- `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x0042d740` `scenario_event_query_grouped_effect_row_list_type_flags` + -> `0x0042df30` `scenario_event_condition_row_list_has_class_bit0_or_flag7f9_fallback` + -> `0x0042df70` `scenario_event_condition_row_list_has_class_bit1_or_flag7fa_fallback` + -> `0x0042dfb0` `scenario_event_condition_row_list_has_class_bit2_or_type63_fallback` + -> `0x0042dff0` `scenario_event_condition_row_list_has_any_class_bit012_or_special_fallback` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004dbfca` `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` +- `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` +- `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` +- `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x004da920` `shell_event_effects_window_remove_selected_grouped_effect_row` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x004da9a0` `shell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` +- `0x004dab60` `shell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip` + -> `0x004d8d50` `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` + -> `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x004da9a0` `shell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event` +- `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` + -> `0x004db6a0` `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` + -> `0x004db6f0` `shell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection` +- `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004dab60` `shell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip` +- `0x004db520` `shell_event_conditions_window_select_previous_event_and_refresh` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004d8ea0` `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004db5e0` `shell_event_conditions_window_select_next_event_and_refresh` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004db520` `shell_event_conditions_window_select_previous_event_and_refresh` +- `0x004db6a0` `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` + -> `0x004d8ea0` `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` + -> `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004db6f0` `shell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection` +- `0x004db6f0` `shell_event_conditions_window_bind_event_selector_callbacks_and_seed_pending_selection` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004daf40` `shell_event_conditions_window_reset_selected_event_summary_placeholders` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004db6a0` `shell_event_conditions_window_set_selected_event_id_and_refresh_if_open` +- `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` + -> `0x0042e050` `scenario_event_clone_runtime_record_deep_copy` + -> `0x00432ea0` `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004dba90` `shell_event_conditions_window_rename_selected_event_via_name_modal` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` + -> `0x004d9360` `shell_event_conditions_window_remove_selected_event_and_refresh_selector` + -> `0x004d9d10` `shell_event_conditions_window_refresh_selected_grouped_effect_territory_target_affordance` + -> `0x004d9f50` `shell_event_conditions_window_refresh_selected_event_mode_strip_and_summary_panels` + -> `0x004db520` `shell_event_conditions_window_select_previous_event_and_refresh` + -> `0x004db5e0` `shell_event_conditions_window_select_next_event_and_refresh` + -> `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` + -> `0x004dba90` `shell_event_conditions_window_rename_selected_event_via_name_modal` + -> `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` + -> `0x004dbfca` `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` +- `0x004dbe7a` `shell_event_conditions_window_open_choice_event_single_player_only_warning_modal` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004dbf93` `shell_event_conditions_window_select_grouped_effect_summary_band_and_refresh` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d8d50` `shell_event_conditions_window_commit_current_grouped_effect_summary_state_before_group_switch` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x004da9a0` `shell_event_conditions_window_refresh_current_grouped_effect_summary_state_from_selected_event` + -> `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` +- `0x004dbfca` `shell_event_conditions_window_select_grouped_effect_target_scope_mode_and_refresh` + -> `0x004d8ea0` `shell_event_conditions_window_commit_current_selected_event_text_panels_before_selection_change` + -> `0x004dab60` `shell_event_conditions_window_refresh_selected_grouped_effect_target_scope_strip` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004dc670` `shell_file_options_dialog_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004dc7d0` `shell_has_file_options_dialog` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004dc7e0` `shell_mark_file_options_dialog_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004dc7f0` `shell_file_options_dialog_handle_message` + -> `0x004fe120` `shell_has_settings_window` + -> `0x00501e50` `shell_open_settings_window` +- `0x004dd010` `shell_file_request_dialog_collect_target_path` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` +- `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004d4500` `shell_ensure_editor_panel_window` +- `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x004dfdf0` `shell_ensure_game_message_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004dfdf0` `shell_ensure_game_message_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004e0960` `game_uppermost_window_refresh_controls` + -> `0x004e0b20` `game_uppermost_window_construct` + -> `0x004e0ba0` `game_uppermost_window_handle_message` +- `0x004e0b20` `game_uppermost_window_construct` + -> `0x004e0e40` `shell_ensure_game_uppermost_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004e0ba0` `game_uppermost_window_handle_message` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` +- `0x004e0e40` `shell_ensure_game_uppermost_window` + -> `0x004e0b20` `game_uppermost_window_construct` +- `0x004e1d60` `shell_load_screen_refresh_page_strip_and_page_kind_controls` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` +- `0x004e1f50` `shell_has_live_load_screen_window` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004e1f60` `shell_mark_load_screen_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` + -> `0x004e3a00` `shell_load_screen_step_selected_company_delta` + -> `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x004e45d0` `shell_load_screen_profile_stock_holdings_page_handle_message` +- `0x004e39e0` `company_query_display_year_or_current_year` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e3a00` `shell_load_screen_step_selected_company_delta` + -> `0x00429990` `company_collection_get_nth_active_company_id` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` +- `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` + -> `0x004e3a00` `shell_load_screen_step_selected_company_delta` + -> `0x004e45d0` `shell_load_screen_profile_stock_holdings_page_handle_message` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e45d0` `shell_load_screen_profile_stock_holdings_page_handle_message` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` + -> `0x004e39e0` `company_query_display_year_or_current_year` + -> `0x004e3a00` `shell_load_screen_step_selected_company_delta` + -> `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x004e4b10` `shell_load_screen_reset_runtime_state_and_seed_selection` + -> `0x004e4ee0` `shell_open_or_focus_load_screen_page` +- `0x004e4ee0` `shell_open_or_focus_load_screen_page` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` + -> `0x004e4b10` `shell_load_screen_reset_runtime_state_and_seed_selection` +- `0x004e5130` `shell_load_screen_render_company_stock_data_panel` + -> `0x004c0160` `shell_format_company_stock_data_panel` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004e51ea` `shell_load_screen_render_game_status_briefing_panel` + -> `0x00432f40` `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x004348c0` `scenario_state_get_selected_chairman_profile_record` +- `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x00434870` `scenario_state_get_selected_chairman_company_record` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004768c0` `chairman_profile_owns_all_company_shares` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x004e39e0` `company_query_display_year_or_current_year` +- `0x004e68e0` `shell_load_screen_render_company_list_panel` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x004e6ef0` `shell_load_screen_render_player_list_panel` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x00477860` `profile_collection_get_nth_active_chairman_record` +- `0x004e7670` `shell_load_screen_render_company_train_list_panel` + -> `0x004264c0` `company_count_owned_trains` + -> `0x004e39e0` `company_query_display_year_or_current_year` +- `0x004e8bb0` `shell_load_screen_render_company_station_list_panel` + -> `0x00426590` `company_count_linked_transit_sites` +- `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` +- `0x004e9b20` `shell_load_screen_render_company_report_history_panel` + -> `0x00425880` `company_compute_negative_cash_balance_interest_rate` + -> `0x004258c0` `company_compute_positive_cash_balance_interest_rate` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004ea060` `shell_load_screen_render_active_page_panel` + -> `0x004e5130` `shell_load_screen_render_company_stock_data_panel` + -> `0x004e51ea` `shell_load_screen_render_game_status_briefing_panel` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e68e0` `shell_load_screen_render_company_list_panel` + -> `0x004e6ef0` `shell_load_screen_render_player_list_panel` + -> `0x004e7670` `shell_load_screen_render_company_train_list_panel` + -> `0x004e8270` `shell_load_screen_render_company_industry_list_panel` + -> `0x004e8bb0` `shell_load_screen_render_company_station_list_panel` + -> `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x004ea620` `shell_load_screen_window_construct` + -> `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x004ea720` `shell_load_screen_window_is_open` + -> `0x004ea730` `shell_load_screen_window_destroy` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004ea720` `shell_load_screen_window_is_open` + -> `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` +- `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` +- `0x004eb890` `shell_present_merger_vote_outcome_dialog` + -> `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` +- `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` + -> `0x004eb890` `shell_present_merger_vote_outcome_dialog` +- `0x004ec640` `shell_company_detail_attempt_merger_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x004ebd10` `shell_resolve_merger_vote_and_commit_outcome` +- `0x004ee0e0` `multiplayer_open_staged_text_entry_dialog` + -> `0x00484910` `shell_save_graphics_config` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004ee1d0` `multiplayer_commit_staged_text_entry` + -> `0x00484910` `shell_save_graphics_config` +- `0x004ee3a0` `multiplayer_reset_tool_globals` + -> `0x00482ec0` `shell_transition_mode` +- `0x004ee810` `multiplayer_publish_wrapped_chat_message` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` +- `0x004ee950` `multiplayer_load_selected_map_preview_surface` + -> `0x004efe80` `multiplayer_window_init_globals` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` +- `0x004eed30` `multiplayer_sync_selected_map_entry` + -> `0x004ee950` `multiplayer_load_selected_map_preview_surface` +- `0x004f2e80` `shell_has_live_overview_window` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` + -> `0x004f3a10` `shell_open_or_focus_overview_window` +- `0x004f2e90` `shell_mark_overview_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004f38a0` `shell_overview_window_construct` + -> `0x004f3a10` `shell_open_or_focus_overview_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004f38f0` `shell_overview_window_handle_message` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004f3a10` `shell_open_or_focus_overview_window` + -> `0x004f38a0` `shell_overview_window_construct` +- `0x004fe130` `shell_mark_settings_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` + -> `0x00501e50` `shell_open_settings_window` +- `0x00500640` `shell_settings_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00502030` `shell_setup_window_draw_table_driven_payload_category_row` + -> `0x00504010` `shell_setup_window_construct` + -> `0x00552560` `shell_queue_world_anchor_marker` +- `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x00484910` `shell_save_graphics_config` + -> `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00504010` `shell_setup_window_construct` +- `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x00504010` `shell_setup_window_construct` +- `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00442400` `shell_setup_load_selected_profile_bundle_into_payload_record` + -> `0x0047be50` `shell_setup_profile_copy_payload_scroll_count_and_campaign_byte_and_seed_row_categories` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x00559520` `surface_init_rgba_pixel_buffer` +- `0x00502720` `paint_terrain_tool_init_globals` + -> `0x004ee3a0` `multiplayer_reset_tool_globals` +- `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x004eb0b0` `shell_open_grayscale_map_tga_picker_and_stage_selection` + -> `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x005033d0` `shell_setup_window_handle_message` + -> `0x0042a970` `shell_open_file_dialog_copy_selected_path_and_restore_cwd` + -> `0x00484910` `shell_save_graphics_config` + -> `0x004eb0b0` `shell_open_grayscale_map_tga_picker_and_stage_selection` + -> `0x004fe120` `shell_has_settings_window` + -> `0x00501e50` `shell_open_settings_window` + -> `0x00501f20` `shell_query_registry_open_command_for_http_or_rtf_target` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502550` `shell_setup_window_refresh_selection_lists_and_summary_fields` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x00504010` `shell_setup_window_construct` + -> `0x005411c0` `shell_query_tga_header_is_supported_truecolor_image` +- `0x00504010` `shell_setup_window_construct` + -> `0x00502030` `shell_setup_window_draw_table_driven_payload_category_row` + -> `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00502550` `shell_setup_window_refresh_selection_lists_and_summary_fields` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00504ae0` `shell_station_detail_set_active_candidate_service_preview` + -> `0x0043f640` `world_render_station_candidate_service_map_overlay` + -> `0x00504a90` `shell_station_detail_clear_active_candidate_service_preview` +- `0x00504ba0` `shell_station_detail_update_candidate_service_entry` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x00504a90` `shell_station_detail_clear_active_candidate_service_preview` + -> `0x00504ae0` `shell_station_detail_set_active_candidate_service_preview` +- `0x00504bea` `shell_station_detail_format_candidate_local_service_summary` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x00504ae0` `shell_station_detail_set_active_candidate_service_preview` +- `0x00505760` `shell_station_detail_refresh_candidate_service_rows` + -> `0x0047e330` `placed_structure_count_candidates_with_local_service_metrics` + -> `0x00504ba0` `shell_station_detail_update_candidate_service_entry` +- `0x005068c0` `shell_station_detail_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00508bb0` `station_place_world_surface_sync_and_dispatch` + -> `0x00508550` `station_place_format_selected_site_summary` +- `0x005091b0` `station_place_window_handle_message` + -> `0x00508bb0` `station_place_world_surface_sync_and_dispatch` +- `0x00509d80` `station_place_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x0050a530` `station_place_window_service_frame` + -> `0x00508bb0` `station_place_world_surface_sync_and_dispatch` +- `0x0050c500` `shell_present_chairmanship_takeover_vote_outcome_dialog` + -> `0x0050c940` `shell_resolve_chairmanship_takeover_vote_and_commit_outcome` +- `0x0050c940` `shell_resolve_chairmanship_takeover_vote_and_commit_outcome` + -> `0x0050c500` `shell_present_chairmanship_takeover_vote_outcome_dialog` +- `0x0050ccc0` `shell_company_detail_attempt_chairmanship_takeover_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x0050c940` `shell_resolve_chairmanship_takeover_vote_and_commit_outcome` +- `0x0050e400` `track_lay_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x0050f740` `shell_has_live_trainbuy_window` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` + -> `0x00512c50` `shell_open_or_focus_trainbuy_window` +- `0x0050f750` `shell_mark_trainbuy_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x0050f790` `shell_trainbuy_window_compute_selected_upgrade_total_and_count` + -> `0x0050f760` `shell_trainbuy_window_query_selected_locomotive_id` + -> `0x0050f890` `shell_trainbuy_window_render_selected_train_upgrade_summary` +- `0x0050f890` `shell_trainbuy_window_render_selected_train_upgrade_summary` + -> `0x0050f760` `shell_trainbuy_window_query_selected_locomotive_id` + -> `0x0050f790` `shell_trainbuy_window_compute_selected_upgrade_total_and_count` + -> `0x00511500` `shell_trainbuy_window_construct` +- `0x0050fc00` `shell_trainbuy_window_render_selected_train_route_and_state_panel` + -> `0x005519f0` `shell_publish_text_callout_presentation` + -> `0x00552560` `shell_queue_world_anchor_marker` +- `0x00511500` `shell_trainbuy_window_construct` + -> `0x0050f890` `shell_trainbuy_window_render_selected_train_upgrade_summary` + -> `0x0050fc00` `shell_trainbuy_window_render_selected_train_route_and_state_panel` + -> `0x00512080` `shell_trainbuy_window_refresh_controls` + -> `0x00512c50` `shell_open_or_focus_trainbuy_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00512080` `shell_trainbuy_window_refresh_controls` + -> `0x00511500` `shell_trainbuy_window_construct` +- `0x00512c50` `shell_open_or_focus_trainbuy_window` + -> `0x00433b00` `shell_can_open_trainbuy_window_or_warn` + -> `0x00511500` `shell_trainbuy_window_construct` + -> `0x00512080` `shell_trainbuy_window_refresh_controls` +- `0x005130f0` `shell_trainbuy_window_query_selected_train_record` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x005131a0` `shell_trainbuy_window_selected_train_belongs_to_selected_company` + -> `0x00513220` `shell_trainbuy_window_warn_selected_train_not_owned_by_current_company` +- `0x00513220` `shell_trainbuy_window_warn_selected_train_not_owned_by_current_company` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x00514110` `shell_train_detail_window_refresh_selected_train_name_label` + -> `0x00514420` `shell_train_detail_window_construct` +- `0x00514160` `shell_train_detail_window_refresh_controls` + -> `0x00513720` `shell_trainbuy_window_refresh_selection_column_empty_state_labels` + -> `0x00514420` `shell_train_detail_window_construct` + -> `0x00514620` `shell_open_or_focus_train_detail_window` + -> `0x00514690` `shell_train_detail_window_handle_message` +- `0x00514420` `shell_train_detail_window_construct` + -> `0x00512f80` `shell_trainbuy_window_refresh_selection_side_toggle` + -> `0x00514160` `shell_train_detail_window_refresh_controls` + -> `0x00514620` `shell_open_or_focus_train_detail_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00514690` `shell_train_detail_window_handle_message` + -> `0x004ab980` `train_set_route_operating_mode_and_scalar` + -> `0x004b2c10` `train_route_list_validate_reachability_and_station_pair` + -> `0x004b3000` `train_route_list_remove_entry_and_compact` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` + -> `0x00512c50` `shell_open_or_focus_trainbuy_window` + -> `0x005130f0` `shell_trainbuy_window_query_selected_train_record` + -> `0x00513220` `shell_trainbuy_window_warn_selected_train_not_owned_by_current_company` + -> `0x00514160` `shell_train_detail_window_refresh_controls` +- `0x00516d00` `tutorial_validate_train_route_station_indicator_step` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x00516be0` `tutorial_advance_step_and_refresh_expected_control_ids` +- `0x005174e0` `shell_video_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00517570` `shell_video_window_destroy` + -> `0x00484910` `shell_save_graphics_config` + -> `0x005174e0` `shell_video_window_construct` +- `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00517d40` `indexed_collection_entry_id_is_live` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` +- `0x0051db80` `math_measure_float_xy_pair_distance` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` + -> `0x00552900` `shell_queue_projected_world_anchor_quad` +- `0x0051ef20` `shell_load_display_runtime_config_or_init_defaults` + -> `0x0051ebc0` `shell_reset_display_runtime_defaults` + -> `0x0051eea0` `shell_save_display_runtime_config` +- `0x005204b0` `shell_flush_deferred_work_queues` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` +- `0x00520620` `shell_service_frame_cycle` + -> `0x005204b0` `shell_flush_deferred_work_queues` +- `0x00521390` `bootstrap_destroy_shell_service_bundle` + -> `0x00521060` `bootstrap_init_shell_service_bundle` +- `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x004e0ba0` `game_uppermost_window_handle_message` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00504010` `shell_setup_window_construct` +- `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` + -> `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x00558130` `shell_child_control_set_owner_resolve_caption_and_refresh` +- `0x00540a47` `shell_control_refresh_matching_dynamic_text_payload` + -> `0x005639d2` `shell_control_release_dynamic_text_payload` +- `0x005411c0` `shell_query_tga_header_is_supported_truecolor_image` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x0054fb10` `shell_queue_callout_leader_path` + -> `0x0054f710` `shell_queue_callout_segment_marker` +- `0x005519f0` `shell_publish_text_callout_presentation` + -> `0x0054fb10` `shell_queue_callout_leader_path` +- `0x00552900` `shell_queue_projected_world_anchor_quad` + -> `0x0051db80` `math_measure_float_xy_pair_distance` +- `0x00558130` `shell_child_control_set_owner_resolve_caption_and_refresh` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` +- `0x0055d8d0` `display_get_primary_adapter_descriptor` + -> `0x00484a60` `shell_match_legacy_gpu_profile_token` +- `0x005a152e` `math_abs_double_with_crt_special_case_handling` + -> `0x0049c900` `route_entry_collection_try_extend_search_frontier_toward_target_coords` + -> `0x0049d380` `route_entry_collection_search_path_between_entry_or_coord_endpoints` diff --git a/artifacts/exports/rt3-1.06/setup-window-subgraph.dot b/artifacts/exports/rt3-1.06/setup-window-subgraph.dot new file mode 100644 index 0000000..8ca373b --- /dev/null +++ b/artifacts/exports/rt3-1.06/setup-window-subgraph.dot @@ -0,0 +1,92 @@ +digraph shell_load { + graph [rankdir=LR, labelloc="t", labeljust="l"]; + label="Setup Window Dispatch Subgraph"; + node [shape=box, style="rounded,filled", fillcolor="#f8f8f8", color="#555555", fontname="Helvetica"]; + edge [color="#666666", fontname="Helvetica"]; + subgraph cluster_bootstrap { + label="bootstrap"; + color="#cccccc"; + "0x00482ec0" [label="0x00482ec0\\nshell_transition_mode", fillcolor="#f8f8f8"]; + "0x004840e0" [label="0x004840e0\\nbootstrap_init_shell_window_services", fillcolor="#f8f8f8"]; + } + subgraph cluster_map { + label="map"; + color="#cccccc"; + "0x00434300" [label="0x00434300\\nworld_runtime_release_global_services", fillcolor="#f8f8f8"]; + "0x004384d0" [label="0x004384d0\\nworld_run_post_load_generation_pipeline", fillcolor="#f8f8f8"]; + "0x00438890" [label="0x00438890\\nshell_active_mode_run_profile_startup_and_load_dispatch", fillcolor="#f8f8f8"]; + "0x00443a50" [label="0x00443a50\\nworld_entry_transition_and_runtime_bringup", fillcolor="#f8f8f8"]; + "0x00445ac0" [label="0x00445ac0\\nshell_map_file_entry_coordinator", fillcolor="#f8f8f8"]; + } + subgraph cluster_shell { + label="shell"; + color="#cccccc"; + "0x0046b780" [label="0x0046b780\\nmultiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync", fillcolor="#f8f8f8"]; + "0x004b8dc0" [label="0x004b8dc0\\nshell_campaign_window_destroy", fillcolor="#f8f8f8"]; + "0x004b8e60" [label="0x004b8e60\\nshell_campaign_window_construct", fillcolor="#f8f8f8"]; + "0x004c7bc0" [label="0x004c7bc0\\nshell_credits_window_destroy", fillcolor="#f8f8f8"]; + "0x004c7fc0" [label="0x004c7fc0\\nshell_credits_window_construct", fillcolor="#f8f8f8"]; + "0x004dfbe0" [label="0x004dfbe0\\nshell_game_window_construct", fillcolor="#f8f8f8"]; + "0x004dfd70" [label="0x004dfd70\\nshell_game_window_destroy", fillcolor="#f8f8f8"]; + "0x004ea620" [label="0x004ea620\\nshell_load_screen_window_construct", fillcolor="#f8f8f8"]; + "0x004ea730" [label="0x004ea730\\nshell_load_screen_window_destroy", fillcolor="#f8f8f8"]; + "0x004ee3a0" [label="0x004ee3a0\\nmultiplayer_reset_tool_globals", fillcolor="#f8f8f8"]; + "0x004efe80" [label="0x004efe80\\nmultiplayer_window_init_globals", fillcolor="#f8f8f8"]; + "0x00502220" [label="0x00502220\\nshell_setup_window_publish_selected_profile_labels_and_preview_surface [seed]", fillcolor="#ffe9a8"]; + "0x00502550" [label="0x00502550\\nshell_setup_window_refresh_selection_lists_and_summary_fields [seed]", fillcolor="#ffe9a8"]; + "0x00502910" [label="0x00502910\\nshell_setup_window_refresh_mode_dependent_lists [seed]", fillcolor="#ffe9a8"]; + "0x00502c00" [label="0x00502c00\\nshell_setup_window_select_launch_mode_and_apply_shell_state [seed]", fillcolor="#ffe9a8"]; + "0x005033d0" [label="0x005033d0\\nshell_setup_window_handle_message [seed]", fillcolor="#ffe9a8"]; + "0x00504010" [label="0x00504010\\nshell_setup_window_construct [seed]", fillcolor="#ffe9a8"]; + "0x005174e0" [label="0x005174e0\\nshell_video_window_construct", fillcolor="#f8f8f8"]; + "0x00517570" [label="0x00517570\\nshell_video_window_destroy", fillcolor="#f8f8f8"]; + } + subgraph cluster_support { + label="support"; + color="#cccccc"; + "0x00559520" [label="0x00559520\\nsurface_init_rgba_pixel_buffer", fillcolor="#f8f8f8"]; + } + "0x00434300" -> "0x00443a50"; + "0x00434300" -> "0x00482ec0"; + "0x00438890" -> "0x004384d0"; + "0x00438890" -> "0x00445ac0"; + "0x00438890" -> "0x005033d0"; + "0x00443a50" -> "0x00438890"; + "0x00443a50" -> "0x00482ec0"; + "0x00445ac0" -> "0x00443a50"; + "0x0046b780" -> "0x00438890"; + "0x0046b780" -> "0x00445ac0"; + "0x00482ec0" -> "0x00438890"; + "0x00482ec0" -> "0x00443a50"; + "0x00482ec0" -> "0x004840e0"; + "0x00482ec0" -> "0x004b8dc0"; + "0x00482ec0" -> "0x004b8e60"; + "0x00482ec0" -> "0x004c7bc0"; + "0x00482ec0" -> "0x004c7fc0"; + "0x00482ec0" -> "0x004dfbe0"; + "0x00482ec0" -> "0x004dfd70"; + "0x00482ec0" -> "0x004ea620"; + "0x00482ec0" -> "0x004ea730"; + "0x00482ec0" -> "0x004efe80"; + "0x00482ec0" -> "0x00504010"; + "0x00482ec0" -> "0x005174e0"; + "0x00482ec0" -> "0x00517570"; + "0x004840e0" -> "0x00482ec0"; + "0x004b8dc0" -> "0x004b8e60"; + "0x004c7bc0" -> "0x004c7fc0"; + "0x004dfbe0" -> "0x004dfd70"; + "0x004ea620" -> "0x004ea730"; + "0x004ea730" -> "0x004ea620"; + "0x004ee3a0" -> "0x00482ec0"; + "0x00502220" -> "0x00502c00"; + "0x00502220" -> "0x00559520"; + "0x00502910" -> "0x00502c00"; + "0x00502c00" -> "0x00438890"; + "0x00502c00" -> "0x005033d0"; + "0x005033d0" -> "0x00502220"; + "0x005033d0" -> "0x00502550"; + "0x005033d0" -> "0x00502910"; + "0x005033d0" -> "0x00502c00"; + "0x005033d0" -> "0x00504010"; + "0x00517570" -> "0x005174e0"; +} diff --git a/artifacts/exports/rt3-1.06/setup-window-subgraph.md b/artifacts/exports/rt3-1.06/setup-window-subgraph.md new file mode 100644 index 0000000..911120a --- /dev/null +++ b/artifacts/exports/rt3-1.06/setup-window-subgraph.md @@ -0,0 +1,102 @@ +# Setup Window Dispatch Subgraph + +- Nodes: `27` +- Edges: `43` +- Seeds: `0x00502220`, `0x00502550`, `0x00502910`, `0x00502c00`, `0x005033d0`, `0x00504010` +- Graphviz: `setup-window-subgraph.dot` + +## Nodes + +| Address | Name | Subsystem | Confidence | +| --- | --- | --- | --- | +| `0x00434300` | `world_runtime_release_global_services` | `map` | `3` | +| `0x004384d0` | `world_run_post_load_generation_pipeline` | `map` | `4` | +| `0x00438890` | `shell_active_mode_run_profile_startup_and_load_dispatch` | `map` | `4` | +| `0x00443a50` | `world_entry_transition_and_runtime_bringup` | `map` | `4` | +| `0x00445ac0` | `shell_map_file_entry_coordinator` | `map` | `4` | +| `0x0046b780` | `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` | `shell` | `4` | +| `0x00482ec0` | `shell_transition_mode` | `bootstrap` | `4` | +| `0x004840e0` | `bootstrap_init_shell_window_services` | `bootstrap` | `4` | +| `0x004b8dc0` | `shell_campaign_window_destroy` | `shell` | `4` | +| `0x004b8e60` | `shell_campaign_window_construct` | `shell` | `4` | +| `0x004c7bc0` | `shell_credits_window_destroy` | `shell` | `4` | +| `0x004c7fc0` | `shell_credits_window_construct` | `shell` | `4` | +| `0x004dfbe0` | `shell_game_window_construct` | `shell` | `4` | +| `0x004dfd70` | `shell_game_window_destroy` | `shell` | `4` | +| `0x004ea620` | `shell_load_screen_window_construct` | `shell` | `4` | +| `0x004ea730` | `shell_load_screen_window_destroy` | `shell` | `4` | +| `0x004ee3a0` | `multiplayer_reset_tool_globals` | `shell` | `3` | +| `0x004efe80` | `multiplayer_window_init_globals` | `shell` | `4` | +| `0x00502220` | `shell_setup_window_publish_selected_profile_labels_and_preview_surface` | `shell` | `3` | +| `0x00502550` | `shell_setup_window_refresh_selection_lists_and_summary_fields` | `shell` | `3` | +| `0x00502910` | `shell_setup_window_refresh_mode_dependent_lists` | `shell` | `3` | +| `0x00502c00` | `shell_setup_window_select_launch_mode_and_apply_shell_state` | `shell` | `4` | +| `0x005033d0` | `shell_setup_window_handle_message` | `shell` | `3` | +| `0x00504010` | `shell_setup_window_construct` | `shell` | `4` | +| `0x005174e0` | `shell_video_window_construct` | `shell` | `4` | +| `0x00517570` | `shell_video_window_destroy` | `shell` | `4` | +| `0x00559520` | `surface_init_rgba_pixel_buffer` | `support` | `3` | + +## Edges + +- `0x00434300` `world_runtime_release_global_services` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00482ec0` `shell_transition_mode` +- `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00482ec0` `shell_transition_mode` +- `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` +- `0x0046b780` `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00445ac0` `shell_map_file_entry_coordinator` +- `0x00482ec0` `shell_transition_mode` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` + -> `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` + -> `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004efe80` `multiplayer_window_init_globals` + -> `0x00504010` `shell_setup_window_construct` + -> `0x005174e0` `shell_video_window_construct` + -> `0x00517570` `shell_video_window_destroy` +- `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x00482ec0` `shell_transition_mode` +- `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` +- `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` +- `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` +- `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` +- `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` +- `0x004ee3a0` `multiplayer_reset_tool_globals` + -> `0x00482ec0` `shell_transition_mode` +- `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x00559520` `surface_init_rgba_pixel_buffer` +- `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x005033d0` `shell_setup_window_handle_message` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502550` `shell_setup_window_refresh_selection_lists_and_summary_fields` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x00504010` `shell_setup_window_construct` +- `0x00517570` `shell_video_window_destroy` + -> `0x005174e0` `shell_video_window_construct` diff --git a/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-forward-subgraph.dot b/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-forward-subgraph.dot new file mode 100644 index 0000000..8dcc0a4 --- /dev/null +++ b/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-forward-subgraph.dot @@ -0,0 +1,398 @@ +digraph shell_load { + graph [rankdir=LR, labelloc="t", labeljust="l"]; + label="Setup Window Submode Subgraph (Depth 5, Forward Only)"; + node [shape=box, style="rounded,filled", fillcolor="#f8f8f8", color="#555555", fontname="Helvetica"]; + edge [color="#666666", fontname="Helvetica"]; + subgraph cluster_bootstrap { + label="bootstrap"; + color="#cccccc"; + "0x00482ec0" [label="0x00482ec0\\nshell_transition_mode", fillcolor="#f8f8f8"]; + "0x004840e0" [label="0x004840e0\\nbootstrap_init_shell_window_services", fillcolor="#f8f8f8"]; + } + subgraph cluster_map { + label="map"; + color="#cccccc"; + "0x00402cb0" [label="0x00402cb0\\ncity_connection_try_build_route_with_optional_direct_site_placement", fillcolor="#f8f8f8"]; + "0x00404640" [label="0x00404640\\ncity_connection_bonus_try_compact_route_builder_from_region_entry", fillcolor="#f8f8f8"]; + "0x004046a0" [label="0x004046a0\\ncity_connection_bonus_build_peer_route_candidate", fillcolor="#f8f8f8"]; + "0x00404c60" [label="0x00404c60\\ncity_connection_try_build_route_between_region_entry_pair", fillcolor="#f8f8f8"]; + "0x0040e360" [label="0x0040e360\\nplaced_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime", fillcolor="#f8f8f8"]; + "0x0040e450" [label="0x0040e450\\nplaced_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem", fillcolor="#f8f8f8"]; + "0x0040ee10" [label="0x0040ee10\\nplaced_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon", fillcolor="#f8f8f8"]; + "0x0040ef10" [label="0x0040ef10\\nplaced_structure_finalize_creation_or_rebuild_local_runtime_state", fillcolor="#f8f8f8"]; + "0x00412ca0" [label="0x00412ca0\\nworld_region_pick_commercial_profile_label_by_region_rank", fillcolor="#f8f8f8"]; + "0x004133b0" [label="0x004133b0\\nplaced_structure_collection_refresh_local_runtime_records_and_position_scalars", fillcolor="#f8f8f8"]; + "0x004134d0" [label="0x004134d0\\nplaced_structure_collection_allocate_and_construct_entry", fillcolor="#f8f8f8"]; + "0x00413f50" [label="0x00413f50\\nplaced_structure_local_runtime_site_id_queue_pop_next", fillcolor="#f8f8f8"]; + "0x00414470" [label="0x00414470\\nplaced_structure_cache_projected_rect_profile_slot_id", fillcolor="#f8f8f8"]; + "0x00414480" [label="0x00414480\\nplaced_structure_local_runtime_site_id_queue_count", fillcolor="#f8f8f8"]; + "0x00415f20" [label="0x00415f20\\nplaced_structure_recursive_collect_connected_component_tile_bounds", fillcolor="#f8f8f8"]; + "0x00416e20" [label="0x00416e20\\nindexed_collection_resolve_live_entry_id_by_stem_string", fillcolor="#f8f8f8"]; + "0x00417840" [label="0x00417840\\nplaced_structure_project_candidate_grid_extent_offset_by_rotation", fillcolor="#f8f8f8"]; + "0x00418a60" [label="0x00418a60\\nplaced_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds", fillcolor="#f8f8f8"]; + "0x004197e0" [label="0x004197e0\\nplaced_structure_validate_projected_candidate_placement", fillcolor="#f8f8f8"]; + "0x0041e220" [label="0x0041e220\\nstructure_candidate_is_enabled_for_current_year", fillcolor="#f8f8f8"]; + "0x0041e2b0" [label="0x0041e2b0\\nstructure_candidate_rebuild_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0041ea50" [label="0x0041ea50\\nworld_setup_building_collection_phase", fillcolor="#f8f8f8"]; + "0x0041f9b0" [label="0x0041f9b0\\nworld_region_count_structure_profiles_before_year_for_category", fillcolor="#f8f8f8"]; + "0x0041fac0" [label="0x0041fac0\\nworld_region_read_structure_profile_label_and_weight_by_index", fillcolor="#f8f8f8"]; + "0x00421b60" [label="0x00421b60\\nworld_region_collection_seed_default_regions", fillcolor="#f8f8f8"]; + "0x00421c20" [label="0x00421c20\\nworld_region_collection_run_building_population_pass", fillcolor="#f8f8f8"]; + "0x00422900" [label="0x00422900\\nworld_region_accumulate_structure_category_totals", fillcolor="#f8f8f8"]; + "0x00422be0" [label="0x00422be0\\nworld_region_count_placed_structures_for_category", fillcolor="#f8f8f8"]; + "0x00422ee0" [label="0x00422ee0\\nworld_region_try_place_candidate_structure", fillcolor="#f8f8f8"]; + "0x004235c0" [label="0x004235c0\\nworld_region_balance_structure_demand_and_place_candidates", fillcolor="#f8f8f8"]; + "0x00437220" [label="0x00437220\\nworld_build_chairman_profile_slot_records", fillcolor="#f8f8f8"]; + "0x004377a0" [label="0x004377a0\\nworld_seed_default_chairman_profile_slots", fillcolor="#f8f8f8"]; + "0x004384d0" [label="0x004384d0\\nworld_run_post_load_generation_pipeline", fillcolor="#f8f8f8"]; + "0x00438890" [label="0x00438890\\nshell_active_mode_run_profile_startup_and_load_dispatch", fillcolor="#f8f8f8"]; + "0x00443a50" [label="0x00443a50\\nworld_entry_transition_and_runtime_bringup", fillcolor="#f8f8f8"]; + "0x00445ac0" [label="0x00445ac0\\nshell_map_file_entry_coordinator", fillcolor="#f8f8f8"]; + "0x00446d40" [label="0x00446d40\\nworld_load_saved_runtime_state_bundle", fillcolor="#f8f8f8"]; + "0x0044fb70" [label="0x0044fb70\\nworld_compute_transport_and_pricing_grid", fillcolor="#f8f8f8"]; + "0x00477820" [label="0x00477820\\nprofile_collection_count_active_chairman_records", fillcolor="#f8f8f8"]; + "0x00477860" [label="0x00477860\\nprofile_collection_get_nth_active_chairman_record", fillcolor="#f8f8f8"]; + "0x0047d440" [label="0x0047d440\\nworld_conditionally_seed_named_starting_railroad_companies", fillcolor="#f8f8f8"]; + "0x004882e0" [label="0x004882e0\\nworld_region_border_overlay_rebuild", fillcolor="#f8f8f8"]; + "0x004a01a0" [label="0x004a01a0\\nroute_entry_collection_try_build_path_between_optional_endpoint_entries", fillcolor="#f8f8f8"]; + "0x004a5280" [label="0x004a5280\\naux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search", fillcolor="#f8f8f8"]; + "0x004a5900" [label="0x004a5900\\naux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk", fillcolor="#f8f8f8"]; + "0x004a65b0" [label="0x004a65b0\\naux_route_entry_tracker_dispatch_route_entry_pair_metric_query", fillcolor="#f8f8f8"]; + "0x004a6630" [label="0x004a6630\\naux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks", fillcolor="#f8f8f8"]; + "0x004c9da0" [label="0x004c9da0\\nmap_editor_chairman_slot_panel_format_slot_card", fillcolor="#f8f8f8"]; + "0x004cc2d0" [label="0x004cc2d0\\nmap_editor_chairman_slot_panel_construct", fillcolor="#f8f8f8"]; + } + subgraph cluster_shell { + label="shell"; + color="#cccccc"; + "0x0042a970" [label="0x0042a970\\nshell_open_file_dialog_copy_selected_path_and_restore_cwd", fillcolor="#f8f8f8"]; + "0x004333f0" [label="0x004333f0\\nshell_setup_build_file_list_records_from_current_root_and_pattern", fillcolor="#f8f8f8"]; + "0x004336a0" [label="0x004336a0\\nshell_setup_file_list_construct_and_scan_dataset", fillcolor="#f8f8f8"]; + "0x00434050" [label="0x00434050\\nshell_has_auxiliary_preview_owner", fillcolor="#f8f8f8"]; + "0x0046a6c0" [label="0x0046a6c0\\nmultiplayer_session_event_publish_registration_field", fillcolor="#f8f8f8"]; + "0x004839b0" [label="0x004839b0\\nshell_setup_query_file_list_uses_map_extension_pattern", fillcolor="#f8f8f8"]; + "0x004839e0" [label="0x004839e0\\nshell_setup_query_file_list_root_dir_name", fillcolor="#f8f8f8"]; + "0x00484910" [label="0x00484910\\nshell_save_graphics_config", fillcolor="#f8f8f8"]; + "0x004b8dc0" [label="0x004b8dc0\\nshell_campaign_window_destroy", fillcolor="#f8f8f8"]; + "0x004b8e60" [label="0x004b8e60\\nshell_campaign_window_construct", fillcolor="#f8f8f8"]; + "0x004b9a20" [label="0x004b9a20\\nshell_building_detail_refresh_flagged_service_capability_rows", fillcolor="#f8f8f8"]; + "0x004ba3d0" [label="0x004ba3d0\\nshell_building_detail_refresh_subject_cargo_and_service_rows", fillcolor="#f8f8f8"]; + "0x004bad20" [label="0x004bad20\\nshell_building_detail_refresh_subject_pair_value_rows", fillcolor="#f8f8f8"]; + "0x004c2ca0" [label="0x004c2ca0\\nshell_company_detail_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004c3890" [label="0x004c3890\\nshell_company_detail_issue_bond_offer_flow", fillcolor="#f8f8f8"]; + "0x004c3f30" [label="0x004c3f30\\nshell_company_detail_issue_stock_offer_flow", fillcolor="#f8f8f8"]; + "0x004c46d0" [label="0x004c46d0\\nshell_company_detail_buyback_stock_flow", fillcolor="#f8f8f8"]; + "0x004c4c70" [label="0x004c4c70\\nshell_company_detail_setup_dividend_rate_adjust_controls", fillcolor="#f8f8f8"]; + "0x004c4e30" [label="0x004c4e30\\nshell_company_detail_render_change_dividend_rate_dialog", fillcolor="#f8f8f8"]; + "0x004c5140" [label="0x004c5140\\nshell_company_detail_handle_change_dividend_rate_dialog_message", fillcolor="#f8f8f8"]; + "0x004c5360" [label="0x004c5360\\nshell_company_detail_change_dividend_rate_flow", fillcolor="#f8f8f8"]; + "0x004c56a0" [label="0x004c56a0\\nshell_company_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x004c5a0e" [label="0x004c5a0e\\nshell_company_detail_resign_chairmanship_flow", fillcolor="#f8f8f8"]; + "0x004c5b99" [label="0x004c5b99\\nshell_company_detail_bankruptcy_flow", fillcolor="#f8f8f8"]; + "0x004c5fc9" [label="0x004c5fc9\\nshell_company_detail_buy_territory_access_rights_flow", fillcolor="#f8f8f8"]; + "0x004c7bc0" [label="0x004c7bc0\\nshell_credits_window_destroy", fillcolor="#f8f8f8"]; + "0x004c7fc0" [label="0x004c7fc0\\nshell_credits_window_construct", fillcolor="#f8f8f8"]; + "0x004c98a0" [label="0x004c98a0\\nshell_open_custom_modal_dialog_with_callbacks", fillcolor="#f8f8f8"]; + "0x004dd010" [label="0x004dd010\\nshell_file_request_dialog_collect_target_path", fillcolor="#f8f8f8"]; + "0x004ddbd0" [label="0x004ddbd0\\nshell_detail_panel_transition_manager", fillcolor="#f8f8f8"]; + "0x004dfbe0" [label="0x004dfbe0\\nshell_game_window_construct", fillcolor="#f8f8f8"]; + "0x004dfd70" [label="0x004dfd70\\nshell_game_window_destroy", fillcolor="#f8f8f8"]; + "0x004e0ba0" [label="0x004e0ba0\\ngame_uppermost_window_handle_message", fillcolor="#f8f8f8"]; + "0x004ea620" [label="0x004ea620\\nshell_load_screen_window_construct", fillcolor="#f8f8f8"]; + "0x004ea730" [label="0x004ea730\\nshell_load_screen_window_destroy", fillcolor="#f8f8f8"]; + "0x004eb0b0" [label="0x004eb0b0\\nshell_open_grayscale_map_tga_picker_and_stage_selection", fillcolor="#f8f8f8"]; + "0x004ec640" [label="0x004ec640\\nshell_company_detail_attempt_merger_flow", fillcolor="#f8f8f8"]; + "0x004ee0e0" [label="0x004ee0e0\\nmultiplayer_open_staged_text_entry_dialog", fillcolor="#f8f8f8"]; + "0x004efe80" [label="0x004efe80\\nmultiplayer_window_init_globals", fillcolor="#f8f8f8"]; + "0x004fe120" [label="0x004fe120\\nshell_has_settings_window", fillcolor="#f8f8f8"]; + "0x00501e50" [label="0x00501e50\\nshell_open_settings_window", fillcolor="#f8f8f8"]; + "0x00501f20" [label="0x00501f20\\nshell_query_registry_open_command_for_http_or_rtf_target", fillcolor="#f8f8f8"]; + "0x00502030" [label="0x00502030\\nshell_setup_window_draw_table_driven_payload_category_row", fillcolor="#f8f8f8"]; + "0x00502160" [label="0x00502160\\nshell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config", fillcolor="#f8f8f8"]; + "0x005021c0" [label="0x005021c0\\nshell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config", fillcolor="#f8f8f8"]; + "0x00502220" [label="0x00502220\\nshell_setup_window_publish_selected_profile_labels_and_preview_surface [seed]", fillcolor="#ffe9a8"]; + "0x00502550" [label="0x00502550\\nshell_setup_window_refresh_selection_lists_and_summary_fields [seed]", fillcolor="#ffe9a8"]; + "0x005027b0" [label="0x005027b0\\nshell_setup_window_refresh_file_backed_selection_list_panel [seed]", fillcolor="#ffe9a8"]; + "0x00502910" [label="0x00502910\\nshell_setup_window_refresh_mode_dependent_lists [seed]", fillcolor="#ffe9a8"]; + "0x00502c00" [label="0x00502c00\\nshell_setup_window_select_launch_mode_and_apply_shell_state [seed]", fillcolor="#ffe9a8"]; + "0x005033d0" [label="0x005033d0\\nshell_setup_window_handle_message [seed]", fillcolor="#ffe9a8"]; + "0x00504010" [label="0x00504010\\nshell_setup_window_construct [seed]", fillcolor="#ffe9a8"]; + "0x0050ccc0" [label="0x0050ccc0\\nshell_company_detail_attempt_chairmanship_takeover_flow", fillcolor="#f8f8f8"]; + "0x005174e0" [label="0x005174e0\\nshell_video_window_construct", fillcolor="#f8f8f8"]; + "0x00517570" [label="0x00517570\\nshell_video_window_destroy", fillcolor="#f8f8f8"]; + "0x0051c920" [label="0x0051c920\\nlocalization_lookup_display_label_by_stem_or_fallback", fillcolor="#f8f8f8"]; + "0x0051eea0" [label="0x0051eea0\\nshell_save_display_runtime_config", fillcolor="#f8f8f8"]; + "0x0053f830" [label="0x0053f830\\nshell_window_find_registered_child_control_by_id", fillcolor="#f8f8f8"]; + "0x0053f9c0" [label="0x0053f9c0\\nshell_window_register_child_control_sorted_by_priority_and_optional_tag", fillcolor="#f8f8f8"]; + "0x0053fa50" [label="0x0053fa50\\nshell_window_bind_resource_and_initialize_child_control_links", fillcolor="#f8f8f8"]; + "0x005411c0" [label="0x005411c0\\nshell_query_tga_header_is_supported_truecolor_image", fillcolor="#f8f8f8"]; + "0x00552560" [label="0x00552560\\nshell_queue_world_anchor_marker", fillcolor="#f8f8f8"]; + "0x00558130" [label="0x00558130\\nshell_child_control_set_owner_resolve_caption_and_refresh", fillcolor="#f8f8f8"]; + } + subgraph cluster_simulation { + label="simulation"; + color="#cccccc"; + "0x00404ce0" [label="0x00404ce0\\nsimulation_try_select_and_publish_company_start_or_city_connection_news", fillcolor="#f8f8f8"]; + "0x00423d70" [label="0x00423d70\\ncompany_repay_bond_slot_and_compact_debt_table", fillcolor="#f8f8f8"]; + "0x00426260" [label="0x00426260\\ncompany_compute_board_approved_dividend_rate_ceiling", fillcolor="#f8f8f8"]; + "0x00426d60" [label="0x00426d60\\ncompany_deactivate_and_clear_chairman_share_links", fillcolor="#f8f8f8"]; + "0x00437b20" [label="0x00437b20\\nsimulation_run_chunked_fast_forward_burst", fillcolor="#f8f8f8"]; + "0x00482d10" [label="0x00482d10\\nruntime_query_cached_local_exe_version_float", fillcolor="#f8f8f8"]; + "0x00482d80" [label="0x00482d80\\nruntime_query_cached_local_exe_version_string", fillcolor="#f8f8f8"]; + "0x00482e00" [label="0x00482e00\\nruntime_query_hundredths_scaled_build_version", fillcolor="#f8f8f8"]; + "0x00517d40" [label="0x00517d40\\nindexed_collection_entry_id_is_live", fillcolor="#f8f8f8"]; + "0x00518140" [label="0x00518140\\nindexed_collection_resolve_live_entry_by_id", fillcolor="#f8f8f8"]; + "0x00518380" [label="0x00518380\\nindexed_collection_get_nth_live_entry_id", fillcolor="#f8f8f8"]; + } + subgraph cluster_support { + label="support"; + color="#cccccc"; + "0x00559520" [label="0x00559520\\nsurface_init_rgba_pixel_buffer", fillcolor="#f8f8f8"]; + } + "0x00402cb0" -> "0x00404640"; + "0x00402cb0" -> "0x004046a0"; + "0x00402cb0" -> "0x00404c60"; + "0x00402cb0" -> "0x00404ce0"; + "0x00402cb0" -> "0x0040ef10"; + "0x00402cb0" -> "0x004134d0"; + "0x00402cb0" -> "0x00417840"; + "0x00402cb0" -> "0x004197e0"; + "0x00402cb0" -> "0x00482e00"; + "0x00402cb0" -> "0x004a01a0"; + "0x00404640" -> "0x00402cb0"; + "0x00404640" -> "0x004046a0"; + "0x004046a0" -> "0x00402cb0"; + "0x004046a0" -> "0x00404640"; + "0x00404c60" -> "0x00402cb0"; + "0x00404c60" -> "0x00404ce0"; + "0x00404ce0" -> "0x00404c60"; + "0x0040e360" -> "0x0040ee10"; + "0x0040e450" -> "0x004133b0"; + "0x0040e450" -> "0x00414470"; + "0x0040e450" -> "0x00416e20"; + "0x0040e450" -> "0x00418a60"; + "0x0040ee10" -> "0x0040e360"; + "0x0040ee10" -> "0x004133b0"; + "0x0040ee10" -> "0x00415f20"; + "0x0040ee10" -> "0x00434050"; + "0x00412ca0" -> "0x004235c0"; + "0x004133b0" -> "0x0040e450"; + "0x004133b0" -> "0x0040ee10"; + "0x004133b0" -> "0x00413f50"; + "0x004133b0" -> "0x00414480"; + "0x004134d0" -> "0x00422ee0"; + "0x00413f50" -> "0x004133b0"; + "0x00414470" -> "0x0040e450"; + "0x00414470" -> "0x00418a60"; + "0x00414480" -> "0x004133b0"; + "0x00415f20" -> "0x0040ee10"; + "0x00416e20" -> "0x0040e450"; + "0x00416e20" -> "0x00518140"; + "0x00416e20" -> "0x00518380"; + "0x00417840" -> "0x00402cb0"; + "0x00417840" -> "0x004197e0"; + "0x00418a60" -> "0x0040e450"; + "0x004197e0" -> "0x00402cb0"; + "0x004197e0" -> "0x00417840"; + "0x0041e2b0" -> "0x0041e220"; + "0x0041e2b0" -> "0x0041ea50"; + "0x0041ea50" -> "0x0041e2b0"; + "0x0041ea50" -> "0x00518140"; + "0x0041ea50" -> "0x00518380"; + "0x0041f9b0" -> "0x004235c0"; + "0x00421b60" -> "0x004384d0"; + "0x00421c20" -> "0x004235c0"; + "0x00422900" -> "0x004235c0"; + "0x00422be0" -> "0x004235c0"; + "0x00422ee0" -> "0x004134d0"; + "0x00422ee0" -> "0x004235c0"; + "0x004235c0" -> "0x00412ca0"; + "0x004235c0" -> "0x0041f9b0"; + "0x004235c0" -> "0x0041fac0"; + "0x004235c0" -> "0x00422900"; + "0x004235c0" -> "0x00422be0"; + "0x004235c0" -> "0x00422ee0"; + "0x00426260" -> "0x004c5140"; + "0x004333f0" -> "0x004336a0"; + "0x004333f0" -> "0x004839b0"; + "0x004333f0" -> "0x004839e0"; + "0x004333f0" -> "0x0051c920"; + "0x004336a0" -> "0x004333f0"; + "0x004336a0" -> "0x00502c00"; + "0x00437220" -> "0x004384d0"; + "0x004377a0" -> "0x004cc2d0"; + "0x00437b20" -> "0x004384d0"; + "0x004384d0" -> "0x004133b0"; + "0x004384d0" -> "0x0041ea50"; + "0x004384d0" -> "0x00421b60"; + "0x004384d0" -> "0x00421c20"; + "0x004384d0" -> "0x00437220"; + "0x004384d0" -> "0x004377a0"; + "0x004384d0" -> "0x00437b20"; + "0x004384d0" -> "0x0044fb70"; + "0x004384d0" -> "0x0047d440"; + "0x004384d0" -> "0x004882e0"; + "0x00438890" -> "0x004384d0"; + "0x00438890" -> "0x00445ac0"; + "0x00438890" -> "0x005033d0"; + "0x00443a50" -> "0x00438890"; + "0x00443a50" -> "0x00482ec0"; + "0x00445ac0" -> "0x00443a50"; + "0x00445ac0" -> "0x00446d40"; + "0x00445ac0" -> "0x004dd010"; + "0x0046a6c0" -> "0x00482d80"; + "0x00477820" -> "0x0047d440"; + "0x00477860" -> "0x0047d440"; + "0x0047d440" -> "0x004377a0"; + "0x0047d440" -> "0x00477820"; + "0x0047d440" -> "0x00477860"; + "0x00482d10" -> "0x00482d80"; + "0x00482d10" -> "0x00482e00"; + "0x00482d80" -> "0x0046a6c0"; + "0x00482d80" -> "0x00482d10"; + "0x00482e00" -> "0x00402cb0"; + "0x00482e00" -> "0x00482d10"; + "0x00482e00" -> "0x004a65b0"; + "0x00482ec0" -> "0x00438890"; + "0x00482ec0" -> "0x00443a50"; + "0x00482ec0" -> "0x004840e0"; + "0x00482ec0" -> "0x004b8dc0"; + "0x00482ec0" -> "0x004b8e60"; + "0x00482ec0" -> "0x004c7bc0"; + "0x00482ec0" -> "0x004c7fc0"; + "0x00482ec0" -> "0x004dfbe0"; + "0x00482ec0" -> "0x004dfd70"; + "0x00482ec0" -> "0x004ea620"; + "0x00482ec0" -> "0x004ea730"; + "0x00482ec0" -> "0x004efe80"; + "0x00482ec0" -> "0x00504010"; + "0x00482ec0" -> "0x005174e0"; + "0x00482ec0" -> "0x00517570"; + "0x004839b0" -> "0x004333f0"; + "0x004839e0" -> "0x004333f0"; + "0x004840e0" -> "0x00482ec0"; + "0x00484910" -> "0x0051eea0"; + "0x004882e0" -> "0x004384d0"; + "0x004a01a0" -> "0x00402cb0"; + "0x004a01a0" -> "0x00518140"; + "0x004a5280" -> "0x004a65b0"; + "0x004a5900" -> "0x004a5280"; + "0x004a5900" -> "0x004a65b0"; + "0x004a65b0" -> "0x00482e00"; + "0x004a65b0" -> "0x004a5280"; + "0x004a65b0" -> "0x004a5900"; + "0x004a65b0" -> "0x004a6630"; + "0x004a6630" -> "0x004a65b0"; + "0x004b8dc0" -> "0x004b8e60"; + "0x004ba3d0" -> "0x004b9a20"; + "0x004ba3d0" -> "0x004bad20"; + "0x004ba3d0" -> "0x00517d40"; + "0x004ba3d0" -> "0x00518140"; + "0x004ba3d0" -> "0x0051c920"; + "0x004bad20" -> "0x004ba3d0"; + "0x004c2ca0" -> "0x004c56a0"; + "0x004c3890" -> "0x004c56a0"; + "0x004c3f30" -> "0x004c56a0"; + "0x004c46d0" -> "0x004c56a0"; + "0x004c4c70" -> "0x004c4e30"; + "0x004c4c70" -> "0x004c5140"; + "0x004c4c70" -> "0x004c5360"; + "0x004c4c70" -> "0x0053f9c0"; + "0x004c4e30" -> "0x004c5360"; + "0x004c4e30" -> "0x004c98a0"; + "0x004c5140" -> "0x00426260"; + "0x004c5140" -> "0x004c5360"; + "0x004c5140" -> "0x004c98a0"; + "0x004c5360" -> "0x004c4c70"; + "0x004c5360" -> "0x004c4e30"; + "0x004c5360" -> "0x004c5140"; + "0x004c5360" -> "0x004c56a0"; + "0x004c56a0" -> "0x00423d70"; + "0x004c56a0" -> "0x00426d60"; + "0x004c56a0" -> "0x004c2ca0"; + "0x004c56a0" -> "0x004c3890"; + "0x004c56a0" -> "0x004c3f30"; + "0x004c56a0" -> "0x004c46d0"; + "0x004c56a0" -> "0x004c5360"; + "0x004c56a0" -> "0x004c5a0e"; + "0x004c56a0" -> "0x004c5b99"; + "0x004c56a0" -> "0x004c5fc9"; + "0x004c56a0" -> "0x004ddbd0"; + "0x004c56a0" -> "0x004ec640"; + "0x004c56a0" -> "0x0050ccc0"; + "0x004c5a0e" -> "0x004c56a0"; + "0x004c5b99" -> "0x004c56a0"; + "0x004c5fc9" -> "0x004c56a0"; + "0x004c7bc0" -> "0x004c7fc0"; + "0x004c7fc0" -> "0x0053fa50"; + "0x004c98a0" -> "0x004ee0e0"; + "0x004cc2d0" -> "0x004c9da0"; + "0x004dd010" -> "0x004839b0"; + "0x004dfbe0" -> "0x004dfd70"; + "0x004dfbe0" -> "0x0053fa50"; + "0x004e0ba0" -> "0x0053f830"; + "0x004ea620" -> "0x004ea730"; + "0x004ea620" -> "0x0053fa50"; + "0x004ea730" -> "0x004ea620"; + "0x004ec640" -> "0x004c56a0"; + "0x004ee0e0" -> "0x00484910"; + "0x004ee0e0" -> "0x004c98a0"; + "0x00502030" -> "0x00504010"; + "0x00502030" -> "0x00552560"; + "0x00502160" -> "0x00484910"; + "0x00502160" -> "0x005021c0"; + "0x00502160" -> "0x00504010"; + "0x005021c0" -> "0x00484910"; + "0x005021c0" -> "0x00502160"; + "0x005021c0" -> "0x00504010"; + "0x00502220" -> "0x00502c00"; + "0x00502220" -> "0x0053f830"; + "0x00502220" -> "0x00559520"; + "0x005027b0" -> "0x004336a0"; + "0x005027b0" -> "0x00502220"; + "0x005027b0" -> "0x00502c00"; + "0x00502910" -> "0x005027b0"; + "0x00502910" -> "0x00502c00"; + "0x00502c00" -> "0x004336a0"; + "0x00502c00" -> "0x00438890"; + "0x00502c00" -> "0x00482d80"; + "0x00502c00" -> "0x004eb0b0"; + "0x00502c00" -> "0x005027b0"; + "0x00502c00" -> "0x00502910"; + "0x00502c00" -> "0x005033d0"; + "0x005033d0" -> "0x0042a970"; + "0x005033d0" -> "0x00484910"; + "0x005033d0" -> "0x004eb0b0"; + "0x005033d0" -> "0x004fe120"; + "0x005033d0" -> "0x00501e50"; + "0x005033d0" -> "0x00501f20"; + "0x005033d0" -> "0x00502220"; + "0x005033d0" -> "0x00502550"; + "0x005033d0" -> "0x00502910"; + "0x005033d0" -> "0x00502c00"; + "0x005033d0" -> "0x00504010"; + "0x005033d0" -> "0x005411c0"; + "0x00504010" -> "0x00502030"; + "0x00504010" -> "0x00502160"; + "0x00504010" -> "0x005021c0"; + "0x00504010" -> "0x00502550"; + "0x00504010" -> "0x00502910"; + "0x00504010" -> "0x00502c00"; + "0x00504010" -> "0x0053f830"; + "0x00504010" -> "0x0053f9c0"; + "0x00504010" -> "0x0053fa50"; + "0x0050ccc0" -> "0x004c56a0"; + "0x005174e0" -> "0x0053fa50"; + "0x00517570" -> "0x00484910"; + "0x00517570" -> "0x005174e0"; + "0x00517d40" -> "0x004ba3d0"; + "0x00517d40" -> "0x00518140"; + "0x0051c920" -> "0x004ba3d0"; + "0x0053f830" -> "0x004e0ba0"; + "0x0053f830" -> "0x00502220"; + "0x0053f830" -> "0x00504010"; + "0x0053f9c0" -> "0x004c4c70"; + "0x0053f9c0" -> "0x00558130"; + "0x005411c0" -> "0x005033d0"; + "0x00558130" -> "0x0053f9c0"; +} diff --git a/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-forward-subgraph.md b/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-forward-subgraph.md new file mode 100644 index 0000000..bec314f --- /dev/null +++ b/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-forward-subgraph.md @@ -0,0 +1,486 @@ +# Setup Window Submode Subgraph (Depth 5, Forward Only) + +- Nodes: `126` +- Edges: `246` +- Seeds: `0x00502220`, `0x00502550`, `0x005027b0`, `0x00502910`, `0x00502c00`, `0x005033d0`, `0x00504010` +- Graphviz: `setup-window-submodes-depth5-forward-subgraph.dot` + +## Nodes + +| Address | Name | Subsystem | Confidence | +| --- | --- | --- | --- | +| `0x00402cb0` | `city_connection_try_build_route_with_optional_direct_site_placement` | `map` | `3` | +| `0x00404640` | `city_connection_bonus_try_compact_route_builder_from_region_entry` | `map` | `3` | +| `0x004046a0` | `city_connection_bonus_build_peer_route_candidate` | `map` | `4` | +| `0x00404c60` | `city_connection_try_build_route_between_region_entry_pair` | `map` | `3` | +| `0x00404ce0` | `simulation_try_select_and_publish_company_start_or_city_connection_news` | `simulation` | `3` | +| `0x0040e360` | `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` | `map` | `2` | +| `0x0040e450` | `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` | `map` | `2` | +| `0x0040ee10` | `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` | `map` | `2` | +| `0x0040ef10` | `placed_structure_finalize_creation_or_rebuild_local_runtime_state` | `map` | `3` | +| `0x00412ca0` | `world_region_pick_commercial_profile_label_by_region_rank` | `map` | `4` | +| `0x004133b0` | `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` | `map` | `2` | +| `0x004134d0` | `placed_structure_collection_allocate_and_construct_entry` | `map` | `3` | +| `0x00413f50` | `placed_structure_local_runtime_site_id_queue_pop_next` | `map` | `3` | +| `0x00414470` | `placed_structure_cache_projected_rect_profile_slot_id` | `map` | `3` | +| `0x00414480` | `placed_structure_local_runtime_site_id_queue_count` | `map` | `3` | +| `0x00415f20` | `placed_structure_recursive_collect_connected_component_tile_bounds` | `map` | `3` | +| `0x00416e20` | `indexed_collection_resolve_live_entry_id_by_stem_string` | `map` | `3` | +| `0x00417840` | `placed_structure_project_candidate_grid_extent_offset_by_rotation` | `map` | `3` | +| `0x00418a60` | `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` | `map` | `2` | +| `0x004197e0` | `placed_structure_validate_projected_candidate_placement` | `map` | `3` | +| `0x0041e220` | `structure_candidate_is_enabled_for_current_year` | `map` | `3` | +| `0x0041e2b0` | `structure_candidate_rebuild_local_service_metrics` | `map` | `3` | +| `0x0041ea50` | `world_setup_building_collection_phase` | `map` | `3` | +| `0x0041f9b0` | `world_region_count_structure_profiles_before_year_for_category` | `map` | `4` | +| `0x0041fac0` | `world_region_read_structure_profile_label_and_weight_by_index` | `map` | `4` | +| `0x00421b60` | `world_region_collection_seed_default_regions` | `map` | `4` | +| `0x00421c20` | `world_region_collection_run_building_population_pass` | `map` | `4` | +| `0x00422900` | `world_region_accumulate_structure_category_totals` | `map` | `3` | +| `0x00422be0` | `world_region_count_placed_structures_for_category` | `map` | `3` | +| `0x00422ee0` | `world_region_try_place_candidate_structure` | `map` | `4` | +| `0x004235c0` | `world_region_balance_structure_demand_and_place_candidates` | `map` | `4` | +| `0x00423d70` | `company_repay_bond_slot_and_compact_debt_table` | `simulation` | `4` | +| `0x00426260` | `company_compute_board_approved_dividend_rate_ceiling` | `simulation` | `4` | +| `0x00426d60` | `company_deactivate_and_clear_chairman_share_links` | `simulation` | `4` | +| `0x0042a970` | `shell_open_file_dialog_copy_selected_path_and_restore_cwd` | `shell` | `3` | +| `0x004333f0` | `shell_setup_build_file_list_records_from_current_root_and_pattern` | `shell` | `3` | +| `0x004336a0` | `shell_setup_file_list_construct_and_scan_dataset` | `shell` | `3` | +| `0x00434050` | `shell_has_auxiliary_preview_owner` | `shell` | `4` | +| `0x00437220` | `world_build_chairman_profile_slot_records` | `map` | `4` | +| `0x004377a0` | `world_seed_default_chairman_profile_slots` | `map` | `4` | +| `0x00437b20` | `simulation_run_chunked_fast_forward_burst` | `simulation` | `3` | +| `0x004384d0` | `world_run_post_load_generation_pipeline` | `map` | `4` | +| `0x00438890` | `shell_active_mode_run_profile_startup_and_load_dispatch` | `map` | `4` | +| `0x00443a50` | `world_entry_transition_and_runtime_bringup` | `map` | `4` | +| `0x00445ac0` | `shell_map_file_entry_coordinator` | `map` | `4` | +| `0x00446d40` | `world_load_saved_runtime_state_bundle` | `map` | `4` | +| `0x0044fb70` | `world_compute_transport_and_pricing_grid` | `map` | `3` | +| `0x0046a6c0` | `multiplayer_session_event_publish_registration_field` | `shell` | `3` | +| `0x00477820` | `profile_collection_count_active_chairman_records` | `map` | `4` | +| `0x00477860` | `profile_collection_get_nth_active_chairman_record` | `map` | `4` | +| `0x0047d440` | `world_conditionally_seed_named_starting_railroad_companies` | `map` | `4` | +| `0x00482d10` | `runtime_query_cached_local_exe_version_float` | `simulation` | `3` | +| `0x00482d80` | `runtime_query_cached_local_exe_version_string` | `simulation` | `3` | +| `0x00482e00` | `runtime_query_hundredths_scaled_build_version` | `simulation` | `3` | +| `0x00482ec0` | `shell_transition_mode` | `bootstrap` | `4` | +| `0x004839b0` | `shell_setup_query_file_list_uses_map_extension_pattern` | `shell` | `3` | +| `0x004839e0` | `shell_setup_query_file_list_root_dir_name` | `shell` | `3` | +| `0x004840e0` | `bootstrap_init_shell_window_services` | `bootstrap` | `4` | +| `0x00484910` | `shell_save_graphics_config` | `shell` | `4` | +| `0x004882e0` | `world_region_border_overlay_rebuild` | `map` | `4` | +| `0x004a01a0` | `route_entry_collection_try_build_path_between_optional_endpoint_entries` | `map` | `3` | +| `0x004a5280` | `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` | `map` | `3` | +| `0x004a5900` | `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` | `map` | `3` | +| `0x004a65b0` | `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` | `map` | `3` | +| `0x004a6630` | `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` | `map` | `3` | +| `0x004b8dc0` | `shell_campaign_window_destroy` | `shell` | `4` | +| `0x004b8e60` | `shell_campaign_window_construct` | `shell` | `4` | +| `0x004b9a20` | `shell_building_detail_refresh_flagged_service_capability_rows` | `shell` | `3` | +| `0x004ba3d0` | `shell_building_detail_refresh_subject_cargo_and_service_rows` | `shell` | `3` | +| `0x004bad20` | `shell_building_detail_refresh_subject_pair_value_rows` | `shell` | `3` | +| `0x004c2ca0` | `shell_company_detail_window_refresh_controls` | `shell` | `4` | +| `0x004c3890` | `shell_company_detail_issue_bond_offer_flow` | `shell` | `4` | +| `0x004c3f30` | `shell_company_detail_issue_stock_offer_flow` | `shell` | `4` | +| `0x004c46d0` | `shell_company_detail_buyback_stock_flow` | `shell` | `4` | +| `0x004c4c70` | `shell_company_detail_setup_dividend_rate_adjust_controls` | `shell` | `4` | +| `0x004c4e30` | `shell_company_detail_render_change_dividend_rate_dialog` | `shell` | `4` | +| `0x004c5140` | `shell_company_detail_handle_change_dividend_rate_dialog_message` | `shell` | `4` | +| `0x004c5360` | `shell_company_detail_change_dividend_rate_flow` | `shell` | `4` | +| `0x004c56a0` | `shell_company_detail_window_handle_message` | `shell` | `4` | +| `0x004c5a0e` | `shell_company_detail_resign_chairmanship_flow` | `shell` | `4` | +| `0x004c5b99` | `shell_company_detail_bankruptcy_flow` | `shell` | `4` | +| `0x004c5fc9` | `shell_company_detail_buy_territory_access_rights_flow` | `shell` | `4` | +| `0x004c7bc0` | `shell_credits_window_destroy` | `shell` | `4` | +| `0x004c7fc0` | `shell_credits_window_construct` | `shell` | `4` | +| `0x004c98a0` | `shell_open_custom_modal_dialog_with_callbacks` | `shell` | `4` | +| `0x004c9da0` | `map_editor_chairman_slot_panel_format_slot_card` | `map` | `4` | +| `0x004cc2d0` | `map_editor_chairman_slot_panel_construct` | `map` | `4` | +| `0x004dd010` | `shell_file_request_dialog_collect_target_path` | `shell` | `4` | +| `0x004ddbd0` | `shell_detail_panel_transition_manager` | `shell` | `3` | +| `0x004dfbe0` | `shell_game_window_construct` | `shell` | `4` | +| `0x004dfd70` | `shell_game_window_destroy` | `shell` | `4` | +| `0x004e0ba0` | `game_uppermost_window_handle_message` | `shell` | `4` | +| `0x004ea620` | `shell_load_screen_window_construct` | `shell` | `4` | +| `0x004ea730` | `shell_load_screen_window_destroy` | `shell` | `4` | +| `0x004eb0b0` | `shell_open_grayscale_map_tga_picker_and_stage_selection` | `shell` | `3` | +| `0x004ec640` | `shell_company_detail_attempt_merger_flow` | `shell` | `4` | +| `0x004ee0e0` | `multiplayer_open_staged_text_entry_dialog` | `shell` | `3` | +| `0x004efe80` | `multiplayer_window_init_globals` | `shell` | `4` | +| `0x004fe120` | `shell_has_settings_window` | `shell` | `4` | +| `0x00501e50` | `shell_open_settings_window` | `shell` | `4` | +| `0x00501f20` | `shell_query_registry_open_command_for_http_or_rtf_target` | `shell` | `3` | +| `0x00502030` | `shell_setup_window_draw_table_driven_payload_category_row` | `shell` | `3` | +| `0x00502160` | `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` | `shell` | `3` | +| `0x005021c0` | `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` | `shell` | `3` | +| `0x00502220` | `shell_setup_window_publish_selected_profile_labels_and_preview_surface` | `shell` | `3` | +| `0x00502550` | `shell_setup_window_refresh_selection_lists_and_summary_fields` | `shell` | `3` | +| `0x005027b0` | `shell_setup_window_refresh_file_backed_selection_list_panel` | `shell` | `3` | +| `0x00502910` | `shell_setup_window_refresh_mode_dependent_lists` | `shell` | `3` | +| `0x00502c00` | `shell_setup_window_select_launch_mode_and_apply_shell_state` | `shell` | `4` | +| `0x005033d0` | `shell_setup_window_handle_message` | `shell` | `3` | +| `0x00504010` | `shell_setup_window_construct` | `shell` | `4` | +| `0x0050ccc0` | `shell_company_detail_attempt_chairmanship_takeover_flow` | `shell` | `4` | +| `0x005174e0` | `shell_video_window_construct` | `shell` | `4` | +| `0x00517570` | `shell_video_window_destroy` | `shell` | `4` | +| `0x00517d40` | `indexed_collection_entry_id_is_live` | `simulation` | `4` | +| `0x00518140` | `indexed_collection_resolve_live_entry_by_id` | `simulation` | `4` | +| `0x00518380` | `indexed_collection_get_nth_live_entry_id` | `simulation` | `4` | +| `0x0051c920` | `localization_lookup_display_label_by_stem_or_fallback` | `shell` | `4` | +| `0x0051eea0` | `shell_save_display_runtime_config` | `shell` | `4` | +| `0x0053f830` | `shell_window_find_registered_child_control_by_id` | `shell` | `3` | +| `0x0053f9c0` | `shell_window_register_child_control_sorted_by_priority_and_optional_tag` | `shell` | `3` | +| `0x0053fa50` | `shell_window_bind_resource_and_initialize_child_control_links` | `shell` | `4` | +| `0x005411c0` | `shell_query_tga_header_is_supported_truecolor_image` | `shell` | `3` | +| `0x00552560` | `shell_queue_world_anchor_marker` | `shell` | `3` | +| `0x00558130` | `shell_child_control_set_owner_resolve_caption_and_refresh` | `shell` | `3` | +| `0x00559520` | `surface_init_rgba_pixel_buffer` | `support` | `3` | + +## Edges + +- `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` +- `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` +- `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` +- `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` +- `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` +- `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x00414470` `placed_structure_cache_projected_rect_profile_slot_id` + -> `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` + -> `0x00434050` `shell_has_auxiliary_preview_owner` +- `0x00412ca0` `world_region_pick_commercial_profile_label_by_region_rank` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x00413f50` `placed_structure_local_runtime_site_id_queue_pop_next` + -> `0x00414480` `placed_structure_local_runtime_site_id_queue_count` +- `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x00422ee0` `world_region_try_place_candidate_structure` +- `0x00413f50` `placed_structure_local_runtime_site_id_queue_pop_next` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` +- `0x00414470` `placed_structure_cache_projected_rect_profile_slot_id` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x00414480` `placed_structure_local_runtime_site_id_queue_count` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` +- `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` +- `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` +- `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` +- `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` +- `0x0041e2b0` `structure_candidate_rebuild_local_service_metrics` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0041ea50` `world_setup_building_collection_phase` +- `0x0041ea50` `world_setup_building_collection_phase` + -> `0x0041e2b0` `structure_candidate_rebuild_local_service_metrics` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0041f9b0` `world_region_count_structure_profiles_before_year_for_category` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00421b60` `world_region_collection_seed_default_regions` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x00421c20` `world_region_collection_run_building_population_pass` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422be0` `world_region_count_placed_structures_for_category` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422ee0` `world_region_try_place_candidate_structure` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` + -> `0x00412ca0` `world_region_pick_commercial_profile_label_by_region_rank` + -> `0x0041f9b0` `world_region_count_structure_profiles_before_year_for_category` + -> `0x0041fac0` `world_region_read_structure_profile_label_and_weight_by_index` + -> `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x00422be0` `world_region_count_placed_structures_for_category` + -> `0x00422ee0` `world_region_try_place_candidate_structure` +- `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` +- `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` +- `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x0041ea50` `world_setup_building_collection_phase` + -> `0x00421b60` `world_region_collection_seed_default_regions` + -> `0x00421c20` `world_region_collection_run_building_population_pass` + -> `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x0044fb70` `world_compute_transport_and_pricing_grid` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004882e0` `world_region_border_overlay_rebuild` +- `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00482ec0` `shell_transition_mode` +- `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00446d40` `world_load_saved_runtime_state_bundle` + -> `0x004dd010` `shell_file_request_dialog_collect_target_path` +- `0x0046a6c0` `multiplayer_session_event_publish_registration_field` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` +- `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` +- `0x00477860` `profile_collection_get_nth_active_chairman_record` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` +- `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x00477860` `profile_collection_get_nth_active_chairman_record` +- `0x00482d10` `runtime_query_cached_local_exe_version_float` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` +- `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x0046a6c0` `multiplayer_session_event_publish_registration_field` + -> `0x00482d10` `runtime_query_cached_local_exe_version_float` +- `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00482d10` `runtime_query_cached_local_exe_version_float` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x00482ec0` `shell_transition_mode` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` + -> `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` + -> `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004efe80` `multiplayer_window_init_globals` + -> `0x00504010` `shell_setup_window_construct` + -> `0x005174e0` `shell_video_window_construct` + -> `0x00517570` `shell_video_window_destroy` +- `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x00482ec0` `shell_transition_mode` +- `0x00484910` `shell_save_graphics_config` + -> `0x0051eea0` `shell_save_display_runtime_config` +- `0x004882e0` `world_region_border_overlay_rebuild` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` +- `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x00517d40` `indexed_collection_entry_id_is_live` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` +- `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` +- `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00426d60` `company_deactivate_and_clear_chairman_share_links` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c5a0e` `shell_company_detail_resign_chairmanship_flow` + -> `0x004c5b99` `shell_company_detail_bankruptcy_flow` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` + -> `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004ec640` `shell_company_detail_attempt_merger_flow` + -> `0x0050ccc0` `shell_company_detail_attempt_chairmanship_takeover_flow` +- `0x004c5a0e` `shell_company_detail_resign_chairmanship_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5b99` `shell_company_detail_bankruptcy_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` +- `0x004c7fc0` `shell_credits_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004ee0e0` `multiplayer_open_staged_text_entry_dialog` +- `0x004cc2d0` `map_editor_chairman_slot_panel_construct` + -> `0x004c9da0` `map_editor_chairman_slot_panel_format_slot_card` +- `0x004dd010` `shell_file_request_dialog_collect_target_path` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` +- `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004e0ba0` `game_uppermost_window_handle_message` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` +- `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` +- `0x004ec640` `shell_company_detail_attempt_merger_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004ee0e0` `multiplayer_open_staged_text_entry_dialog` + -> `0x00484910` `shell_save_graphics_config` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x00502030` `shell_setup_window_draw_table_driven_payload_category_row` + -> `0x00504010` `shell_setup_window_construct` + -> `0x00552560` `shell_queue_world_anchor_marker` +- `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x00484910` `shell_save_graphics_config` + -> `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00504010` `shell_setup_window_construct` +- `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x00504010` `shell_setup_window_construct` +- `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x00559520` `surface_init_rgba_pixel_buffer` +- `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x004eb0b0` `shell_open_grayscale_map_tga_picker_and_stage_selection` + -> `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x005033d0` `shell_setup_window_handle_message` + -> `0x0042a970` `shell_open_file_dialog_copy_selected_path_and_restore_cwd` + -> `0x00484910` `shell_save_graphics_config` + -> `0x004eb0b0` `shell_open_grayscale_map_tga_picker_and_stage_selection` + -> `0x004fe120` `shell_has_settings_window` + -> `0x00501e50` `shell_open_settings_window` + -> `0x00501f20` `shell_query_registry_open_command_for_http_or_rtf_target` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502550` `shell_setup_window_refresh_selection_lists_and_summary_fields` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x00504010` `shell_setup_window_construct` + -> `0x005411c0` `shell_query_tga_header_is_supported_truecolor_image` +- `0x00504010` `shell_setup_window_construct` + -> `0x00502030` `shell_setup_window_draw_table_driven_payload_category_row` + -> `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00502550` `shell_setup_window_refresh_selection_lists_and_summary_fields` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x0050ccc0` `shell_company_detail_attempt_chairmanship_takeover_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x005174e0` `shell_video_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00517570` `shell_video_window_destroy` + -> `0x00484910` `shell_save_graphics_config` + -> `0x005174e0` `shell_video_window_construct` +- `0x00517d40` `indexed_collection_entry_id_is_live` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` +- `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x004e0ba0` `game_uppermost_window_handle_message` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00504010` `shell_setup_window_construct` +- `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` + -> `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x00558130` `shell_child_control_set_owner_resolve_caption_and_refresh` +- `0x005411c0` `shell_query_tga_header_is_supported_truecolor_image` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x00558130` `shell_child_control_set_owner_resolve_caption_and_refresh` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` diff --git a/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-subgraph.dot b/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-subgraph.dot new file mode 100644 index 0000000..c6cdee6 --- /dev/null +++ b/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-subgraph.dot @@ -0,0 +1,1156 @@ +digraph shell_load { + graph [rankdir=LR, labelloc="t", labeljust="l"]; + label="Setup Window Submode Subgraph (Depth 5)"; + node [shape=box, style="rounded,filled", fillcolor="#f8f8f8", color="#555555", fontname="Helvetica"]; + edge [color="#666666", fontname="Helvetica"]; + subgraph cluster_bootstrap { + label="bootstrap"; + color="#cccccc"; + "0x00482ec0" [label="0x00482ec0\\nshell_transition_mode", fillcolor="#f8f8f8"]; + "0x004840e0" [label="0x004840e0\\nbootstrap_init_shell_window_services", fillcolor="#f8f8f8"]; + "0x00521060" [label="0x00521060\\nbootstrap_init_shell_service_bundle", fillcolor="#f8f8f8"]; + "0x00521390" [label="0x00521390\\nbootstrap_destroy_shell_service_bundle", fillcolor="#f8f8f8"]; + "0x0053a960" [label="0x0053a960\\nshell_emit_geographic_label_text_span", fillcolor="#f8f8f8"]; + } + subgraph cluster_map { + label="map"; + color="#cccccc"; + "0x004010f0" [label="0x004010f0\\ncity_compute_connection_bonus_candidate_weight", fillcolor="#f8f8f8"]; + "0x00402c90" [label="0x00402c90\\nplaced_structure_resolve_linked_candidate_record", fillcolor="#f8f8f8"]; + "0x00402cb0" [label="0x00402cb0\\ncity_connection_try_build_route_with_optional_direct_site_placement", fillcolor="#f8f8f8"]; + "0x00404640" [label="0x00404640\\ncity_connection_bonus_try_compact_route_builder_from_region_entry", fillcolor="#f8f8f8"]; + "0x004046a0" [label="0x004046a0\\ncity_connection_bonus_build_peer_route_candidate", fillcolor="#f8f8f8"]; + "0x00404c60" [label="0x00404c60\\ncity_connection_try_build_route_between_region_entry_pair", fillcolor="#f8f8f8"]; + "0x0040e360" [label="0x0040e360\\nplaced_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime", fillcolor="#f8f8f8"]; + "0x0040e450" [label="0x0040e450\\nplaced_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem", fillcolor="#f8f8f8"]; + "0x0040eba0" [label="0x0040eba0\\nplaced_structure_set_world_coords_and_refresh_local_runtime_side_state", fillcolor="#f8f8f8"]; + "0x0040ee10" [label="0x0040ee10\\nplaced_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon", fillcolor="#f8f8f8"]; + "0x0040ef10" [label="0x0040ef10\\nplaced_structure_finalize_creation_or_rebuild_local_runtime_state", fillcolor="#f8f8f8"]; + "0x0040fef0" [label="0x0040fef0\\nplaced_structure_try_emit_best_route_style_peer_link_for_candidate_class", fillcolor="#f8f8f8"]; + "0x004101e0" [label="0x004101e0\\nplaced_structure_rebuild_route_style_candidate_scores_and_peer_links", fillcolor="#f8f8f8"]; + "0x00412ca0" [label="0x00412ca0\\nworld_region_pick_commercial_profile_label_by_region_rank", fillcolor="#f8f8f8"]; + "0x004133b0" [label="0x004133b0\\nplaced_structure_collection_refresh_local_runtime_records_and_position_scalars", fillcolor="#f8f8f8"]; + "0x004134d0" [label="0x004134d0\\nplaced_structure_collection_allocate_and_construct_entry", fillcolor="#f8f8f8"]; + "0x00413580" [label="0x00413580\\nplaced_structure_collection_refresh_quarter_subset_route_style_state", fillcolor="#f8f8f8"]; + "0x00413f50" [label="0x00413f50\\nplaced_structure_local_runtime_site_id_queue_pop_next", fillcolor="#f8f8f8"]; + "0x00414470" [label="0x00414470\\nplaced_structure_cache_projected_rect_profile_slot_id", fillcolor="#f8f8f8"]; + "0x00414480" [label="0x00414480\\nplaced_structure_local_runtime_site_id_queue_count", fillcolor="#f8f8f8"]; + "0x00415f20" [label="0x00415f20\\nplaced_structure_recursive_collect_connected_component_tile_bounds", fillcolor="#f8f8f8"]; + "0x00416e20" [label="0x00416e20\\nindexed_collection_resolve_live_entry_id_by_stem_string", fillcolor="#f8f8f8"]; + "0x00417840" [label="0x00417840\\nplaced_structure_project_candidate_grid_extent_offset_by_rotation", fillcolor="#f8f8f8"]; + "0x00418a60" [label="0x00418a60\\nplaced_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds", fillcolor="#f8f8f8"]; + "0x004197e0" [label="0x004197e0\\nplaced_structure_validate_projected_candidate_placement", fillcolor="#f8f8f8"]; + "0x0041e220" [label="0x0041e220\\nstructure_candidate_is_enabled_for_current_year", fillcolor="#f8f8f8"]; + "0x0041e2b0" [label="0x0041e2b0\\nstructure_candidate_rebuild_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0041e650" [label="0x0041e650\\nstructure_candidate_query_route_style_or_local_availability_metric", fillcolor="#f8f8f8"]; + "0x0041ea50" [label="0x0041ea50\\nworld_setup_building_collection_phase", fillcolor="#f8f8f8"]; + "0x0041f9b0" [label="0x0041f9b0\\nworld_region_count_structure_profiles_before_year_for_category", fillcolor="#f8f8f8"]; + "0x0041fac0" [label="0x0041fac0\\nworld_region_read_structure_profile_label_and_weight_by_index", fillcolor="#f8f8f8"]; + "0x00420030" [label="0x00420030\\ncity_connection_bonus_exists_matching_peer_site", fillcolor="#f8f8f8"]; + "0x00420280" [label="0x00420280\\ncity_connection_bonus_select_first_matching_peer_site", fillcolor="#f8f8f8"]; + "0x004207d0" [label="0x004207d0\\ncity_site_format_connection_bonus_status_label", fillcolor="#f8f8f8"]; + "0x00421b60" [label="0x00421b60\\nworld_region_collection_seed_default_regions", fillcolor="#f8f8f8"]; + "0x00421c20" [label="0x00421c20\\nworld_region_collection_run_building_population_pass", fillcolor="#f8f8f8"]; + "0x00422900" [label="0x00422900\\nworld_region_accumulate_structure_category_totals", fillcolor="#f8f8f8"]; + "0x00422be0" [label="0x00422be0\\nworld_region_count_placed_structures_for_category", fillcolor="#f8f8f8"]; + "0x00422ee0" [label="0x00422ee0\\nworld_region_try_place_candidate_structure", fillcolor="#f8f8f8"]; + "0x004235c0" [label="0x004235c0\\nworld_region_balance_structure_demand_and_place_candidates", fillcolor="#f8f8f8"]; + "0x0042cab0" [label="0x0042cab0\\nplaced_structure_accumulate_candidate_metric_or_emit_route_style_peer_link", fillcolor="#f8f8f8"]; + "0x00434300" [label="0x00434300\\nworld_runtime_release_global_services", fillcolor="#f8f8f8"]; + "0x00434870" [label="0x00434870\\nscenario_state_get_selected_chairman_company_record", fillcolor="#f8f8f8"]; + "0x00434890" [label="0x00434890\\nscenario_state_set_selected_chairman_profile", fillcolor="#f8f8f8"]; + "0x004348c0" [label="0x004348c0\\nscenario_state_get_selected_chairman_profile_record", fillcolor="#f8f8f8"]; + "0x00437220" [label="0x00437220\\nworld_build_chairman_profile_slot_records", fillcolor="#f8f8f8"]; + "0x004377a0" [label="0x004377a0\\nworld_seed_default_chairman_profile_slots", fillcolor="#f8f8f8"]; + "0x004384d0" [label="0x004384d0\\nworld_run_post_load_generation_pipeline", fillcolor="#f8f8f8"]; + "0x00438890" [label="0x00438890\\nshell_active_mode_run_profile_startup_and_load_dispatch", fillcolor="#f8f8f8"]; + "0x00443a50" [label="0x00443a50\\nworld_entry_transition_and_runtime_bringup", fillcolor="#f8f8f8"]; + "0x00444dd0" [label="0x00444dd0\\nmap_bundle_open_reference_databases", fillcolor="#f8f8f8"]; + "0x00445ac0" [label="0x00445ac0\\nshell_map_file_entry_coordinator", fillcolor="#f8f8f8"]; + "0x00445de0" [label="0x00445de0\\nshell_map_file_world_bundle_coordinator", fillcolor="#f8f8f8"]; + "0x00446240" [label="0x00446240\\nworld_runtime_serialize_smp_bundle", fillcolor="#f8f8f8"]; + "0x00446d40" [label="0x00446d40\\nworld_load_saved_runtime_state_bundle", fillcolor="#f8f8f8"]; + "0x0044fb70" [label="0x0044fb70\\nworld_compute_transport_and_pricing_grid", fillcolor="#f8f8f8"]; + "0x00467eb0" [label="0x00467eb0\\nplaced_structure_route_link_attach_site_owner", fillcolor="#f8f8f8"]; + "0x004682c0" [label="0x004682c0\\nplaced_structure_route_link_collection_recompute_all_endpoint_pair_state", fillcolor="#f8f8f8"]; + "0x00477820" [label="0x00477820\\nprofile_collection_count_active_chairman_records", fillcolor="#f8f8f8"]; + "0x00477860" [label="0x00477860\\nprofile_collection_get_nth_active_chairman_record", fillcolor="#f8f8f8"]; + "0x0047d440" [label="0x0047d440\\nworld_conditionally_seed_named_starting_railroad_companies", fillcolor="#f8f8f8"]; + "0x0047e240" [label="0x0047e240\\nplaced_structure_query_candidate_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0047e330" [label="0x0047e330\\nplaced_structure_count_candidates_with_local_service_metrics", fillcolor="#f8f8f8"]; + "0x0047e690" [label="0x0047e690\\nplaced_structure_query_candidate_directional_route_overlay_summary", fillcolor="#f8f8f8"]; + "0x0047efe0" [label="0x0047efe0\\nplaced_structure_query_linked_company_id", fillcolor="#f8f8f8"]; + "0x0047f010" [label="0x0047f010\\nplaced_structure_append_unique_route_entry", fillcolor="#f8f8f8"]; + "0x00481390" [label="0x00481390\\nplaced_structure_collection_allocate_and_construct_linked_site_record", fillcolor="#f8f8f8"]; + "0x004882e0" [label="0x004882e0\\nworld_region_border_overlay_rebuild", fillcolor="#f8f8f8"]; + "0x00494240" [label="0x00494240\\nroute_entry_collection_query_rect_window_passes_entry_type_gate", fillcolor="#f8f8f8"]; + "0x0049bd40" [label="0x0049bd40\\nroute_entry_collection_run_initial_candidate_path_sweep", fillcolor="#f8f8f8"]; + "0x004a01a0" [label="0x004a01a0\\nroute_entry_collection_try_build_path_between_optional_endpoint_entries", fillcolor="#f8f8f8"]; + "0x004a5280" [label="0x004a5280\\naux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search", fillcolor="#f8f8f8"]; + "0x004a5900" [label="0x004a5900\\naux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk", fillcolor="#f8f8f8"]; + "0x004a65b0" [label="0x004a65b0\\naux_route_entry_tracker_dispatch_route_entry_pair_metric_query", fillcolor="#f8f8f8"]; + "0x004a6630" [label="0x004a6630\\naux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks", fillcolor="#f8f8f8"]; + "0x004b99c0" [label="0x004b99c0\\nstructure_candidate_collection_get_nth_active_candidate_id", fillcolor="#f8f8f8"]; + "0x004c9da0" [label="0x004c9da0\\nmap_editor_chairman_slot_panel_format_slot_card", fillcolor="#f8f8f8"]; + "0x004ca1c0" [label="0x004ca1c0\\nmap_editor_chairman_slot_panel_refresh_slot_counters", fillcolor="#f8f8f8"]; + "0x004cc250" [label="0x004cc250\\nmap_editor_chairman_slot_panel_refresh_slot_list", fillcolor="#f8f8f8"]; + "0x004cc2d0" [label="0x004cc2d0\\nmap_editor_chairman_slot_panel_construct", fillcolor="#f8f8f8"]; + "0x004cecc0" [label="0x004cecc0\\nmap_editor_chairman_slot_panel_handle_message", fillcolor="#f8f8f8"]; + } + subgraph cluster_render { + label="render"; + color="#cccccc"; + "0x0043f640" [label="0x0043f640\\nworld_render_station_candidate_service_map_overlay", fillcolor="#f8f8f8"]; + } + subgraph cluster_scenario { + label="scenario"; + color="#cccccc"; + "0x0042e050" [label="0x0042e050\\nscenario_event_clone_runtime_record_deep_copy", fillcolor="#f8f8f8"]; + "0x00433130" [label="0x00433130\\nscenario_event_collection_refresh_runtime_records_from_packed_state", fillcolor="#f8f8f8"]; + "0x004883f0" [label="0x004883f0\\nscenario_text_export_append_numbered_entry", fillcolor="#f8f8f8"]; + "0x004886e0" [label="0x004886e0\\nscenario_text_export_build_language_file", fillcolor="#f8f8f8"]; + "0x00489830" [label="0x00489830\\nscenario_text_export_report_language_file", fillcolor="#f8f8f8"]; + "0x00489a20" [label="0x00489a20\\nscenario_text_export_batch_process_maps", fillcolor="#f8f8f8"]; + } + subgraph cluster_shell { + label="shell"; + color="#cccccc"; + "0x00425880" [label="0x00425880\\ncompany_compute_negative_cash_balance_interest_rate", fillcolor="#f8f8f8"]; + "0x004258c0" [label="0x004258c0\\ncompany_compute_positive_cash_balance_interest_rate", fillcolor="#f8f8f8"]; + "0x0042a970" [label="0x0042a970\\nshell_open_file_dialog_copy_selected_path_and_restore_cwd", fillcolor="#f8f8f8"]; + "0x004333f0" [label="0x004333f0\\nshell_setup_build_file_list_records_from_current_root_and_pattern", fillcolor="#f8f8f8"]; + "0x004336a0" [label="0x004336a0\\nshell_setup_file_list_construct_and_scan_dataset", fillcolor="#f8f8f8"]; + "0x00433b00" [label="0x00433b00\\nshell_can_open_trainbuy_window_or_warn", fillcolor="#f8f8f8"]; + "0x00434050" [label="0x00434050\\nshell_has_auxiliary_preview_owner", fillcolor="#f8f8f8"]; + "0x00439e40" [label="0x00439e40\\nworld_view_seed_keyboard_binding_slot_pairs", fillcolor="#f8f8f8"]; + "0x0043af60" [label="0x0043af60\\nworld_view_should_drive_primary_pan_channel", fillcolor="#f8f8f8"]; + "0x0043b030" [label="0x0043b030\\nworld_view_should_drive_secondary_pan_channel", fillcolor="#f8f8f8"]; + "0x0043cc30" [label="0x0043cc30\\nworld_view_step_zoom_bucket", fillcolor="#f8f8f8"]; + "0x0043d050" [label="0x0043d050\\nworld_view_set_focus_position_xyz", fillcolor="#f8f8f8"]; + "0x0043d130" [label="0x0043d130\\nworld_view_pan_relative_offset_in_camera_plane", fillcolor="#f8f8f8"]; + "0x0043d740" [label="0x0043d740\\nworld_view_service_keyboard_turn_pan_and_zoom_bindings", fillcolor="#f8f8f8"]; + "0x0043db00" [label="0x0043db00\\nworld_view_service_shell_input_pan_and_hover", fillcolor="#f8f8f8"]; + "0x00464410" [label="0x00464410\\nshell_dispatch_ui_command", fillcolor="#f8f8f8"]; + "0x00469720" [label="0x00469720\\nmultiplayer_preview_dataset_service_frame", fillcolor="#f8f8f8"]; + "0x0046a6c0" [label="0x0046a6c0\\nmultiplayer_session_event_publish_registration_field", fillcolor="#f8f8f8"]; + "0x0046b780" [label="0x0046b780\\nmultiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync", fillcolor="#f8f8f8"]; + "0x0047d080" [label="0x0047d080\\nstart_new_company_dialog_open", fillcolor="#f8f8f8"]; + "0x004839b0" [label="0x004839b0\\nshell_setup_query_file_list_uses_map_extension_pattern", fillcolor="#f8f8f8"]; + "0x004839e0" [label="0x004839e0\\nshell_setup_query_file_list_root_dir_name", fillcolor="#f8f8f8"]; + "0x00483f70" [label="0x00483f70\\nshell_service_pump_iteration", fillcolor="#f8f8f8"]; + "0x00484590" [label="0x00484590\\nshell_init_graphics_preset_state", fillcolor="#f8f8f8"]; + "0x00484910" [label="0x00484910\\nshell_save_graphics_config", fillcolor="#f8f8f8"]; + "0x00484980" [label="0x00484980\\nshell_load_graphics_config_or_init_defaults", fillcolor="#f8f8f8"]; + "0x00484a60" [label="0x00484a60\\nshell_match_legacy_gpu_profile_token", fillcolor="#f8f8f8"]; + "0x00484d70" [label="0x00484d70\\nshell_apply_graphics_option_runtime_effects", fillcolor="#f8f8f8"]; + "0x00485060" [label="0x00485060\\nshell_set_graphics_option_with_fanout", fillcolor="#f8f8f8"]; + "0x004852e0" [label="0x004852e0\\nshell_apply_default_graphics_master_profile", fillcolor="#f8f8f8"]; + "0x004853c0" [label="0x004853c0\\nshell_apply_graphics_preset_bundle", fillcolor="#f8f8f8"]; + "0x004b8dc0" [label="0x004b8dc0\\nshell_campaign_window_destroy", fillcolor="#f8f8f8"]; + "0x004b8e60" [label="0x004b8e60\\nshell_campaign_window_construct", fillcolor="#f8f8f8"]; + "0x004b9a20" [label="0x004b9a20\\nshell_building_detail_refresh_flagged_service_capability_rows", fillcolor="#f8f8f8"]; + "0x004b9d70" [label="0x004b9d70\\nshell_has_live_building_detail_window", fillcolor="#f8f8f8"]; + "0x004b9d80" [label="0x004b9d80\\nshell_mark_building_detail_window_dirty", fillcolor="#f8f8f8"]; + "0x004b9e10" [label="0x004b9e10\\nshell_building_detail_submit_aux_owner_subject_sync_request", fillcolor="#f8f8f8"]; + "0x004b9fd0" [label="0x004b9fd0\\nshell_building_detail_present_flagged_service_capability_popup", fillcolor="#f8f8f8"]; + "0x004ba3d0" [label="0x004ba3d0\\nshell_building_detail_refresh_subject_cargo_and_service_rows", fillcolor="#f8f8f8"]; + "0x004bad20" [label="0x004bad20\\nshell_building_detail_refresh_subject_pair_value_rows", fillcolor="#f8f8f8"]; + "0x004baef0" [label="0x004baef0\\nshell_building_detail_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004bb9e0" [label="0x004bb9e0\\nshell_building_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x004bc0a0" [label="0x004bc0a0\\nshell_building_detail_window_construct", fillcolor="#f8f8f8"]; + "0x004bc100" [label="0x004bc100\\nshell_open_or_focus_building_detail_window", fillcolor="#f8f8f8"]; + "0x004bfb30" [label="0x004bfb30\\nshell_format_company_financial_summary_card", fillcolor="#f8f8f8"]; + "0x004c1610" [label="0x004c1610\\nshell_company_detail_bind_bond_row_band_for_active_panel", fillcolor="#f8f8f8"]; + "0x004c16f0" [label="0x004c16f0\\nshell_company_detail_resolve_selected_company", fillcolor="#f8f8f8"]; + "0x004c1730" [label="0x004c1730\\nshell_company_detail_render_financial_history_panel", fillcolor="#f8f8f8"]; + "0x004c1ab0" [label="0x004c1ab0\\nshell_company_detail_render_company_summary_card", fillcolor="#f8f8f8"]; + "0x004c1b60" [label="0x004c1b60\\nshell_company_detail_refresh_selected_territory_access_summary", fillcolor="#f8f8f8"]; + "0x004c1d30" [label="0x004c1d30\\nshell_company_detail_select_territory_access_row", fillcolor="#f8f8f8"]; + "0x004c1d70" [label="0x004c1d70\\nshell_company_detail_render_territory_access_row", fillcolor="#f8f8f8"]; + "0x004c1ec0" [label="0x004c1ec0\\nshell_company_detail_render_bond_maturity_and_repay_panel", fillcolor="#f8f8f8"]; + "0x004c22e0" [label="0x004c22e0\\nshell_company_detail_sync_selected_territory_from_picker", fillcolor="#f8f8f8"]; + "0x004c23a0" [label="0x004c23a0\\nshell_company_detail_render_debt_credit_and_rate_summary_panel", fillcolor="#f8f8f8"]; + "0x004c2ca0" [label="0x004c2ca0\\nshell_company_detail_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004c3470" [label="0x004c3470\\nshell_company_detail_step_selected_active_company_delta", fillcolor="#f8f8f8"]; + "0x004c3540" [label="0x004c3540\\nshell_company_detail_select_next_active_company", fillcolor="#f8f8f8"]; + "0x004c3550" [label="0x004c3550\\nshell_company_detail_select_previous_active_company", fillcolor="#f8f8f8"]; + "0x004c3560" [label="0x004c3560\\nshell_company_detail_render_issue_bond_offer_dialog", fillcolor="#f8f8f8"]; + "0x004c3890" [label="0x004c3890\\nshell_company_detail_issue_bond_offer_flow", fillcolor="#f8f8f8"]; + "0x004c3b50" [label="0x004c3b50\\nshell_company_detail_render_issue_stock_offer_dialog", fillcolor="#f8f8f8"]; + "0x004c3f30" [label="0x004c3f30\\nshell_company_detail_issue_stock_offer_flow", fillcolor="#f8f8f8"]; + "0x004c4300" [label="0x004c4300\\nshell_company_detail_render_stock_buyback_offer_dialog", fillcolor="#f8f8f8"]; + "0x004c46d0" [label="0x004c46d0\\nshell_company_detail_buyback_stock_flow", fillcolor="#f8f8f8"]; + "0x004c4c70" [label="0x004c4c70\\nshell_company_detail_setup_dividend_rate_adjust_controls", fillcolor="#f8f8f8"]; + "0x004c4e30" [label="0x004c4e30\\nshell_company_detail_render_change_dividend_rate_dialog", fillcolor="#f8f8f8"]; + "0x004c5140" [label="0x004c5140\\nshell_company_detail_handle_change_dividend_rate_dialog_message", fillcolor="#f8f8f8"]; + "0x004c5360" [label="0x004c5360\\nshell_company_detail_change_dividend_rate_flow", fillcolor="#f8f8f8"]; + "0x004c5540" [label="0x004c5540\\nshell_company_detail_window_construct", fillcolor="#f8f8f8"]; + "0x004c56a0" [label="0x004c56a0\\nshell_company_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x004c5a0e" [label="0x004c5a0e\\nshell_company_detail_resign_chairmanship_flow", fillcolor="#f8f8f8"]; + "0x004c5b99" [label="0x004c5b99\\nshell_company_detail_bankruptcy_flow", fillcolor="#f8f8f8"]; + "0x004c5fc9" [label="0x004c5fc9\\nshell_company_detail_buy_territory_access_rights_flow", fillcolor="#f8f8f8"]; + "0x004c6b40" [label="0x004c6b40\\nshell_company_list_format_company_or_start_row", fillcolor="#f8f8f8"]; + "0x004c6bb0" [label="0x004c6bb0\\nshell_company_list_activate_or_shift_center_company", fillcolor="#f8f8f8"]; + "0x004c6c30" [label="0x004c6c30\\nshell_company_list_window_refresh_rows", fillcolor="#f8f8f8"]; + "0x004c6f30" [label="0x004c6f30\\nshell_company_list_window_handle_message", fillcolor="#f8f8f8"]; + "0x004c7bc0" [label="0x004c7bc0\\nshell_credits_window_destroy", fillcolor="#f8f8f8"]; + "0x004c7fc0" [label="0x004c7fc0\\nshell_credits_window_construct", fillcolor="#f8f8f8"]; + "0x004c8670" [label="0x004c8670\\nshell_mark_custom_modal_dialog_dirty", fillcolor="#f8f8f8"]; + "0x004c8680" [label="0x004c8680\\nshell_has_live_custom_modal_dialog", fillcolor="#f8f8f8"]; + "0x004c98a0" [label="0x004c98a0\\nshell_open_custom_modal_dialog_with_callbacks", fillcolor="#f8f8f8"]; + "0x004d4500" [label="0x004d4500\\nshell_ensure_editor_panel_window", fillcolor="#f8f8f8"]; + "0x004d57c0" [label="0x004d57c0\\nshell_event_conditions_window_construct", fillcolor="#f8f8f8"]; + "0x004d5d00" [label="0x004d5d00\\nshell_event_effects_window_refresh_effect_type_selector", fillcolor="#f8f8f8"]; + "0x004d5f50" [label="0x004d5f50\\nshell_event_effects_window_refresh_selected_effect_parameter_rows", fillcolor="#f8f8f8"]; + "0x004d6090" [label="0x004d6090\\nshell_event_effects_window_refresh_selected_staged_effect_editor_panels", fillcolor="#f8f8f8"]; + "0x004d67f0" [label="0x004d67f0\\nshell_event_effects_window_commit_current_editor_state_into_staged_row", fillcolor="#f8f8f8"]; + "0x004d6d60" [label="0x004d6d60\\nshell_event_effects_window_construct", fillcolor="#f8f8f8"]; + "0x004d7060" [label="0x004d7060\\nshell_event_effects_window_handle_message", fillcolor="#f8f8f8"]; + "0x004d7ef0" [label="0x004d7ef0\\nshell_event_effects_window_refresh_event_selector_list_and_selected_event_id", fillcolor="#f8f8f8"]; + "0x004d8120" [label="0x004d8120\\nshell_event_conditions_window_refresh_condition_row_list_panel", fillcolor="#f8f8f8"]; + "0x004d88f0" [label="0x004d88f0\\nshell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel", fillcolor="#f8f8f8"]; + "0x004d9970" [label="0x004d9970\\nshell_event_conditions_window_refresh_condition_class_summary_and_group_rows", fillcolor="#f8f8f8"]; + "0x004d9dc0" [label="0x004d9dc0\\nshell_open_event_conditions_modal_and_return_result", fillcolor="#f8f8f8"]; + "0x004d9e40" [label="0x004d9e40\\nshell_open_event_effects_modal_and_return_result", fillcolor="#f8f8f8"]; + "0x004da0f0" [label="0x004da0f0\\nshell_event_conditions_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004da640" [label="0x004da640\\nshell_event_conditions_window_append_default_condition_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da700" [label="0x004da700\\nshell_event_conditions_window_edit_selected_condition_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da7c0" [label="0x004da7c0\\nshell_event_effects_window_append_grouped_effect_row_via_modal", fillcolor="#f8f8f8"]; + "0x004da860" [label="0x004da860\\nshell_event_effects_window_edit_selected_grouped_effect_row_via_modal", fillcolor="#f8f8f8"]; + "0x004db120" [label="0x004db120\\nshell_event_conditions_window_refresh_selected_event_strip_and_navigation", fillcolor="#f8f8f8"]; + "0x004db8b0" [label="0x004db8b0\\nshell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal", fillcolor="#f8f8f8"]; + "0x004dba90" [label="0x004dba90\\nshell_event_conditions_window_rename_selected_event_via_name_modal", fillcolor="#f8f8f8"]; + "0x004dbb80" [label="0x004dbb80\\nshell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions", fillcolor="#f8f8f8"]; + "0x004dbe7a" [label="0x004dbe7a\\nshell_event_conditions_window_open_choice_event_single_player_only_warning_modal", fillcolor="#f8f8f8"]; + "0x004dc670" [label="0x004dc670\\nshell_file_options_dialog_construct", fillcolor="#f8f8f8"]; + "0x004dc7d0" [label="0x004dc7d0\\nshell_has_file_options_dialog", fillcolor="#f8f8f8"]; + "0x004dc7e0" [label="0x004dc7e0\\nshell_mark_file_options_dialog_dirty", fillcolor="#f8f8f8"]; + "0x004dc7f0" [label="0x004dc7f0\\nshell_file_options_dialog_handle_message", fillcolor="#f8f8f8"]; + "0x004dd010" [label="0x004dd010\\nshell_file_request_dialog_collect_target_path", fillcolor="#f8f8f8"]; + "0x004ddbd0" [label="0x004ddbd0\\nshell_detail_panel_transition_manager", fillcolor="#f8f8f8"]; + "0x004dfbe0" [label="0x004dfbe0\\nshell_game_window_construct", fillcolor="#f8f8f8"]; + "0x004dfd70" [label="0x004dfd70\\nshell_game_window_destroy", fillcolor="#f8f8f8"]; + "0x004dfdf0" [label="0x004dfdf0\\nshell_ensure_game_message_window", fillcolor="#f8f8f8"]; + "0x004e0210" [label="0x004e0210\\ngame_message_window_service_frame", fillcolor="#f8f8f8"]; + "0x004e0720" [label="0x004e0720\\ngame_message_window_service_if_present", fillcolor="#f8f8f8"]; + "0x004e0780" [label="0x004e0780\\ngame_uppermost_window_service_world_hotspot_band", fillcolor="#f8f8f8"]; + "0x004e0960" [label="0x004e0960\\ngame_uppermost_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x004e0b20" [label="0x004e0b20\\ngame_uppermost_window_construct", fillcolor="#f8f8f8"]; + "0x004e0ba0" [label="0x004e0ba0\\ngame_uppermost_window_handle_message", fillcolor="#f8f8f8"]; + "0x004e0e40" [label="0x004e0e40\\nshell_ensure_game_uppermost_window", fillcolor="#f8f8f8"]; + "0x004e1d60" [label="0x004e1d60\\nshell_load_screen_refresh_page_strip_and_page_kind_controls", fillcolor="#f8f8f8"]; + "0x004e1f50" [label="0x004e1f50\\nshell_has_live_load_screen_window", fillcolor="#f8f8f8"]; + "0x004e1f60" [label="0x004e1f60\\nshell_mark_load_screen_window_dirty", fillcolor="#f8f8f8"]; + "0x004e2c10" [label="0x004e2c10\\nshell_load_screen_select_page_subject_and_refresh", fillcolor="#f8f8f8"]; + "0x004e3a00" [label="0x004e3a00\\nshell_load_screen_step_selected_company_delta", fillcolor="#f8f8f8"]; + "0x004e3a80" [label="0x004e3a80\\nshell_load_screen_window_handle_message", fillcolor="#f8f8f8"]; + "0x004e45d0" [label="0x004e45d0\\nshell_load_screen_profile_stock_holdings_page_handle_message", fillcolor="#f8f8f8"]; + "0x004e4b10" [label="0x004e4b10\\nshell_load_screen_reset_runtime_state_and_seed_selection", fillcolor="#f8f8f8"]; + "0x004e4ee0" [label="0x004e4ee0\\nshell_open_or_focus_load_screen_page", fillcolor="#f8f8f8"]; + "0x004e5130" [label="0x004e5130\\nshell_load_screen_render_company_stock_data_panel", fillcolor="#f8f8f8"]; + "0x004e51ea" [label="0x004e51ea\\nshell_load_screen_render_game_status_briefing_panel", fillcolor="#f8f8f8"]; + "0x004e5300" [label="0x004e5300\\nshell_load_screen_render_player_detail_stock_holdings_panel", fillcolor="#f8f8f8"]; + "0x004e5a80" [label="0x004e5a80\\nshell_render_company_overview_panel_header_and_optional_change_affordance", fillcolor="#f8f8f8"]; + "0x004e5cf0" [label="0x004e5cf0\\nshell_format_company_governance_and_economy_status_panel", fillcolor="#f8f8f8"]; + "0x004e68e0" [label="0x004e68e0\\nshell_load_screen_render_company_list_panel", fillcolor="#f8f8f8"]; + "0x004e6ef0" [label="0x004e6ef0\\nshell_load_screen_render_player_list_panel", fillcolor="#f8f8f8"]; + "0x004e7670" [label="0x004e7670\\nshell_load_screen_render_company_train_list_panel", fillcolor="#f8f8f8"]; + "0x004e8270" [label="0x004e8270\\nshell_load_screen_render_company_industry_list_panel", fillcolor="#f8f8f8"]; + "0x004e8bb0" [label="0x004e8bb0\\nshell_load_screen_render_company_station_list_panel", fillcolor="#f8f8f8"]; + "0x004e9460" [label="0x004e9460\\nshell_load_screen_render_map_cargo_list_panel", fillcolor="#f8f8f8"]; + "0x004e9b20" [label="0x004e9b20\\nshell_load_screen_render_company_report_history_panel", fillcolor="#f8f8f8"]; + "0x004ea060" [label="0x004ea060\\nshell_load_screen_render_active_page_panel", fillcolor="#f8f8f8"]; + "0x004ea620" [label="0x004ea620\\nshell_load_screen_window_construct", fillcolor="#f8f8f8"]; + "0x004ea720" [label="0x004ea720\\nshell_load_screen_window_is_open", fillcolor="#f8f8f8"]; + "0x004ea730" [label="0x004ea730\\nshell_load_screen_window_destroy", fillcolor="#f8f8f8"]; + "0x004eb0b0" [label="0x004eb0b0\\nshell_open_grayscale_map_tga_picker_and_stage_selection", fillcolor="#f8f8f8"]; + "0x004ec640" [label="0x004ec640\\nshell_company_detail_attempt_merger_flow", fillcolor="#f8f8f8"]; + "0x004ee0e0" [label="0x004ee0e0\\nmultiplayer_open_staged_text_entry_dialog", fillcolor="#f8f8f8"]; + "0x004ee1d0" [label="0x004ee1d0\\nmultiplayer_commit_staged_text_entry", fillcolor="#f8f8f8"]; + "0x004ee3a0" [label="0x004ee3a0\\nmultiplayer_reset_tool_globals", fillcolor="#f8f8f8"]; + "0x004ee810" [label="0x004ee810\\nmultiplayer_publish_wrapped_chat_message", fillcolor="#f8f8f8"]; + "0x004ee950" [label="0x004ee950\\nmultiplayer_load_selected_map_preview_surface", fillcolor="#f8f8f8"]; + "0x004eed30" [label="0x004eed30\\nmultiplayer_sync_selected_map_entry", fillcolor="#f8f8f8"]; + "0x004efe80" [label="0x004efe80\\nmultiplayer_window_init_globals", fillcolor="#f8f8f8"]; + "0x004f2e80" [label="0x004f2e80\\nshell_has_live_overview_window", fillcolor="#f8f8f8"]; + "0x004f2e90" [label="0x004f2e90\\nshell_mark_overview_window_dirty", fillcolor="#f8f8f8"]; + "0x004f38a0" [label="0x004f38a0\\nshell_overview_window_construct", fillcolor="#f8f8f8"]; + "0x004f38f0" [label="0x004f38f0\\nshell_overview_window_handle_message", fillcolor="#f8f8f8"]; + "0x004f3a10" [label="0x004f3a10\\nshell_open_or_focus_overview_window", fillcolor="#f8f8f8"]; + "0x004fe120" [label="0x004fe120\\nshell_has_settings_window", fillcolor="#f8f8f8"]; + "0x004fe130" [label="0x004fe130\\nshell_mark_settings_window_dirty", fillcolor="#f8f8f8"]; + "0x00500640" [label="0x00500640\\nshell_settings_window_construct", fillcolor="#f8f8f8"]; + "0x00501e50" [label="0x00501e50\\nshell_open_settings_window", fillcolor="#f8f8f8"]; + "0x00501f20" [label="0x00501f20\\nshell_query_registry_open_command_for_http_or_rtf_target", fillcolor="#f8f8f8"]; + "0x00502030" [label="0x00502030\\nshell_setup_window_draw_table_driven_payload_category_row", fillcolor="#f8f8f8"]; + "0x00502160" [label="0x00502160\\nshell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config", fillcolor="#f8f8f8"]; + "0x005021c0" [label="0x005021c0\\nshell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config", fillcolor="#f8f8f8"]; + "0x00502220" [label="0x00502220\\nshell_setup_window_publish_selected_profile_labels_and_preview_surface [seed]", fillcolor="#ffe9a8"]; + "0x00502550" [label="0x00502550\\nshell_setup_window_refresh_selection_lists_and_summary_fields [seed]", fillcolor="#ffe9a8"]; + "0x00502720" [label="0x00502720\\npaint_terrain_tool_init_globals", fillcolor="#f8f8f8"]; + "0x005027b0" [label="0x005027b0\\nshell_setup_window_refresh_file_backed_selection_list_panel [seed]", fillcolor="#ffe9a8"]; + "0x00502910" [label="0x00502910\\nshell_setup_window_refresh_mode_dependent_lists [seed]", fillcolor="#ffe9a8"]; + "0x00502c00" [label="0x00502c00\\nshell_setup_window_select_launch_mode_and_apply_shell_state [seed]", fillcolor="#ffe9a8"]; + "0x005033d0" [label="0x005033d0\\nshell_setup_window_handle_message [seed]", fillcolor="#ffe9a8"]; + "0x00504010" [label="0x00504010\\nshell_setup_window_construct [seed]", fillcolor="#ffe9a8"]; + "0x00504a90" [label="0x00504a90\\nshell_station_detail_clear_active_candidate_service_preview", fillcolor="#f8f8f8"]; + "0x00504ae0" [label="0x00504ae0\\nshell_station_detail_set_active_candidate_service_preview", fillcolor="#f8f8f8"]; + "0x00504ba0" [label="0x00504ba0\\nshell_station_detail_update_candidate_service_entry", fillcolor="#f8f8f8"]; + "0x00504bea" [label="0x00504bea\\nshell_station_detail_format_candidate_local_service_summary", fillcolor="#f8f8f8"]; + "0x005068c0" [label="0x005068c0\\nshell_station_detail_window_construct", fillcolor="#f8f8f8"]; + "0x00506be0" [label="0x00506be0\\nshell_station_detail_format_freight_and_express_summary", fillcolor="#f8f8f8"]; + "0x00509d80" [label="0x00509d80\\nstation_place_window_construct", fillcolor="#f8f8f8"]; + "0x0050ccc0" [label="0x0050ccc0\\nshell_company_detail_attempt_chairmanship_takeover_flow", fillcolor="#f8f8f8"]; + "0x0050e400" [label="0x0050e400\\ntrack_lay_window_construct", fillcolor="#f8f8f8"]; + "0x0050f740" [label="0x0050f740\\nshell_has_live_trainbuy_window", fillcolor="#f8f8f8"]; + "0x0050f750" [label="0x0050f750\\nshell_mark_trainbuy_window_dirty", fillcolor="#f8f8f8"]; + "0x0050f760" [label="0x0050f760\\nshell_trainbuy_window_query_selected_locomotive_id", fillcolor="#f8f8f8"]; + "0x0050f790" [label="0x0050f790\\nshell_trainbuy_window_compute_selected_upgrade_total_and_count", fillcolor="#f8f8f8"]; + "0x0050f890" [label="0x0050f890\\nshell_trainbuy_window_render_selected_train_upgrade_summary", fillcolor="#f8f8f8"]; + "0x0050fc00" [label="0x0050fc00\\nshell_trainbuy_window_render_selected_train_route_and_state_panel", fillcolor="#f8f8f8"]; + "0x00511500" [label="0x00511500\\nshell_trainbuy_window_construct", fillcolor="#f8f8f8"]; + "0x00512080" [label="0x00512080\\nshell_trainbuy_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x00512c50" [label="0x00512c50\\nshell_open_or_focus_trainbuy_window", fillcolor="#f8f8f8"]; + "0x00512f80" [label="0x00512f80\\nshell_trainbuy_window_refresh_selection_side_toggle", fillcolor="#f8f8f8"]; + "0x005130f0" [label="0x005130f0\\nshell_trainbuy_window_query_selected_train_record", fillcolor="#f8f8f8"]; + "0x005131a0" [label="0x005131a0\\nshell_trainbuy_window_selected_train_belongs_to_selected_company", fillcolor="#f8f8f8"]; + "0x00513220" [label="0x00513220\\nshell_trainbuy_window_warn_selected_train_not_owned_by_current_company", fillcolor="#f8f8f8"]; + "0x00513720" [label="0x00513720\\nshell_trainbuy_window_refresh_selection_column_empty_state_labels", fillcolor="#f8f8f8"]; + "0x00514110" [label="0x00514110\\nshell_train_detail_window_refresh_selected_train_name_label", fillcolor="#f8f8f8"]; + "0x00514160" [label="0x00514160\\nshell_train_detail_window_refresh_controls", fillcolor="#f8f8f8"]; + "0x00514420" [label="0x00514420\\nshell_train_detail_window_construct", fillcolor="#f8f8f8"]; + "0x00514620" [label="0x00514620\\nshell_open_or_focus_train_detail_window", fillcolor="#f8f8f8"]; + "0x00514690" [label="0x00514690\\nshell_train_detail_window_handle_message", fillcolor="#f8f8f8"]; + "0x00516be0" [label="0x00516be0\\ntutorial_advance_step_and_refresh_expected_control_ids", fillcolor="#f8f8f8"]; + "0x00516d00" [label="0x00516d00\\ntutorial_validate_train_route_station_indicator_step", fillcolor="#f8f8f8"]; + "0x005174e0" [label="0x005174e0\\nshell_video_window_construct", fillcolor="#f8f8f8"]; + "0x00517570" [label="0x00517570\\nshell_video_window_destroy", fillcolor="#f8f8f8"]; + "0x0051c920" [label="0x0051c920\\nlocalization_lookup_display_label_by_stem_or_fallback", fillcolor="#f8f8f8"]; + "0x0051ebc0" [label="0x0051ebc0\\nshell_reset_display_runtime_defaults", fillcolor="#f8f8f8"]; + "0x0051eea0" [label="0x0051eea0\\nshell_save_display_runtime_config", fillcolor="#f8f8f8"]; + "0x0051ef20" [label="0x0051ef20\\nshell_load_display_runtime_config_or_init_defaults", fillcolor="#f8f8f8"]; + "0x0051fd70" [label="0x0051fd70\\nshell_update_frame_time_history", fillcolor="#f8f8f8"]; + "0x005204b0" [label="0x005204b0\\nshell_flush_deferred_work_queues", fillcolor="#f8f8f8"]; + "0x00520620" [label="0x00520620\\nshell_service_frame_cycle", fillcolor="#f8f8f8"]; + "0x0052b990" [label="0x0052b990\\nshell_refresh_presentation_frame", fillcolor="#f8f8f8"]; + "0x0053f4e0" [label="0x0053f4e0\\nmouse_cursor_update_frame_state", fillcolor="#f8f8f8"]; + "0x0053f830" [label="0x0053f830\\nshell_window_find_registered_child_control_by_id", fillcolor="#f8f8f8"]; + "0x0053f9c0" [label="0x0053f9c0\\nshell_window_register_child_control_sorted_by_priority_and_optional_tag", fillcolor="#f8f8f8"]; + "0x0053fa50" [label="0x0053fa50\\nshell_window_bind_resource_and_initialize_child_control_links", fillcolor="#f8f8f8"]; + "0x00540a47" [label="0x00540a47\\nshell_control_refresh_matching_dynamic_text_payload", fillcolor="#f8f8f8"]; + "0x005411c0" [label="0x005411c0\\nshell_query_tga_header_is_supported_truecolor_image", fillcolor="#f8f8f8"]; + "0x0054f540" [label="0x0054f540\\nshell_input_cursor_inside_active_view", fillcolor="#f8f8f8"]; + "0x0054f710" [label="0x0054f710\\nshell_queue_callout_segment_marker", fillcolor="#f8f8f8"]; + "0x0054fb10" [label="0x0054fb10\\nshell_queue_callout_leader_path", fillcolor="#f8f8f8"]; + "0x005519f0" [label="0x005519f0\\nshell_publish_text_callout_presentation", fillcolor="#f8f8f8"]; + "0x00552560" [label="0x00552560\\nshell_queue_world_anchor_marker", fillcolor="#f8f8f8"]; + "0x00558130" [label="0x00558130\\nshell_child_control_set_owner_resolve_caption_and_refresh", fillcolor="#f8f8f8"]; + "0x005639d2" [label="0x005639d2\\nshell_control_release_dynamic_text_payload", fillcolor="#f8f8f8"]; + "0x00565110" [label="0x00565110\\nshell_rebuild_layout_state_and_optional_texture_report", fillcolor="#f8f8f8"]; + } + subgraph cluster_simulation { + label="simulation"; + color="#cccccc"; + "0x004014b0" [label="0x004014b0\\ncompany_try_buy_unowned_industry_near_city_and_publish_news", fillcolor="#f8f8f8"]; + "0x004019e0" [label="0x004019e0\\ncompany_service_periodic_city_connection_finance_and_linked_transit_lanes", fillcolor="#f8f8f8"]; + "0x00401c50" [label="0x00401c50\\ncompany_evaluate_annual_finance_policy_and_publish_news", fillcolor="#f8f8f8"]; + "0x00404ce0" [label="0x00404ce0\\nsimulation_try_select_and_publish_company_start_or_city_connection_news", fillcolor="#f8f8f8"]; + "0x00405920" [label="0x00405920\\ncompany_query_min_linked_site_distance_to_xy", fillcolor="#f8f8f8"]; + "0x00406050" [label="0x00406050\\ncompany_evaluate_and_publish_city_connection_bonus_news", fillcolor="#f8f8f8"]; + "0x00407bd0" [label="0x00407bd0\\ncompany_rebuild_linked_transit_autoroute_site_score_cache", fillcolor="#f8f8f8"]; + "0x004093d0" [label="0x004093d0\\ncompany_rebuild_linked_transit_site_peer_cache", fillcolor="#f8f8f8"]; + "0x0040a590" [label="0x0040a590\\nsimulation_service_periodic_boundary_work", fillcolor="#f8f8f8"]; + "0x0040ab50" [label="0x0040ab50\\nsimulation_advance_to_target_calendar_point", fillcolor="#f8f8f8"]; + "0x00423d70" [label="0x00423d70\\ncompany_repay_bond_slot_and_compact_debt_table", fillcolor="#f8f8f8"]; + "0x00424010" [label="0x00424010\\ncompany_has_territory_access_rights", fillcolor="#f8f8f8"]; + "0x004248d0" [label="0x004248d0\\ncompany_compute_cached_recent_per_share_performance_subscore", fillcolor="#f8f8f8"]; + "0x00425320" [label="0x00425320\\ncompany_compute_connection_bonus_value_ladder", fillcolor="#f8f8f8"]; + "0x00426260" [label="0x00426260\\ncompany_compute_board_approved_dividend_rate_ceiling", fillcolor="#f8f8f8"]; + "0x00426590" [label="0x00426590\\ncompany_count_linked_transit_sites", fillcolor="#f8f8f8"]; + "0x00426be0" [label="0x00426be0\\ncompany_can_purchase_territory_access_rights", fillcolor="#f8f8f8"]; + "0x00426d60" [label="0x00426d60\\ncompany_deactivate_and_clear_chairman_share_links", fillcolor="#f8f8f8"]; + "0x00426ef0" [label="0x00426ef0\\ncompany_get_linked_chairman_profile_record", fillcolor="#f8f8f8"]; + "0x00429990" [label="0x00429990\\ncompany_collection_get_nth_active_company_id", fillcolor="#f8f8f8"]; + "0x004299f0" [label="0x004299f0\\ncompany_collection_count_active_companies_before_company_id", fillcolor="#f8f8f8"]; + "0x00429a50" [label="0x00429a50\\ncompany_collection_count_active_companies", fillcolor="#f8f8f8"]; + "0x00429c70" [label="0x00429c70\\ncompany_read_derived_financial_report_metric_slot", fillcolor="#f8f8f8"]; + "0x0042a2e0" [label="0x0042a2e0\\ncompany_read_control_transfer_metric_slot", fillcolor="#f8f8f8"]; + "0x0042a5d0" [label="0x0042a5d0\\ncompany_read_year_or_control_transfer_metric_value", fillcolor="#f8f8f8"]; + "0x00436590" [label="0x00436590\\nscenario_state_compute_issue_opinion_multiplier", fillcolor="#f8f8f8"]; + "0x00437b20" [label="0x00437b20\\nsimulation_run_chunked_fast_forward_burst", fillcolor="#f8f8f8"]; + "0x00439140" [label="0x00439140\\nsimulation_frame_accumulate_and_step_world", fillcolor="#f8f8f8"]; + "0x004768c0" [label="0x004768c0\\nchairman_profile_owns_all_company_shares", fillcolor="#f8f8f8"]; + "0x00482d10" [label="0x00482d10\\nruntime_query_cached_local_exe_version_float", fillcolor="#f8f8f8"]; + "0x00482d80" [label="0x00482d80\\nruntime_query_cached_local_exe_version_string", fillcolor="#f8f8f8"]; + "0x00482e00" [label="0x00482e00\\nruntime_query_hundredths_scaled_build_version", fillcolor="#f8f8f8"]; + "0x004ab980" [label="0x004ab980\\ntrain_set_route_operating_mode_and_scalar", fillcolor="#f8f8f8"]; + "0x004b2c10" [label="0x004b2c10\\ntrain_route_list_validate_reachability_and_station_pair", fillcolor="#f8f8f8"]; + "0x004b3000" [label="0x004b3000\\ntrain_route_list_remove_entry_and_compact", fillcolor="#f8f8f8"]; + "0x004b3160" [label="0x004b3160\\ntrain_route_list_insert_staged_entry_at_index", fillcolor="#f8f8f8"]; + "0x004e39e0" [label="0x004e39e0\\ncompany_query_display_year_or_current_year", fillcolor="#f8f8f8"]; + "0x00517cf0" [label="0x00517cf0\\nindexed_collection_slot_count", fillcolor="#f8f8f8"]; + "0x00517d40" [label="0x00517d40\\nindexed_collection_entry_id_is_live", fillcolor="#f8f8f8"]; + "0x00518140" [label="0x00518140\\nindexed_collection_resolve_live_entry_by_id", fillcolor="#f8f8f8"]; + "0x00518380" [label="0x00518380\\nindexed_collection_get_nth_live_entry_id", fillcolor="#f8f8f8"]; + } + subgraph cluster_support { + label="support"; + color="#cccccc"; + "0x0051db80" [label="0x0051db80\\nmath_measure_float_xy_pair_distance", fillcolor="#f8f8f8"]; + "0x00559520" [label="0x00559520\\nsurface_init_rgba_pixel_buffer", fillcolor="#f8f8f8"]; + "0x0055d8d0" [label="0x0055d8d0\\ndisplay_get_primary_adapter_descriptor", fillcolor="#f8f8f8"]; + } + "0x004010f0" -> "0x00406050"; + "0x004010f0" -> "0x00424010"; + "0x004014b0" -> "0x004019e0"; + "0x004014b0" -> "0x00426590"; + "0x004014b0" -> "0x0051c920"; + "0x004019e0" -> "0x004014b0"; + "0x004019e0" -> "0x00401c50"; + "0x004019e0" -> "0x00404ce0"; + "0x004019e0" -> "0x00406050"; + "0x004019e0" -> "0x00407bd0"; + "0x004019e0" -> "0x004093d0"; + "0x004019e0" -> "0x0049bd40"; + "0x00401c50" -> "0x004019e0"; + "0x00401c50" -> "0x00423d70"; + "0x00401c50" -> "0x00426260"; + "0x00401c50" -> "0x0042a5d0"; + "0x00402c90" -> "0x00518140"; + "0x00402cb0" -> "0x00404640"; + "0x00402cb0" -> "0x004046a0"; + "0x00402cb0" -> "0x00404c60"; + "0x00402cb0" -> "0x00404ce0"; + "0x00402cb0" -> "0x0040ef10"; + "0x00402cb0" -> "0x004134d0"; + "0x00402cb0" -> "0x00417840"; + "0x00402cb0" -> "0x004197e0"; + "0x00402cb0" -> "0x00482e00"; + "0x00402cb0" -> "0x004a01a0"; + "0x00404640" -> "0x00402cb0"; + "0x00404640" -> "0x004046a0"; + "0x004046a0" -> "0x00402cb0"; + "0x004046a0" -> "0x00404640"; + "0x004046a0" -> "0x00406050"; + "0x004046a0" -> "0x00420280"; + "0x00404c60" -> "0x00402cb0"; + "0x00404c60" -> "0x00404ce0"; + "0x00404ce0" -> "0x004010f0"; + "0x00404ce0" -> "0x00404c60"; + "0x00404ce0" -> "0x00406050"; + "0x00404ce0" -> "0x00420030"; + "0x00404ce0" -> "0x00424010"; + "0x00404ce0" -> "0x0042a5d0"; + "0x00405920" -> "0x00406050"; + "0x00405920" -> "0x0047efe0"; + "0x00406050" -> "0x004010f0"; + "0x00406050" -> "0x004046a0"; + "0x00406050" -> "0x00405920"; + "0x00406050" -> "0x00425320"; + "0x00406050" -> "0x00426590"; + "0x00406050" -> "0x00426ef0"; + "0x00406050" -> "0x0042a5d0"; + "0x00407bd0" -> "0x0047e330"; + "0x00407bd0" -> "0x004a65b0"; + "0x004093d0" -> "0x00405920"; + "0x004093d0" -> "0x00407bd0"; + "0x004093d0" -> "0x0047efe0"; + "0x004093d0" -> "0x004a6630"; + "0x0040a590" -> "0x00413580"; + "0x0040a590" -> "0x00445de0"; + "0x0040ab50" -> "0x00437b20"; + "0x0040ab50" -> "0x00439140"; + "0x0040e360" -> "0x0040eba0"; + "0x0040e360" -> "0x0040ee10"; + "0x0040e450" -> "0x004133b0"; + "0x0040e450" -> "0x00414470"; + "0x0040e450" -> "0x00416e20"; + "0x0040e450" -> "0x00418a60"; + "0x0040eba0" -> "0x0040e360"; + "0x0040eba0" -> "0x0040ee10"; + "0x0040eba0" -> "0x0040ef10"; + "0x0040ee10" -> "0x0040e360"; + "0x0040ee10" -> "0x004133b0"; + "0x0040ee10" -> "0x00415f20"; + "0x0040ee10" -> "0x00434050"; + "0x0040ef10" -> "0x0040eba0"; + "0x0040ef10" -> "0x004101e0"; + "0x004101e0" -> "0x0040fef0"; + "0x004101e0" -> "0x00436590"; + "0x004101e0" -> "0x00482e00"; + "0x00412ca0" -> "0x004235c0"; + "0x004133b0" -> "0x0040e450"; + "0x004133b0" -> "0x0040ee10"; + "0x004133b0" -> "0x00413f50"; + "0x004133b0" -> "0x00414480"; + "0x004134d0" -> "0x00422ee0"; + "0x00413580" -> "0x004101e0"; + "0x00413f50" -> "0x004133b0"; + "0x00414470" -> "0x0040e450"; + "0x00414470" -> "0x00418a60"; + "0x00414480" -> "0x004133b0"; + "0x00415f20" -> "0x0040ee10"; + "0x00416e20" -> "0x0040e450"; + "0x00416e20" -> "0x00517cf0"; + "0x00416e20" -> "0x00518140"; + "0x00416e20" -> "0x00518380"; + "0x00417840" -> "0x00402cb0"; + "0x00417840" -> "0x004197e0"; + "0x00418a60" -> "0x0040e450"; + "0x004197e0" -> "0x00402cb0"; + "0x004197e0" -> "0x00417840"; + "0x004197e0" -> "0x00424010"; + "0x0041e2b0" -> "0x0041e220"; + "0x0041e2b0" -> "0x0041ea50"; + "0x0041e650" -> "0x004e9460"; + "0x0041e650" -> "0x00517cf0"; + "0x0041e650" -> "0x00518140"; + "0x0041e650" -> "0x00518380"; + "0x0041ea50" -> "0x0041e2b0"; + "0x0041ea50" -> "0x00518140"; + "0x0041ea50" -> "0x00518380"; + "0x0041f9b0" -> "0x004235c0"; + "0x00420030" -> "0x004207d0"; + "0x00420030" -> "0x0047efe0"; + "0x00420280" -> "0x004207d0"; + "0x004207d0" -> "0x00420030"; + "0x004207d0" -> "0x00420280"; + "0x004207d0" -> "0x0047efe0"; + "0x00421b60" -> "0x004384d0"; + "0x00421c20" -> "0x004235c0"; + "0x00422900" -> "0x004235c0"; + "0x00422be0" -> "0x004235c0"; + "0x00422ee0" -> "0x004134d0"; + "0x00422ee0" -> "0x004235c0"; + "0x004235c0" -> "0x00412ca0"; + "0x004235c0" -> "0x0041f9b0"; + "0x004235c0" -> "0x0041fac0"; + "0x004235c0" -> "0x00422900"; + "0x004235c0" -> "0x00422be0"; + "0x004235c0" -> "0x00422ee0"; + "0x00424010" -> "0x004c1b60"; + "0x00424010" -> "0x004c5fc9"; + "0x004248d0" -> "0x0042a5d0"; + "0x00425320" -> "0x00406050"; + "0x00425320" -> "0x0042a5d0"; + "0x00425880" -> "0x0042a5d0"; + "0x00425880" -> "0x004e9b20"; + "0x004258c0" -> "0x0042a5d0"; + "0x004258c0" -> "0x004e9b20"; + "0x00426260" -> "0x004c5140"; + "0x00426590" -> "0x00406050"; + "0x00426590" -> "0x0047efe0"; + "0x00426be0" -> "0x004c1b60"; + "0x00426be0" -> "0x004c5fc9"; + "0x00426ef0" -> "0x004e5cf0"; + "0x00426ef0" -> "0x00518140"; + "0x00429990" -> "0x00518380"; + "0x004299f0" -> "0x00429990"; + "0x004299f0" -> "0x00518380"; + "0x00429a50" -> "0x00518140"; + "0x00429a50" -> "0x00518380"; + "0x00429c70" -> "0x0042a5d0"; + "0x0042a2e0" -> "0x00429c70"; + "0x0042a5d0" -> "0x00429c70"; + "0x0042a5d0" -> "0x0042a2e0"; + "0x0042cab0" -> "0x0040fef0"; + "0x0042cab0" -> "0x004101e0"; + "0x0042e050" -> "0x004db8b0"; + "0x00433130" -> "0x00517cf0"; + "0x00433130" -> "0x00518140"; + "0x00433130" -> "0x00518380"; + "0x004333f0" -> "0x004336a0"; + "0x004333f0" -> "0x004839b0"; + "0x004333f0" -> "0x004839e0"; + "0x004333f0" -> "0x0051c920"; + "0x004336a0" -> "0x004333f0"; + "0x004336a0" -> "0x00502c00"; + "0x00433b00" -> "0x00512c50"; + "0x00434050" -> "0x00445de0"; + "0x00434050" -> "0x004b9e10"; + "0x00434050" -> "0x004bb9e0"; + "0x00434300" -> "0x00443a50"; + "0x00434300" -> "0x00446d40"; + "0x00434300" -> "0x00482ec0"; + "0x004348c0" -> "0x00434890"; + "0x00437220" -> "0x004384d0"; + "0x004377a0" -> "0x004cc2d0"; + "0x00437b20" -> "0x004384d0"; + "0x004384d0" -> "0x004133b0"; + "0x004384d0" -> "0x0041ea50"; + "0x004384d0" -> "0x00421b60"; + "0x004384d0" -> "0x00421c20"; + "0x004384d0" -> "0x00437220"; + "0x004384d0" -> "0x004377a0"; + "0x004384d0" -> "0x00437b20"; + "0x004384d0" -> "0x0044fb70"; + "0x004384d0" -> "0x0047d440"; + "0x004384d0" -> "0x004882e0"; + "0x00438890" -> "0x004384d0"; + "0x00438890" -> "0x00445ac0"; + "0x00438890" -> "0x005033d0"; + "0x00439140" -> "0x0040ab50"; + "0x00439140" -> "0x0043db00"; + "0x00439140" -> "0x00483f70"; + "0x00439140" -> "0x004b9d70"; + "0x00439140" -> "0x004b9d80"; + "0x00439140" -> "0x004c8670"; + "0x00439140" -> "0x004c8680"; + "0x00439140" -> "0x004dc7d0"; + "0x00439140" -> "0x004dc7e0"; + "0x00439140" -> "0x004e0720"; + "0x00439140" -> "0x004e1f50"; + "0x00439140" -> "0x004e1f60"; + "0x00439140" -> "0x004e4ee0"; + "0x00439140" -> "0x004f2e80"; + "0x00439140" -> "0x004f2e90"; + "0x00439140" -> "0x004fe120"; + "0x00439140" -> "0x004fe130"; + "0x00439140" -> "0x0050f740"; + "0x00439140" -> "0x0050f750"; + "0x00439e40" -> "0x0043d740"; + "0x0043af60" -> "0x0043db00"; + "0x0043b030" -> "0x0043db00"; + "0x0043d050" -> "0x0043d130"; + "0x0043d740" -> "0x0043d130"; + "0x0043d740" -> "0x0043db00"; + "0x0043db00" -> "0x0043af60"; + "0x0043db00" -> "0x0043b030"; + "0x0043db00" -> "0x0043cc30"; + "0x0043db00" -> "0x0043d740"; + "0x0043f640" -> "0x00420030"; + "0x0043f640" -> "0x004207d0"; + "0x0043f640" -> "0x0046b780"; + "0x0043f640" -> "0x0047e240"; + "0x0043f640" -> "0x0047e690"; + "0x0043f640" -> "0x0047efe0"; + "0x0043f640" -> "0x00504ae0"; + "0x00443a50" -> "0x00438890"; + "0x00443a50" -> "0x00482ec0"; + "0x00445ac0" -> "0x00443a50"; + "0x00445ac0" -> "0x00446d40"; + "0x00445ac0" -> "0x004dd010"; + "0x00445de0" -> "0x00434050"; + "0x00445de0" -> "0x00444dd0"; + "0x00445de0" -> "0x00446240"; + "0x00445de0" -> "0x004dd010"; + "0x00446240" -> "0x00445de0"; + "0x00464410" -> "0x00484590"; + "0x00464410" -> "0x004853c0"; + "0x00464410" -> "0x004886e0"; + "0x00464410" -> "0x00489830"; + "0x00464410" -> "0x00489a20"; + "0x00464410" -> "0x0051ebc0"; + "0x00467eb0" -> "0x0041e650"; + "0x00467eb0" -> "0x0047e690"; + "0x004682c0" -> "0x00517cf0"; + "0x004682c0" -> "0x00518140"; + "0x004682c0" -> "0x00518380"; + "0x00469720" -> "0x005519f0"; + "0x0046a6c0" -> "0x00482d80"; + "0x0046b780" -> "0x00438890"; + "0x0046b780" -> "0x00445ac0"; + "0x004768c0" -> "0x004e5cf0"; + "0x00477820" -> "0x0047d440"; + "0x00477860" -> "0x0047d440"; + "0x0047d080" -> "0x004c6f30"; + "0x0047d080" -> "0x004c98a0"; + "0x0047d440" -> "0x004377a0"; + "0x0047d440" -> "0x00477820"; + "0x0047d440" -> "0x00477860"; + "0x0047e240" -> "0x0041e220"; + "0x0047e330" -> "0x0047e240"; + "0x0047e330" -> "0x00518380"; + "0x0047f010" -> "0x0047e690"; + "0x00481390" -> "0x00518140"; + "0x00482d10" -> "0x00482d80"; + "0x00482d10" -> "0x00482e00"; + "0x00482d80" -> "0x0046a6c0"; + "0x00482d80" -> "0x00482d10"; + "0x00482e00" -> "0x00402cb0"; + "0x00482e00" -> "0x00482d10"; + "0x00482e00" -> "0x004a65b0"; + "0x00482ec0" -> "0x00438890"; + "0x00482ec0" -> "0x00443a50"; + "0x00482ec0" -> "0x004840e0"; + "0x00482ec0" -> "0x004b8dc0"; + "0x00482ec0" -> "0x004b8e60"; + "0x00482ec0" -> "0x004c7bc0"; + "0x00482ec0" -> "0x004c7fc0"; + "0x00482ec0" -> "0x004dfbe0"; + "0x00482ec0" -> "0x004dfd70"; + "0x00482ec0" -> "0x004ea620"; + "0x00482ec0" -> "0x004ea730"; + "0x00482ec0" -> "0x004efe80"; + "0x00482ec0" -> "0x00504010"; + "0x00482ec0" -> "0x005174e0"; + "0x00482ec0" -> "0x00517570"; + "0x004839b0" -> "0x004333f0"; + "0x004839e0" -> "0x004333f0"; + "0x004840e0" -> "0x00482ec0"; + "0x004840e0" -> "0x00483f70"; + "0x004840e0" -> "0x00521390"; + "0x00484910" -> "0x0051eea0"; + "0x00484980" -> "0x00484590"; + "0x00484980" -> "0x00484910"; + "0x00484980" -> "0x0051ef20"; + "0x00484a60" -> "0x004853c0"; + "0x00485060" -> "0x00484910"; + "0x00485060" -> "0x00484d70"; + "0x004852e0" -> "0x00484910"; + "0x004852e0" -> "0x00484d70"; + "0x004853c0" -> "0x00484910"; + "0x004853c0" -> "0x00484d70"; + "0x004853c0" -> "0x00485060"; + "0x004882e0" -> "0x004384d0"; + "0x004886e0" -> "0x004883f0"; + "0x00489a20" -> "0x004886e0"; + "0x00489a20" -> "0x00489830"; + "0x00494240" -> "0x00518140"; + "0x0049bd40" -> "0x004019e0"; + "0x0049bd40" -> "0x00402cb0"; + "0x0049bd40" -> "0x004a6630"; + "0x0049bd40" -> "0x0051db80"; + "0x004a01a0" -> "0x00402cb0"; + "0x004a01a0" -> "0x00518140"; + "0x004a5280" -> "0x004a65b0"; + "0x004a5900" -> "0x00424010"; + "0x004a5900" -> "0x004a5280"; + "0x004a5900" -> "0x004a65b0"; + "0x004a65b0" -> "0x00482e00"; + "0x004a65b0" -> "0x004a5280"; + "0x004a65b0" -> "0x004a5900"; + "0x004a65b0" -> "0x004a6630"; + "0x004a6630" -> "0x004093d0"; + "0x004a6630" -> "0x0049bd40"; + "0x004a6630" -> "0x004a65b0"; + "0x004a6630" -> "0x004b2c10"; + "0x004ab980" -> "0x00434050"; + "0x004b2c10" -> "0x004a6630"; + "0x004b3160" -> "0x00516d00"; + "0x004b8dc0" -> "0x004b8e60"; + "0x004b9a20" -> "0x004b99c0"; + "0x004b9d70" -> "0x00439140"; + "0x004b9d80" -> "0x00439140"; + "0x004b9e10" -> "0x004bb9e0"; + "0x004b9fd0" -> "0x0047e240"; + "0x004b9fd0" -> "0x004b99c0"; + "0x004ba3d0" -> "0x004b9a20"; + "0x004ba3d0" -> "0x004bad20"; + "0x004ba3d0" -> "0x00517d40"; + "0x004ba3d0" -> "0x00518140"; + "0x004ba3d0" -> "0x0051c920"; + "0x004bad20" -> "0x004ba3d0"; + "0x004baef0" -> "0x004b9a20"; + "0x004baef0" -> "0x004ba3d0"; + "0x004baef0" -> "0x004bad20"; + "0x004baef0" -> "0x004bb9e0"; + "0x004bb9e0" -> "0x00434050"; + "0x004bb9e0" -> "0x004b9a20"; + "0x004bb9e0" -> "0x004b9e10"; + "0x004bb9e0" -> "0x004bad20"; + "0x004bb9e0" -> "0x004c98a0"; + "0x004bc0a0" -> "0x004baef0"; + "0x004bc0a0" -> "0x004bc100"; + "0x004bc0a0" -> "0x0053fa50"; + "0x004bc100" -> "0x004bc0a0"; + "0x004bfb30" -> "0x0042a5d0"; + "0x004bfb30" -> "0x004c1ab0"; + "0x004bfb30" -> "0x004c6b40"; + "0x004c1610" -> "0x004c2ca0"; + "0x004c16f0" -> "0x00518140"; + "0x004c1730" -> "0x0042a5d0"; + "0x004c1730" -> "0x004c5540"; + "0x004c1ab0" -> "0x004bfb30"; + "0x004c1ab0" -> "0x004c1730"; + "0x004c1ab0" -> "0x004c5540"; + "0x004c1b60" -> "0x004c1d30"; + "0x004c1b60" -> "0x004c1d70"; + "0x004c1b60" -> "0x004c22e0"; + "0x004c1d30" -> "0x004c1b60"; + "0x004c1d70" -> "0x00424010"; + "0x004c1d70" -> "0x0054f710"; + "0x004c1ec0" -> "0x004c1610"; + "0x004c1ec0" -> "0x004c5540"; + "0x004c22e0" -> "0x004c1b60"; + "0x004c23a0" -> "0x00425320"; + "0x004c23a0" -> "0x0042a5d0"; + "0x004c2ca0" -> "0x00434870"; + "0x004c2ca0" -> "0x004c5540"; + "0x004c2ca0" -> "0x004c56a0"; + "0x004c2ca0" -> "0x004e5cf0"; + "0x004c2ca0" -> "0x00540a47"; + "0x004c2ca0" -> "0x005639d2"; + "0x004c3470" -> "0x00429990"; + "0x004c3470" -> "0x004299f0"; + "0x004c3470" -> "0x00429a50"; + "0x004c3470" -> "0x004c2ca0"; + "0x004c3470" -> "0x004c3540"; + "0x004c3470" -> "0x004c3550"; + "0x004c3540" -> "0x004c3470"; + "0x004c3550" -> "0x004c3470"; + "0x004c3560" -> "0x004c3890"; + "0x004c3560" -> "0x004c98a0"; + "0x004c3890" -> "0x004c3560"; + "0x004c3890" -> "0x004c56a0"; + "0x004c3b50" -> "0x004c3f30"; + "0x004c3b50" -> "0x004c98a0"; + "0x004c3f30" -> "0x004c56a0"; + "0x004c4300" -> "0x004c46d0"; + "0x004c4300" -> "0x004c98a0"; + "0x004c46d0" -> "0x004c4300"; + "0x004c46d0" -> "0x004c56a0"; + "0x004c4c70" -> "0x004c4e30"; + "0x004c4c70" -> "0x004c5140"; + "0x004c4c70" -> "0x004c5360"; + "0x004c4c70" -> "0x0053f9c0"; + "0x004c4e30" -> "0x004c5360"; + "0x004c4e30" -> "0x004c98a0"; + "0x004c5140" -> "0x00426260"; + "0x004c5140" -> "0x004c5360"; + "0x004c5140" -> "0x004c98a0"; + "0x004c5360" -> "0x004c4c70"; + "0x004c5360" -> "0x004c4e30"; + "0x004c5360" -> "0x004c5140"; + "0x004c5360" -> "0x004c56a0"; + "0x004c5540" -> "0x004c1730"; + "0x004c5540" -> "0x004c1ab0"; + "0x004c5540" -> "0x004c1d30"; + "0x004c5540" -> "0x004c1d70"; + "0x004c5540" -> "0x004c1ec0"; + "0x004c5540" -> "0x004c22e0"; + "0x004c5540" -> "0x004c2ca0"; + "0x004c5540" -> "0x0053fa50"; + "0x004c56a0" -> "0x00423d70"; + "0x004c56a0" -> "0x00426d60"; + "0x004c56a0" -> "0x004c2ca0"; + "0x004c56a0" -> "0x004c3890"; + "0x004c56a0" -> "0x004c3f30"; + "0x004c56a0" -> "0x004c46d0"; + "0x004c56a0" -> "0x004c5360"; + "0x004c56a0" -> "0x004c5a0e"; + "0x004c56a0" -> "0x004c5b99"; + "0x004c56a0" -> "0x004c5fc9"; + "0x004c56a0" -> "0x004ddbd0"; + "0x004c56a0" -> "0x004ec640"; + "0x004c56a0" -> "0x0050ccc0"; + "0x004c5a0e" -> "0x004c56a0"; + "0x004c5b99" -> "0x004c56a0"; + "0x004c5fc9" -> "0x004c56a0"; + "0x004c6b40" -> "0x004bfb30"; + "0x004c6b40" -> "0x004c6c30"; + "0x004c6c30" -> "0x00434870"; + "0x004c6f30" -> "0x0047d080"; + "0x004c6f30" -> "0x004c6bb0"; + "0x004c6f30" -> "0x004c6c30"; + "0x004c6f30" -> "0x004ddbd0"; + "0x004c7bc0" -> "0x004c7fc0"; + "0x004c7fc0" -> "0x0053fa50"; + "0x004c8670" -> "0x00439140"; + "0x004c8680" -> "0x00439140"; + "0x004c98a0" -> "0x004ee0e0"; + "0x004ca1c0" -> "0x004cc2d0"; + "0x004ca1c0" -> "0x004cecc0"; + "0x004cc250" -> "0x004ca1c0"; + "0x004cc250" -> "0x004cc2d0"; + "0x004cc250" -> "0x004cecc0"; + "0x004cc2d0" -> "0x004c9da0"; + "0x004cecc0" -> "0x004cc2d0"; + "0x004d4500" -> "0x0053fa50"; + "0x004d57c0" -> "0x0053fa50"; + "0x004d5d00" -> "0x004d6090"; + "0x004d5d00" -> "0x004d6d60"; + "0x004d5d00" -> "0x004d7060"; + "0x004d5f50" -> "0x004d6090"; + "0x004d5f50" -> "0x004d6d60"; + "0x004d5f50" -> "0x004d7060"; + "0x004d6090" -> "0x004d6d60"; + "0x004d6090" -> "0x004d7060"; + "0x004d67f0" -> "0x004d6d60"; + "0x004d67f0" -> "0x004d7060"; + "0x004d6d60" -> "0x0053fa50"; + "0x004d7060" -> "0x004d5d00"; + "0x004d7060" -> "0x004d5f50"; + "0x004d7060" -> "0x004d6090"; + "0x004d7060" -> "0x004d67f0"; + "0x004d8120" -> "0x004da640"; + "0x004d8120" -> "0x004da700"; + "0x004d88f0" -> "0x004da7c0"; + "0x004d88f0" -> "0x004da860"; + "0x004d88f0" -> "0x004db120"; + "0x004d9970" -> "0x004da640"; + "0x004d9970" -> "0x004da700"; + "0x004d9dc0" -> "0x004d57c0"; + "0x004d9dc0" -> "0x004da640"; + "0x004d9dc0" -> "0x004da700"; + "0x004d9e40" -> "0x004d6d60"; + "0x004d9e40" -> "0x004da7c0"; + "0x004d9e40" -> "0x004da860"; + "0x004da0f0" -> "0x004d9970"; + "0x004da640" -> "0x004d8120"; + "0x004da640" -> "0x004d9970"; + "0x004da640" -> "0x004d9dc0"; + "0x004da700" -> "0x004d8120"; + "0x004da700" -> "0x004d9970"; + "0x004da700" -> "0x004d9dc0"; + "0x004da7c0" -> "0x004d88f0"; + "0x004da7c0" -> "0x004d9e40"; + "0x004da7c0" -> "0x004da0f0"; + "0x004da860" -> "0x004d88f0"; + "0x004da860" -> "0x004d9e40"; + "0x004da860" -> "0x004da0f0"; + "0x004db120" -> "0x004d8120"; + "0x004db120" -> "0x004d88f0"; + "0x004db120" -> "0x004d9970"; + "0x004db8b0" -> "0x0042e050"; + "0x004db8b0" -> "0x004c98a0"; + "0x004db8b0" -> "0x004d7ef0"; + "0x004db8b0" -> "0x004db120"; + "0x004dba90" -> "0x004c98a0"; + "0x004dba90" -> "0x004d7ef0"; + "0x004dba90" -> "0x004db120"; + "0x004dbb80" -> "0x004db8b0"; + "0x004dbb80" -> "0x004dba90"; + "0x004dbe7a" -> "0x004c98a0"; + "0x004dc670" -> "0x0053fa50"; + "0x004dc7d0" -> "0x00439140"; + "0x004dc7e0" -> "0x00439140"; + "0x004dc7f0" -> "0x004fe120"; + "0x004dc7f0" -> "0x00501e50"; + "0x004dd010" -> "0x004839b0"; + "0x004ddbd0" -> "0x004d4500"; + "0x004dfbe0" -> "0x004dfd70"; + "0x004dfbe0" -> "0x004dfdf0"; + "0x004dfbe0" -> "0x0053fa50"; + "0x004dfdf0" -> "0x0053fa50"; + "0x004e0210" -> "0x004e0720"; + "0x004e0780" -> "0x0043d130"; + "0x004e0780" -> "0x004e0ba0"; + "0x004e0780" -> "0x0054f540"; + "0x004e0960" -> "0x004e0b20"; + "0x004e0960" -> "0x004e0ba0"; + "0x004e0b20" -> "0x004e0e40"; + "0x004e0b20" -> "0x0053fa50"; + "0x004e0ba0" -> "0x0053f830"; + "0x004e0e40" -> "0x004e0b20"; + "0x004e1d60" -> "0x004e2c10"; + "0x004e1f50" -> "0x00439140"; + "0x004e1f60" -> "0x00439140"; + "0x004e2c10" -> "0x004e3a00"; + "0x004e2c10" -> "0x004e3a80"; + "0x004e2c10" -> "0x004e45d0"; + "0x004e39e0" -> "0x004e5cf0"; + "0x004e3a00" -> "0x00429990"; + "0x004e3a00" -> "0x00429a50"; + "0x004e3a00" -> "0x004e2c10"; + "0x004e3a80" -> "0x004ddbd0"; + "0x004e3a80" -> "0x004e2c10"; + "0x004e3a80" -> "0x004e3a00"; + "0x004e3a80" -> "0x004e45d0"; + "0x004e3a80" -> "0x004e5300"; + "0x004e3a80" -> "0x004e5a80"; + "0x004e3a80" -> "0x004e5cf0"; + "0x004e45d0" -> "0x00477820"; + "0x004e45d0" -> "0x004e2c10"; + "0x004e45d0" -> "0x004e39e0"; + "0x004e45d0" -> "0x004e3a00"; + "0x004e45d0" -> "0x004e3a80"; + "0x004e45d0" -> "0x00518380"; + "0x004e4b10" -> "0x004e4ee0"; + "0x004e4ee0" -> "0x004e2c10"; + "0x004e4ee0" -> "0x004e4b10"; + "0x004e5130" -> "0x004ea060"; + "0x004e51ea" -> "0x004ea060"; + "0x004e5300" -> "0x00429a50"; + "0x004e5300" -> "0x004348c0"; + "0x004e5a80" -> "0x00434870"; + "0x004e5a80" -> "0x004e5cf0"; + "0x004e5cf0" -> "0x00426ef0"; + "0x004e5cf0" -> "0x0042a5d0"; + "0x004e5cf0" -> "0x004768c0"; + "0x004e5cf0" -> "0x004c56a0"; + "0x004e5cf0" -> "0x004e39e0"; + "0x004e68e0" -> "0x00429a50"; + "0x004e68e0" -> "0x0042a5d0"; + "0x004e6ef0" -> "0x00477820"; + "0x004e6ef0" -> "0x00477860"; + "0x004e7670" -> "0x004e39e0"; + "0x004e8bb0" -> "0x00426590"; + "0x004e9460" -> "0x0041e220"; + "0x004e9460" -> "0x0041e650"; + "0x004e9b20" -> "0x00425880"; + "0x004e9b20" -> "0x004258c0"; + "0x004e9b20" -> "0x0042a5d0"; + "0x004e9b20" -> "0x004ea060"; + "0x004ea060" -> "0x004e5130"; + "0x004ea060" -> "0x004e51ea"; + "0x004ea060" -> "0x004e5300"; + "0x004ea060" -> "0x004e5a80"; + "0x004ea060" -> "0x004e68e0"; + "0x004ea060" -> "0x004e6ef0"; + "0x004ea060" -> "0x004e7670"; + "0x004ea060" -> "0x004e8270"; + "0x004ea060" -> "0x004e8bb0"; + "0x004ea060" -> "0x004e9460"; + "0x004ea060" -> "0x004e9b20"; + "0x004ea620" -> "0x004e3a80"; + "0x004ea620" -> "0x004e5300"; + "0x004ea620" -> "0x004e5a80"; + "0x004ea620" -> "0x004e5cf0"; + "0x004ea620" -> "0x004ea720"; + "0x004ea620" -> "0x004ea730"; + "0x004ea620" -> "0x0053fa50"; + "0x004ea720" -> "0x004ea620"; + "0x004ea720" -> "0x004ea730"; + "0x004ea730" -> "0x004ea620"; + "0x004ec640" -> "0x004c56a0"; + "0x004ee0e0" -> "0x00484910"; + "0x004ee0e0" -> "0x004c98a0"; + "0x004ee1d0" -> "0x00484910"; + "0x004ee3a0" -> "0x00482ec0"; + "0x004ee810" -> "0x0053f830"; + "0x004ee950" -> "0x004efe80"; + "0x004ee950" -> "0x0053f830"; + "0x004eed30" -> "0x004ee950"; + "0x004f2e80" -> "0x00439140"; + "0x004f2e80" -> "0x004f3a10"; + "0x004f2e90" -> "0x00439140"; + "0x004f38a0" -> "0x004f3a10"; + "0x004f38a0" -> "0x0053fa50"; + "0x004f38f0" -> "0x004c98a0"; + "0x004f3a10" -> "0x004f38a0"; + "0x004fe130" -> "0x00439140"; + "0x004fe130" -> "0x00501e50"; + "0x00500640" -> "0x0053fa50"; + "0x00502030" -> "0x00504010"; + "0x00502030" -> "0x00552560"; + "0x00502160" -> "0x00484910"; + "0x00502160" -> "0x005021c0"; + "0x00502160" -> "0x00504010"; + "0x005021c0" -> "0x00484910"; + "0x005021c0" -> "0x00502160"; + "0x005021c0" -> "0x00504010"; + "0x00502220" -> "0x00502c00"; + "0x00502220" -> "0x0053f830"; + "0x00502220" -> "0x00559520"; + "0x00502720" -> "0x004ee3a0"; + "0x005027b0" -> "0x004336a0"; + "0x005027b0" -> "0x00502220"; + "0x005027b0" -> "0x00502c00"; + "0x00502910" -> "0x005027b0"; + "0x00502910" -> "0x00502c00"; + "0x00502c00" -> "0x004336a0"; + "0x00502c00" -> "0x00438890"; + "0x00502c00" -> "0x00482d80"; + "0x00502c00" -> "0x004eb0b0"; + "0x00502c00" -> "0x005027b0"; + "0x00502c00" -> "0x00502910"; + "0x00502c00" -> "0x005033d0"; + "0x005033d0" -> "0x0042a970"; + "0x005033d0" -> "0x00484910"; + "0x005033d0" -> "0x004eb0b0"; + "0x005033d0" -> "0x004fe120"; + "0x005033d0" -> "0x00501e50"; + "0x005033d0" -> "0x00501f20"; + "0x005033d0" -> "0x00502220"; + "0x005033d0" -> "0x00502550"; + "0x005033d0" -> "0x00502910"; + "0x005033d0" -> "0x00502c00"; + "0x005033d0" -> "0x00504010"; + "0x005033d0" -> "0x005411c0"; + "0x00504010" -> "0x00502030"; + "0x00504010" -> "0x00502160"; + "0x00504010" -> "0x005021c0"; + "0x00504010" -> "0x00502550"; + "0x00504010" -> "0x00502910"; + "0x00504010" -> "0x00502c00"; + "0x00504010" -> "0x0053f830"; + "0x00504010" -> "0x0053f9c0"; + "0x00504010" -> "0x0053fa50"; + "0x00504ae0" -> "0x0043f640"; + "0x00504ae0" -> "0x00504a90"; + "0x00504ba0" -> "0x0047e240"; + "0x00504ba0" -> "0x00504a90"; + "0x00504ba0" -> "0x00504ae0"; + "0x00504bea" -> "0x0047e240"; + "0x00504bea" -> "0x00504ae0"; + "0x005068c0" -> "0x0053fa50"; + "0x00506be0" -> "0x005519f0"; + "0x00509d80" -> "0x0053fa50"; + "0x0050ccc0" -> "0x004c56a0"; + "0x0050e400" -> "0x0053fa50"; + "0x0050f740" -> "0x00439140"; + "0x0050f740" -> "0x00512c50"; + "0x0050f750" -> "0x00439140"; + "0x0050f790" -> "0x0050f760"; + "0x0050f790" -> "0x0050f890"; + "0x0050f890" -> "0x0050f760"; + "0x0050f890" -> "0x0050f790"; + "0x0050f890" -> "0x00511500"; + "0x0050fc00" -> "0x005519f0"; + "0x0050fc00" -> "0x00552560"; + "0x00511500" -> "0x0050f890"; + "0x00511500" -> "0x0050fc00"; + "0x00511500" -> "0x00512080"; + "0x00511500" -> "0x00512c50"; + "0x00511500" -> "0x0053fa50"; + "0x00512080" -> "0x00511500"; + "0x00512c50" -> "0x00433b00"; + "0x00512c50" -> "0x00511500"; + "0x00512c50" -> "0x00512080"; + "0x005130f0" -> "0x00518140"; + "0x005131a0" -> "0x00513220"; + "0x00513220" -> "0x004c98a0"; + "0x00514110" -> "0x00514420"; + "0x00514160" -> "0x00513720"; + "0x00514160" -> "0x00514420"; + "0x00514160" -> "0x00514620"; + "0x00514160" -> "0x00514690"; + "0x00514420" -> "0x00512f80"; + "0x00514420" -> "0x00514160"; + "0x00514420" -> "0x00514620"; + "0x00514420" -> "0x0053fa50"; + "0x00514690" -> "0x004ab980"; + "0x00514690" -> "0x004b2c10"; + "0x00514690" -> "0x004b3000"; + "0x00514690" -> "0x004b3160"; + "0x00514690" -> "0x00512c50"; + "0x00514690" -> "0x005130f0"; + "0x00514690" -> "0x00513220"; + "0x00514690" -> "0x00514160"; + "0x00516d00" -> "0x004b3160"; + "0x00516d00" -> "0x004c98a0"; + "0x00516d00" -> "0x00516be0"; + "0x005174e0" -> "0x0053fa50"; + "0x00517570" -> "0x00484910"; + "0x00517570" -> "0x005174e0"; + "0x00517cf0" -> "0x00518380"; + "0x00517d40" -> "0x004ba3d0"; + "0x00517d40" -> "0x00518140"; + "0x0051c920" -> "0x004ba3d0"; + "0x0051db80" -> "0x00402cb0"; + "0x0051db80" -> "0x0049bd40"; + "0x0051ef20" -> "0x0051ebc0"; + "0x0051ef20" -> "0x0051eea0"; + "0x005204b0" -> "0x00443a50"; + "0x00520620" -> "0x0051fd70"; + "0x00520620" -> "0x005204b0"; + "0x00520620" -> "0x0052b990"; + "0x00520620" -> "0x0053f4e0"; + "0x00520620" -> "0x00565110"; + "0x00521390" -> "0x00521060"; + "0x0052b990" -> "0x00565110"; + "0x0053a960" -> "0x005519f0"; + "0x0053f830" -> "0x004e0ba0"; + "0x0053f830" -> "0x00502220"; + "0x0053f830" -> "0x00504010"; + "0x0053f9c0" -> "0x004c4c70"; + "0x0053f9c0" -> "0x00558130"; + "0x00540a47" -> "0x005639d2"; + "0x005411c0" -> "0x005033d0"; + "0x0054f540" -> "0x004e0780"; + "0x0054fb10" -> "0x0054f710"; + "0x005519f0" -> "0x0054fb10"; + "0x00558130" -> "0x0053f9c0"; + "0x0055d8d0" -> "0x00484a60"; +} diff --git a/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-subgraph.md b/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-subgraph.md new file mode 100644 index 0000000..b49a246 --- /dev/null +++ b/artifacts/exports/rt3-1.06/setup-window-submodes-depth5-subgraph.md @@ -0,0 +1,1450 @@ +# Setup Window Submode Subgraph (Depth 5) + +- Nodes: `369` +- Edges: `753` +- Seeds: `0x00502220`, `0x00502550`, `0x005027b0`, `0x00502910`, `0x00502c00`, `0x005033d0`, `0x00504010` +- Graphviz: `setup-window-submodes-depth5-subgraph.dot` + +## Nodes + +| Address | Name | Subsystem | Confidence | +| --- | --- | --- | --- | +| `0x004010f0` | `city_compute_connection_bonus_candidate_weight` | `map` | `4` | +| `0x004014b0` | `company_try_buy_unowned_industry_near_city_and_publish_news` | `simulation` | `2` | +| `0x004019e0` | `company_service_periodic_city_connection_finance_and_linked_transit_lanes` | `simulation` | `2` | +| `0x00401c50` | `company_evaluate_annual_finance_policy_and_publish_news` | `simulation` | `2` | +| `0x00402c90` | `placed_structure_resolve_linked_candidate_record` | `map` | `2` | +| `0x00402cb0` | `city_connection_try_build_route_with_optional_direct_site_placement` | `map` | `3` | +| `0x00404640` | `city_connection_bonus_try_compact_route_builder_from_region_entry` | `map` | `3` | +| `0x004046a0` | `city_connection_bonus_build_peer_route_candidate` | `map` | `4` | +| `0x00404c60` | `city_connection_try_build_route_between_region_entry_pair` | `map` | `3` | +| `0x00404ce0` | `simulation_try_select_and_publish_company_start_or_city_connection_news` | `simulation` | `3` | +| `0x00405920` | `company_query_min_linked_site_distance_to_xy` | `simulation` | `4` | +| `0x00406050` | `company_evaluate_and_publish_city_connection_bonus_news` | `simulation` | `4` | +| `0x00407bd0` | `company_rebuild_linked_transit_autoroute_site_score_cache` | `simulation` | `3` | +| `0x004093d0` | `company_rebuild_linked_transit_site_peer_cache` | `simulation` | `3` | +| `0x0040a590` | `simulation_service_periodic_boundary_work` | `simulation` | `3` | +| `0x0040ab50` | `simulation_advance_to_target_calendar_point` | `simulation` | `3` | +| `0x0040e360` | `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` | `map` | `2` | +| `0x0040e450` | `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` | `map` | `2` | +| `0x0040eba0` | `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` | `map` | `2` | +| `0x0040ee10` | `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` | `map` | `2` | +| `0x0040ef10` | `placed_structure_finalize_creation_or_rebuild_local_runtime_state` | `map` | `3` | +| `0x0040fef0` | `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` | `map` | `3` | +| `0x004101e0` | `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` | `map` | `3` | +| `0x00412ca0` | `world_region_pick_commercial_profile_label_by_region_rank` | `map` | `4` | +| `0x004133b0` | `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` | `map` | `2` | +| `0x004134d0` | `placed_structure_collection_allocate_and_construct_entry` | `map` | `3` | +| `0x00413580` | `placed_structure_collection_refresh_quarter_subset_route_style_state` | `map` | `3` | +| `0x00413f50` | `placed_structure_local_runtime_site_id_queue_pop_next` | `map` | `3` | +| `0x00414470` | `placed_structure_cache_projected_rect_profile_slot_id` | `map` | `3` | +| `0x00414480` | `placed_structure_local_runtime_site_id_queue_count` | `map` | `3` | +| `0x00415f20` | `placed_structure_recursive_collect_connected_component_tile_bounds` | `map` | `3` | +| `0x00416e20` | `indexed_collection_resolve_live_entry_id_by_stem_string` | `map` | `3` | +| `0x00417840` | `placed_structure_project_candidate_grid_extent_offset_by_rotation` | `map` | `3` | +| `0x00418a60` | `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` | `map` | `2` | +| `0x004197e0` | `placed_structure_validate_projected_candidate_placement` | `map` | `3` | +| `0x0041e220` | `structure_candidate_is_enabled_for_current_year` | `map` | `3` | +| `0x0041e2b0` | `structure_candidate_rebuild_local_service_metrics` | `map` | `3` | +| `0x0041e650` | `structure_candidate_query_route_style_or_local_availability_metric` | `map` | `3` | +| `0x0041ea50` | `world_setup_building_collection_phase` | `map` | `3` | +| `0x0041f9b0` | `world_region_count_structure_profiles_before_year_for_category` | `map` | `4` | +| `0x0041fac0` | `world_region_read_structure_profile_label_and_weight_by_index` | `map` | `4` | +| `0x00420030` | `city_connection_bonus_exists_matching_peer_site` | `map` | `4` | +| `0x00420280` | `city_connection_bonus_select_first_matching_peer_site` | `map` | `4` | +| `0x004207d0` | `city_site_format_connection_bonus_status_label` | `map` | `4` | +| `0x00421b60` | `world_region_collection_seed_default_regions` | `map` | `4` | +| `0x00421c20` | `world_region_collection_run_building_population_pass` | `map` | `4` | +| `0x00422900` | `world_region_accumulate_structure_category_totals` | `map` | `3` | +| `0x00422be0` | `world_region_count_placed_structures_for_category` | `map` | `3` | +| `0x00422ee0` | `world_region_try_place_candidate_structure` | `map` | `4` | +| `0x004235c0` | `world_region_balance_structure_demand_and_place_candidates` | `map` | `4` | +| `0x00423d70` | `company_repay_bond_slot_and_compact_debt_table` | `simulation` | `4` | +| `0x00424010` | `company_has_territory_access_rights` | `simulation` | `4` | +| `0x004248d0` | `company_compute_cached_recent_per_share_performance_subscore` | `simulation` | `3` | +| `0x00425320` | `company_compute_connection_bonus_value_ladder` | `simulation` | `4` | +| `0x00425880` | `company_compute_negative_cash_balance_interest_rate` | `shell` | `4` | +| `0x004258c0` | `company_compute_positive_cash_balance_interest_rate` | `shell` | `4` | +| `0x00426260` | `company_compute_board_approved_dividend_rate_ceiling` | `simulation` | `4` | +| `0x00426590` | `company_count_linked_transit_sites` | `simulation` | `4` | +| `0x00426be0` | `company_can_purchase_territory_access_rights` | `simulation` | `4` | +| `0x00426d60` | `company_deactivate_and_clear_chairman_share_links` | `simulation` | `4` | +| `0x00426ef0` | `company_get_linked_chairman_profile_record` | `simulation` | `4` | +| `0x00429990` | `company_collection_get_nth_active_company_id` | `simulation` | `4` | +| `0x004299f0` | `company_collection_count_active_companies_before_company_id` | `simulation` | `4` | +| `0x00429a50` | `company_collection_count_active_companies` | `simulation` | `4` | +| `0x00429c70` | `company_read_derived_financial_report_metric_slot` | `simulation` | `3` | +| `0x0042a2e0` | `company_read_control_transfer_metric_slot` | `simulation` | `3` | +| `0x0042a5d0` | `company_read_year_or_control_transfer_metric_value` | `simulation` | `3` | +| `0x0042a970` | `shell_open_file_dialog_copy_selected_path_and_restore_cwd` | `shell` | `3` | +| `0x0042cab0` | `placed_structure_accumulate_candidate_metric_or_emit_route_style_peer_link` | `map` | `3` | +| `0x0042e050` | `scenario_event_clone_runtime_record_deep_copy` | `scenario` | `2` | +| `0x00433130` | `scenario_event_collection_refresh_runtime_records_from_packed_state` | `scenario` | `3` | +| `0x004333f0` | `shell_setup_build_file_list_records_from_current_root_and_pattern` | `shell` | `3` | +| `0x004336a0` | `shell_setup_file_list_construct_and_scan_dataset` | `shell` | `3` | +| `0x00433b00` | `shell_can_open_trainbuy_window_or_warn` | `shell` | `4` | +| `0x00434050` | `shell_has_auxiliary_preview_owner` | `shell` | `4` | +| `0x00434300` | `world_runtime_release_global_services` | `map` | `3` | +| `0x00434870` | `scenario_state_get_selected_chairman_company_record` | `map` | `4` | +| `0x00434890` | `scenario_state_set_selected_chairman_profile` | `map` | `4` | +| `0x004348c0` | `scenario_state_get_selected_chairman_profile_record` | `map` | `4` | +| `0x00436590` | `scenario_state_compute_issue_opinion_multiplier` | `simulation` | `4` | +| `0x00437220` | `world_build_chairman_profile_slot_records` | `map` | `4` | +| `0x004377a0` | `world_seed_default_chairman_profile_slots` | `map` | `4` | +| `0x00437b20` | `simulation_run_chunked_fast_forward_burst` | `simulation` | `3` | +| `0x004384d0` | `world_run_post_load_generation_pipeline` | `map` | `4` | +| `0x00438890` | `shell_active_mode_run_profile_startup_and_load_dispatch` | `map` | `4` | +| `0x00439140` | `simulation_frame_accumulate_and_step_world` | `simulation` | `4` | +| `0x00439e40` | `world_view_seed_keyboard_binding_slot_pairs` | `shell` | `4` | +| `0x0043af60` | `world_view_should_drive_primary_pan_channel` | `shell` | `3` | +| `0x0043b030` | `world_view_should_drive_secondary_pan_channel` | `shell` | `3` | +| `0x0043cc30` | `world_view_step_zoom_bucket` | `shell` | `3` | +| `0x0043d050` | `world_view_set_focus_position_xyz` | `shell` | `4` | +| `0x0043d130` | `world_view_pan_relative_offset_in_camera_plane` | `shell` | `4` | +| `0x0043d740` | `world_view_service_keyboard_turn_pan_and_zoom_bindings` | `shell` | `4` | +| `0x0043db00` | `world_view_service_shell_input_pan_and_hover` | `shell` | `4` | +| `0x0043f640` | `world_render_station_candidate_service_map_overlay` | `render` | `4` | +| `0x00443a50` | `world_entry_transition_and_runtime_bringup` | `map` | `4` | +| `0x00444dd0` | `map_bundle_open_reference_databases` | `map` | `3` | +| `0x00445ac0` | `shell_map_file_entry_coordinator` | `map` | `4` | +| `0x00445de0` | `shell_map_file_world_bundle_coordinator` | `map` | `4` | +| `0x00446240` | `world_runtime_serialize_smp_bundle` | `map` | `3` | +| `0x00446d40` | `world_load_saved_runtime_state_bundle` | `map` | `4` | +| `0x0044fb70` | `world_compute_transport_and_pricing_grid` | `map` | `3` | +| `0x00464410` | `shell_dispatch_ui_command` | `shell` | `4` | +| `0x00467eb0` | `placed_structure_route_link_attach_site_owner` | `map` | `3` | +| `0x004682c0` | `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` | `map` | `3` | +| `0x00469720` | `multiplayer_preview_dataset_service_frame` | `shell` | `3` | +| `0x0046a6c0` | `multiplayer_session_event_publish_registration_field` | `shell` | `3` | +| `0x0046b780` | `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` | `shell` | `4` | +| `0x004768c0` | `chairman_profile_owns_all_company_shares` | `simulation` | `4` | +| `0x00477820` | `profile_collection_count_active_chairman_records` | `map` | `4` | +| `0x00477860` | `profile_collection_get_nth_active_chairman_record` | `map` | `4` | +| `0x0047d080` | `start_new_company_dialog_open` | `shell` | `4` | +| `0x0047d440` | `world_conditionally_seed_named_starting_railroad_companies` | `map` | `4` | +| `0x0047e240` | `placed_structure_query_candidate_local_service_metrics` | `map` | `3` | +| `0x0047e330` | `placed_structure_count_candidates_with_local_service_metrics` | `map` | `3` | +| `0x0047e690` | `placed_structure_query_candidate_directional_route_overlay_summary` | `map` | `3` | +| `0x0047efe0` | `placed_structure_query_linked_company_id` | `map` | `4` | +| `0x0047f010` | `placed_structure_append_unique_route_entry` | `map` | `4` | +| `0x00481390` | `placed_structure_collection_allocate_and_construct_linked_site_record` | `map` | `3` | +| `0x00482d10` | `runtime_query_cached_local_exe_version_float` | `simulation` | `3` | +| `0x00482d80` | `runtime_query_cached_local_exe_version_string` | `simulation` | `3` | +| `0x00482e00` | `runtime_query_hundredths_scaled_build_version` | `simulation` | `3` | +| `0x00482ec0` | `shell_transition_mode` | `bootstrap` | `4` | +| `0x004839b0` | `shell_setup_query_file_list_uses_map_extension_pattern` | `shell` | `3` | +| `0x004839e0` | `shell_setup_query_file_list_root_dir_name` | `shell` | `3` | +| `0x00483f70` | `shell_service_pump_iteration` | `shell` | `4` | +| `0x004840e0` | `bootstrap_init_shell_window_services` | `bootstrap` | `4` | +| `0x00484590` | `shell_init_graphics_preset_state` | `shell` | `3` | +| `0x00484910` | `shell_save_graphics_config` | `shell` | `4` | +| `0x00484980` | `shell_load_graphics_config_or_init_defaults` | `shell` | `4` | +| `0x00484a60` | `shell_match_legacy_gpu_profile_token` | `shell` | `4` | +| `0x00484d70` | `shell_apply_graphics_option_runtime_effects` | `shell` | `3` | +| `0x00485060` | `shell_set_graphics_option_with_fanout` | `shell` | `4` | +| `0x004852e0` | `shell_apply_default_graphics_master_profile` | `shell` | `4` | +| `0x004853c0` | `shell_apply_graphics_preset_bundle` | `shell` | `4` | +| `0x004882e0` | `world_region_border_overlay_rebuild` | `map` | `4` | +| `0x004883f0` | `scenario_text_export_append_numbered_entry` | `scenario` | `4` | +| `0x004886e0` | `scenario_text_export_build_language_file` | `scenario` | `4` | +| `0x00489830` | `scenario_text_export_report_language_file` | `scenario` | `3` | +| `0x00489a20` | `scenario_text_export_batch_process_maps` | `scenario` | `4` | +| `0x00494240` | `route_entry_collection_query_rect_window_passes_entry_type_gate` | `map` | `2` | +| `0x0049bd40` | `route_entry_collection_run_initial_candidate_path_sweep` | `map` | `3` | +| `0x004a01a0` | `route_entry_collection_try_build_path_between_optional_endpoint_entries` | `map` | `3` | +| `0x004a5280` | `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` | `map` | `3` | +| `0x004a5900` | `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` | `map` | `3` | +| `0x004a65b0` | `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` | `map` | `3` | +| `0x004a6630` | `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` | `map` | `3` | +| `0x004ab980` | `train_set_route_operating_mode_and_scalar` | `simulation` | `4` | +| `0x004b2c10` | `train_route_list_validate_reachability_and_station_pair` | `simulation` | `4` | +| `0x004b3000` | `train_route_list_remove_entry_and_compact` | `simulation` | `4` | +| `0x004b3160` | `train_route_list_insert_staged_entry_at_index` | `simulation` | `4` | +| `0x004b8dc0` | `shell_campaign_window_destroy` | `shell` | `4` | +| `0x004b8e60` | `shell_campaign_window_construct` | `shell` | `4` | +| `0x004b99c0` | `structure_candidate_collection_get_nth_active_candidate_id` | `map` | `4` | +| `0x004b9a20` | `shell_building_detail_refresh_flagged_service_capability_rows` | `shell` | `3` | +| `0x004b9d70` | `shell_has_live_building_detail_window` | `shell` | `4` | +| `0x004b9d80` | `shell_mark_building_detail_window_dirty` | `shell` | `4` | +| `0x004b9e10` | `shell_building_detail_submit_aux_owner_subject_sync_request` | `shell` | `3` | +| `0x004b9fd0` | `shell_building_detail_present_flagged_service_capability_popup` | `shell` | `3` | +| `0x004ba3d0` | `shell_building_detail_refresh_subject_cargo_and_service_rows` | `shell` | `3` | +| `0x004bad20` | `shell_building_detail_refresh_subject_pair_value_rows` | `shell` | `3` | +| `0x004baef0` | `shell_building_detail_window_refresh_controls` | `shell` | `4` | +| `0x004bb9e0` | `shell_building_detail_window_handle_message` | `shell` | `4` | +| `0x004bc0a0` | `shell_building_detail_window_construct` | `shell` | `4` | +| `0x004bc100` | `shell_open_or_focus_building_detail_window` | `shell` | `4` | +| `0x004bfb30` | `shell_format_company_financial_summary_card` | `shell` | `4` | +| `0x004c1610` | `shell_company_detail_bind_bond_row_band_for_active_panel` | `shell` | `4` | +| `0x004c16f0` | `shell_company_detail_resolve_selected_company` | `shell` | `4` | +| `0x004c1730` | `shell_company_detail_render_financial_history_panel` | `shell` | `4` | +| `0x004c1ab0` | `shell_company_detail_render_company_summary_card` | `shell` | `4` | +| `0x004c1b60` | `shell_company_detail_refresh_selected_territory_access_summary` | `shell` | `4` | +| `0x004c1d30` | `shell_company_detail_select_territory_access_row` | `shell` | `4` | +| `0x004c1d70` | `shell_company_detail_render_territory_access_row` | `shell` | `4` | +| `0x004c1ec0` | `shell_company_detail_render_bond_maturity_and_repay_panel` | `shell` | `4` | +| `0x004c22e0` | `shell_company_detail_sync_selected_territory_from_picker` | `shell` | `4` | +| `0x004c23a0` | `shell_company_detail_render_debt_credit_and_rate_summary_panel` | `shell` | `4` | +| `0x004c2ca0` | `shell_company_detail_window_refresh_controls` | `shell` | `4` | +| `0x004c3470` | `shell_company_detail_step_selected_active_company_delta` | `shell` | `4` | +| `0x004c3540` | `shell_company_detail_select_next_active_company` | `shell` | `4` | +| `0x004c3550` | `shell_company_detail_select_previous_active_company` | `shell` | `4` | +| `0x004c3560` | `shell_company_detail_render_issue_bond_offer_dialog` | `shell` | `4` | +| `0x004c3890` | `shell_company_detail_issue_bond_offer_flow` | `shell` | `4` | +| `0x004c3b50` | `shell_company_detail_render_issue_stock_offer_dialog` | `shell` | `4` | +| `0x004c3f30` | `shell_company_detail_issue_stock_offer_flow` | `shell` | `4` | +| `0x004c4300` | `shell_company_detail_render_stock_buyback_offer_dialog` | `shell` | `4` | +| `0x004c46d0` | `shell_company_detail_buyback_stock_flow` | `shell` | `4` | +| `0x004c4c70` | `shell_company_detail_setup_dividend_rate_adjust_controls` | `shell` | `4` | +| `0x004c4e30` | `shell_company_detail_render_change_dividend_rate_dialog` | `shell` | `4` | +| `0x004c5140` | `shell_company_detail_handle_change_dividend_rate_dialog_message` | `shell` | `4` | +| `0x004c5360` | `shell_company_detail_change_dividend_rate_flow` | `shell` | `4` | +| `0x004c5540` | `shell_company_detail_window_construct` | `shell` | `4` | +| `0x004c56a0` | `shell_company_detail_window_handle_message` | `shell` | `4` | +| `0x004c5a0e` | `shell_company_detail_resign_chairmanship_flow` | `shell` | `4` | +| `0x004c5b99` | `shell_company_detail_bankruptcy_flow` | `shell` | `4` | +| `0x004c5fc9` | `shell_company_detail_buy_territory_access_rights_flow` | `shell` | `4` | +| `0x004c6b40` | `shell_company_list_format_company_or_start_row` | `shell` | `4` | +| `0x004c6bb0` | `shell_company_list_activate_or_shift_center_company` | `shell` | `4` | +| `0x004c6c30` | `shell_company_list_window_refresh_rows` | `shell` | `4` | +| `0x004c6f30` | `shell_company_list_window_handle_message` | `shell` | `4` | +| `0x004c7bc0` | `shell_credits_window_destroy` | `shell` | `4` | +| `0x004c7fc0` | `shell_credits_window_construct` | `shell` | `4` | +| `0x004c8670` | `shell_mark_custom_modal_dialog_dirty` | `shell` | `4` | +| `0x004c8680` | `shell_has_live_custom_modal_dialog` | `shell` | `4` | +| `0x004c98a0` | `shell_open_custom_modal_dialog_with_callbacks` | `shell` | `4` | +| `0x004c9da0` | `map_editor_chairman_slot_panel_format_slot_card` | `map` | `4` | +| `0x004ca1c0` | `map_editor_chairman_slot_panel_refresh_slot_counters` | `map` | `3` | +| `0x004cc250` | `map_editor_chairman_slot_panel_refresh_slot_list` | `map` | `4` | +| `0x004cc2d0` | `map_editor_chairman_slot_panel_construct` | `map` | `4` | +| `0x004cecc0` | `map_editor_chairman_slot_panel_handle_message` | `map` | `4` | +| `0x004d4500` | `shell_ensure_editor_panel_window` | `shell` | `4` | +| `0x004d57c0` | `shell_event_conditions_window_construct` | `shell` | `3` | +| `0x004d5d00` | `shell_event_effects_window_refresh_effect_type_selector` | `shell` | `3` | +| `0x004d5f50` | `shell_event_effects_window_refresh_selected_effect_parameter_rows` | `shell` | `3` | +| `0x004d6090` | `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` | `shell` | `3` | +| `0x004d67f0` | `shell_event_effects_window_commit_current_editor_state_into_staged_row` | `shell` | `3` | +| `0x004d6d60` | `shell_event_effects_window_construct` | `shell` | `3` | +| `0x004d7060` | `shell_event_effects_window_handle_message` | `shell` | `3` | +| `0x004d7ef0` | `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` | `shell` | `3` | +| `0x004d8120` | `shell_event_conditions_window_refresh_condition_row_list_panel` | `shell` | `3` | +| `0x004d88f0` | `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` | `shell` | `3` | +| `0x004d9970` | `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` | `shell` | `3` | +| `0x004d9dc0` | `shell_open_event_conditions_modal_and_return_result` | `shell` | `3` | +| `0x004d9e40` | `shell_open_event_effects_modal_and_return_result` | `shell` | `3` | +| `0x004da0f0` | `shell_event_conditions_window_refresh_controls` | `shell` | `3` | +| `0x004da640` | `shell_event_conditions_window_append_default_condition_row_via_modal` | `shell` | `3` | +| `0x004da700` | `shell_event_conditions_window_edit_selected_condition_row_via_modal` | `shell` | `3` | +| `0x004da7c0` | `shell_event_effects_window_append_grouped_effect_row_via_modal` | `shell` | `3` | +| `0x004da860` | `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` | `shell` | `3` | +| `0x004db120` | `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` | `shell` | `3` | +| `0x004db8b0` | `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` | `shell` | `3` | +| `0x004dba90` | `shell_event_conditions_window_rename_selected_event_via_name_modal` | `shell` | `3` | +| `0x004dbb80` | `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` | `shell` | `3` | +| `0x004dbe7a` | `shell_event_conditions_window_open_choice_event_single_player_only_warning_modal` | `shell` | `3` | +| `0x004dc670` | `shell_file_options_dialog_construct` | `shell` | `4` | +| `0x004dc7d0` | `shell_has_file_options_dialog` | `shell` | `4` | +| `0x004dc7e0` | `shell_mark_file_options_dialog_dirty` | `shell` | `4` | +| `0x004dc7f0` | `shell_file_options_dialog_handle_message` | `shell` | `4` | +| `0x004dd010` | `shell_file_request_dialog_collect_target_path` | `shell` | `4` | +| `0x004ddbd0` | `shell_detail_panel_transition_manager` | `shell` | `3` | +| `0x004dfbe0` | `shell_game_window_construct` | `shell` | `4` | +| `0x004dfd70` | `shell_game_window_destroy` | `shell` | `4` | +| `0x004dfdf0` | `shell_ensure_game_message_window` | `shell` | `4` | +| `0x004e0210` | `game_message_window_service_frame` | `shell` | `4` | +| `0x004e0720` | `game_message_window_service_if_present` | `shell` | `4` | +| `0x004e0780` | `game_uppermost_window_service_world_hotspot_band` | `shell` | `4` | +| `0x004e0960` | `game_uppermost_window_refresh_controls` | `shell` | `4` | +| `0x004e0b20` | `game_uppermost_window_construct` | `shell` | `4` | +| `0x004e0ba0` | `game_uppermost_window_handle_message` | `shell` | `4` | +| `0x004e0e40` | `shell_ensure_game_uppermost_window` | `shell` | `4` | +| `0x004e1d60` | `shell_load_screen_refresh_page_strip_and_page_kind_controls` | `shell` | `4` | +| `0x004e1f50` | `shell_has_live_load_screen_window` | `shell` | `4` | +| `0x004e1f60` | `shell_mark_load_screen_window_dirty` | `shell` | `4` | +| `0x004e2c10` | `shell_load_screen_select_page_subject_and_refresh` | `shell` | `4` | +| `0x004e39e0` | `company_query_display_year_or_current_year` | `simulation` | `4` | +| `0x004e3a00` | `shell_load_screen_step_selected_company_delta` | `shell` | `4` | +| `0x004e3a80` | `shell_load_screen_window_handle_message` | `shell` | `4` | +| `0x004e45d0` | `shell_load_screen_profile_stock_holdings_page_handle_message` | `shell` | `4` | +| `0x004e4b10` | `shell_load_screen_reset_runtime_state_and_seed_selection` | `shell` | `3` | +| `0x004e4ee0` | `shell_open_or_focus_load_screen_page` | `shell` | `4` | +| `0x004e5130` | `shell_load_screen_render_company_stock_data_panel` | `shell` | `4` | +| `0x004e51ea` | `shell_load_screen_render_game_status_briefing_panel` | `shell` | `4` | +| `0x004e5300` | `shell_load_screen_render_player_detail_stock_holdings_panel` | `shell` | `4` | +| `0x004e5a80` | `shell_render_company_overview_panel_header_and_optional_change_affordance` | `shell` | `4` | +| `0x004e5cf0` | `shell_format_company_governance_and_economy_status_panel` | `shell` | `4` | +| `0x004e68e0` | `shell_load_screen_render_company_list_panel` | `shell` | `4` | +| `0x004e6ef0` | `shell_load_screen_render_player_list_panel` | `shell` | `4` | +| `0x004e7670` | `shell_load_screen_render_company_train_list_panel` | `shell` | `4` | +| `0x004e8270` | `shell_load_screen_render_company_industry_list_panel` | `shell` | `4` | +| `0x004e8bb0` | `shell_load_screen_render_company_station_list_panel` | `shell` | `4` | +| `0x004e9460` | `shell_load_screen_render_map_cargo_list_panel` | `shell` | `4` | +| `0x004e9b20` | `shell_load_screen_render_company_report_history_panel` | `shell` | `4` | +| `0x004ea060` | `shell_load_screen_render_active_page_panel` | `shell` | `4` | +| `0x004ea620` | `shell_load_screen_window_construct` | `shell` | `4` | +| `0x004ea720` | `shell_load_screen_window_is_open` | `shell` | `4` | +| `0x004ea730` | `shell_load_screen_window_destroy` | `shell` | `4` | +| `0x004eb0b0` | `shell_open_grayscale_map_tga_picker_and_stage_selection` | `shell` | `3` | +| `0x004ec640` | `shell_company_detail_attempt_merger_flow` | `shell` | `4` | +| `0x004ee0e0` | `multiplayer_open_staged_text_entry_dialog` | `shell` | `3` | +| `0x004ee1d0` | `multiplayer_commit_staged_text_entry` | `shell` | `3` | +| `0x004ee3a0` | `multiplayer_reset_tool_globals` | `shell` | `3` | +| `0x004ee810` | `multiplayer_publish_wrapped_chat_message` | `shell` | `4` | +| `0x004ee950` | `multiplayer_load_selected_map_preview_surface` | `shell` | `4` | +| `0x004eed30` | `multiplayer_sync_selected_map_entry` | `shell` | `3` | +| `0x004efe80` | `multiplayer_window_init_globals` | `shell` | `4` | +| `0x004f2e80` | `shell_has_live_overview_window` | `shell` | `4` | +| `0x004f2e90` | `shell_mark_overview_window_dirty` | `shell` | `4` | +| `0x004f38a0` | `shell_overview_window_construct` | `shell` | `4` | +| `0x004f38f0` | `shell_overview_window_handle_message` | `shell` | `4` | +| `0x004f3a10` | `shell_open_or_focus_overview_window` | `shell` | `4` | +| `0x004fe120` | `shell_has_settings_window` | `shell` | `4` | +| `0x004fe130` | `shell_mark_settings_window_dirty` | `shell` | `4` | +| `0x00500640` | `shell_settings_window_construct` | `shell` | `4` | +| `0x00501e50` | `shell_open_settings_window` | `shell` | `4` | +| `0x00501f20` | `shell_query_registry_open_command_for_http_or_rtf_target` | `shell` | `3` | +| `0x00502030` | `shell_setup_window_draw_table_driven_payload_category_row` | `shell` | `3` | +| `0x00502160` | `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` | `shell` | `3` | +| `0x005021c0` | `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` | `shell` | `3` | +| `0x00502220` | `shell_setup_window_publish_selected_profile_labels_and_preview_surface` | `shell` | `3` | +| `0x00502550` | `shell_setup_window_refresh_selection_lists_and_summary_fields` | `shell` | `3` | +| `0x00502720` | `paint_terrain_tool_init_globals` | `shell` | `4` | +| `0x005027b0` | `shell_setup_window_refresh_file_backed_selection_list_panel` | `shell` | `3` | +| `0x00502910` | `shell_setup_window_refresh_mode_dependent_lists` | `shell` | `3` | +| `0x00502c00` | `shell_setup_window_select_launch_mode_and_apply_shell_state` | `shell` | `4` | +| `0x005033d0` | `shell_setup_window_handle_message` | `shell` | `3` | +| `0x00504010` | `shell_setup_window_construct` | `shell` | `4` | +| `0x00504a90` | `shell_station_detail_clear_active_candidate_service_preview` | `shell` | `4` | +| `0x00504ae0` | `shell_station_detail_set_active_candidate_service_preview` | `shell` | `4` | +| `0x00504ba0` | `shell_station_detail_update_candidate_service_entry` | `shell` | `4` | +| `0x00504bea` | `shell_station_detail_format_candidate_local_service_summary` | `shell` | `4` | +| `0x005068c0` | `shell_station_detail_window_construct` | `shell` | `4` | +| `0x00506be0` | `shell_station_detail_format_freight_and_express_summary` | `shell` | `4` | +| `0x00509d80` | `station_place_window_construct` | `shell` | `4` | +| `0x0050ccc0` | `shell_company_detail_attempt_chairmanship_takeover_flow` | `shell` | `4` | +| `0x0050e400` | `track_lay_window_construct` | `shell` | `4` | +| `0x0050f740` | `shell_has_live_trainbuy_window` | `shell` | `4` | +| `0x0050f750` | `shell_mark_trainbuy_window_dirty` | `shell` | `4` | +| `0x0050f760` | `shell_trainbuy_window_query_selected_locomotive_id` | `shell` | `4` | +| `0x0050f790` | `shell_trainbuy_window_compute_selected_upgrade_total_and_count` | `shell` | `4` | +| `0x0050f890` | `shell_trainbuy_window_render_selected_train_upgrade_summary` | `shell` | `4` | +| `0x0050fc00` | `shell_trainbuy_window_render_selected_train_route_and_state_panel` | `shell` | `4` | +| `0x00511500` | `shell_trainbuy_window_construct` | `shell` | `4` | +| `0x00512080` | `shell_trainbuy_window_refresh_controls` | `shell` | `4` | +| `0x00512c50` | `shell_open_or_focus_trainbuy_window` | `shell` | `4` | +| `0x00512f80` | `shell_trainbuy_window_refresh_selection_side_toggle` | `shell` | `4` | +| `0x005130f0` | `shell_trainbuy_window_query_selected_train_record` | `shell` | `4` | +| `0x005131a0` | `shell_trainbuy_window_selected_train_belongs_to_selected_company` | `shell` | `4` | +| `0x00513220` | `shell_trainbuy_window_warn_selected_train_not_owned_by_current_company` | `shell` | `4` | +| `0x00513720` | `shell_trainbuy_window_refresh_selection_column_empty_state_labels` | `shell` | `4` | +| `0x00514110` | `shell_train_detail_window_refresh_selected_train_name_label` | `shell` | `4` | +| `0x00514160` | `shell_train_detail_window_refresh_controls` | `shell` | `4` | +| `0x00514420` | `shell_train_detail_window_construct` | `shell` | `4` | +| `0x00514620` | `shell_open_or_focus_train_detail_window` | `shell` | `4` | +| `0x00514690` | `shell_train_detail_window_handle_message` | `shell` | `4` | +| `0x00516be0` | `tutorial_advance_step_and_refresh_expected_control_ids` | `shell` | `4` | +| `0x00516d00` | `tutorial_validate_train_route_station_indicator_step` | `shell` | `4` | +| `0x005174e0` | `shell_video_window_construct` | `shell` | `4` | +| `0x00517570` | `shell_video_window_destroy` | `shell` | `4` | +| `0x00517cf0` | `indexed_collection_slot_count` | `simulation` | `4` | +| `0x00517d40` | `indexed_collection_entry_id_is_live` | `simulation` | `4` | +| `0x00518140` | `indexed_collection_resolve_live_entry_by_id` | `simulation` | `4` | +| `0x00518380` | `indexed_collection_get_nth_live_entry_id` | `simulation` | `4` | +| `0x0051c920` | `localization_lookup_display_label_by_stem_or_fallback` | `shell` | `4` | +| `0x0051db80` | `math_measure_float_xy_pair_distance` | `support` | `4` | +| `0x0051ebc0` | `shell_reset_display_runtime_defaults` | `shell` | `3` | +| `0x0051eea0` | `shell_save_display_runtime_config` | `shell` | `4` | +| `0x0051ef20` | `shell_load_display_runtime_config_or_init_defaults` | `shell` | `4` | +| `0x0051fd70` | `shell_update_frame_time_history` | `shell` | `4` | +| `0x005204b0` | `shell_flush_deferred_work_queues` | `shell` | `4` | +| `0x00520620` | `shell_service_frame_cycle` | `shell` | `4` | +| `0x00521060` | `bootstrap_init_shell_service_bundle` | `bootstrap` | `4` | +| `0x00521390` | `bootstrap_destroy_shell_service_bundle` | `bootstrap` | `4` | +| `0x0052b990` | `shell_refresh_presentation_frame` | `shell` | `3` | +| `0x0053a960` | `shell_emit_geographic_label_text_span` | `bootstrap` | `4` | +| `0x0053f4e0` | `mouse_cursor_update_frame_state` | `shell` | `4` | +| `0x0053f830` | `shell_window_find_registered_child_control_by_id` | `shell` | `3` | +| `0x0053f9c0` | `shell_window_register_child_control_sorted_by_priority_and_optional_tag` | `shell` | `3` | +| `0x0053fa50` | `shell_window_bind_resource_and_initialize_child_control_links` | `shell` | `4` | +| `0x00540a47` | `shell_control_refresh_matching_dynamic_text_payload` | `shell` | `3` | +| `0x005411c0` | `shell_query_tga_header_is_supported_truecolor_image` | `shell` | `3` | +| `0x0054f540` | `shell_input_cursor_inside_active_view` | `shell` | `3` | +| `0x0054f710` | `shell_queue_callout_segment_marker` | `shell` | `2` | +| `0x0054fb10` | `shell_queue_callout_leader_path` | `shell` | `3` | +| `0x005519f0` | `shell_publish_text_callout_presentation` | `shell` | `3` | +| `0x00552560` | `shell_queue_world_anchor_marker` | `shell` | `3` | +| `0x00558130` | `shell_child_control_set_owner_resolve_caption_and_refresh` | `shell` | `3` | +| `0x00559520` | `surface_init_rgba_pixel_buffer` | `support` | `3` | +| `0x0055d8d0` | `display_get_primary_adapter_descriptor` | `support` | `4` | +| `0x005639d2` | `shell_control_release_dynamic_text_payload` | `shell` | `3` | +| `0x00565110` | `shell_rebuild_layout_state_and_optional_texture_report` | `shell` | `3` | + +## Edges + +- `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00424010` `company_has_territory_access_rights` +- `0x004014b0` `company_try_buy_unowned_industry_near_city_and_publish_news` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00426590` `company_count_linked_transit_sites` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x004014b0` `company_try_buy_unowned_industry_near_city_and_publish_news` + -> `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` +- `0x00401c50` `company_evaluate_annual_finance_policy_and_publish_news` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00402c90` `placed_structure_resolve_linked_candidate_record` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` +- `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` +- `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404640` `city_connection_bonus_try_compact_route_builder_from_region_entry` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00420280` `city_connection_bonus_select_first_matching_peer_site` +- `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` +- `0x00404ce0` `simulation_try_select_and_publish_company_start_or_city_connection_news` + -> `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x00404c60` `city_connection_try_build_route_between_region_entry_pair` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x004010f0` `city_compute_connection_bonus_candidate_weight` + -> `0x004046a0` `city_connection_bonus_build_peer_route_candidate` + -> `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x00426590` `company_count_linked_transit_sites` + -> `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x0047e330` `placed_structure_count_candidates_with_local_service_metrics` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x00405920` `company_query_min_linked_site_distance_to_xy` + -> `0x00407bd0` `company_rebuild_linked_transit_autoroute_site_score_cache` + -> `0x0047efe0` `placed_structure_query_linked_company_id` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x0040a590` `simulation_service_periodic_boundary_work` + -> `0x00413580` `placed_structure_collection_refresh_quarter_subset_route_style_state` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` +- `0x0040ab50` `simulation_advance_to_target_calendar_point` + -> `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` +- `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x00414470` `placed_structure_cache_projected_rect_profile_slot_id` + -> `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` +- `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x0040e360` `placed_structure_refresh_linked_site_anchor_position_triplet_for_local_runtime` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` + -> `0x00434050` `shell_has_auxiliary_preview_owner` +- `0x0040ef10` `placed_structure_finalize_creation_or_rebuild_local_runtime_state` + -> `0x0040eba0` `placed_structure_set_world_coords_and_refresh_local_runtime_side_state` + -> `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` +- `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x00436590` `scenario_state_compute_issue_opinion_multiplier` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` +- `0x00412ca0` `world_region_pick_commercial_profile_label_by_region_rank` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` + -> `0x00413f50` `placed_structure_local_runtime_site_id_queue_pop_next` + -> `0x00414480` `placed_structure_local_runtime_site_id_queue_count` +- `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x00422ee0` `world_region_try_place_candidate_structure` +- `0x00413580` `placed_structure_collection_refresh_quarter_subset_route_style_state` + -> `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` +- `0x00413f50` `placed_structure_local_runtime_site_id_queue_pop_next` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` +- `0x00414470` `placed_structure_cache_projected_rect_profile_slot_id` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` +- `0x00414480` `placed_structure_local_runtime_site_id_queue_count` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` +- `0x00415f20` `placed_structure_recursive_collect_connected_component_tile_bounds` + -> `0x0040ee10` `placed_structure_refresh_local_runtime_position_triplet_and_linked_anchor_followon` +- `0x00416e20` `indexed_collection_resolve_live_entry_id_by_stem_string` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x004197e0` `placed_structure_validate_projected_candidate_placement` +- `0x00418a60` `placed_structure_clone_template_local_runtime_record_for_subject_and_refresh_component_bounds` + -> `0x0040e450` `placed_structure_refresh_cloned_local_runtime_record_from_current_candidate_stem` +- `0x004197e0` `placed_structure_validate_projected_candidate_placement` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00417840` `placed_structure_project_candidate_grid_extent_offset_by_rotation` + -> `0x00424010` `company_has_territory_access_rights` +- `0x0041e2b0` `structure_candidate_rebuild_local_service_metrics` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0041ea50` `world_setup_building_collection_phase` +- `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` + -> `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0041ea50` `world_setup_building_collection_phase` + -> `0x0041e2b0` `structure_candidate_rebuild_local_service_metrics` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0041f9b0` `world_region_count_structure_profiles_before_year_for_category` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x004207d0` `city_site_format_connection_bonus_status_label` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00420280` `city_connection_bonus_select_first_matching_peer_site` + -> `0x004207d0` `city_site_format_connection_bonus_status_label` +- `0x004207d0` `city_site_format_connection_bonus_status_label` + -> `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x00420280` `city_connection_bonus_select_first_matching_peer_site` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00421b60` `world_region_collection_seed_default_regions` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x00421c20` `world_region_collection_run_building_population_pass` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422be0` `world_region_count_placed_structures_for_category` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x00422ee0` `world_region_try_place_candidate_structure` + -> `0x004134d0` `placed_structure_collection_allocate_and_construct_entry` + -> `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` +- `0x004235c0` `world_region_balance_structure_demand_and_place_candidates` + -> `0x00412ca0` `world_region_pick_commercial_profile_label_by_region_rank` + -> `0x0041f9b0` `world_region_count_structure_profiles_before_year_for_category` + -> `0x0041fac0` `world_region_read_structure_profile_label_and_weight_by_index` + -> `0x00422900` `world_region_accumulate_structure_category_totals` + -> `0x00422be0` `world_region_count_placed_structures_for_category` + -> `0x00422ee0` `world_region_try_place_candidate_structure` +- `0x00424010` `company_has_territory_access_rights` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x004248d0` `company_compute_cached_recent_per_share_performance_subscore` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x00425880` `company_compute_negative_cash_balance_interest_rate` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x004258c0` `company_compute_positive_cash_balance_interest_rate` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` +- `0x00426590` `company_count_linked_transit_sites` + -> `0x00406050` `company_evaluate_and_publish_city_connection_bonus_news` + -> `0x0047efe0` `placed_structure_query_linked_company_id` +- `0x00426be0` `company_can_purchase_territory_access_rights` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` +- `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x00429990` `company_collection_get_nth_active_company_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x004299f0` `company_collection_count_active_companies_before_company_id` + -> `0x00429990` `company_collection_get_nth_active_company_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00429a50` `company_collection_count_active_companies` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00429c70` `company_read_derived_financial_report_metric_slot` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x0042a2e0` `company_read_control_transfer_metric_slot` + -> `0x00429c70` `company_read_derived_financial_report_metric_slot` +- `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x00429c70` `company_read_derived_financial_report_metric_slot` + -> `0x0042a2e0` `company_read_control_transfer_metric_slot` +- `0x0042cab0` `placed_structure_accumulate_candidate_metric_or_emit_route_style_peer_link` + -> `0x0040fef0` `placed_structure_try_emit_best_route_style_peer_link_for_candidate_class` + -> `0x004101e0` `placed_structure_rebuild_route_style_candidate_scores_and_peer_links` +- `0x0042e050` `scenario_event_clone_runtime_record_deep_copy` + -> `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` +- `0x00433130` `scenario_event_collection_refresh_runtime_records_from_packed_state` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00433b00` `shell_can_open_trainbuy_window_or_warn` + -> `0x00512c50` `shell_open_or_focus_trainbuy_window` +- `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` + -> `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bb9e0` `shell_building_detail_window_handle_message` +- `0x00434300` `world_runtime_release_global_services` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00446d40` `world_load_saved_runtime_state_bundle` + -> `0x00482ec0` `shell_transition_mode` +- `0x004348c0` `scenario_state_get_selected_chairman_profile_record` + -> `0x00434890` `scenario_state_set_selected_chairman_profile` +- `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` +- `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x0041ea50` `world_setup_building_collection_phase` + -> `0x00421b60` `world_region_collection_seed_default_regions` + -> `0x00421c20` `world_region_collection_run_building_population_pass` + -> `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x0044fb70` `world_compute_transport_and_pricing_grid` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004882e0` `world_region_border_overlay_rebuild` +- `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x00439140` `simulation_frame_accumulate_and_step_world` + -> `0x0040ab50` `simulation_advance_to_target_calendar_point` + -> `0x0043db00` `world_view_service_shell_input_pan_and_hover` + -> `0x00483f70` `shell_service_pump_iteration` + -> `0x004b9d70` `shell_has_live_building_detail_window` + -> `0x004b9d80` `shell_mark_building_detail_window_dirty` + -> `0x004c8670` `shell_mark_custom_modal_dialog_dirty` + -> `0x004c8680` `shell_has_live_custom_modal_dialog` + -> `0x004dc7d0` `shell_has_file_options_dialog` + -> `0x004dc7e0` `shell_mark_file_options_dialog_dirty` + -> `0x004e0720` `game_message_window_service_if_present` + -> `0x004e1f50` `shell_has_live_load_screen_window` + -> `0x004e1f60` `shell_mark_load_screen_window_dirty` + -> `0x004e4ee0` `shell_open_or_focus_load_screen_page` + -> `0x004f2e80` `shell_has_live_overview_window` + -> `0x004f2e90` `shell_mark_overview_window_dirty` + -> `0x004fe120` `shell_has_settings_window` + -> `0x004fe130` `shell_mark_settings_window_dirty` + -> `0x0050f740` `shell_has_live_trainbuy_window` + -> `0x0050f750` `shell_mark_trainbuy_window_dirty` +- `0x00439e40` `world_view_seed_keyboard_binding_slot_pairs` + -> `0x0043d740` `world_view_service_keyboard_turn_pan_and_zoom_bindings` +- `0x0043af60` `world_view_should_drive_primary_pan_channel` + -> `0x0043db00` `world_view_service_shell_input_pan_and_hover` +- `0x0043b030` `world_view_should_drive_secondary_pan_channel` + -> `0x0043db00` `world_view_service_shell_input_pan_and_hover` +- `0x0043d050` `world_view_set_focus_position_xyz` + -> `0x0043d130` `world_view_pan_relative_offset_in_camera_plane` +- `0x0043d740` `world_view_service_keyboard_turn_pan_and_zoom_bindings` + -> `0x0043d130` `world_view_pan_relative_offset_in_camera_plane` + -> `0x0043db00` `world_view_service_shell_input_pan_and_hover` +- `0x0043db00` `world_view_service_shell_input_pan_and_hover` + -> `0x0043af60` `world_view_should_drive_primary_pan_channel` + -> `0x0043b030` `world_view_should_drive_secondary_pan_channel` + -> `0x0043cc30` `world_view_step_zoom_bucket` + -> `0x0043d740` `world_view_service_keyboard_turn_pan_and_zoom_bindings` +- `0x0043f640` `world_render_station_candidate_service_map_overlay` + -> `0x00420030` `city_connection_bonus_exists_matching_peer_site` + -> `0x004207d0` `city_site_format_connection_bonus_status_label` + -> `0x0046b780` `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x0047e690` `placed_structure_query_candidate_directional_route_overlay_summary` + -> `0x0047efe0` `placed_structure_query_linked_company_id` + -> `0x00504ae0` `shell_station_detail_set_active_candidate_service_preview` +- `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00482ec0` `shell_transition_mode` +- `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00446d40` `world_load_saved_runtime_state_bundle` + -> `0x004dd010` `shell_file_request_dialog_collect_target_path` +- `0x00445de0` `shell_map_file_world_bundle_coordinator` + -> `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x00444dd0` `map_bundle_open_reference_databases` + -> `0x00446240` `world_runtime_serialize_smp_bundle` + -> `0x004dd010` `shell_file_request_dialog_collect_target_path` +- `0x00446240` `world_runtime_serialize_smp_bundle` + -> `0x00445de0` `shell_map_file_world_bundle_coordinator` +- `0x00464410` `shell_dispatch_ui_command` + -> `0x00484590` `shell_init_graphics_preset_state` + -> `0x004853c0` `shell_apply_graphics_preset_bundle` + -> `0x004886e0` `scenario_text_export_build_language_file` + -> `0x00489830` `scenario_text_export_report_language_file` + -> `0x00489a20` `scenario_text_export_batch_process_maps` + -> `0x0051ebc0` `shell_reset_display_runtime_defaults` +- `0x00467eb0` `placed_structure_route_link_attach_site_owner` + -> `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` + -> `0x0047e690` `placed_structure_query_candidate_directional_route_overlay_summary` +- `0x004682c0` `placed_structure_route_link_collection_recompute_all_endpoint_pair_state` + -> `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00469720` `multiplayer_preview_dataset_service_frame` + -> `0x005519f0` `shell_publish_text_callout_presentation` +- `0x0046a6c0` `multiplayer_session_event_publish_registration_field` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` +- `0x0046b780` `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00445ac0` `shell_map_file_entry_coordinator` +- `0x004768c0` `chairman_profile_owns_all_company_shares` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` +- `0x00477860` `profile_collection_get_nth_active_chairman_record` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` +- `0x0047d080` `start_new_company_dialog_open` + -> `0x004c6f30` `shell_company_list_window_handle_message` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x00477860` `profile_collection_get_nth_active_chairman_record` +- `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` +- `0x0047e330` `placed_structure_count_candidates_with_local_service_metrics` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x0047f010` `placed_structure_append_unique_route_entry` + -> `0x0047e690` `placed_structure_query_candidate_directional_route_overlay_summary` +- `0x00481390` `placed_structure_collection_allocate_and_construct_linked_site_record` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x00482d10` `runtime_query_cached_local_exe_version_float` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` +- `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x0046a6c0` `multiplayer_session_event_publish_registration_field` + -> `0x00482d10` `runtime_query_cached_local_exe_version_float` +- `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00482d10` `runtime_query_cached_local_exe_version_float` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x00482ec0` `shell_transition_mode` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` + -> `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` + -> `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004efe80` `multiplayer_window_init_globals` + -> `0x00504010` `shell_setup_window_construct` + -> `0x005174e0` `shell_video_window_construct` + -> `0x00517570` `shell_video_window_destroy` +- `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x004839e0` `shell_setup_query_file_list_root_dir_name` + -> `0x004333f0` `shell_setup_build_file_list_records_from_current_root_and_pattern` +- `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x00482ec0` `shell_transition_mode` + -> `0x00483f70` `shell_service_pump_iteration` + -> `0x00521390` `bootstrap_destroy_shell_service_bundle` +- `0x00484910` `shell_save_graphics_config` + -> `0x0051eea0` `shell_save_display_runtime_config` +- `0x00484980` `shell_load_graphics_config_or_init_defaults` + -> `0x00484590` `shell_init_graphics_preset_state` + -> `0x00484910` `shell_save_graphics_config` + -> `0x0051ef20` `shell_load_display_runtime_config_or_init_defaults` +- `0x00484a60` `shell_match_legacy_gpu_profile_token` + -> `0x004853c0` `shell_apply_graphics_preset_bundle` +- `0x00485060` `shell_set_graphics_option_with_fanout` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00484d70` `shell_apply_graphics_option_runtime_effects` +- `0x004852e0` `shell_apply_default_graphics_master_profile` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00484d70` `shell_apply_graphics_option_runtime_effects` +- `0x004853c0` `shell_apply_graphics_preset_bundle` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00484d70` `shell_apply_graphics_option_runtime_effects` + -> `0x00485060` `shell_set_graphics_option_with_fanout` +- `0x004882e0` `world_region_border_overlay_rebuild` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004886e0` `scenario_text_export_build_language_file` + -> `0x004883f0` `scenario_text_export_append_numbered_entry` +- `0x00489a20` `scenario_text_export_batch_process_maps` + -> `0x004886e0` `scenario_text_export_build_language_file` + -> `0x00489830` `scenario_text_export_report_language_file` +- `0x00494240` `route_entry_collection_query_rect_window_passes_entry_type_gate` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x004019e0` `company_service_periodic_city_connection_finance_and_linked_transit_lanes` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` + -> `0x0051db80` `math_measure_float_xy_pair_distance` +- `0x004a01a0` `route_entry_collection_try_build_path_between_optional_endpoint_entries` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` +- `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` + -> `0x00482e00` `runtime_query_hundredths_scaled_build_version` + -> `0x004a5280` `aux_route_entry_tracker_query_route_entry_pair_metric_via_weighted_recursive_search` + -> `0x004a5900` `aux_route_entry_tracker_query_route_entry_pair_metric_via_recursive_neighbor_walk` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` + -> `0x004093d0` `company_rebuild_linked_transit_site_peer_cache` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` + -> `0x004a65b0` `aux_route_entry_tracker_dispatch_route_entry_pair_metric_query` + -> `0x004b2c10` `train_route_list_validate_reachability_and_station_pair` +- `0x004ab980` `train_set_route_operating_mode_and_scalar` + -> `0x00434050` `shell_has_auxiliary_preview_owner` +- `0x004b2c10` `train_route_list_validate_reachability_and_station_pair` + -> `0x004a6630` `aux_route_entry_tracker_query_best_route_entry_pair_metric_with_endpoint_fallbacks` +- `0x004b3160` `train_route_list_insert_staged_entry_at_index` + -> `0x00516d00` `tutorial_validate_train_route_station_indicator_step` +- `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` +- `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004b99c0` `structure_candidate_collection_get_nth_active_candidate_id` +- `0x004b9d70` `shell_has_live_building_detail_window` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004b9d80` `shell_mark_building_detail_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bb9e0` `shell_building_detail_window_handle_message` +- `0x004b9fd0` `shell_building_detail_present_flagged_service_capability_popup` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x004b99c0` `structure_candidate_collection_get_nth_active_candidate_id` +- `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x00517d40` `indexed_collection_entry_id_is_live` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` + -> `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` +- `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` +- `0x004baef0` `shell_building_detail_window_refresh_controls` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004bb9e0` `shell_building_detail_window_handle_message` +- `0x004bb9e0` `shell_building_detail_window_handle_message` + -> `0x00434050` `shell_has_auxiliary_preview_owner` + -> `0x004b9a20` `shell_building_detail_refresh_flagged_service_capability_rows` + -> `0x004b9e10` `shell_building_detail_submit_aux_owner_subject_sync_request` + -> `0x004bad20` `shell_building_detail_refresh_subject_pair_value_rows` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004bc0a0` `shell_building_detail_window_construct` + -> `0x004baef0` `shell_building_detail_window_refresh_controls` + -> `0x004bc100` `shell_open_or_focus_building_detail_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004bc100` `shell_open_or_focus_building_detail_window` + -> `0x004bc0a0` `shell_building_detail_window_construct` +- `0x004bfb30` `shell_format_company_financial_summary_card` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004c1ab0` `shell_company_detail_render_company_summary_card` + -> `0x004c6b40` `shell_company_list_format_company_or_start_row` +- `0x004c1610` `shell_company_detail_bind_bond_row_band_for_active_panel` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` +- `0x004c16f0` `shell_company_detail_resolve_selected_company` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c1ab0` `shell_company_detail_render_company_summary_card` + -> `0x004bfb30` `shell_format_company_financial_summary_card` + -> `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` + -> `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` +- `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` +- `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x00424010` `company_has_territory_access_rights` + -> `0x0054f710` `shell_queue_callout_segment_marker` +- `0x004c1ec0` `shell_company_detail_render_bond_maturity_and_repay_panel` + -> `0x004c1610` `shell_company_detail_bind_bond_row_band_for_active_panel` + -> `0x004c5540` `shell_company_detail_window_construct` +- `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` + -> `0x004c1b60` `shell_company_detail_refresh_selected_territory_access_summary` +- `0x004c23a0` `shell_company_detail_render_debt_credit_and_rate_summary_panel` + -> `0x00425320` `company_compute_connection_bonus_value_ladder` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x00434870` `scenario_state_get_selected_chairman_company_record` + -> `0x004c5540` `shell_company_detail_window_construct` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00540a47` `shell_control_refresh_matching_dynamic_text_payload` + -> `0x005639d2` `shell_control_release_dynamic_text_payload` +- `0x004c3470` `shell_company_detail_step_selected_active_company_delta` + -> `0x00429990` `company_collection_get_nth_active_company_id` + -> `0x004299f0` `company_collection_count_active_companies_before_company_id` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x004c3540` `shell_company_detail_select_next_active_company` + -> `0x004c3550` `shell_company_detail_select_previous_active_company` +- `0x004c3540` `shell_company_detail_select_next_active_company` + -> `0x004c3470` `shell_company_detail_step_selected_active_company_delta` +- `0x004c3550` `shell_company_detail_select_previous_active_company` + -> `0x004c3470` `shell_company_detail_step_selected_active_company_delta` +- `0x004c3560` `shell_company_detail_render_issue_bond_offer_dialog` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c3560` `shell_company_detail_render_issue_bond_offer_dialog` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c3b50` `shell_company_detail_render_issue_stock_offer_dialog` + -> `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c4300` `shell_company_detail_render_stock_buyback_offer_dialog` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c4300` `shell_company_detail_render_stock_buyback_offer_dialog` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` +- `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x00426260` `company_compute_board_approved_dividend_rate_ceiling` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x004c4e30` `shell_company_detail_render_change_dividend_rate_dialog` + -> `0x004c5140` `shell_company_detail_handle_change_dividend_rate_dialog_message` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5540` `shell_company_detail_window_construct` + -> `0x004c1730` `shell_company_detail_render_financial_history_panel` + -> `0x004c1ab0` `shell_company_detail_render_company_summary_card` + -> `0x004c1d30` `shell_company_detail_select_territory_access_row` + -> `0x004c1d70` `shell_company_detail_render_territory_access_row` + -> `0x004c1ec0` `shell_company_detail_render_bond_maturity_and_repay_panel` + -> `0x004c22e0` `shell_company_detail_sync_selected_territory_from_picker` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x00423d70` `company_repay_bond_slot_and_compact_debt_table` + -> `0x00426d60` `company_deactivate_and_clear_chairman_share_links` + -> `0x004c2ca0` `shell_company_detail_window_refresh_controls` + -> `0x004c3890` `shell_company_detail_issue_bond_offer_flow` + -> `0x004c3f30` `shell_company_detail_issue_stock_offer_flow` + -> `0x004c46d0` `shell_company_detail_buyback_stock_flow` + -> `0x004c5360` `shell_company_detail_change_dividend_rate_flow` + -> `0x004c5a0e` `shell_company_detail_resign_chairmanship_flow` + -> `0x004c5b99` `shell_company_detail_bankruptcy_flow` + -> `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` + -> `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004ec640` `shell_company_detail_attempt_merger_flow` + -> `0x0050ccc0` `shell_company_detail_attempt_chairmanship_takeover_flow` +- `0x004c5a0e` `shell_company_detail_resign_chairmanship_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5b99` `shell_company_detail_bankruptcy_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c5fc9` `shell_company_detail_buy_territory_access_rights_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004c6b40` `shell_company_list_format_company_or_start_row` + -> `0x004bfb30` `shell_format_company_financial_summary_card` + -> `0x004c6c30` `shell_company_list_window_refresh_rows` +- `0x004c6c30` `shell_company_list_window_refresh_rows` + -> `0x00434870` `scenario_state_get_selected_chairman_company_record` +- `0x004c6f30` `shell_company_list_window_handle_message` + -> `0x0047d080` `start_new_company_dialog_open` + -> `0x004c6bb0` `shell_company_list_activate_or_shift_center_company` + -> `0x004c6c30` `shell_company_list_window_refresh_rows` + -> `0x004ddbd0` `shell_detail_panel_transition_manager` +- `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` +- `0x004c7fc0` `shell_credits_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004c8670` `shell_mark_custom_modal_dialog_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004c8680` `shell_has_live_custom_modal_dialog` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004ee0e0` `multiplayer_open_staged_text_entry_dialog` +- `0x004ca1c0` `map_editor_chairman_slot_panel_refresh_slot_counters` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` + -> `0x004cecc0` `map_editor_chairman_slot_panel_handle_message` +- `0x004cc250` `map_editor_chairman_slot_panel_refresh_slot_list` + -> `0x004ca1c0` `map_editor_chairman_slot_panel_refresh_slot_counters` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` + -> `0x004cecc0` `map_editor_chairman_slot_panel_handle_message` +- `0x004cc2d0` `map_editor_chairman_slot_panel_construct` + -> `0x004c9da0` `map_editor_chairman_slot_panel_format_slot_card` +- `0x004cecc0` `map_editor_chairman_slot_panel_handle_message` + -> `0x004cc2d0` `map_editor_chairman_slot_panel_construct` +- `0x004d4500` `shell_ensure_editor_panel_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004d57c0` `shell_event_conditions_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004d5d00` `shell_event_effects_window_refresh_effect_type_selector` + -> `0x004d6090` `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004d7060` `shell_event_effects_window_handle_message` +- `0x004d5f50` `shell_event_effects_window_refresh_selected_effect_parameter_rows` + -> `0x004d6090` `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004d7060` `shell_event_effects_window_handle_message` +- `0x004d6090` `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004d7060` `shell_event_effects_window_handle_message` +- `0x004d67f0` `shell_event_effects_window_commit_current_editor_state_into_staged_row` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004d7060` `shell_event_effects_window_handle_message` +- `0x004d6d60` `shell_event_effects_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004d7060` `shell_event_effects_window_handle_message` + -> `0x004d5d00` `shell_event_effects_window_refresh_effect_type_selector` + -> `0x004d5f50` `shell_event_effects_window_refresh_selected_effect_parameter_rows` + -> `0x004d6090` `shell_event_effects_window_refresh_selected_staged_effect_editor_panels` + -> `0x004d67f0` `shell_event_effects_window_commit_current_editor_state_into_staged_row` +- `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` + -> `0x004d57c0` `shell_event_conditions_window_construct` + -> `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` +- `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004d6d60` `shell_event_effects_window_construct` + -> `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` +- `0x004da0f0` `shell_event_conditions_window_refresh_controls` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` +- `0x004da640` `shell_event_conditions_window_append_default_condition_row_via_modal` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` +- `0x004da700` `shell_event_conditions_window_edit_selected_condition_row_via_modal` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` + -> `0x004d9dc0` `shell_open_event_conditions_modal_and_return_result` +- `0x004da7c0` `shell_event_effects_window_append_grouped_effect_row_via_modal` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x004da860` `shell_event_effects_window_edit_selected_grouped_effect_row_via_modal` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9e40` `shell_open_event_effects_modal_and_return_result` + -> `0x004da0f0` `shell_event_conditions_window_refresh_controls` +- `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` + -> `0x004d8120` `shell_event_conditions_window_refresh_condition_row_list_panel` + -> `0x004d88f0` `shell_event_conditions_window_refresh_selected_grouped_effect_row_list_panel` + -> `0x004d9970` `shell_event_conditions_window_refresh_condition_class_summary_and_group_rows` +- `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` + -> `0x0042e050` `scenario_event_clone_runtime_record_deep_copy` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004dba90` `shell_event_conditions_window_rename_selected_event_via_name_modal` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x004d7ef0` `shell_event_effects_window_refresh_event_selector_list_and_selected_event_id` + -> `0x004db120` `shell_event_conditions_window_refresh_selected_event_strip_and_navigation` +- `0x004dbb80` `shell_event_conditions_window_dispatch_selected_event_strip_and_grouped_band_actions` + -> `0x004db8b0` `shell_event_conditions_window_append_blank_or_clone_selected_event_via_name_modal` + -> `0x004dba90` `shell_event_conditions_window_rename_selected_event_via_name_modal` +- `0x004dbe7a` `shell_event_conditions_window_open_choice_event_single_player_only_warning_modal` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004dc670` `shell_file_options_dialog_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004dc7d0` `shell_has_file_options_dialog` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004dc7e0` `shell_mark_file_options_dialog_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004dc7f0` `shell_file_options_dialog_handle_message` + -> `0x004fe120` `shell_has_settings_window` + -> `0x00501e50` `shell_open_settings_window` +- `0x004dd010` `shell_file_request_dialog_collect_target_path` + -> `0x004839b0` `shell_setup_query_file_list_uses_map_extension_pattern` +- `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004d4500` `shell_ensure_editor_panel_window` +- `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x004dfdf0` `shell_ensure_game_message_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004dfdf0` `shell_ensure_game_message_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004e0210` `game_message_window_service_frame` + -> `0x004e0720` `game_message_window_service_if_present` +- `0x004e0780` `game_uppermost_window_service_world_hotspot_band` + -> `0x0043d130` `world_view_pan_relative_offset_in_camera_plane` + -> `0x004e0ba0` `game_uppermost_window_handle_message` + -> `0x0054f540` `shell_input_cursor_inside_active_view` +- `0x004e0960` `game_uppermost_window_refresh_controls` + -> `0x004e0b20` `game_uppermost_window_construct` + -> `0x004e0ba0` `game_uppermost_window_handle_message` +- `0x004e0b20` `game_uppermost_window_construct` + -> `0x004e0e40` `shell_ensure_game_uppermost_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004e0ba0` `game_uppermost_window_handle_message` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` +- `0x004e0e40` `shell_ensure_game_uppermost_window` + -> `0x004e0b20` `game_uppermost_window_construct` +- `0x004e1d60` `shell_load_screen_refresh_page_strip_and_page_kind_controls` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` +- `0x004e1f50` `shell_has_live_load_screen_window` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004e1f60` `shell_mark_load_screen_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` + -> `0x004e3a00` `shell_load_screen_step_selected_company_delta` + -> `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x004e45d0` `shell_load_screen_profile_stock_holdings_page_handle_message` +- `0x004e39e0` `company_query_display_year_or_current_year` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e3a00` `shell_load_screen_step_selected_company_delta` + -> `0x00429990` `company_collection_get_nth_active_company_id` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` +- `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x004ddbd0` `shell_detail_panel_transition_manager` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` + -> `0x004e3a00` `shell_load_screen_step_selected_company_delta` + -> `0x004e45d0` `shell_load_screen_profile_stock_holdings_page_handle_message` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e45d0` `shell_load_screen_profile_stock_holdings_page_handle_message` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` + -> `0x004e39e0` `company_query_display_year_or_current_year` + -> `0x004e3a00` `shell_load_screen_step_selected_company_delta` + -> `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x004e4b10` `shell_load_screen_reset_runtime_state_and_seed_selection` + -> `0x004e4ee0` `shell_open_or_focus_load_screen_page` +- `0x004e4ee0` `shell_open_or_focus_load_screen_page` + -> `0x004e2c10` `shell_load_screen_select_page_subject_and_refresh` + -> `0x004e4b10` `shell_load_screen_reset_runtime_state_and_seed_selection` +- `0x004e5130` `shell_load_screen_render_company_stock_data_panel` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004e51ea` `shell_load_screen_render_game_status_briefing_panel` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x004348c0` `scenario_state_get_selected_chairman_profile_record` +- `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x00434870` `scenario_state_get_selected_chairman_company_record` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x00426ef0` `company_get_linked_chairman_profile_record` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004768c0` `chairman_profile_owns_all_company_shares` + -> `0x004c56a0` `shell_company_detail_window_handle_message` + -> `0x004e39e0` `company_query_display_year_or_current_year` +- `0x004e68e0` `shell_load_screen_render_company_list_panel` + -> `0x00429a50` `company_collection_count_active_companies` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` +- `0x004e6ef0` `shell_load_screen_render_player_list_panel` + -> `0x00477820` `profile_collection_count_active_chairman_records` + -> `0x00477860` `profile_collection_get_nth_active_chairman_record` +- `0x004e7670` `shell_load_screen_render_company_train_list_panel` + -> `0x004e39e0` `company_query_display_year_or_current_year` +- `0x004e8bb0` `shell_load_screen_render_company_station_list_panel` + -> `0x00426590` `company_count_linked_transit_sites` +- `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x0041e220` `structure_candidate_is_enabled_for_current_year` + -> `0x0041e650` `structure_candidate_query_route_style_or_local_availability_metric` +- `0x004e9b20` `shell_load_screen_render_company_report_history_panel` + -> `0x00425880` `company_compute_negative_cash_balance_interest_rate` + -> `0x004258c0` `company_compute_positive_cash_balance_interest_rate` + -> `0x0042a5d0` `company_read_year_or_control_transfer_metric_value` + -> `0x004ea060` `shell_load_screen_render_active_page_panel` +- `0x004ea060` `shell_load_screen_render_active_page_panel` + -> `0x004e5130` `shell_load_screen_render_company_stock_data_panel` + -> `0x004e51ea` `shell_load_screen_render_game_status_briefing_panel` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e68e0` `shell_load_screen_render_company_list_panel` + -> `0x004e6ef0` `shell_load_screen_render_player_list_panel` + -> `0x004e7670` `shell_load_screen_render_company_train_list_panel` + -> `0x004e8270` `shell_load_screen_render_company_industry_list_panel` + -> `0x004e8bb0` `shell_load_screen_render_company_station_list_panel` + -> `0x004e9460` `shell_load_screen_render_map_cargo_list_panel` + -> `0x004e9b20` `shell_load_screen_render_company_report_history_panel` +- `0x004ea620` `shell_load_screen_window_construct` + -> `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x004ea720` `shell_load_screen_window_is_open` + -> `0x004ea730` `shell_load_screen_window_destroy` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004ea720` `shell_load_screen_window_is_open` + -> `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` +- `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` +- `0x004ec640` `shell_company_detail_attempt_merger_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x004ee0e0` `multiplayer_open_staged_text_entry_dialog` + -> `0x00484910` `shell_save_graphics_config` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004ee1d0` `multiplayer_commit_staged_text_entry` + -> `0x00484910` `shell_save_graphics_config` +- `0x004ee3a0` `multiplayer_reset_tool_globals` + -> `0x00482ec0` `shell_transition_mode` +- `0x004ee810` `multiplayer_publish_wrapped_chat_message` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` +- `0x004ee950` `multiplayer_load_selected_map_preview_surface` + -> `0x004efe80` `multiplayer_window_init_globals` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` +- `0x004eed30` `multiplayer_sync_selected_map_entry` + -> `0x004ee950` `multiplayer_load_selected_map_preview_surface` +- `0x004f2e80` `shell_has_live_overview_window` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` + -> `0x004f3a10` `shell_open_or_focus_overview_window` +- `0x004f2e90` `shell_mark_overview_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x004f38a0` `shell_overview_window_construct` + -> `0x004f3a10` `shell_open_or_focus_overview_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x004f38f0` `shell_overview_window_handle_message` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x004f3a10` `shell_open_or_focus_overview_window` + -> `0x004f38a0` `shell_overview_window_construct` +- `0x004fe130` `shell_mark_settings_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` + -> `0x00501e50` `shell_open_settings_window` +- `0x00500640` `shell_settings_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00502030` `shell_setup_window_draw_table_driven_payload_category_row` + -> `0x00504010` `shell_setup_window_construct` + -> `0x00552560` `shell_queue_world_anchor_marker` +- `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x00484910` `shell_save_graphics_config` + -> `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00504010` `shell_setup_window_construct` +- `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00484910` `shell_save_graphics_config` + -> `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x00504010` `shell_setup_window_construct` +- `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x00559520` `surface_init_rgba_pixel_buffer` +- `0x00502720` `paint_terrain_tool_init_globals` + -> `0x004ee3a0` `multiplayer_reset_tool_globals` +- `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` +- `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x004336a0` `shell_setup_file_list_construct_and_scan_dataset` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00482d80` `runtime_query_cached_local_exe_version_string` + -> `0x004eb0b0` `shell_open_grayscale_map_tga_picker_and_stage_selection` + -> `0x005027b0` `shell_setup_window_refresh_file_backed_selection_list_panel` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x005033d0` `shell_setup_window_handle_message` + -> `0x0042a970` `shell_open_file_dialog_copy_selected_path_and_restore_cwd` + -> `0x00484910` `shell_save_graphics_config` + -> `0x004eb0b0` `shell_open_grayscale_map_tga_picker_and_stage_selection` + -> `0x004fe120` `shell_has_settings_window` + -> `0x00501e50` `shell_open_settings_window` + -> `0x00501f20` `shell_query_registry_open_command_for_http_or_rtf_target` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00502550` `shell_setup_window_refresh_selection_lists_and_summary_fields` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x00504010` `shell_setup_window_construct` + -> `0x005411c0` `shell_query_tga_header_is_supported_truecolor_image` +- `0x00504010` `shell_setup_window_construct` + -> `0x00502030` `shell_setup_window_draw_table_driven_payload_category_row` + -> `0x00502160` `shell_setup_window_set_first_persisted_selector_flag_or_index_and_save_config` + -> `0x005021c0` `shell_setup_window_set_second_persisted_selector_flag_or_index_and_save_config` + -> `0x00502550` `shell_setup_window_refresh_selection_lists_and_summary_fields` + -> `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + -> `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + -> `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00504ae0` `shell_station_detail_set_active_candidate_service_preview` + -> `0x0043f640` `world_render_station_candidate_service_map_overlay` + -> `0x00504a90` `shell_station_detail_clear_active_candidate_service_preview` +- `0x00504ba0` `shell_station_detail_update_candidate_service_entry` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x00504a90` `shell_station_detail_clear_active_candidate_service_preview` + -> `0x00504ae0` `shell_station_detail_set_active_candidate_service_preview` +- `0x00504bea` `shell_station_detail_format_candidate_local_service_summary` + -> `0x0047e240` `placed_structure_query_candidate_local_service_metrics` + -> `0x00504ae0` `shell_station_detail_set_active_candidate_service_preview` +- `0x005068c0` `shell_station_detail_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00506be0` `shell_station_detail_format_freight_and_express_summary` + -> `0x005519f0` `shell_publish_text_callout_presentation` +- `0x00509d80` `station_place_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x0050ccc0` `shell_company_detail_attempt_chairmanship_takeover_flow` + -> `0x004c56a0` `shell_company_detail_window_handle_message` +- `0x0050e400` `track_lay_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x0050f740` `shell_has_live_trainbuy_window` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` + -> `0x00512c50` `shell_open_or_focus_trainbuy_window` +- `0x0050f750` `shell_mark_trainbuy_window_dirty` + -> `0x00439140` `simulation_frame_accumulate_and_step_world` +- `0x0050f790` `shell_trainbuy_window_compute_selected_upgrade_total_and_count` + -> `0x0050f760` `shell_trainbuy_window_query_selected_locomotive_id` + -> `0x0050f890` `shell_trainbuy_window_render_selected_train_upgrade_summary` +- `0x0050f890` `shell_trainbuy_window_render_selected_train_upgrade_summary` + -> `0x0050f760` `shell_trainbuy_window_query_selected_locomotive_id` + -> `0x0050f790` `shell_trainbuy_window_compute_selected_upgrade_total_and_count` + -> `0x00511500` `shell_trainbuy_window_construct` +- `0x0050fc00` `shell_trainbuy_window_render_selected_train_route_and_state_panel` + -> `0x005519f0` `shell_publish_text_callout_presentation` + -> `0x00552560` `shell_queue_world_anchor_marker` +- `0x00511500` `shell_trainbuy_window_construct` + -> `0x0050f890` `shell_trainbuy_window_render_selected_train_upgrade_summary` + -> `0x0050fc00` `shell_trainbuy_window_render_selected_train_route_and_state_panel` + -> `0x00512080` `shell_trainbuy_window_refresh_controls` + -> `0x00512c50` `shell_open_or_focus_trainbuy_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00512080` `shell_trainbuy_window_refresh_controls` + -> `0x00511500` `shell_trainbuy_window_construct` +- `0x00512c50` `shell_open_or_focus_trainbuy_window` + -> `0x00433b00` `shell_can_open_trainbuy_window_or_warn` + -> `0x00511500` `shell_trainbuy_window_construct` + -> `0x00512080` `shell_trainbuy_window_refresh_controls` +- `0x005130f0` `shell_trainbuy_window_query_selected_train_record` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x005131a0` `shell_trainbuy_window_selected_train_belongs_to_selected_company` + -> `0x00513220` `shell_trainbuy_window_warn_selected_train_not_owned_by_current_company` +- `0x00513220` `shell_trainbuy_window_warn_selected_train_not_owned_by_current_company` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` +- `0x00514110` `shell_train_detail_window_refresh_selected_train_name_label` + -> `0x00514420` `shell_train_detail_window_construct` +- `0x00514160` `shell_train_detail_window_refresh_controls` + -> `0x00513720` `shell_trainbuy_window_refresh_selection_column_empty_state_labels` + -> `0x00514420` `shell_train_detail_window_construct` + -> `0x00514620` `shell_open_or_focus_train_detail_window` + -> `0x00514690` `shell_train_detail_window_handle_message` +- `0x00514420` `shell_train_detail_window_construct` + -> `0x00512f80` `shell_trainbuy_window_refresh_selection_side_toggle` + -> `0x00514160` `shell_train_detail_window_refresh_controls` + -> `0x00514620` `shell_open_or_focus_train_detail_window` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00514690` `shell_train_detail_window_handle_message` + -> `0x004ab980` `train_set_route_operating_mode_and_scalar` + -> `0x004b2c10` `train_route_list_validate_reachability_and_station_pair` + -> `0x004b3000` `train_route_list_remove_entry_and_compact` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` + -> `0x00512c50` `shell_open_or_focus_trainbuy_window` + -> `0x005130f0` `shell_trainbuy_window_query_selected_train_record` + -> `0x00513220` `shell_trainbuy_window_warn_selected_train_not_owned_by_current_company` + -> `0x00514160` `shell_train_detail_window_refresh_controls` +- `0x00516d00` `tutorial_validate_train_route_station_indicator_step` + -> `0x004b3160` `train_route_list_insert_staged_entry_at_index` + -> `0x004c98a0` `shell_open_custom_modal_dialog_with_callbacks` + -> `0x00516be0` `tutorial_advance_step_and_refresh_expected_control_ids` +- `0x005174e0` `shell_video_window_construct` + -> `0x0053fa50` `shell_window_bind_resource_and_initialize_child_control_links` +- `0x00517570` `shell_video_window_destroy` + -> `0x00484910` `shell_save_graphics_config` + -> `0x005174e0` `shell_video_window_construct` +- `0x00517cf0` `indexed_collection_slot_count` + -> `0x00518380` `indexed_collection_get_nth_live_entry_id` +- `0x00517d40` `indexed_collection_entry_id_is_live` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` + -> `0x00518140` `indexed_collection_resolve_live_entry_by_id` +- `0x0051c920` `localization_lookup_display_label_by_stem_or_fallback` + -> `0x004ba3d0` `shell_building_detail_refresh_subject_cargo_and_service_rows` +- `0x0051db80` `math_measure_float_xy_pair_distance` + -> `0x00402cb0` `city_connection_try_build_route_with_optional_direct_site_placement` + -> `0x0049bd40` `route_entry_collection_run_initial_candidate_path_sweep` +- `0x0051ef20` `shell_load_display_runtime_config_or_init_defaults` + -> `0x0051ebc0` `shell_reset_display_runtime_defaults` + -> `0x0051eea0` `shell_save_display_runtime_config` +- `0x005204b0` `shell_flush_deferred_work_queues` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` +- `0x00520620` `shell_service_frame_cycle` + -> `0x0051fd70` `shell_update_frame_time_history` + -> `0x005204b0` `shell_flush_deferred_work_queues` + -> `0x0052b990` `shell_refresh_presentation_frame` + -> `0x0053f4e0` `mouse_cursor_update_frame_state` + -> `0x00565110` `shell_rebuild_layout_state_and_optional_texture_report` +- `0x00521390` `bootstrap_destroy_shell_service_bundle` + -> `0x00521060` `bootstrap_init_shell_service_bundle` +- `0x0052b990` `shell_refresh_presentation_frame` + -> `0x00565110` `shell_rebuild_layout_state_and_optional_texture_report` +- `0x0053a960` `shell_emit_geographic_label_text_span` + -> `0x005519f0` `shell_publish_text_callout_presentation` +- `0x0053f830` `shell_window_find_registered_child_control_by_id` + -> `0x004e0ba0` `game_uppermost_window_handle_message` + -> `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + -> `0x00504010` `shell_setup_window_construct` +- `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` + -> `0x004c4c70` `shell_company_detail_setup_dividend_rate_adjust_controls` + -> `0x00558130` `shell_child_control_set_owner_resolve_caption_and_refresh` +- `0x00540a47` `shell_control_refresh_matching_dynamic_text_payload` + -> `0x005639d2` `shell_control_release_dynamic_text_payload` +- `0x005411c0` `shell_query_tga_header_is_supported_truecolor_image` + -> `0x005033d0` `shell_setup_window_handle_message` +- `0x0054f540` `shell_input_cursor_inside_active_view` + -> `0x004e0780` `game_uppermost_window_service_world_hotspot_band` +- `0x0054fb10` `shell_queue_callout_leader_path` + -> `0x0054f710` `shell_queue_callout_segment_marker` +- `0x005519f0` `shell_publish_text_callout_presentation` + -> `0x0054fb10` `shell_queue_callout_leader_path` +- `0x00558130` `shell_child_control_set_owner_resolve_caption_and_refresh` + -> `0x0053f9c0` `shell_window_register_child_control_sorted_by_priority_and_optional_tag` +- `0x0055d8d0` `display_get_primary_adapter_descriptor` + -> `0x00484a60` `shell_match_legacy_gpu_profile_token` diff --git a/artifacts/exports/rt3-1.06/shell-load-subgraph.dot b/artifacts/exports/rt3-1.06/shell-load-subgraph.dot new file mode 100644 index 0000000..1623f52 --- /dev/null +++ b/artifacts/exports/rt3-1.06/shell-load-subgraph.dot @@ -0,0 +1,141 @@ +digraph shell_load { + graph [rankdir=LR, labelloc="t", labeljust="l"]; + label="Shell Load Startup Subgraph"; + node [shape=box, style="rounded,filled", fillcolor="#f8f8f8", color="#555555", fontname="Helvetica"]; + edge [color="#666666", fontname="Helvetica"]; + subgraph cluster_bootstrap { + label="bootstrap"; + color="#cccccc"; + "0x00482ec0" [label="0x00482ec0\\nshell_transition_mode [seed]", fillcolor="#ffe9a8"]; + "0x004840e0" [label="0x004840e0\\nbootstrap_init_shell_window_services", fillcolor="#f8f8f8"]; + "0x00521390" [label="0x00521390\\nbootstrap_destroy_shell_service_bundle", fillcolor="#f8f8f8"]; + } + subgraph cluster_map { + label="map"; + color="#cccccc"; + "0x004133b0" [label="0x004133b0\\nplaced_structure_collection_refresh_local_runtime_records_and_position_scalars", fillcolor="#f8f8f8"]; + "0x0041ea50" [label="0x0041ea50\\nworld_setup_building_collection_phase", fillcolor="#f8f8f8"]; + "0x00421b60" [label="0x00421b60\\nworld_region_collection_seed_default_regions", fillcolor="#f8f8f8"]; + "0x00421c20" [label="0x00421c20\\nworld_region_collection_run_building_population_pass", fillcolor="#f8f8f8"]; + "0x00434300" [label="0x00434300\\nworld_runtime_release_global_services", fillcolor="#f8f8f8"]; + "0x00437220" [label="0x00437220\\nworld_build_chairman_profile_slot_records", fillcolor="#f8f8f8"]; + "0x004377a0" [label="0x004377a0\\nworld_seed_default_chairman_profile_slots", fillcolor="#f8f8f8"]; + "0x004384d0" [label="0x004384d0\\nworld_run_post_load_generation_pipeline", fillcolor="#f8f8f8"]; + "0x00438890" [label="0x00438890\\nshell_active_mode_run_profile_startup_and_load_dispatch [seed]", fillcolor="#ffe9a8"]; + "0x00443a50" [label="0x00443a50\\nworld_entry_transition_and_runtime_bringup", fillcolor="#f8f8f8"]; + "0x00445ac0" [label="0x00445ac0\\nshell_map_file_entry_coordinator", fillcolor="#f8f8f8"]; + "0x00446d40" [label="0x00446d40\\nworld_load_saved_runtime_state_bundle", fillcolor="#f8f8f8"]; + "0x0044fb70" [label="0x0044fb70\\nworld_compute_transport_and_pricing_grid", fillcolor="#f8f8f8"]; + "0x0047d440" [label="0x0047d440\\nworld_conditionally_seed_named_starting_railroad_companies", fillcolor="#f8f8f8"]; + "0x004882e0" [label="0x004882e0\\nworld_region_border_overlay_rebuild", fillcolor="#f8f8f8"]; + } + subgraph cluster_render { + label="render"; + color="#cccccc"; + "0x0043f640" [label="0x0043f640\\nworld_render_station_candidate_service_map_overlay", fillcolor="#f8f8f8"]; + } + subgraph cluster_shell { + label="shell"; + color="#cccccc"; + "0x0046b780" [label="0x0046b780\\nmultiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync", fillcolor="#f8f8f8"]; + "0x00483f70" [label="0x00483f70\\nshell_service_pump_iteration", fillcolor="#f8f8f8"]; + "0x00484910" [label="0x00484910\\nshell_save_graphics_config", fillcolor="#f8f8f8"]; + "0x004b8dc0" [label="0x004b8dc0\\nshell_campaign_window_destroy", fillcolor="#f8f8f8"]; + "0x004b8e60" [label="0x004b8e60\\nshell_campaign_window_construct", fillcolor="#f8f8f8"]; + "0x004c7bc0" [label="0x004c7bc0\\nshell_credits_window_destroy", fillcolor="#f8f8f8"]; + "0x004c7fc0" [label="0x004c7fc0\\nshell_credits_window_construct", fillcolor="#f8f8f8"]; + "0x004dd010" [label="0x004dd010\\nshell_file_request_dialog_collect_target_path", fillcolor="#f8f8f8"]; + "0x004dfbe0" [label="0x004dfbe0\\nshell_game_window_construct", fillcolor="#f8f8f8"]; + "0x004dfd70" [label="0x004dfd70\\nshell_game_window_destroy", fillcolor="#f8f8f8"]; + "0x004dfdf0" [label="0x004dfdf0\\nshell_ensure_game_message_window", fillcolor="#f8f8f8"]; + "0x004e3a80" [label="0x004e3a80\\nshell_load_screen_window_handle_message", fillcolor="#f8f8f8"]; + "0x004e5300" [label="0x004e5300\\nshell_load_screen_render_player_detail_stock_holdings_panel", fillcolor="#f8f8f8"]; + "0x004e5a80" [label="0x004e5a80\\nshell_render_company_overview_panel_header_and_optional_change_affordance", fillcolor="#f8f8f8"]; + "0x004e5cf0" [label="0x004e5cf0\\nshell_format_company_governance_and_economy_status_panel", fillcolor="#f8f8f8"]; + "0x004ea620" [label="0x004ea620\\nshell_load_screen_window_construct", fillcolor="#f8f8f8"]; + "0x004ea720" [label="0x004ea720\\nshell_load_screen_window_is_open", fillcolor="#f8f8f8"]; + "0x004ea730" [label="0x004ea730\\nshell_load_screen_window_destroy", fillcolor="#f8f8f8"]; + "0x004ee3a0" [label="0x004ee3a0\\nmultiplayer_reset_tool_globals", fillcolor="#f8f8f8"]; + "0x004ee950" [label="0x004ee950\\nmultiplayer_load_selected_map_preview_surface", fillcolor="#f8f8f8"]; + "0x004efe80" [label="0x004efe80\\nmultiplayer_window_init_globals", fillcolor="#f8f8f8"]; + "0x00502720" [label="0x00502720\\npaint_terrain_tool_init_globals", fillcolor="#f8f8f8"]; + "0x00504010" [label="0x00504010\\nshell_setup_window_construct", fillcolor="#f8f8f8"]; + "0x005174e0" [label="0x005174e0\\nshell_video_window_construct", fillcolor="#f8f8f8"]; + "0x00517570" [label="0x00517570\\nshell_video_window_destroy", fillcolor="#f8f8f8"]; + "0x005204b0" [label="0x005204b0\\nshell_flush_deferred_work_queues", fillcolor="#f8f8f8"]; + } + subgraph cluster_simulation { + label="simulation"; + color="#cccccc"; + "0x00437b20" [label="0x00437b20\\nsimulation_run_chunked_fast_forward_burst", fillcolor="#f8f8f8"]; + } + "0x00421b60" -> "0x004384d0"; + "0x00434300" -> "0x00443a50"; + "0x00434300" -> "0x00446d40"; + "0x00434300" -> "0x00482ec0"; + "0x00437220" -> "0x004384d0"; + "0x00437b20" -> "0x004384d0"; + "0x004384d0" -> "0x004133b0"; + "0x004384d0" -> "0x0041ea50"; + "0x004384d0" -> "0x00421b60"; + "0x004384d0" -> "0x00421c20"; + "0x004384d0" -> "0x00437220"; + "0x004384d0" -> "0x004377a0"; + "0x004384d0" -> "0x00437b20"; + "0x004384d0" -> "0x0044fb70"; + "0x004384d0" -> "0x0047d440"; + "0x004384d0" -> "0x004882e0"; + "0x00438890" -> "0x004384d0"; + "0x00438890" -> "0x00445ac0"; + "0x0043f640" -> "0x0046b780"; + "0x00443a50" -> "0x00438890"; + "0x00443a50" -> "0x00482ec0"; + "0x00445ac0" -> "0x00443a50"; + "0x00445ac0" -> "0x00446d40"; + "0x00445ac0" -> "0x004dd010"; + "0x0046b780" -> "0x00438890"; + "0x0046b780" -> "0x00445ac0"; + "0x0047d440" -> "0x004377a0"; + "0x00482ec0" -> "0x00438890"; + "0x00482ec0" -> "0x00443a50"; + "0x00482ec0" -> "0x004840e0"; + "0x00482ec0" -> "0x004b8dc0"; + "0x00482ec0" -> "0x004b8e60"; + "0x00482ec0" -> "0x004c7bc0"; + "0x00482ec0" -> "0x004c7fc0"; + "0x00482ec0" -> "0x004dfbe0"; + "0x00482ec0" -> "0x004dfd70"; + "0x00482ec0" -> "0x004ea620"; + "0x00482ec0" -> "0x004ea730"; + "0x00482ec0" -> "0x004efe80"; + "0x00482ec0" -> "0x00504010"; + "0x00482ec0" -> "0x005174e0"; + "0x00482ec0" -> "0x00517570"; + "0x004840e0" -> "0x00482ec0"; + "0x004840e0" -> "0x00483f70"; + "0x004840e0" -> "0x00521390"; + "0x004882e0" -> "0x004384d0"; + "0x004b8dc0" -> "0x004b8e60"; + "0x004c7bc0" -> "0x004c7fc0"; + "0x004dfbe0" -> "0x004dfd70"; + "0x004dfbe0" -> "0x004dfdf0"; + "0x004e3a80" -> "0x004e5300"; + "0x004e3a80" -> "0x004e5a80"; + "0x004e3a80" -> "0x004e5cf0"; + "0x004e5a80" -> "0x004e5cf0"; + "0x004ea620" -> "0x004e3a80"; + "0x004ea620" -> "0x004e5300"; + "0x004ea620" -> "0x004e5a80"; + "0x004ea620" -> "0x004e5cf0"; + "0x004ea620" -> "0x004ea720"; + "0x004ea620" -> "0x004ea730"; + "0x004ea720" -> "0x004ea620"; + "0x004ea720" -> "0x004ea730"; + "0x004ea730" -> "0x004ea620"; + "0x004ee3a0" -> "0x00482ec0"; + "0x004ee950" -> "0x004efe80"; + "0x00502720" -> "0x004ee3a0"; + "0x00517570" -> "0x00484910"; + "0x00517570" -> "0x005174e0"; + "0x005204b0" -> "0x00443a50"; +} diff --git a/artifacts/exports/rt3-1.06/shell-load-subgraph.md b/artifacts/exports/rt3-1.06/shell-load-subgraph.md new file mode 100644 index 0000000..c645785 --- /dev/null +++ b/artifacts/exports/rt3-1.06/shell-load-subgraph.md @@ -0,0 +1,156 @@ +# Shell Load Startup Subgraph + +- Nodes: `46` +- Edges: `69` +- Seeds: `0x00438890`, `0x00482ec0` +- Graphviz: `shell-load-subgraph.dot` + +## Nodes + +| Address | Name | Subsystem | Confidence | +| --- | --- | --- | --- | +| `0x004133b0` | `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` | `map` | `2` | +| `0x0041ea50` | `world_setup_building_collection_phase` | `map` | `3` | +| `0x00421b60` | `world_region_collection_seed_default_regions` | `map` | `4` | +| `0x00421c20` | `world_region_collection_run_building_population_pass` | `map` | `4` | +| `0x00434300` | `world_runtime_release_global_services` | `map` | `3` | +| `0x00437220` | `world_build_chairman_profile_slot_records` | `map` | `4` | +| `0x004377a0` | `world_seed_default_chairman_profile_slots` | `map` | `4` | +| `0x00437b20` | `simulation_run_chunked_fast_forward_burst` | `simulation` | `3` | +| `0x004384d0` | `world_run_post_load_generation_pipeline` | `map` | `4` | +| `0x00438890` | `shell_active_mode_run_profile_startup_and_load_dispatch` | `map` | `4` | +| `0x0043f640` | `world_render_station_candidate_service_map_overlay` | `render` | `4` | +| `0x00443a50` | `world_entry_transition_and_runtime_bringup` | `map` | `4` | +| `0x00445ac0` | `shell_map_file_entry_coordinator` | `map` | `4` | +| `0x00446d40` | `world_load_saved_runtime_state_bundle` | `map` | `4` | +| `0x0044fb70` | `world_compute_transport_and_pricing_grid` | `map` | `3` | +| `0x0046b780` | `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` | `shell` | `4` | +| `0x0047d440` | `world_conditionally_seed_named_starting_railroad_companies` | `map` | `4` | +| `0x00482ec0` | `shell_transition_mode` | `bootstrap` | `4` | +| `0x00483f70` | `shell_service_pump_iteration` | `shell` | `4` | +| `0x004840e0` | `bootstrap_init_shell_window_services` | `bootstrap` | `4` | +| `0x00484910` | `shell_save_graphics_config` | `shell` | `4` | +| `0x004882e0` | `world_region_border_overlay_rebuild` | `map` | `4` | +| `0x004b8dc0` | `shell_campaign_window_destroy` | `shell` | `4` | +| `0x004b8e60` | `shell_campaign_window_construct` | `shell` | `4` | +| `0x004c7bc0` | `shell_credits_window_destroy` | `shell` | `4` | +| `0x004c7fc0` | `shell_credits_window_construct` | `shell` | `4` | +| `0x004dd010` | `shell_file_request_dialog_collect_target_path` | `shell` | `4` | +| `0x004dfbe0` | `shell_game_window_construct` | `shell` | `4` | +| `0x004dfd70` | `shell_game_window_destroy` | `shell` | `4` | +| `0x004dfdf0` | `shell_ensure_game_message_window` | `shell` | `4` | +| `0x004e3a80` | `shell_load_screen_window_handle_message` | `shell` | `4` | +| `0x004e5300` | `shell_load_screen_render_player_detail_stock_holdings_panel` | `shell` | `4` | +| `0x004e5a80` | `shell_render_company_overview_panel_header_and_optional_change_affordance` | `shell` | `4` | +| `0x004e5cf0` | `shell_format_company_governance_and_economy_status_panel` | `shell` | `4` | +| `0x004ea620` | `shell_load_screen_window_construct` | `shell` | `4` | +| `0x004ea720` | `shell_load_screen_window_is_open` | `shell` | `4` | +| `0x004ea730` | `shell_load_screen_window_destroy` | `shell` | `4` | +| `0x004ee3a0` | `multiplayer_reset_tool_globals` | `shell` | `3` | +| `0x004ee950` | `multiplayer_load_selected_map_preview_surface` | `shell` | `4` | +| `0x004efe80` | `multiplayer_window_init_globals` | `shell` | `4` | +| `0x00502720` | `paint_terrain_tool_init_globals` | `shell` | `4` | +| `0x00504010` | `shell_setup_window_construct` | `shell` | `4` | +| `0x005174e0` | `shell_video_window_construct` | `shell` | `4` | +| `0x00517570` | `shell_video_window_destroy` | `shell` | `4` | +| `0x005204b0` | `shell_flush_deferred_work_queues` | `shell` | `4` | +| `0x00521390` | `bootstrap_destroy_shell_service_bundle` | `bootstrap` | `4` | + +## Edges + +- `0x00421b60` `world_region_collection_seed_default_regions` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x00434300` `world_runtime_release_global_services` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00446d40` `world_load_saved_runtime_state_bundle` + -> `0x00482ec0` `shell_transition_mode` +- `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x004133b0` `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` + -> `0x0041ea50` `world_setup_building_collection_phase` + -> `0x00421b60` `world_region_collection_seed_default_regions` + -> `0x00421c20` `world_region_collection_run_building_population_pass` + -> `0x00437220` `world_build_chairman_profile_slot_records` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` + -> `0x00437b20` `simulation_run_chunked_fast_forward_burst` + -> `0x0044fb70` `world_compute_transport_and_pricing_grid` + -> `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004882e0` `world_region_border_overlay_rebuild` +- `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x004384d0` `world_run_post_load_generation_pipeline` + -> `0x00445ac0` `shell_map_file_entry_coordinator` +- `0x0043f640` `world_render_station_candidate_service_map_overlay` + -> `0x0046b780` `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` +- `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00482ec0` `shell_transition_mode` +- `0x00445ac0` `shell_map_file_entry_coordinator` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x00446d40` `world_load_saved_runtime_state_bundle` + -> `0x004dd010` `shell_file_request_dialog_collect_target_path` +- `0x0046b780` `multiplayer_preview_dataset_service_launch_state_and_warn_out_of_sync` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00445ac0` `shell_map_file_entry_coordinator` +- `0x0047d440` `world_conditionally_seed_named_starting_railroad_companies` + -> `0x004377a0` `world_seed_default_chairman_profile_slots` +- `0x00482ec0` `shell_transition_mode` + -> `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` + -> `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` + -> `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` + -> `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004efe80` `multiplayer_window_init_globals` + -> `0x00504010` `shell_setup_window_construct` + -> `0x005174e0` `shell_video_window_construct` + -> `0x00517570` `shell_video_window_destroy` +- `0x004840e0` `bootstrap_init_shell_window_services` + -> `0x00482ec0` `shell_transition_mode` + -> `0x00483f70` `shell_service_pump_iteration` + -> `0x00521390` `bootstrap_destroy_shell_service_bundle` +- `0x004882e0` `world_region_border_overlay_rebuild` + -> `0x004384d0` `world_run_post_load_generation_pipeline` +- `0x004b8dc0` `shell_campaign_window_destroy` + -> `0x004b8e60` `shell_campaign_window_construct` +- `0x004c7bc0` `shell_credits_window_destroy` + -> `0x004c7fc0` `shell_credits_window_construct` +- `0x004dfbe0` `shell_game_window_construct` + -> `0x004dfd70` `shell_game_window_destroy` + -> `0x004dfdf0` `shell_ensure_game_message_window` +- `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` +- `0x004ea620` `shell_load_screen_window_construct` + -> `0x004e3a80` `shell_load_screen_window_handle_message` + -> `0x004e5300` `shell_load_screen_render_player_detail_stock_holdings_panel` + -> `0x004e5a80` `shell_render_company_overview_panel_header_and_optional_change_affordance` + -> `0x004e5cf0` `shell_format_company_governance_and_economy_status_panel` + -> `0x004ea720` `shell_load_screen_window_is_open` + -> `0x004ea730` `shell_load_screen_window_destroy` +- `0x004ea720` `shell_load_screen_window_is_open` + -> `0x004ea620` `shell_load_screen_window_construct` + -> `0x004ea730` `shell_load_screen_window_destroy` +- `0x004ea730` `shell_load_screen_window_destroy` + -> `0x004ea620` `shell_load_screen_window_construct` +- `0x004ee3a0` `multiplayer_reset_tool_globals` + -> `0x00482ec0` `shell_transition_mode` +- `0x004ee950` `multiplayer_load_selected_map_preview_surface` + -> `0x004efe80` `multiplayer_window_init_globals` +- `0x00502720` `paint_terrain_tool_init_globals` + -> `0x004ee3a0` `multiplayer_reset_tool_globals` +- `0x00517570` `shell_video_window_destroy` + -> `0x00484910` `shell_save_graphics_config` + -> `0x005174e0` `shell_video_window_construct` +- `0x005204b0` `shell_flush_deferred_work_queues` + -> `0x00443a50` `world_entry_transition_and_runtime_bringup` diff --git a/crates/rrt-cli/Cargo.toml b/crates/rrt-cli/Cargo.toml index 3b1e66c..d9bb5fe 100644 --- a/crates/rrt-cli/Cargo.toml +++ b/crates/rrt-cli/Cargo.toml @@ -6,4 +6,6 @@ license.workspace = true [dependencies] rrt-model = { path = "../rrt-model" } +serde.workspace = true +serde_json.workspace = true sha2.workspace = true diff --git a/crates/rrt-cli/src/main.rs b/crates/rrt-cli/src/main.rs index b0d88ba..5f94c52 100644 --- a/crates/rrt-cli/src/main.rs +++ b/crates/rrt-cli/src/main.rs @@ -6,10 +6,34 @@ use std::path::{Path, PathBuf}; use rrt_model::{ BINARY_SUMMARY_PATH, CANONICAL_EXE_PATH, CONTROL_LOOP_ATLAS_PATH, FUNCTION_MAP_PATH, - REQUIRED_ATLAS_HEADINGS, REQUIRED_EXPORTS, load_binary_summary, load_function_map, + REQUIRED_ATLAS_HEADINGS, REQUIRED_EXPORTS, + finance::{FinanceOutcome, FinanceSnapshot}, + load_binary_summary, load_function_map, }; +use serde::Serialize; +use serde_json::Value; use sha2::{Digest, Sha256}; +enum Command { + Validate { repo_root: PathBuf }, + FinanceEval { snapshot_path: PathBuf }, + FinanceDiff { left_path: PathBuf, right_path: PathBuf }, +} + +#[derive(Debug, Serialize)] +struct FinanceDiffEntry { + path: String, + left: Value, + right: Value, +} + +#[derive(Debug, Serialize)] +struct FinanceDiffReport { + matches: bool, + difference_count: usize, + differences: Vec, +} + fn main() { if let Err(err) = real_main() { eprintln!("error: {err}"); @@ -18,22 +42,155 @@ fn main() { } fn real_main() -> Result<(), Box> { - let repo_root = parse_repo_root()?; - validate_required_files(&repo_root)?; - validate_binary_summary(&repo_root)?; - validate_function_map(&repo_root)?; - validate_control_loop_atlas(&repo_root)?; - println!("baseline validation passed"); + match parse_command()? { + Command::Validate { repo_root } => { + validate_required_files(&repo_root)?; + validate_binary_summary(&repo_root)?; + validate_function_map(&repo_root)?; + validate_control_loop_atlas(&repo_root)?; + println!("baseline validation passed"); + } + Command::FinanceEval { snapshot_path } => { + run_finance_eval(&snapshot_path)?; + } + Command::FinanceDiff { + left_path, + right_path, + } => { + run_finance_diff(&left_path, &right_path)?; + } + } + Ok(()) } -fn parse_repo_root() -> Result> { +fn parse_command() -> Result> { let mut args = env::args().skip(1); - match (args.next().as_deref(), args.next(), args.next()) { - (None, None, None) => Ok(env::current_dir()?), - (Some("validate"), None, None) => Ok(env::current_dir()?), - (Some("validate"), Some(path), None) => Ok(PathBuf::from(path)), - _ => Err("usage: rrt-cli [validate [repo-root]]".into()), + match (args.next().as_deref(), args.next(), args.next(), args.next()) { + (None, None, None, None) => Ok(Command::Validate { + repo_root: env::current_dir()?, + }), + (Some("validate"), None, None, None) => Ok(Command::Validate { + repo_root: env::current_dir()?, + }), + (Some("validate"), Some(path), None, None) => Ok(Command::Validate { + repo_root: PathBuf::from(path), + }), + (Some("finance"), Some(subcommand), Some(path), None) if subcommand == "eval" => { + Ok(Command::FinanceEval { + snapshot_path: PathBuf::from(path), + }) + } + (Some("finance"), Some(subcommand), Some(left), Some(right)) if subcommand == "diff" => { + Ok(Command::FinanceDiff { + left_path: PathBuf::from(left), + right_path: PathBuf::from(right), + }) + } + _ => Err( + "usage: rrt-cli [validate [repo-root] | finance eval | finance diff ]" + .into(), + ), + } +} + +fn run_finance_eval(snapshot_path: &Path) -> Result<(), Box> { + let outcome = load_finance_outcome(snapshot_path)?; + println!("{}", serde_json::to_string_pretty(&outcome)?); + Ok(()) +} + +fn run_finance_diff( + left_path: &Path, + right_path: &Path, +) -> Result<(), Box> { + let left = load_finance_outcome(left_path)?; + let right = load_finance_outcome(right_path)?; + let report = diff_finance_outcomes(&left, &right)?; + println!("{}", serde_json::to_string_pretty(&report)?); + Ok(()) +} + +fn load_finance_outcome(path: &Path) -> Result> { + let text = fs::read_to_string(path)?; + if let Ok(snapshot) = serde_json::from_str::(&text) { + return Ok(snapshot.evaluate()); + } + if let Ok(outcome) = serde_json::from_str::(&text) { + return Ok(outcome); + } + + Err(format!( + "unable to parse {} as FinanceSnapshot or FinanceOutcome", + path.display() + ) + .into()) +} + +fn diff_finance_outcomes( + left: &FinanceOutcome, + right: &FinanceOutcome, +) -> Result> { + let left_value = serde_json::to_value(left)?; + let right_value = serde_json::to_value(right)?; + let mut differences = Vec::new(); + collect_json_differences("$", &left_value, &right_value, &mut differences); + + Ok(FinanceDiffReport { + matches: differences.is_empty(), + difference_count: differences.len(), + differences, + }) +} + +fn collect_json_differences( + path: &str, + left: &Value, + right: &Value, + differences: &mut Vec, +) { + match (left, right) { + (Value::Object(left_map), Value::Object(right_map)) => { + let mut keys = BTreeSet::new(); + keys.extend(left_map.keys().cloned()); + keys.extend(right_map.keys().cloned()); + + for key in keys { + let next_path = format!("{path}.{key}"); + match (left_map.get(&key), right_map.get(&key)) { + (Some(left_value), Some(right_value)) => { + collect_json_differences(&next_path, left_value, right_value, differences); + } + (left_value, right_value) => differences.push(FinanceDiffEntry { + path: next_path, + left: left_value.cloned().unwrap_or(Value::Null), + right: right_value.cloned().unwrap_or(Value::Null), + }), + } + } + } + (Value::Array(left_items), Value::Array(right_items)) => { + let max_len = left_items.len().max(right_items.len()); + for index in 0..max_len { + let next_path = format!("{path}[{index}]"); + match (left_items.get(index), right_items.get(index)) { + (Some(left_value), Some(right_value)) => { + collect_json_differences(&next_path, left_value, right_value, differences); + } + (left_value, right_value) => differences.push(FinanceDiffEntry { + path: next_path, + left: left_value.cloned().unwrap_or(Value::Null), + right: right_value.cloned().unwrap_or(Value::Null), + }), + } + } + } + _ if left != right => differences.push(FinanceDiffEntry { + path: path.to_string(), + left: left.clone(), + right: right.clone(), + }), + _ => {} } } @@ -143,3 +300,62 @@ fn sha256_file(path: &Path) -> Result> { Ok(format!("{:x}", hasher.finalize())) } + +#[cfg(test)] +mod tests { + use super::*; + use rrt_model::finance::{AnnualFinanceDecision, AnnualFinanceEvaluation, CompanyFinanceState, DebtRestructureSummary}; + + #[test] + fn loads_snapshot_as_outcome() { + let snapshot = FinanceSnapshot { + policy: rrt_model::finance::AnnualFinancePolicy { + dividends_allowed: false, + ..rrt_model::finance::AnnualFinancePolicy::default() + }, + company: CompanyFinanceState::default(), + }; + let path = write_temp_json("snapshot", &snapshot); + + let outcome = load_finance_outcome(&path).expect("snapshot should load"); + assert_eq!(outcome.evaluation.decision, AnnualFinanceDecision::NoAction); + + let _ = fs::remove_file(path); + } + + #[test] + fn diffs_outcomes_recursively() { + let left = FinanceOutcome { + evaluation: AnnualFinanceEvaluation::no_action(), + post_company: CompanyFinanceState::default(), + }; + let mut right = left.clone(); + right.post_company.current_cash = 123; + right.evaluation.debt_restructure = DebtRestructureSummary { + retired_principal: 10, + issued_principal: 20, + }; + + let report = diff_finance_outcomes(&left, &right).expect("diff should succeed"); + assert!(!report.matches); + assert!(report + .differences + .iter() + .any(|entry| entry.path == "$.post_company.current_cash")); + assert!(report + .differences + .iter() + .any(|entry| entry.path == "$.evaluation.debt_restructure.retired_principal")); + } + + fn write_temp_json(stem: &str, value: &T) -> PathBuf { + let nonce = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .expect("system time should be after epoch") + .as_nanos(); + let path = std::env::temp_dir().join(format!("rrt-cli-{stem}-{nonce}.json")); + let bytes = serde_json::to_vec_pretty(value).expect("json serialization should succeed"); + fs::write(&path, bytes).expect("temp json should be written"); + path + } +} diff --git a/crates/rrt-hook/Cargo.toml b/crates/rrt-hook/Cargo.toml index 957f397..bedd8e2 100644 --- a/crates/rrt-hook/Cargo.toml +++ b/crates/rrt-hook/Cargo.toml @@ -7,3 +7,8 @@ license.workspace = true [lib] name = "dinput8" crate-type = ["cdylib", "rlib"] + +[dependencies] +rrt-model = { path = "../rrt-model" } +serde.workspace = true +serde_json.workspace = true diff --git a/crates/rrt-hook/src/lib.rs b/crates/rrt-hook/src/lib.rs index 5a73fe7..31668db 100644 --- a/crates/rrt-hook/src/lib.rs +++ b/crates/rrt-hook/src/lib.rs @@ -1,10 +1,144 @@ #![cfg_attr(not(windows), allow(dead_code))] +use std::fs; +use std::io; +use std::path::{Path, PathBuf}; + +use rrt_model::finance::{ + AnnualFinancePolicy, BondPosition, CompanyFinanceState, FinanceOutcome, FinanceSnapshot, +}; +use serde::Serialize; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FinanceLogPaths { + pub snapshot_path: PathBuf, + pub outcome_path: PathBuf, +} + +pub fn sample_finance_snapshot() -> FinanceSnapshot { + FinanceSnapshot { + policy: AnnualFinancePolicy { + dividends_allowed: false, + ..AnnualFinancePolicy::default() + }, + company: CompanyFinanceState { + current_cash: 100_000, + support_adjusted_share_price: 27.5, + book_value_per_share: 20.0, + outstanding_share_count: 60_000, + recent_net_profits: [40_000, 30_000, 20_000], + recent_revenue_totals: [250_000, 240_000, 230_000], + bonds: vec![ + BondPosition { + principal: 150_000, + coupon_rate: 0.12, + years_remaining: 12, + }, + BondPosition { + principal: 10_000, + coupon_rate: 0.10, + years_remaining: 10, + }, + ], + ..CompanyFinanceState::default() + }, + } +} + +pub fn write_finance_snapshot_bundle( + base_dir: &Path, + stem: &str, + snapshot: &FinanceSnapshot, +) -> io::Result { + fs::create_dir_all(base_dir)?; + + let snapshot_path = base_dir.join(format!("rrt_finance_{stem}_snapshot.json")); + let outcome_path = base_dir.join(format!("rrt_finance_{stem}_outcome.json")); + let outcome: FinanceOutcome = snapshot.evaluate(); + + let snapshot_json = serde_json::to_vec_pretty(snapshot) + .map_err(|err| io::Error::other(format!("serialize snapshot: {err}")))?; + let outcome_json = serde_json::to_vec_pretty(&outcome) + .map_err(|err| io::Error::other(format!("serialize outcome: {err}")))?; + + fs::write(&snapshot_path, snapshot_json)?; + fs::write(&outcome_path, outcome_json)?; + + Ok(FinanceLogPaths { + snapshot_path, + outcome_path, + }) +} + +pub fn write_finance_snapshot_only( + base_dir: &Path, + stem: &str, + snapshot: &FinanceSnapshot, +) -> io::Result { + fs::create_dir_all(base_dir)?; + + let snapshot_path = base_dir.join(format!("rrt_finance_{stem}_snapshot.json")); + let snapshot_json = serde_json::to_vec_pretty(snapshot) + .map_err(|err| io::Error::other(format!("serialize snapshot: {err}")))?; + fs::write(&snapshot_path, snapshot_json)?; + + Ok(snapshot_path) +} + +#[derive(Debug, Clone, Serialize)] +pub struct IndexedCollectionProbeRow { + pub entry_id: usize, + pub live: bool, + pub resolved_ptr: usize, + pub active_flag: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct IndexedCollectionProbe { + pub collection_addr: usize, + pub flat_payload: bool, + pub stride: u32, + pub id_bound: i32, + pub payload_ptr: usize, + pub tombstone_ptr: usize, + pub first_rows: Vec, +} + +pub fn write_indexed_collection_probe( + base_dir: &Path, + stem: &str, + probe: &IndexedCollectionProbe, +) -> io::Result { + fs::create_dir_all(base_dir)?; + + let path = base_dir.join(format!("rrt_finance_{stem}_collection_probe.json")); + let json = serde_json::to_vec_pretty(probe) + .map_err(|err| io::Error::other(format!("serialize collection probe: {err}")))?; + fs::write(&path, json)?; + + Ok(path) +} + #[cfg(windows)] mod windows_hook { + use super::{ + IndexedCollectionProbe, IndexedCollectionProbeRow, sample_finance_snapshot, + write_finance_snapshot_bundle, write_finance_snapshot_only, write_indexed_collection_probe, + }; use core::ffi::{c_char, c_void}; use core::mem; use core::ptr; + use std::env; + use std::fmt::Write as _; + use std::path::PathBuf; + use std::sync::OnceLock; + use std::sync::atomic::{AtomicBool, AtomicU32, Ordering}; + use std::thread; + use std::time::Duration; + + use rrt_model::finance::{ + AnnualFinancePolicy, BondPosition, CompanyFinanceState, FinanceSnapshot, GrowthSetting, + }; const DLL_PROCESS_ATTACH: u32 = 1; const E_FAIL: i32 = 0x8000_4005_u32 as i32; @@ -17,10 +151,92 @@ mod windows_hook { static LOG_PATH: &[u8] = b"rrt_hook_attach.log\0"; static ATTACH_MESSAGE: &[u8] = b"rrt-hook: process attach\n"; + static FINANCE_CAPTURE_STARTED_MESSAGE: &[u8] = b"rrt-hook: finance capture thread started\n"; + static FINANCE_CAPTURE_SCAN_MESSAGE: &[u8] = + b"rrt-hook: finance capture raw collection scan\n"; + static FINANCE_CAPTURE_PROBE_DUMP_WRITTEN_MESSAGE: &[u8] = + b"rrt-hook: finance collection probe written\n"; + static FINANCE_CAPTURE_COMPANY_RESOLVED_MESSAGE: &[u8] = + b"rrt-hook: finance capture company resolved\n"; + static FINANCE_CAPTURE_PROBE_WRITTEN_MESSAGE: &[u8] = + b"rrt-hook: finance probe snapshot written\n"; + static FINANCE_CAPTURE_TIMEOUT_MESSAGE: &[u8] = + b"rrt-hook: finance capture timed out\n"; + static AUTO_LOAD_STARTED_MESSAGE: &[u8] = + b"rrt-hook: auto load hook armed\n"; + static AUTO_LOAD_HOOK_INSTALLED_MESSAGE: &[u8] = + b"rrt-hook: auto load shell-pump hook installed\n"; + static AUTO_LOAD_READY_MESSAGE: &[u8] = + b"rrt-hook: auto load ready gate passed\n"; + static AUTO_LOAD_DEFERRED_MESSAGE: &[u8] = + b"rrt-hook: auto load restore deferred to later shell-pump turn\n"; + static AUTO_LOAD_CALLING_MESSAGE: &[u8] = + b"rrt-hook: auto load restore calling\n"; + static AUTO_LOAD_OWNER_ENTRY_MESSAGE: &[u8] = + b"rrt-hook: auto load larger owner entering\n"; + static AUTO_LOAD_OWNER_RETURNED_MESSAGE: &[u8] = + b"rrt-hook: auto load larger owner returned\n"; + static AUTO_LOAD_TRIGGERED_MESSAGE: &[u8] = + b"rrt-hook: auto load restore invoked\n"; + static AUTO_LOAD_SUCCESS_MESSAGE: &[u8] = + b"rrt-hook: auto load request reported success\n"; + static AUTO_LOAD_FAILURE_MESSAGE: &[u8] = + b"rrt-hook: auto load request reported failure\n"; static DEBUG_MESSAGE: &[u8] = b"rrt-hook: DllMain process attach\0"; static DIRECT_INPUT8_CREATE_NAME: &[u8] = b"DirectInput8Create\0"; static mut REAL_DINPUT8_CREATE: Option = None; + static FINANCE_TEMPLATE_EMITTED: AtomicBool = AtomicBool::new(false); + static FINANCE_CAPTURE_STARTED: AtomicBool = AtomicBool::new(false); + static FINANCE_COLLECTION_PROBE_WRITTEN: AtomicBool = AtomicBool::new(false); + static AUTO_LOAD_THREAD_STARTED: AtomicBool = AtomicBool::new(false); + static AUTO_LOAD_HOOK_INSTALLED: AtomicBool = AtomicBool::new(false); + static AUTO_LOAD_ATTEMPTED: AtomicBool = AtomicBool::new(false); + static AUTO_LOAD_IN_PROGRESS: AtomicBool = AtomicBool::new(false); + static AUTO_LOAD_DEFERRED: AtomicBool = AtomicBool::new(false); + static AUTO_LOAD_LAST_GATE_MASK: AtomicU32 = AtomicU32::new(u32::MAX); + static AUTO_LOAD_READY_COUNT: AtomicU32 = AtomicU32::new(0); + static AUTO_LOAD_SAVE_STEM: OnceLock = OnceLock::new(); + static mut SHELL_PUMP_TRAMPOLINE: usize = 0; + const COMPANY_COLLECTION_ADDR: usize = 0x0062be10; + const SHELL_CONTROLLER_PTR_ADDR: usize = 0x006d4024; + const SHELL_STATE_PTR_ADDR: usize = 0x006cec74; + const ACTIVE_MODE_PTR_ADDR: usize = 0x006cec78; + const SHELL_PUMP_ADDR: usize = 0x00483f70; + const SHELL_STATE_ACTIVE_MODE_OFFSET: usize = 0x08; + const SHELL_STATE_ACTIVE_MODE_OBJECT_OFFSET: usize = 0x0c; + const RUNTIME_PROFILE_PTR_ADDR: usize = 0x006cec7c; + const RUNTIME_PROFILE_MANUAL_LOAD_PATH_OFFSET: usize = 0x11; + const RUNTIME_PROFILE_PENDING_LOAD_BYTE_OFFSET: usize = 0x97; + const INDEXED_COLLECTION_FLAT_FLAG_OFFSET: usize = 0x04; + const INDEXED_COLLECTION_STRIDE_OFFSET: usize = 0x08; + const INDEXED_COLLECTION_ID_BOUND_OFFSET: usize = 0x14; + const INDEXED_COLLECTION_PAYLOAD_OFFSET: usize = 0x30; + const INDEXED_COLLECTION_TOMBSTONE_BITSET_OFFSET: usize = 0x34; + const COMPANY_ACTIVE_OFFSET: usize = 0x3f; + const COMPANY_OUTSTANDING_SHARES_OFFSET: usize = 0x47; + const COMPANY_COMPANY_VALUE_OFFSET: usize = 0x57; + const COMPANY_BOND_COUNT_OFFSET: usize = 0x5b; + const COMPANY_BOND_TABLE_OFFSET: usize = 0x5f; + const COMPANY_FOUNDING_YEAR_OFFSET: usize = 0x157; + const COMPANY_LAST_BANKRUPTCY_YEAR_OFFSET: usize = 0x163; + const COMPANY_CITY_CONNECTION_LATCH_OFFSET: usize = 0x0d18; + const COMPANY_LINKED_TRANSIT_LATCH_OFFSET: usize = 0x0d56; + + const SCENARIO_CURRENT_YEAR_OFFSET: usize = 0x0d; + const SCENARIO_BUILDING_DENSITY_GROWTH_OFFSET: usize = 0x4c7c; + const SCENARIO_BANKRUPTCY_TOGGLE_OFFSET: usize = 0x4a8f; + const SCENARIO_BOND_TOGGLE_OFFSET: usize = 0x4a8b; + const SCENARIO_STOCK_TOGGLE_OFFSET: usize = 0x4a87; + const SCENARIO_DIVIDEND_TOGGLE_OFFSET: usize = 0x4a93; + + const MAX_CAPTURE_POLL_ATTEMPTS: usize = 120; + const CAPTURE_POLL_INTERVAL: Duration = Duration::from_secs(1); + const AUTO_LOAD_READY_POLLS: u32 = 30; + const AUTO_LOAD_DEFER_POLLS: u32 = 5; + const MEM_COMMIT: u32 = 0x1000; + const MEM_RESERVE: u32 = 0x2000; + const PAGE_EXECUTE_READWRITE: u32 = 0x40; unsafe extern "system" { fn CreateFileA( lp_file_name: *const c_char, @@ -46,10 +262,28 @@ mod windows_hook { ) -> i32; fn CloseHandle(handle: isize) -> i32; fn DisableThreadLibraryCalls(module: *mut c_void) -> i32; + fn FlushInstructionCache( + process: *mut c_void, + base_address: *const c_void, + size: usize, + ) -> i32; + fn GetCurrentProcess() -> *mut c_void; fn GetSystemDirectoryA(buffer: *mut u8, size: u32) -> u32; fn GetProcAddress(module: isize, name: *const c_char) -> *mut c_void; fn LoadLibraryA(name: *const c_char) -> isize; fn OutputDebugStringA(output: *const c_char); + fn VirtualAlloc( + address: *mut c_void, + size: usize, + allocation_type: u32, + protect: u32, + ) -> *mut c_void; + fn VirtualProtect( + address: *mut c_void, + size: usize, + new_protect: u32, + old_protect: *mut u32, + ) -> i32; } #[repr(C)] @@ -67,7 +301,8 @@ mod windows_hook { out: *mut *mut c_void, outer: *mut c_void, ) -> i32; - + type ShellPumpFn = unsafe extern "thiscall" fn(*mut u8) -> i32; + type LargerManualLoadOwnerFn = unsafe extern "thiscall" fn(*mut u8, u32, u32); #[unsafe(no_mangle)] pub extern "system" fn DllMain( module: *mut c_void, @@ -92,6 +327,10 @@ mod windows_hook { out: *mut *mut c_void, outer: *mut c_void, ) -> i32 { + maybe_emit_finance_template_bundle(); + maybe_start_finance_capture_thread(); + maybe_install_auto_load_hook(); + let direct_input8_create = unsafe { load_direct_input8_create() }; match direct_input8_create { Some(callback) => unsafe { callback(instance, version, riid, out, outer) }, @@ -100,6 +339,10 @@ mod windows_hook { } unsafe fn append_attach_log() { + append_log_message(ATTACH_MESSAGE); + } + + fn append_log_message(message: &[u8]) { let handle = unsafe { CreateFileA( LOG_PATH.as_ptr().cast(), @@ -120,8 +363,8 @@ mod windows_hook { let _ = unsafe { WriteFile( handle, - ATTACH_MESSAGE.as_ptr().cast(), - ATTACH_MESSAGE.len() as u32, + message.as_ptr().cast(), + message.len() as u32, &mut bytes_written, ptr::null_mut(), ) @@ -129,6 +372,613 @@ mod windows_hook { let _ = unsafe { CloseHandle(handle) }; } + fn append_log_line(line: &str) { + append_log_message(line.as_bytes()); + } + + fn maybe_emit_finance_template_bundle() { + if env::var_os("RRT_WRITE_FINANCE_TEMPLATE").is_none() { + return; + } + if FINANCE_TEMPLATE_EMITTED.swap(true, Ordering::AcqRel) { + return; + } + + let base_dir = env::current_dir().unwrap_or_else(|_| PathBuf::from(".")); + let _ = write_finance_snapshot_bundle( + &base_dir, + "attach_template", + &sample_finance_snapshot(), + ); + } + + fn maybe_start_finance_capture_thread() { + if env::var_os("RRT_WRITE_FINANCE_CAPTURE").is_none() { + return; + } + if FINANCE_CAPTURE_STARTED.swap(true, Ordering::AcqRel) { + return; + } + + append_log_message(FINANCE_CAPTURE_STARTED_MESSAGE); + let base_dir = env::current_dir().unwrap_or_else(|_| PathBuf::from(".")); + let _ = thread::Builder::new() + .name("rrt-finance-capture".to_string()) + .spawn(move || { + for _ in 0..MAX_CAPTURE_POLL_ATTEMPTS { + if !FINANCE_COLLECTION_PROBE_WRITTEN.load(Ordering::Acquire) { + if let Some(probe) = unsafe { capture_company_collection_probe() } { + if write_indexed_collection_probe(&base_dir, "attach_probe", &probe) + .is_ok() + { + FINANCE_COLLECTION_PROBE_WRITTEN.store(true, Ordering::Release); + append_log_message(FINANCE_CAPTURE_PROBE_DUMP_WRITTEN_MESSAGE); + } + } + } + if let Some(snapshot) = unsafe { try_capture_probe_snapshot() } { + append_log_message(FINANCE_CAPTURE_COMPANY_RESOLVED_MESSAGE); + if write_finance_snapshot_only(&base_dir, "attach_probe", &snapshot) + .is_ok() + { + append_log_message(FINANCE_CAPTURE_PROBE_WRITTEN_MESSAGE); + return; + } + } + thread::sleep(CAPTURE_POLL_INTERVAL); + } + + append_log_message(FINANCE_CAPTURE_TIMEOUT_MESSAGE); + }); + } + + fn maybe_install_auto_load_hook() { + let save_stem = match env::var("RRT_AUTO_LOAD_SAVE") { + Ok(value) if !value.trim().is_empty() => value, + _ => return, + }; + let _ = AUTO_LOAD_SAVE_STEM.set(save_stem); + if AUTO_LOAD_HOOK_INSTALLED.swap(true, Ordering::AcqRel) { + return; + } + + append_log_message(AUTO_LOAD_STARTED_MESSAGE); + AUTO_LOAD_THREAD_STARTED.store(true, Ordering::Release); + if unsafe { install_shell_pump_hook() } { + append_log_message(AUTO_LOAD_HOOK_INSTALLED_MESSAGE); + } else { + append_log_message(AUTO_LOAD_FAILURE_MESSAGE); + } + } + + fn run_auto_load_worker(save_stem: &str) { + append_log_message(AUTO_LOAD_CALLING_MESSAGE); + let staged = unsafe { invoke_manual_load_branch(save_stem) }; + if staged { + append_log_message(AUTO_LOAD_TRIGGERED_MESSAGE); + append_log_message(AUTO_LOAD_SUCCESS_MESSAGE); + } else { + append_log_message(AUTO_LOAD_FAILURE_MESSAGE); + } + AUTO_LOAD_IN_PROGRESS.store(false, Ordering::Release); + } + + unsafe fn invoke_manual_load_branch(save_stem: &str) -> bool { + if save_stem.is_empty() || save_stem.as_bytes().contains(&0) { + return false; + } + + let shell_state = unsafe { read_ptr(SHELL_STATE_PTR_ADDR as *const u8) }; + let runtime_profile = unsafe { read_ptr(RUNTIME_PROFILE_PTR_ADDR as *const u8) }; + let active_mode = unsafe { resolve_active_mode_ptr() }; + if shell_state.is_null() || runtime_profile.is_null() || active_mode.is_null() { + return false; + } + + let path_seed = unsafe { runtime_profile.add(RUNTIME_PROFILE_MANUAL_LOAD_PATH_OFFSET) }; + if unsafe { write_c_string(path_seed, 260, save_stem.as_bytes()) }.is_none() { + return false; + } + + unsafe { + ptr::write_unaligned( + runtime_profile + .add(RUNTIME_PROFILE_PENDING_LOAD_BYTE_OFFSET) + .cast::(), + 0, + ) + }; + + let larger_owner: LargerManualLoadOwnerFn = + unsafe { mem::transmute(0x00438890usize) }; + + let global_active_mode = unsafe { read_ptr(ACTIVE_MODE_PTR_ADDR as *const u8) }; + + if global_active_mode.is_null() { + unsafe { + ptr::write_unaligned( + (ACTIVE_MODE_PTR_ADDR as *mut u8).cast::(), + active_mode as usize, + ) + }; + } + append_log_message(AUTO_LOAD_OWNER_ENTRY_MESSAGE); + unsafe { larger_owner(active_mode, 1, 0) }; + append_log_message(AUTO_LOAD_OWNER_RETURNED_MESSAGE); + if global_active_mode.is_null() { + unsafe { + ptr::write_unaligned((ACTIVE_MODE_PTR_ADDR as *mut u8).cast::(), 0) + }; + } + + true + } + + unsafe fn write_c_string( + destination: *mut u8, + capacity: usize, + bytes: &[u8], + ) -> Option<()> { + if bytes.len() + 1 > capacity { + return None; + } + + unsafe { ptr::write_bytes(destination, 0, capacity) }; + unsafe { ptr::copy_nonoverlapping(bytes.as_ptr(), destination, bytes.len()) }; + Some(()) + } + + unsafe fn try_capture_probe_snapshot() -> Option { + append_log_message(FINANCE_CAPTURE_SCAN_MESSAGE); + let company = unsafe { resolve_first_active_company()? }; + Some(unsafe { capture_probe_snapshot_from_company(company) }) + } + + unsafe fn runtime_saved_world_restore_gate_mask() -> u32 { + let mut mask = 0_u32; + let shell_state = unsafe { read_ptr(SHELL_STATE_PTR_ADDR as *const u8) }; + if !shell_state.is_null() { + mask |= 0x1; + } + let shell_controller = unsafe { read_ptr(SHELL_CONTROLLER_PTR_ADDR as *const u8) }; + if !shell_controller.is_null() { + mask |= 0x2; + } + let active_mode = unsafe { resolve_active_mode_ptr() }; + if !active_mode.is_null() { + mask |= 0x4; + } + mask + } + + unsafe fn current_mode_id() -> u32 { + let shell_state = unsafe { read_ptr(SHELL_STATE_PTR_ADDR as *const u8) }; + if shell_state.is_null() { + return 0; + } + unsafe { read_u32(shell_state.add(SHELL_STATE_ACTIVE_MODE_OFFSET)) } + } + + fn auto_load_ready_polls() -> u32 { + env::var("RRT_AUTO_LOAD_READY_POLLS") + .ok() + .and_then(|value| value.parse::().ok()) + .filter(|value| *value > 0) + .unwrap_or(AUTO_LOAD_READY_POLLS) + } + + fn auto_load_defer_polls() -> u32 { + env::var("RRT_AUTO_LOAD_DEFER_POLLS") + .ok() + .and_then(|value| value.parse::().ok()) + .unwrap_or(AUTO_LOAD_DEFER_POLLS) + } + + unsafe extern "fastcall" fn shell_pump_detour(this: *mut u8, _edx: usize) -> i32 { + let trampoline: ShellPumpFn = unsafe { mem::transmute(SHELL_PUMP_TRAMPOLINE) }; + let result = unsafe { trampoline(this) }; + maybe_service_auto_load_on_main_thread(); + result + } + + fn maybe_service_auto_load_on_main_thread() { + if !AUTO_LOAD_HOOK_INSTALLED.load(Ordering::Acquire) + || AUTO_LOAD_ATTEMPTED.load(Ordering::Acquire) + || AUTO_LOAD_IN_PROGRESS.load(Ordering::Acquire) + { + return; + } + + let gate_mask = unsafe { runtime_saved_world_restore_gate_mask() }; + let last_gate_mask = AUTO_LOAD_LAST_GATE_MASK.swap(gate_mask, Ordering::AcqRel); + if gate_mask != last_gate_mask { + log_auto_load_gate_mask(gate_mask); + } + + let mode_id = unsafe { current_mode_id() }; + let ready = gate_mask == 0x7 && mode_id == 2; + let ready_count = if ready { + AUTO_LOAD_READY_COUNT.fetch_add(1, Ordering::AcqRel) + 1 + } else { + AUTO_LOAD_READY_COUNT.store(0, Ordering::Release); + AUTO_LOAD_DEFERRED.store(false, Ordering::Release); + 0 + }; + + let ready_polls = auto_load_ready_polls(); + if ready_count < ready_polls { + return; + } + + if !AUTO_LOAD_DEFERRED.load(Ordering::Acquire) { + AUTO_LOAD_DEFERRED.store(true, Ordering::Release); + append_log_message(AUTO_LOAD_READY_MESSAGE); + append_log_message(AUTO_LOAD_DEFERRED_MESSAGE); + return; + } + + if ready_count < ready_polls.saturating_add(auto_load_defer_polls()) { + return; + } + + if AUTO_LOAD_ATTEMPTED.swap(true, Ordering::AcqRel) { + return; + } + + let Some(save_stem) = AUTO_LOAD_SAVE_STEM.get() else { + append_log_message(AUTO_LOAD_FAILURE_MESSAGE); + return; + }; + + AUTO_LOAD_IN_PROGRESS.store(true, Ordering::Release); + append_log_message(AUTO_LOAD_READY_MESSAGE); + run_auto_load_worker(save_stem); + } + + fn log_auto_load_gate_mask(mask: u32) { + let mut line = String::from("rrt-hook: auto load gate mask "); + let global_active_mode = unsafe { read_ptr(ACTIVE_MODE_PTR_ADDR as *const u8) } as usize; + let shell_state = unsafe { read_ptr(SHELL_STATE_PTR_ADDR as *const u8) }; + let mode_id = if shell_state.is_null() { + 0 + } else { + unsafe { read_u32(shell_state.add(SHELL_STATE_ACTIVE_MODE_OFFSET)) as usize } + }; + let field_active_mode_object = if shell_state.is_null() { + 0 + } else { + unsafe { read_ptr(shell_state.add(SHELL_STATE_ACTIVE_MODE_OBJECT_OFFSET)) as usize } + }; + let _ = write!( + &mut line, + "0x{mask:01x} shell_state={} shell_controller={} active_mode={} global_active_mode=0x{global_active_mode:08x} mode_id=0x{mode_id:08x} field_active_mode_object=0x{field_active_mode_object:08x}\n", + (mask & 0x1) != 0, + (mask & 0x2) != 0, + (mask & 0x4) != 0, + ); + append_log_line(&line); + } + + unsafe fn resolve_active_mode_ptr() -> *mut u8 { + let global_active_mode = unsafe { resolve_global_active_mode_ptr() }; + if !global_active_mode.is_null() { + return global_active_mode; + } + + let shell_state = unsafe { read_ptr(SHELL_STATE_PTR_ADDR as *const u8) }; + if shell_state.is_null() { + return ptr::null_mut(); + } + + unsafe { read_ptr(shell_state.add(SHELL_STATE_ACTIVE_MODE_OBJECT_OFFSET)) } + } + + unsafe fn resolve_global_active_mode_ptr() -> *mut u8 { + unsafe { read_ptr(ACTIVE_MODE_PTR_ADDR as *const u8) } + } + + unsafe fn install_shell_pump_hook() -> bool { + const STOLEN_LEN: usize = 8; + let target = SHELL_PUMP_ADDR as *mut u8; + let trampoline_size = STOLEN_LEN + 5; + let trampoline = unsafe { + VirtualAlloc( + ptr::null_mut(), + trampoline_size, + MEM_COMMIT | MEM_RESERVE, + PAGE_EXECUTE_READWRITE, + ) + } as *mut u8; + if trampoline.is_null() { + return false; + } + + unsafe { ptr::copy_nonoverlapping(target, trampoline, STOLEN_LEN) }; + unsafe { + write_rel32_jump( + trampoline.add(STOLEN_LEN), + target.add(STOLEN_LEN) as usize, + ) + }; + + let mut old_protect = 0_u32; + if unsafe { + VirtualProtect( + target.cast(), + STOLEN_LEN, + PAGE_EXECUTE_READWRITE, + &mut old_protect, + ) + } == 0 + { + return false; + } + + unsafe { write_rel32_jump(target, shell_pump_detour as *const () as usize) }; + unsafe { ptr::write(target.add(5), 0x90) }; + unsafe { ptr::write(target.add(6), 0x90) }; + unsafe { ptr::write(target.add(7), 0x90) }; + let mut restore_protect = 0_u32; + let _ = unsafe { + VirtualProtect( + target.cast(), + STOLEN_LEN, + old_protect, + &mut restore_protect, + ) + }; + let _ = unsafe { + FlushInstructionCache( + GetCurrentProcess(), + target.cast(), + STOLEN_LEN, + ) + }; + unsafe { + SHELL_PUMP_TRAMPOLINE = trampoline as usize; + } + true + } + + unsafe fn write_rel32_jump(location: *mut u8, destination: usize) { + unsafe { ptr::write(location, 0xE9) }; + let next_ip = unsafe { location.add(5) } as usize; + let relative = (destination as isize - next_ip as isize) as i32; + unsafe { ptr::write_unaligned(location.add(1).cast::(), relative) }; + } + + unsafe fn resolve_first_active_company() -> Option<*mut u8> { + let collection = COMPANY_COLLECTION_ADDR as *const u8; + let id_bound = unsafe { read_i32(collection.add(INDEXED_COLLECTION_ID_BOUND_OFFSET)) }; + if id_bound <= 0 { + return None; + } + + for entry_id in 1..=id_bound as usize { + if unsafe { indexed_collection_entry_id_is_live(collection, entry_id) } { + let company = unsafe { indexed_collection_resolve_live_entry_by_id(collection, entry_id) }; + if !company.is_null() && unsafe { read_u8(company.add(COMPANY_ACTIVE_OFFSET)) != 0 } { + return Some(company); + } + } + } + + None + } + + unsafe fn capture_company_collection_probe() -> Option { + let collection = COMPANY_COLLECTION_ADDR as *const u8; + let id_bound = unsafe { read_i32(collection.add(INDEXED_COLLECTION_ID_BOUND_OFFSET)) }; + if id_bound <= 0 { + return Some(IndexedCollectionProbe { + collection_addr: COMPANY_COLLECTION_ADDR, + flat_payload: unsafe { + read_u32(collection.add(INDEXED_COLLECTION_FLAT_FLAG_OFFSET)) != 0 + }, + stride: unsafe { read_u32(collection.add(INDEXED_COLLECTION_STRIDE_OFFSET)) }, + id_bound, + payload_ptr: unsafe { + read_ptr(collection.add(INDEXED_COLLECTION_PAYLOAD_OFFSET)) as usize + }, + tombstone_ptr: unsafe { + read_ptr(collection.add(INDEXED_COLLECTION_TOMBSTONE_BITSET_OFFSET)) as usize + }, + first_rows: Vec::new(), + }); + } + + let mut first_rows = Vec::new(); + let sample_bound = (id_bound as usize).min(8); + for entry_id in 1..=sample_bound { + let live = unsafe { indexed_collection_entry_id_is_live(collection, entry_id) }; + let resolved_ptr = unsafe { + indexed_collection_resolve_live_entry_by_id(collection, entry_id) as usize + }; + let active_flag = if resolved_ptr == 0 { + None + } else { + Some(unsafe { read_u8((resolved_ptr as *const u8).add(COMPANY_ACTIVE_OFFSET)) }) + }; + first_rows.push(IndexedCollectionProbeRow { + entry_id, + live, + resolved_ptr, + active_flag, + }); + } + + Some(IndexedCollectionProbe { + collection_addr: COMPANY_COLLECTION_ADDR, + flat_payload: unsafe { + read_u32(collection.add(INDEXED_COLLECTION_FLAT_FLAG_OFFSET)) != 0 + }, + stride: unsafe { read_u32(collection.add(INDEXED_COLLECTION_STRIDE_OFFSET)) }, + id_bound, + payload_ptr: unsafe { read_ptr(collection.add(INDEXED_COLLECTION_PAYLOAD_OFFSET)) as usize }, + tombstone_ptr: unsafe { + read_ptr(collection.add(INDEXED_COLLECTION_TOMBSTONE_BITSET_OFFSET)) as usize + }, + first_rows, + }) + } + + unsafe fn capture_probe_snapshot_from_company(company: *mut u8) -> FinanceSnapshot { + let scenario = unsafe { read_ptr(ACTIVE_MODE_PTR_ADDR as *const u8) } as *const u8; + let current_year = unsafe { read_u16(scenario.add(SCENARIO_CURRENT_YEAR_OFFSET)) }; + let founding_year = unsafe { read_u16(company.add(COMPANY_FOUNDING_YEAR_OFFSET)) }; + let last_bankruptcy_year = + unsafe { read_u16(company.add(COMPANY_LAST_BANKRUPTCY_YEAR_OFFSET)) }; + let outstanding_share_count = + unsafe { read_u32(company.add(COMPANY_OUTSTANDING_SHARES_OFFSET)) }; + let bonds = unsafe { capture_bonds(company, current_year) }; + let company_value = unsafe { read_u32(company.add(COMPANY_COMPANY_VALUE_OFFSET)) as i64 }; + let growth_setting = unsafe { + growth_setting_from_raw(read_u8( + scenario.add(SCENARIO_BUILDING_DENSITY_GROWTH_OFFSET), + )) + }; + + FinanceSnapshot { + policy: AnnualFinancePolicy { + annual_mode: 0x0c, + bankruptcy_allowed: unsafe { + read_u8(scenario.add(SCENARIO_BANKRUPTCY_TOGGLE_OFFSET)) == 0 + }, + bond_issuance_allowed: unsafe { + read_u8(scenario.add(SCENARIO_BOND_TOGGLE_OFFSET)) == 0 + }, + stock_actions_allowed: unsafe { + read_u8(scenario.add(SCENARIO_STOCK_TOGGLE_OFFSET)) == 0 + }, + dividends_allowed: unsafe { + read_u8(scenario.add(SCENARIO_DIVIDEND_TOGGLE_OFFSET)) == 0 + }, + growth_setting, + ..AnnualFinancePolicy::default() + }, + company: CompanyFinanceState { + active: unsafe { read_u8(company.add(COMPANY_ACTIVE_OFFSET)) != 0 }, + years_since_founding: year_delta(current_year, founding_year), + years_since_last_bankruptcy: year_delta(current_year, last_bankruptcy_year), + current_company_value: company_value, + outstanding_share_count, + city_connection_bonus_latch: unsafe { + read_u8(company.add(COMPANY_CITY_CONNECTION_LATCH_OFFSET)) != 0 + }, + linked_transit_service_latch: unsafe { + read_u8(company.add(COMPANY_LINKED_TRANSIT_LATCH_OFFSET)) != 0 + }, + chairman_buyback_factor: None, + bonds, + ..CompanyFinanceState::default() + }, + } + } + + unsafe fn capture_bonds(company: *mut u8, current_year: u16) -> Vec { + let bond_count = unsafe { read_u8(company.add(COMPANY_BOND_COUNT_OFFSET)) as usize }; + let table = unsafe { company.add(COMPANY_BOND_TABLE_OFFSET) }; + let mut bonds = Vec::with_capacity(bond_count); + + for index in 0..bond_count { + let slot = unsafe { table.add(index * 12) }; + let principal = unsafe { read_i32(slot) } as i64; + let maturity_year = unsafe { read_u32(slot.add(4)) }; + let coupon_rate = unsafe { read_f32(slot.add(8)) } as f64; + + bonds.push(BondPosition { + principal, + coupon_rate, + years_remaining: maturity_year + .saturating_sub(current_year as u32) + .min(u8::MAX as u32) as u8, + }); + } + + bonds + } + + fn growth_setting_from_raw(raw: u8) -> GrowthSetting { + match raw { + 1 => GrowthSetting::ExpansionBias, + 2 => GrowthSetting::DividendSuppressed, + _ => GrowthSetting::Neutral, + } + } + + fn year_delta(current_year: u16, past_year: u16) -> u8 { + current_year + .saturating_sub(past_year) + .min(u8::MAX as u16) as u8 + } + + unsafe fn indexed_collection_entry_id_is_live(collection: *const u8, entry_id: usize) -> bool { + let id_bound = unsafe { read_i32(collection.add(INDEXED_COLLECTION_ID_BOUND_OFFSET)) }; + if entry_id == 0 || entry_id > id_bound.max(0) as usize { + return false; + } + + let tombstone_bits = unsafe { + read_ptr(collection.add(INDEXED_COLLECTION_TOMBSTONE_BITSET_OFFSET)) + }; + if tombstone_bits.is_null() { + return true; + } + + let bit_index = entry_id as u32; + let word = unsafe { + ptr::read_unaligned(tombstone_bits.add((bit_index / 32) as usize).cast::()) + }; + (word & (1_u32 << (bit_index % 32))) == 0 + } + + unsafe fn indexed_collection_resolve_live_entry_by_id( + collection: *const u8, + entry_id: usize, + ) -> *mut u8 { + if !unsafe { indexed_collection_entry_id_is_live(collection, entry_id) } { + return ptr::null_mut(); + } + + let payload = unsafe { read_ptr(collection.add(INDEXED_COLLECTION_PAYLOAD_OFFSET)) }; + if payload.is_null() { + return ptr::null_mut(); + } + + let stride = unsafe { read_u32(collection.add(INDEXED_COLLECTION_STRIDE_OFFSET)) as usize }; + let flat = unsafe { read_u32(collection.add(INDEXED_COLLECTION_FLAT_FLAG_OFFSET)) != 0 }; + + if flat { + unsafe { payload.add(stride * entry_id) } + } else { + unsafe { ptr::read_unaligned(payload.add(stride * entry_id).cast::<*mut u8>()) } + } + } + + unsafe fn read_u8(address: *const u8) -> u8 { + unsafe { ptr::read_unaligned(address) } + } + + unsafe fn read_u16(address: *const u8) -> u16 { + unsafe { ptr::read_unaligned(address.cast::()) } + } + + unsafe fn read_u32(address: *const u8) -> u32 { + unsafe { ptr::read_unaligned(address.cast::()) } + } + + unsafe fn read_i32(address: *const u8) -> i32 { + unsafe { ptr::read_unaligned(address.cast::()) } + } + + unsafe fn read_f32(address: *const u8) -> f32 { + unsafe { ptr::read_unaligned(address.cast::()) } + } + + unsafe fn read_ptr(address: *const u8) -> *mut u8 { + unsafe { ptr::read_unaligned(address.cast::<*mut u8>()) } + } + unsafe fn load_direct_input8_create() -> Option { if let Some(callback) = unsafe { REAL_DINPUT8_CREATE } { return Some(callback); @@ -168,3 +1018,30 @@ mod windows_hook { pub fn host_build_marker() -> &'static str { "rrt-hook host build" } + +#[cfg(test)] +mod tests { + use super::*; + use std::time::{SystemTime, UNIX_EPOCH}; + + #[test] + fn writes_snapshot_bundle_to_disk() { + let nonce = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("system time should be after epoch") + .as_nanos(); + let dir = std::env::temp_dir().join(format!("rrt-hook-finance-{nonce}")); + let paths = write_finance_snapshot_bundle(&dir, "testcase", &sample_finance_snapshot()) + .expect("bundle should be written"); + + let snapshot_json = fs::read_to_string(&paths.snapshot_path).expect("snapshot should exist"); + let outcome_json = fs::read_to_string(&paths.outcome_path).expect("outcome should exist"); + + assert!(snapshot_json.contains("\"policy\"")); + assert!(outcome_json.contains("\"evaluation\"")); + + let _ = fs::remove_file(&paths.snapshot_path); + let _ = fs::remove_file(&paths.outcome_path); + let _ = fs::remove_dir(&dir); + } +} diff --git a/crates/rrt-model/src/finance.rs b/crates/rrt-model/src/finance.rs new file mode 100644 index 0000000..31468d9 --- /dev/null +++ b/crates/rrt-model/src/finance.rs @@ -0,0 +1,957 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] +pub enum GrowthSetting { + #[default] + Neutral, + ExpansionBias, + DividendSuppressed, +} + +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub struct BondPosition { + pub principal: i64, + pub coupon_rate: f64, + pub years_remaining: u8, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum BankruptcyReason { + EarlyStress, + DeepDistress, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum AnnualReportMetric { + NetProfits, + RevenueAggregate, + FuelCost, + RevenuePerShare, + EarningsPerShare, + DividendPerShare, + BookValuePerShare, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum DebtNewsOutcome { + RefinanceOnly, + RefinanceAndBorrow, + RefinanceAndPayDown, + DebtPayoffOnly, + NewBorrowingOnly, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] +pub struct DebtRestructureSummary { + pub retired_principal: i64, + pub issued_principal: i64, +} + +impl DebtRestructureSummary { + pub fn classify(self) -> Option { + match (self.retired_principal > 0, self.issued_principal > 0) { + (false, false) => None, + (false, true) => Some(DebtNewsOutcome::NewBorrowingOnly), + (true, false) => Some(DebtNewsOutcome::DebtPayoffOnly), + (true, true) if self.retired_principal == self.issued_principal => { + Some(DebtNewsOutcome::RefinanceOnly) + } + (true, true) if self.issued_principal > self.retired_principal => { + Some(DebtNewsOutcome::RefinanceAndBorrow) + } + (true, true) => Some(DebtNewsOutcome::RefinanceAndPayDown), + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum AnnualFinanceDecision { + NoAction, + DeclareBankruptcy { + reason: BankruptcyReason, + }, + IssueBond { + count: u32, + principal_per_bond: i64, + term_years: u8, + }, + RepurchasePublicShares { + share_count: u32, + price_per_share: f64, + }, + IssuePublicShares { + share_count_per_tranche: u32, + tranche_count: u32, + price_per_share: f64, + }, + AdjustDividend { + old_rate: f64, + new_rate: f64, + }, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct AnnualFinanceEvaluation { + pub decision: AnnualFinanceDecision, + pub debt_restructure: DebtRestructureSummary, + pub debt_news: Option, + pub repurchased_share_count: u32, + pub issued_share_count: u32, +} + +impl AnnualFinanceEvaluation { + pub fn no_action() -> Self { + Self { + decision: AnnualFinanceDecision::NoAction, + debt_restructure: DebtRestructureSummary::default(), + debt_news: None, + repurchased_share_count: 0, + issued_share_count: 0, + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct AnnualFinancePolicy { + pub annual_mode: u8, + pub build_103_plus: bool, + pub bankruptcy_allowed: bool, + pub bond_issuance_allowed: bool, + pub stock_actions_allowed: bool, + pub dividends_allowed: bool, + pub growth_setting: GrowthSetting, + pub stock_issue_cash_buffer: i64, +} + +impl Default for AnnualFinancePolicy { + fn default() -> Self { + Self { + annual_mode: 0x0c, + build_103_plus: true, + bankruptcy_allowed: true, + bond_issuance_allowed: true, + stock_actions_allowed: true, + dividends_allowed: true, + growth_setting: GrowthSetting::Neutral, + stock_issue_cash_buffer: 30_000, + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct CompanyFinanceState { + pub active: bool, + pub years_since_founding: u8, + pub years_since_last_bankruptcy: u8, + pub current_cash: i64, + pub current_company_value: i64, + pub support_adjusted_share_price: f64, + pub book_value_per_share: f64, + pub current_fuel_cost: i64, + pub current_dividend_per_share: f64, + pub board_dividend_ceiling: f64, + pub outstanding_share_count: u32, + pub unassigned_share_count: u32, + pub city_connection_bonus_latch: bool, + pub linked_transit_service_latch: bool, + pub chairman_buyback_factor: Option, + pub recent_net_profits: [i64; 3], + pub recent_revenue_totals: [i64; 3], + pub recent_revenue_per_share: [f64; 3], + pub recent_earnings_per_share: [f64; 3], + pub recent_dividend_per_share: [f64; 3], + pub bonds: Vec, +} + +impl Default for CompanyFinanceState { + fn default() -> Self { + Self { + active: true, + years_since_founding: 5, + years_since_last_bankruptcy: 20, + current_cash: 0, + current_company_value: 1_000_000, + support_adjusted_share_price: 25.0, + book_value_per_share: 20.0, + current_fuel_cost: 0, + current_dividend_per_share: 0.0, + board_dividend_ceiling: 2.0, + outstanding_share_count: 20_000, + unassigned_share_count: 10_000, + city_connection_bonus_latch: false, + linked_transit_service_latch: false, + chairman_buyback_factor: None, + recent_net_profits: [10_000, 10_000, 10_000], + recent_revenue_totals: [200_000, 180_000, 160_000], + recent_revenue_per_share: [1.2, 1.1, 1.0], + recent_earnings_per_share: [1.0, 0.9, 0.8], + recent_dividend_per_share: [0.2, 0.2, 0.1], + bonds: Vec::new(), + } + } +} + +impl CompanyFinanceState { + pub const BOND_PRINCIPAL: i64 = 500_000; + pub const BOND_TERM_YEARS: u8 = 30; + pub const SHARE_LOT: u32 = 1_000; + + pub fn total_debt_principal(&self) -> i64 { + self.bonds.iter().map(|bond| bond.principal.max(0)).sum() + } + + pub fn highest_coupon_bond(&self) -> Option { + self.bonds + .iter() + .copied() + .max_by(|left, right| left.coupon_rate.total_cmp(&right.coupon_rate)) + } + + pub fn simulate_cash_after_full_bond_repayment(&self) -> i64 { + self.current_cash - self.total_debt_principal() + } + + pub fn declare_bankruptcy(&mut self) { + for bond in &mut self.bonds { + bond.principal /= 2; + } + self.current_company_value /= 2; + self.years_since_last_bankruptcy = 0; + } + + pub fn issue_bond(&mut self, coupon_rate: f64, count: u32) { + for _ in 0..count { + self.bonds.push(BondPosition { + principal: Self::BOND_PRINCIPAL, + coupon_rate, + years_remaining: Self::BOND_TERM_YEARS, + }); + self.current_cash += Self::BOND_PRINCIPAL; + } + } + + pub fn repurchase_public_shares(&mut self, share_count: u32, price_per_share: f64) { + let repurchased = share_count.min(self.unassigned_share_count); + self.unassigned_share_count -= repurchased; + self.outstanding_share_count = self.outstanding_share_count.saturating_sub(repurchased); + self.current_cash -= (repurchased as f64 * price_per_share).round() as i64; + } + + pub fn issue_public_shares(&mut self, share_count: u32, price_per_share: f64) { + self.outstanding_share_count = self.outstanding_share_count.saturating_add(share_count); + self.unassigned_share_count = self.unassigned_share_count.saturating_add(share_count); + self.current_cash += (share_count as f64 * price_per_share).round() as i64; + } + + pub fn set_dividend_rate(&mut self, new_rate: f64) { + self.current_dividend_per_share = new_rate.clamp(0.0, self.board_dividend_ceiling); + } + + pub fn read_recent_metric( + &self, + metric: AnnualReportMetric, + years_ago: usize, + ) -> Option { + match metric { + AnnualReportMetric::FuelCost if years_ago == 0 => Some(self.current_fuel_cost as f64), + AnnualReportMetric::BookValuePerShare if years_ago == 0 => Some(self.book_value_per_share), + AnnualReportMetric::NetProfits => self + .recent_net_profits + .get(years_ago) + .copied() + .map(|value| value as f64), + AnnualReportMetric::RevenueAggregate => self + .recent_revenue_totals + .get(years_ago) + .copied() + .map(|value| value as f64), + AnnualReportMetric::RevenuePerShare => { + self.recent_revenue_per_share.get(years_ago).copied() + } + AnnualReportMetric::EarningsPerShare => { + self.recent_earnings_per_share.get(years_ago).copied() + } + AnnualReportMetric::DividendPerShare => { + self.recent_dividend_per_share.get(years_ago).copied() + } + _ => None, + } + } + + pub fn read_recent_metric_window( + &self, + metric: AnnualReportMetric, + years: usize, + ) -> Vec { + (0..years) + .filter_map(|years_ago| self.read_recent_metric(metric, years_ago)) + .collect() + } + + pub fn weighted_recent_metric( + &self, + metric: AnnualReportMetric, + weights: &[f64], + ) -> Option { + let mut numerator = 0.0; + let mut denominator = 0.0; + for (years_ago, weight) in weights.iter().copied().enumerate() { + let value = self.read_recent_metric(metric, years_ago)?; + numerator += value * weight; + denominator += weight; + } + + (denominator > 0.0).then_some(numerator / denominator) + } + + pub fn apply_annual_decision(&mut self, decision: &AnnualFinanceDecision) { + match *decision { + AnnualFinanceDecision::NoAction => {} + AnnualFinanceDecision::DeclareBankruptcy { .. } => self.declare_bankruptcy(), + AnnualFinanceDecision::IssueBond { + count, + principal_per_bond: _, + term_years: _, + } => { + let coupon = self + .highest_coupon_bond() + .map(|bond| bond.coupon_rate) + .unwrap_or(0.10); + self.issue_bond(coupon, count); + } + AnnualFinanceDecision::RepurchasePublicShares { + share_count, + price_per_share, + } => self.repurchase_public_shares(share_count, price_per_share), + AnnualFinanceDecision::IssuePublicShares { + share_count_per_tranche, + tranche_count, + price_per_share, + } => self.issue_public_shares( + share_count_per_tranche.saturating_mul(tranche_count), + price_per_share, + ), + AnnualFinanceDecision::AdjustDividend { new_rate, .. } => { + self.set_dividend_rate(new_rate); + } + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct FinanceSnapshot { + pub policy: AnnualFinancePolicy, + pub company: CompanyFinanceState, +} + +impl FinanceSnapshot { + pub fn evaluate(&self) -> FinanceOutcome { + let evaluation = evaluate_annual_finance_policy_detailed(&self.policy, &self.company); + let mut post_company = self.company.clone(); + post_company.apply_annual_decision(&evaluation.decision); + + FinanceOutcome { + evaluation, + post_company, + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct FinanceOutcome { + pub evaluation: AnnualFinanceEvaluation, + pub post_company: CompanyFinanceState, +} + +pub fn evaluate_annual_finance_policy( + policy: &AnnualFinancePolicy, + company: &CompanyFinanceState, +) -> AnnualFinanceDecision { + evaluate_annual_finance_policy_detailed(policy, company).decision +} + +pub fn evaluate_annual_finance_policy_detailed( + policy: &AnnualFinancePolicy, + company: &CompanyFinanceState, +) -> AnnualFinanceEvaluation { + if !company.active { + return AnnualFinanceEvaluation::no_action(); + } + + if should_bankrupt_early(policy, company) { + return AnnualFinanceEvaluation { + decision: AnnualFinanceDecision::DeclareBankruptcy { + reason: BankruptcyReason::EarlyStress, + }, + ..AnnualFinanceEvaluation::no_action() + }; + } + + if let Some(evaluation) = issue_bond_evaluation(policy, company) { + return evaluation; + } + + if let Some(evaluation) = repurchase_evaluation(policy, company) { + return evaluation; + } + + if should_bankrupt_deep_distress(policy, company) { + return AnnualFinanceEvaluation { + decision: AnnualFinanceDecision::DeclareBankruptcy { + reason: BankruptcyReason::DeepDistress, + }, + ..AnnualFinanceEvaluation::no_action() + }; + } + + if let Some(evaluation) = issue_stock_evaluation(policy, company) { + return evaluation; + } + + if let Some(evaluation) = dividend_evaluation(policy, company) { + return evaluation; + } + + AnnualFinanceEvaluation::no_action() +} + +fn should_bankrupt_early(policy: &AnnualFinancePolicy, company: &CompanyFinanceState) -> bool { + if policy.annual_mode != 0x0c || !policy.bankruptcy_allowed { + return false; + } + if company.years_since_last_bankruptcy < 13 || company.years_since_founding < 4 { + return false; + } + + let current_revenue = company.recent_revenue_totals[0]; + let stress_ladder: i64 = if current_revenue < 120_000 { + -600_000 + } else if current_revenue < 230_000 { + -1_100_000 + } else if current_revenue < 340_000 { + -1_600_000 + } else { + -2_000_000 + }; + + let failed_profit_years = company + .recent_net_profits + .iter() + .filter(|profit| **profit <= 0) + .count(); + let net_profit_sum: i64 = company.recent_net_profits.iter().sum(); + let share_price_floor = if failed_profit_years == 3 { 20.0 } else { 15.0 }; + let fuel_gate = (stress_ladder.abs() as f64 * 0.08).round() as i64; + + failed_profit_years >= 2 + && net_profit_sum <= -60_000 + && company.support_adjusted_share_price >= share_price_floor + && company.current_fuel_cost >= fuel_gate +} + +fn should_bankrupt_deep_distress( + policy: &AnnualFinancePolicy, + company: &CompanyFinanceState, +) -> bool { + policy.bankruptcy_allowed + && company.current_cash < -300_000 + && company.years_since_founding >= 3 + && company.years_since_last_bankruptcy >= 5 + && company.recent_net_profits.iter().all(|profit| *profit <= -20_000) +} + +fn issue_bond_evaluation( + policy: &AnnualFinancePolicy, + company: &CompanyFinanceState, +) -> Option { + if !policy.bond_issuance_allowed { + return None; + } + + let simulated_cash = company.simulate_cash_after_full_bond_repayment(); + let target_floor = if company.linked_transit_service_latch { + -30_000 + } else { + -250_000 + }; + if simulated_cash >= target_floor { + return None; + } + + let shortfall = (target_floor - simulated_cash).max(0) as u64; + let count = shortfall.div_ceil(CompanyFinanceState::BOND_PRINCIPAL as u64) as u32; + let issued_principal = count.max(1) as i64 * CompanyFinanceState::BOND_PRINCIPAL; + let debt_restructure = DebtRestructureSummary { + retired_principal: 0, + issued_principal, + }; + + Some(AnnualFinanceEvaluation { + decision: AnnualFinanceDecision::IssueBond { + count: count.max(1), + principal_per_bond: CompanyFinanceState::BOND_PRINCIPAL, + term_years: CompanyFinanceState::BOND_TERM_YEARS, + }, + debt_news: debt_restructure.classify(), + debt_restructure, + ..AnnualFinanceEvaluation::no_action() + }) +} + +fn repurchase_evaluation( + policy: &AnnualFinancePolicy, + company: &CompanyFinanceState, +) -> Option { + if !policy.stock_actions_allowed + || !company.city_connection_bonus_latch + || matches!(policy.growth_setting, GrowthSetting::DividendSuppressed) + || company.unassigned_share_count < CompanyFinanceState::SHARE_LOT + || company.current_company_value < 800_000 + { + return None; + } + + let mut factor = company.chairman_buyback_factor.unwrap_or(1.0); + if matches!(policy.growth_setting, GrowthSetting::ExpansionBias) { + factor *= 1.6; + } + + let batch = CompanyFinanceState::SHARE_LOT; + let affordability_gate = company.support_adjusted_share_price * factor * batch as f64 * 1.2; + if company.current_cash < affordability_gate.round() as i64 { + return None; + } + + Some(AnnualFinanceEvaluation { + decision: AnnualFinanceDecision::RepurchasePublicShares { + share_count: batch, + price_per_share: company.support_adjusted_share_price, + }, + repurchased_share_count: batch, + ..AnnualFinanceEvaluation::no_action() + }) +} + +fn issue_stock_evaluation( + policy: &AnnualFinancePolicy, + company: &CompanyFinanceState, +) -> Option { + if !policy.build_103_plus + || !policy.stock_actions_allowed + || !policy.bond_issuance_allowed + || company.bonds.len() < 2 + || company.years_since_founding < 1 + || company.support_adjusted_share_price < 22.0 + || company.book_value_per_share <= 0.0 + { + return None; + } + + let highest_coupon = company.highest_coupon_bond()?; + if company.current_cash >= highest_coupon.principal + policy.stock_issue_cash_buffer { + return None; + } + + let mut tranche = + ((company.outstanding_share_count / 10) / CompanyFinanceState::SHARE_LOT) + * CompanyFinanceState::SHARE_LOT; + tranche = tranche.max(2_000); + while tranche >= CompanyFinanceState::SHARE_LOT + && company.support_adjusted_share_price * tranche as f64 > 55_000.0 + { + tranche -= CompanyFinanceState::SHARE_LOT; + } + if tranche < CompanyFinanceState::SHARE_LOT { + return None; + } + + let price_to_book = company.support_adjusted_share_price / company.book_value_per_share; + if price_to_book < required_price_to_book_ratio(highest_coupon.coupon_rate) { + return None; + } + + Some(AnnualFinanceEvaluation { + decision: AnnualFinanceDecision::IssuePublicShares { + share_count_per_tranche: tranche, + tranche_count: 2, + price_per_share: company.support_adjusted_share_price, + }, + issued_share_count: tranche * 2, + ..AnnualFinanceEvaluation::no_action() + }) +} + +fn dividend_evaluation( + policy: &AnnualFinancePolicy, + company: &CompanyFinanceState, +) -> Option { + if !policy.dividends_allowed || company.years_since_founding < 2 { + return None; + } + + let weighted_target = company + .weighted_recent_metric(AnnualReportMetric::EarningsPerShare, &[3.0, 2.0, 1.0]) + .unwrap_or(0.0); + let mut target = weighted_target.max(0.0); + + if company.unassigned_share_count < CompanyFinanceState::SHARE_LOT + && company.outstanding_share_count > 0 + && company.current_cash > 0 + { + target += company.current_cash as f64 / company.outstanding_share_count as f64; + } + + target = match policy.growth_setting { + GrowthSetting::Neutral => target, + GrowthSetting::ExpansionBias => target * 0.66, + GrowthSetting::DividendSuppressed => 0.0, + }; + target = quantize_tenths(target.clamp(0.0, company.board_dividend_ceiling)); + + if (target - company.current_dividend_per_share).abs() <= 0.1 { + return None; + } + + Some(AnnualFinanceEvaluation { + decision: AnnualFinanceDecision::AdjustDividend { + old_rate: company.current_dividend_per_share, + new_rate: target, + }, + ..AnnualFinanceEvaluation::no_action() + }) +} + +fn required_price_to_book_ratio(coupon_rate: f64) -> f64 { + if coupon_rate <= 0.07 { + 1.3 + } else if coupon_rate <= 0.08 { + 1.2 + } else if coupon_rate <= 0.09 { + 1.1 + } else if coupon_rate <= 0.10 { + 0.95 + } else if coupon_rate <= 0.11 { + 0.8 + } else if coupon_rate <= 0.12 { + 0.62 + } else if coupon_rate <= 0.13 { + 0.5 + } else { + 0.35 + } +} + +fn quantize_tenths(value: f64) -> f64 { + (value * 10.0).round() / 10.0 +} + +#[cfg(test)] +mod tests { + use super::*; + + fn base_policy() -> AnnualFinancePolicy { + AnnualFinancePolicy::default() + } + + fn base_company() -> CompanyFinanceState { + CompanyFinanceState { + bonds: vec![ + BondPosition { + principal: 400_000, + coupon_rate: 0.10, + years_remaining: 10, + }, + BondPosition { + principal: 300_000, + coupon_rate: 0.12, + years_remaining: 12, + }, + ], + ..CompanyFinanceState::default() + } + } + + #[test] + fn early_bankruptcy_precedes_other_actions() { + let policy = base_policy(); + let company = CompanyFinanceState { + current_fuel_cost: 90_000, + support_adjusted_share_price: 21.0, + recent_net_profits: [-30_000, -25_000, -20_000], + recent_revenue_totals: [150_000, 140_000, 130_000], + city_connection_bonus_latch: true, + linked_transit_service_latch: true, + ..base_company() + }; + + let decision = evaluate_annual_finance_policy(&policy, &company); + assert_eq!( + decision, + AnnualFinanceDecision::DeclareBankruptcy { + reason: BankruptcyReason::EarlyStress, + } + ); + } + + #[test] + fn bond_issue_precedes_stock_issue_when_cash_window_fails() { + let policy = base_policy(); + let company = CompanyFinanceState { + current_cash: -900_000, + support_adjusted_share_price: 30.0, + book_value_per_share: 20.0, + linked_transit_service_latch: true, + recent_net_profits: [20_000, 10_000, 5_000], + ..base_company() + }; + + let decision = evaluate_annual_finance_policy(&policy, &company); + assert_eq!( + decision, + AnnualFinanceDecision::IssueBond { + count: 4, + principal_per_bond: CompanyFinanceState::BOND_PRINCIPAL, + term_years: CompanyFinanceState::BOND_TERM_YEARS, + } + ); + } + + #[test] + fn stock_issue_checks_liquidity_before_valuation() { + let policy = AnnualFinancePolicy { + bond_issuance_allowed: false, + dividends_allowed: false, + ..base_policy() + }; + let company = CompanyFinanceState { + current_cash: 500_000, + support_adjusted_share_price: 30.0, + book_value_per_share: 20.0, + recent_net_profits: [40_000, 30_000, 20_000], + recent_revenue_totals: [250_000, 240_000, 230_000], + ..base_company() + }; + + let decision = evaluate_annual_finance_policy(&policy, &company); + assert_eq!(decision, AnnualFinanceDecision::NoAction); + } + + #[test] + fn stock_issue_emits_two_tranches_when_gates_pass() { + let policy = AnnualFinancePolicy { + dividends_allowed: false, + ..base_policy() + }; + let company = CompanyFinanceState { + current_cash: 100_000, + support_adjusted_share_price: 27.5, + book_value_per_share: 20.0, + outstanding_share_count: 60_000, + recent_net_profits: [40_000, 30_000, 20_000], + recent_revenue_totals: [250_000, 240_000, 230_000], + bonds: vec![ + BondPosition { + principal: 150_000, + coupon_rate: 0.12, + years_remaining: 12, + }, + BondPosition { + principal: 10_000, + coupon_rate: 0.10, + years_remaining: 10, + }, + ], + ..base_company() + }; + + let decision = evaluate_annual_finance_policy(&policy, &company); + assert_eq!( + decision, + AnnualFinanceDecision::IssuePublicShares { + share_count_per_tranche: 2_000, + tranche_count: 2, + price_per_share: 27.5, + } + ); + } + + #[test] + fn recent_metric_reader_exposes_report_lanes() { + let company = CompanyFinanceState { + current_fuel_cost: 12_345, + recent_net_profits: [11_000, 22_000, 33_000], + recent_revenue_totals: [101_000, 102_000, 103_000], + recent_revenue_per_share: [1.6, 1.5, 1.4], + recent_earnings_per_share: [1.3, 1.2, 1.1], + recent_dividend_per_share: [0.4, 0.3, 0.2], + book_value_per_share: 19.5, + ..base_company() + }; + + assert_eq!( + company.read_recent_metric(AnnualReportMetric::NetProfits, 1), + Some(22_000.0) + ); + assert_eq!( + company.read_recent_metric(AnnualReportMetric::RevenuePerShare, 2), + Some(1.4) + ); + assert_eq!( + company.read_recent_metric(AnnualReportMetric::FuelCost, 0), + Some(12_345.0) + ); + assert_eq!( + company.read_recent_metric(AnnualReportMetric::BookValuePerShare, 0), + Some(19.5) + ); + assert_eq!( + company.weighted_recent_metric(AnnualReportMetric::EarningsPerShare, &[3.0, 2.0, 1.0]), + Some(1.2333333333333334) + ); + } + + #[test] + fn debt_news_classifies_borrow_and_paydown_paths() { + assert_eq!( + DebtRestructureSummary { + retired_principal: 500_000, + issued_principal: 500_000, + } + .classify(), + Some(DebtNewsOutcome::RefinanceOnly) + ); + assert_eq!( + DebtRestructureSummary { + retired_principal: 300_000, + issued_principal: 500_000, + } + .classify(), + Some(DebtNewsOutcome::RefinanceAndBorrow) + ); + assert_eq!( + DebtRestructureSummary { + retired_principal: 500_000, + issued_principal: 300_000, + } + .classify(), + Some(DebtNewsOutcome::RefinanceAndPayDown) + ); + } + + #[test] + fn detailed_evaluation_carries_share_and_debt_side_effects() { + let policy = base_policy(); + let company = CompanyFinanceState { + current_cash: -900_000, + support_adjusted_share_price: 30.0, + book_value_per_share: 20.0, + linked_transit_service_latch: true, + recent_net_profits: [20_000, 10_000, 5_000], + ..base_company() + }; + + let evaluation = evaluate_annual_finance_policy_detailed(&policy, &company); + assert_eq!( + evaluation.decision, + AnnualFinanceDecision::IssueBond { + count: 4, + principal_per_bond: CompanyFinanceState::BOND_PRINCIPAL, + term_years: CompanyFinanceState::BOND_TERM_YEARS, + } + ); + assert_eq!( + evaluation.debt_news, + Some(DebtNewsOutcome::NewBorrowingOnly) + ); + assert_eq!(evaluation.debt_restructure.issued_principal, 2_000_000); + assert_eq!(evaluation.repurchased_share_count, 0); + assert_eq!(evaluation.issued_share_count, 0); + } + + #[test] + fn snapshot_evaluation_applies_post_state_transition() { + let snapshot = FinanceSnapshot { + policy: AnnualFinancePolicy { + dividends_allowed: false, + ..base_policy() + }, + company: CompanyFinanceState { + current_cash: 100_000, + support_adjusted_share_price: 27.5, + book_value_per_share: 20.0, + outstanding_share_count: 60_000, + recent_net_profits: [40_000, 30_000, 20_000], + recent_revenue_totals: [250_000, 240_000, 230_000], + bonds: vec![ + BondPosition { + principal: 150_000, + coupon_rate: 0.12, + years_remaining: 12, + }, + BondPosition { + principal: 10_000, + coupon_rate: 0.10, + years_remaining: 10, + }, + ], + ..base_company() + }, + }; + + let outcome = snapshot.evaluate(); + assert_eq!( + outcome.evaluation.decision, + AnnualFinanceDecision::IssuePublicShares { + share_count_per_tranche: 2_000, + tranche_count: 2, + price_per_share: 27.5, + } + ); + assert_eq!(outcome.evaluation.issued_share_count, 4_000); + assert_eq!(outcome.post_company.outstanding_share_count, 64_000); + assert_eq!(outcome.post_company.unassigned_share_count, 14_000); + assert_eq!(outcome.post_company.current_cash, 210_000); + } + + #[test] + fn dividend_target_is_quantized_and_clamped() { + let policy = AnnualFinancePolicy { + bond_issuance_allowed: false, + ..base_policy() + }; + let company = CompanyFinanceState { + current_cash: 20_000, + board_dividend_ceiling: 0.9, + current_dividend_per_share: 0.2, + unassigned_share_count: 500, + outstanding_share_count: 10_000, + recent_earnings_per_share: [1.4, 1.1, 0.9], + ..base_company() + }; + + let decision = evaluate_annual_finance_policy(&policy, &company); + assert_eq!( + decision, + AnnualFinanceDecision::AdjustDividend { + old_rate: 0.2, + new_rate: 0.9, + } + ); + } + + #[test] + fn bankruptcy_mutator_halves_bond_principal() { + let mut company = base_company(); + company.current_company_value = 900_000; + company.years_since_last_bankruptcy = 25; + + company.apply_annual_decision(&AnnualFinanceDecision::DeclareBankruptcy { + reason: BankruptcyReason::DeepDistress, + }); + + assert_eq!(company.bonds[0].principal, 200_000); + assert_eq!(company.bonds[1].principal, 150_000); + assert_eq!(company.current_company_value, 450_000); + assert_eq!(company.years_since_last_bankruptcy, 0); + } +} diff --git a/crates/rrt-model/src/lib.rs b/crates/rrt-model/src/lib.rs index d30f4e6..378e386 100644 --- a/crates/rrt-model/src/lib.rs +++ b/crates/rrt-model/src/lib.rs @@ -1,3 +1,5 @@ +pub mod finance; + use std::collections::BTreeMap; use std::fmt; use std::fs::File; diff --git a/docs/atlas/company-and-ledger.md b/docs/atlas/company-and-ledger.md index e64ff4e..c7f1376 100644 --- a/docs/atlas/company-and-ledger.md +++ b/docs/atlas/company-and-ledger.md @@ -64,7 +64,7 @@ Current bounded compatibility impact: `0x00408f70`, because that target sums raw site cache `+0x12` rather than the weighted `+0x0e` or promoted `+0x16` lanes -Highest-value open edge: +Latest finance closure: - The remaining semantic meaning of the annual finance policy branches is now narrower: stat-family `0x2329/0x1d` is now bounded as current `Book Value Per Share` in the stock-issue @@ -72,27 +72,80 @@ Highest-value open edge: bond-rate-versus-support ladder, the broader support-adjusted share-price or public-support lane is now bounded through `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0`, and its immediate feeder is now bounded as - `company_compute_cached_recent_per_share_performance_subscore` `0x004248d0`, which weighs recent - `Revenue Per Share`, `Earnings Per Share`, and `Dividend Per Share` lanes `0x1e/0x1f/0x20` - against current `Book Value Per Share`, while `0x21` now routes through + `company_compute_cached_recent_per_share_performance_subscore` `0x004248d0`, which uses an + explicit recent-history ladder: the current partial year is weighted by `(5 * [world+0x0f]) - 5`, + the prior four full years use `48/36/24/12` for `Earnings Per Share` and `Revenue Per Share` + lanes `0x1f/0x1e`, and the adjacent `Dividend Per Share` non-decline trend comparisons on lane + `0x20` use weights `9/8/7/6`, all before the tail folds those lanes against current `Book Value + Per Share`, while `0x21` now routes through `company_compute_five_year_weighted_shareholder_return` `0x004246b0` and its paired hidden shareholder-payout lane `0x23`, raw slot `0x09` aligns with the Income Statement fuel-cost lane surfaced by tooltip `1309`, and - derived slot `0x2b` now reads as the rolling net-profits lane. The main remaining gap is the - exact weight schedule and gate ordering used inside the already-bounded annual bankruptcy, - debt, repurchase, stock-issue, and dividend branches. The current strongest read is now: + derived slot `0x2b` now reads as the rolling net-profits lane. The exact stock-issue cutoff + ordering is now closed, and the current grounded read is: bankruptcy = first the year, toggle, and cooldown gates, then the three-year scan, then the revenue-band-selected cash-and-debt ladder, then the support-adjusted share-price threshold, then the fuel-cost lane and net-profit accumulator; the later deep-distress fallback then re-checks cash below `-300000` plus the first three recent profit years at or below `-20000`. - Stock issuance = first the bond/stock toggle gates, then the outstanding-share tranche sizing, - then the `55000` proceeds cap, then the support-adjusted price-to-book screen against the - highest live coupon band. Dividend adjustment = first the toggle and age gates, then the - weighted recent-profit-per-share target, then the small-unassigned-share cash supplement, then - the board ceiling clamp. The remaining gap is now mostly the near-cutoff ordering inside the - stock-issue lane, and the current strongest read places the liquidity gate at `0x2329/0x0d` - before the valuation gate at `0x2329/0x1d`. The dividend-ceiling clamp is already separately - bounded on the dividend branch. That is now a final precedence question, not a missing - ownership gap in the annual finance verbs themselves. The debt-news tail is also now explicit: + Stock issuance = first the bond/stock toggles, live-bond count, and founding-age gates, then + tranche sizing from outstanding shares, then the `55000` proceeds-cap trim, then the pressured + support-adjusted share-price recompute and price-to-book derivation, followed by the tested + gates in fixed order: share-price floor `22`, proceeds floor `55000`, current cash + `0x2329/0x0d` against highest-coupon principal plus `5000`, one later stock-issue cooldown gate + driven by the current issue mixed-radix calendar tuple at `[company+0x16b/+0x16f]` versus the + active world absolute calendar counter `[world+0x15]`, and only then the coupon-versus-price-to-book ladder + `0.07/1.3 .. 0.14/0.35`. Dividend + adjustment = first the toggle and age gates, then the weighted recent-profit-per-share target, + then the small-unassigned-share cash supplement, then the board ceiling clamp. The debt-news tail + is also now explicit: it compares total retired versus newly issued principal to pick `2882..2886`, and the stock-buyback tail separately publishes `2887` from the accumulated repurchased-share count. + +Current finance closure detail: + +- The stock-issue cooldown stamp is now structurally closed: + `[company+0x16b/+0x16f]` holds the current issue calendar-point tuple, + `[company+0x173/+0x177]` preserves the prior tuple, + and the cooldown gate converts the current tuple through `0x0051d3c0` before comparing against + the active world absolute calendar counter `[world+0x15]`. The tuple model is no longer just + “calendar-like”: current local arithmetic now bounds it as the same mixed-radix + `12 x 28 x 3 x 60` family unpacked by `0x0051d460`. +- The recent per-share performance feeder `0x004248d0` is now tighter than before: + its four tail lanes are `EPS * 10`, `Revenue Per Share`, a dividend-strength lane derived from + the weighted non-decline ratio on slot `0x20`, and current `Book Value Per Share` from slot + `0x1d`; base lane weights are `40/10/20/30`, startup companies ramp those weights with the + age table `0/0/0/100 -> 25/25/35/100 -> 50/50/65/100 -> 75/75/85/100 -> 100/100/100/100`, + the strongest lane is boosted by `1.25` while the weakest is reduced by `0.8`, the bounded + intermediate `[company+0x0d19]` uses `((difficulty + 1.0) / 2.0)` with a floor at `0.5`, + and the final cached score uses the raw difficulty table + `0.8/0.9/1.0/1.1/1.2/0.9/0.95/1.0` plus the post-bankruptcy smoothing factor. +- The broader support-adjusted share-price consumer `0x00424fd0` is tighter now too: + it starts from that recent per-share feeder, can interpolate it against the older support field + `[company+0x57]` on the young-company path using one capped progress term from + `[world+0x15]`, `[company+0x0d07]`, and founding year `[company+0x157]`, clamps the caller's + share-count pressure term to `[-0.2, 0.2]`, can refresh mutable support field `[company+0x4f]` + from that staged pressure, derives one share-count growth term from `(shares / 20000)^0.33`, + then runs the resulting support scalar through the later threshold ladder + `0.6 / 0.45 / 0.3 / 1.7 / 2.5 / 4.0 / 6.0` before multiplying by scenario issue `0x37` and + rounding into the cached share-price lane `[company+0x0d7b]`. +- The surrounding finance issue split is now much tighter: + `0x00425320` is the bounded company `Credit Rating` score used by the shell debt summary and the + bond-offer rejection path on localized id `974`, with raw issue slot `0x38` folded in at the + tail; `0x00424580` is the explicit `Prime Rate` lane fed by raw issue slot `0x39`; and + `0x00424fd0` then multiplies the equity-side share-price scalar by issue slot `0x37`. + So the strongest current read is: + `0x38 = debt-market / creditworthiness`, + `0x39 = prime-rate / market-rate pressure`, + `0x37 = broader equity-market / investor confidence in company or chairman performance`. +- The raw formula side is now mostly closed, and what remains is mostly whether RT3 exposed one exact + UI caption for issue `0x37` beyond the already-grounded investor-performance strings. The + negative results now sharpen that last edge too: the nearby `0x460a90` / `0x473620` + registration blocks are camera-view and related shell-command families, not finance issue + owners; and the editor-side `Stock Prices` label belongs to a separate float-tuning block + `[state+0x0bde..0x0bf6]`, not the issue table behind `0x37`. The shell-resource side is now + tighter too: extracting `CompanyDetail.win` from `rt3_2WIN.PK4` did not uncover any separate + plain-English finance caption or investor label for this lane, and the recovered shell owner path + already routes section-0 through the dynamic-text widget `0x947f` plus formatter + `shell_format_company_governance_and_economy_status_panel` `0x004e5cf0`. So the strongest + current UI-facing text for issue `0x37` remains the investor-attitude sentence family + `1217` and `3048/3049`, not one standalone caption row like `Credit Rating:` or `Prime Rate:`. diff --git a/docs/atlas/editor-and-site-service.md b/docs/atlas/editor-and-site-service.md index 73f6c19..8f16c5e 100644 --- a/docs/atlas/editor-and-site-service.md +++ b/docs/atlas/editor-and-site-service.md @@ -34,7 +34,10 @@ Current grounded runtime chain: - `placed_structure_refresh_local_service_score_bundle` - `placed_structure_query_candidate_local_service_metrics` - `placed_structure_count_candidates_with_local_service_metrics` +- `placed_structure_get_nth_candidate_id_with_local_service_metrics` - `placed_structure_query_cached_express_service_class_score` +- `placed_structure_refresh_candidate_local_service_comparison_cache_against_peer_site` +- `placed_structure_select_best_candidate_id_by_local_service_score` Current grounded shell-side consumers: @@ -51,14 +54,19 @@ What this note is for: - Per-site local service tables and caps - Station-detail and station-list read-side summaries -Highest-value open edge: +Resolved edge: -- The deeper gameplay meaning of the per-site local service tables is now mostly about whether - those scores stay confined to placement, overlay, and station-summary presentation through the - query helpers, or whether the same query outputs also feed live cargo-economy filter flags, - per-site service-cap rebuilds, or nearby-structure behavior beyond the currently bounded shell - summaries. The grounded chain strongly suggests the read-side path is dominant, the query - helpers themselves still read as read-only consumers, and the only grounded mutation bridge is - the collection-wide cargo-economy filter refresh. The remaining open question is whether that - filter refresh is the full policy sink for the local service tables or whether an additional - mutation-side writer exists outside the local corpus. +- The per-site local service query family is now bounded as predominantly read-side. Above the + mutation and rebuild lane, the grounded helpers are: + `placed_structure_query_candidate_local_service_metrics`, + `placed_structure_count_candidates_with_local_service_metrics`, + `placed_structure_get_nth_candidate_id_with_local_service_metrics`, + `placed_structure_query_cached_express_service_class_score`, + `placed_structure_refresh_candidate_local_service_comparison_cache_against_peer_site`, and + `placed_structure_select_best_candidate_id_by_local_service_score`. +- Their grounded callers are shell summaries, shell detail rows and popups, the world preview + overlay, one company-side autoroute score cache rebuild, and one peer-site comparison cache. + None of the newly closed callers acts as a policy writer back into candidate or site state. +- The only grounded mutation bridge on this edge remains + `structure_candidate_collection_refresh_cargo_economy_filter_flags`, which writes the derived + enabled or filtered state into `[entry+0x56]` before rebuilding the visible counts. diff --git a/docs/atlas/multiplayer.md b/docs/atlas/multiplayer.md index 6072788..e798325 100644 --- a/docs/atlas/multiplayer.md +++ b/docs/atlas/multiplayer.md @@ -31,9 +31,9 @@ What this note is for: - GameSpy-facing callback and live-route semantics - Selector-view refresh, retry, and probe state -Highest-value open edge: +Latest local closure: -- The remaining multiplayer edge is narrower now: +- The remaining multiplayer branch is narrower now: the status-route callback vector is bounded through selector-text or averaged-sample publication, control-id-list seeding, scalar-query forwarding, and the validated cookie or extended-payload callbacks. The selector-view sidecar is tighter too: `[entry+0x80]` now reads as the averaged @@ -49,6 +49,10 @@ Highest-value open edge: `0x5906f0` tears down the decoded schema dictionary rooted at `[this+0x08]`, `0x590540/0x5905a0` acquire and release refcounted shared schema strings through the global pool, and `0x5908c0` now reads as the live receive/decode state machine serviced by `0x591290` in table states `2/3`. + The owner-callback mode split above that runtime is tighter now too: mode `0` comes from the + generic append-notify lane `0x590370`, mode `1` from compact upsert `0x590d00`, mode `2` from + generic remove-notify `0x590430`, and modes `6/5/3` from the receive/decode state machine + `0x5908c0`. The higher transport bring-up split is tighter too: `0x596090` now clearly constructs `[transport+0xba4]` through `0x5905e0` with owner callback `0x595a40`, then seeds the local field-cache family `[transport+0x1724]` through `0x5a08f0` with helper `0x595b60`, and then @@ -83,15 +87,31 @@ Highest-value open edge: `+0x0c/+0x10/+0x18` metadata triplet and the replay modes later consume the pointer through `0x5933a0`. The negative result is stronger too: local text-side xrefs still show no direct store to `[transport+0x1778]`, and a wider sweep also failed to show any obvious `lea`-based - replay-band writer. So the sidecar writer remains upstream of this leaf capacity publisher. The + replay-band writer. The owned request lifecycle now tightens that further too: + `0x593330/0x593370/0x593380/0x5934e0/0x5933a0` fully own `[transport+0x1780]`, `0x1784`, and + `0x1788`, while still leaving `[transport+0x1778]` outside that family; the neighboring active + opcode reset path `0x5929a0` also only targets `[transport+0x17fc]`. Constructor and teardown + passes around `0x596090/0x5961b0/0x5962e0` tighten that negative result further: those owners + seed or clear the neighboring replay-band fields while still leaving `[transport+0x1778]` + untouched. A full-binary literal-offset sweep tightens it further still: the only direct + `0x1778` hit in `RT3.exe` is the read in `0x595bc0`. One nearby ambiguity is now closed too: the + mode-`5` mirror path in `0x595a40` and `0x595e10` does not seed `[transport+0x1778]`; it writes + `[transport+0x54]` and mirrors the same staged route companion dword only into queue-side slot + `[transport+0x1724+0x24]` through `0x005a0940`. So the sidecar writer remains upstream of this + leaf capacity publisher. The payload split is tighter too: `0x592ae0` now grounds opcode `2` as a seven-dword descriptor payload with an owned string slot at `+0x08`, so live mode supplies a populated payload while modes `3` and `5` deliberately enqueue an all-zero payload and reuse only the sidecar metadata in the wrapper. Those two modes are tighter now too: they are not generic replay guesses, they are the live receive-state owner callbacks emitted by `0x5911e0 -> 0x5908c0`. So they are best read as delayed metadata replays - over one cached work record, not over a standalone custom cache object. The producer side is - tighter now too: callback-table attach, + over one cached work record, not over a standalone custom cache object. The capacity owner split + itself is tighter now too: `0x595bc0` only does real work for modes + `0`, `3`, and `5`; the upstream table still delivers modes `1`, `2`, and `6`, but those are + explicit no-ops in the capacity leaf. So the callback-owner edge is now effectively closed: the + route-callback table feeds the capacity publisher only through the live append lane and the two + replay lanes, while the remaining missing piece is still the upstream sidecar producer, not the + owner-mode wiring. The producer side is tighter now too: callback-table attach, bound-route requests, selector-text route requests, and the type-`9` text fastpath all stage that same `+0x0c/+0x10/+0x18` triplet through `0x5934e0`, so the capacity replay sidecar is clearly reusing one broader transport work-record family. The generic owner-callback split above that family is tighter now @@ -125,34 +145,52 @@ Highest-value open edge: `0x5904d0` family, not a vague collection clear. The callback-table attach side now constrains the same work-record metadata family a little further too: `0x593650` deliberately - duplicates one caller metadata dword into both work fields `+0x0c` and `+0x18`, while preserving - the remaining caller callback function pointer in `+0x10`. The lower opcode wrappers are tighter - now too: both `0x592a40` and `0x592a70` consume that staged triplet in the order `( callback fn - +0x10, callback companion +0x18, drain context id +0x0c )`. So the replay-side triplet is - clearly a broader transport callback-wrapper family, not one fixed route-only tuple. The type-`9` - text fastpath confirms the same split from the other side too: `0x593d00` only emits the - follow-on callback lane when work field `+0x10` is nonnull, and then forwards `(+0x10, +0x18, - +0x0c)` into `0x593170` as callback function, callback companion, and trailing drain context. + duplicates its first caller metadata dword into both work fields `+0x0c` and `+0x10`, while + carrying the second caller metadata dword in `+0x18`. The lower opcode wrappers are tighter now + too: `0x592a40` turned out not to be the real 0x08-byte binding leaf at all, but the explicit + opcode-`1` trigger wrapper whose constructor is a no-op and whose active-side service is + `0x5913c0`. The real lower binding leaf is `0x592c40`, which builds the local `0x08`-byte + payload later deep-copied by the explicit opcode-`5` family `0x591540/0x591570/0x591580`. The + earlier opcode-`4` reading was just the table-indexing mistake: `0x5928a0` multiplies the pushed + selector by `0x10`, so selector `4` lands on the row at `0x5e2044`, not the row at `0x5e2034`. + So + the replay-side triplet is still a broader transport callback-wrapper family, not one fixed + route-only tuple. The type-`9` text fastpath confirms the same split from the other side too: + `0x593d00` only emits the follow-on callback lane when work field `+0x10` is nonnull, and then + forwards `(+0x10, +0x18, +0x0c)` into `0x593170` as callback function, callback companion, and + trailing drain context. The nearby field-subscription side is tighter too: `0x592b50` now clearly uses `[transport+0x1774]` as a cached progress percentage under the `[transport+0xba4]` callback table, and `0x5962e0` seeds that percentage to `1` just before the first immediate mode-`3` snapshot. The nearby route-callback-table lifecycle is tighter now too: `0x596090` seeds `[transport+0xba0]` as the callback-plumbing enable latch, clears staged payload slot `[transport+0xb50]`, and constructs the three owner branches rooted at `[transport+0xba4]`, - `[transport+0x1164]`, and `[transport+0x18bc]`. The matching local cleanup is tighter too: - `0x5962c0` is the explicit staged route-callback payload clear on `[transport+0xb50]`, while - `0x595ce0` now clearly resets only the capacity-descriptor route callback table at - `[transport+0x1164]`, not the field-subscription table at `[transport+0xba4]`. The only - meaningful gap left on the capacity side is the still-unrecovered writer that stages - `[transport+0x1778]`. The carried sidecar fields are no longer anonymous: current evidence now - says they are just the same cached callback-wrapper triplet reused by other work-record families, - namely drain context id `+0x0c`, callback function `+0x10`, and callback companion `+0x18`. - The negative result is stronger now too: the neighboring replay-band fields - `[transport+0x176c]`, `[transport+0x1770]`, `[transport+0x1774]`, `[transport+0x177c]`, - `[transport+0x1780]`, and `[transport+0x1784]` all have direct local lifecycle owners, but - `[transport+0x1778]` still only appears as the single read in `0x595bc0`. So this is no longer - a local ownership gap: no local writer is grounded, and the remaining staging path is best read - as upstream and indirect rather than one ordinary direct field store in the local text cluster. + `[transport+0x1164]`, and `[transport+0x18bc]`; `0x596210` is the recurring service sweep over + those same three tables plus the local field-cache and queued-descriptor families; `0x596060` + is the explicit `gsi_am_rating` reset; and `0x596530` is the reopen-from-stored-label sibling + above that same am-rating table. The matching local cleanup is tighter too: `0x5962c0` is the + explicit staged route-callback payload clear on `[transport+0xb50]`, while `0x595ce0` now + clearly resets only the capacity-descriptor route callback table at `[transport+0x1164]`, not + the field-subscription table at `[transport+0xba4]`. The only meaningful gap left on the + capacity side is no longer a local writer search. The carried + sidecar fields are no longer anonymous: current evidence now says they are just the same cached + callback-wrapper triplet reused by other work-record families, namely drain context id `+0x0c`, + callback function `+0x10`, and callback companion `+0x18`. The negative result is stronger now + too: the neighboring replay-band fields `[transport+0x176c]`, `[transport+0x1770]`, + `[transport+0x1774]`, `[transport+0x177c]`, `[transport+0x1780]`, and `[transport+0x1784]` all + have direct local lifecycle owners, but `[transport+0x1778]` still only appears as the single + read in `0x595bc0`; even the broader callback-owner lifecycle now skips it while touching those + neighbors, including bring-up `0x596090`, recurring service `0x596210`, am-rating reset/reopen + `0x596060/0x596530`, teardown `0x5961b0`, and field-subscription open `0x5962e0`. The + constructor now closes that negative result further: `0x58dc50` bulk-zeroes the full transport + body and still never seeds `[transport+0x1778]` before later explicit neighbor initialization. + So this edge is now locally closed: no writer is grounded anywhere in `RT3.exe`, and the + remaining staging path is best read as an upstream callback or worker handoff rather than one + missing ordinary field store in the local text cluster. The callback-binding family at + `0x5934e0 -> 0x593650 -> 0x58f2f0` now gives the cleanest local boundary for that claim: + RT3 stages and later consumes the shared work-record metadata triplet, but the sidecar itself + still appears only as a borrowed cached pointer at `0x595bc0`, never as a locally seeded + replay-band field. One adjacent staged-route callback is tighter now too: `0x595860` is the submit-result handler below `0x5958e0`, using the already-grounded third selector-generation counter at `[transport+0xac0]` @@ -212,10 +250,10 @@ Highest-value open edge: gate and the same queued fallback, mode `2` removes pending descriptors from the queued family, mode `3` forces mode `2` when the primary-endpoint table is empty, mode `4` updates the deferred route-status state around `[this+0x1ed4]` and `[this+0x1ed8]`, and mode `5` copies the staged - route companion dword at `[this+0x490]` into `[this+0x54]` while mirroring that value into the - local field-cache family. The route-event dispatcher side is cleaner too: + route companion dword at `[this+0x490]` into `[this+0x54]` while mirroring that value into + queue-side slot `[this+0x1724+0x24]` through `0x005a0940`. The route-event dispatcher side is cleaner too: the mode-`5` tails in both callback families do not copy a descriptor-local field. They mirror the - transport-staged companion dword at `[this+0x490]` into `[this+0x54]` and the local field-cache - family instead. The `gsi_am_rating` maintenance lane is tighter now too: it sorts the + transport-staged companion dword at `[this+0x490]` into `[this+0x54]` and that same queue-side + slot instead, not into `[this+0x1778]`. The `gsi_am_rating` maintenance lane is tighter now too: it sorts the primary-endpoint descriptor table through `0x590310` in mode `1` with key `gsi_am_rating`, then selects the new head through `0x590480` rather than treating the table as pure insertion order. diff --git a/docs/atlas/route-entry-and-trackers.md b/docs/atlas/route-entry-and-trackers.md index 49504b8..bdea53f 100644 --- a/docs/atlas/route-entry-and-trackers.md +++ b/docs/atlas/route-entry-and-trackers.md @@ -125,17 +125,19 @@ What this note is for: - Route-style peer-link emission and route-link state - Track-laying-capacity interactions with route synthesis -Highest-value open edge: +Latest local closure: -- The remaining semantic edge here is now mostly about ranking, not company pressure: - the pre-`1.03` versus `1.03+` tracker metric split still looks meaningful for the weighted - linked-transit site-score cache at `company_rebuild_linked_transit_autoroute_site_score_cache` - `0x00407bd0` and the seeded peer-route chooser at `company_build_linked_transit_autoroute_entry` - `0x00408380`, but current evidence says the company train-pressure target still sums raw site - cache `+0x12` rather than the weighted lanes fed by step count and continuity. The lower - route-entry pair metric still has other grounded consumers such as the initial route sweep and - the train route validator through `0x004a6630`, but no downstream consumer of the cached weighted - site lanes `+0x0e/+0x16` is currently grounded beyond the autoroute selector `0x00408280` and - builder `0x00408380`. So the remaining question here is no longer about current local ownership; - it is only whether some still-ungrounded consumer outside the current corpus also reads those - cached weighted lanes. +- The linked-transit cache split is now locally bounded rather than just suggestive: + the pre-`1.03` versus `1.03+` tracker metric dispatcher still matters for the weighted + autoroute cache lanes at `company_rebuild_linked_transit_autoroute_site_score_cache` + `0x00407bd0`, but the grounded downstream chain now stops at route choice rather than company + pressure. Cache lane `+0x16` feeds the owned-site selector + `company_select_best_owned_linked_transit_site_by_autoroute_score` `0x00408280`, and the + weighted peer-side bands then feed `company_build_linked_transit_autoroute_entry` + `0x00408380`; train-side append and add-train helpers `0x00409770` and `0x00409830` only + inherit that weighted choice by calling the builder. By contrast, the company-wide roster target + at `company_compute_owned_linked_transit_site_score_total` `0x00408f70` still sums only raw + cache `+0x12` before `company_balance_linked_transit_train_roster` `0x00409950` reacts. So this + local semantic edge is effectively closed: the compatibility split perturbs ranked site choice + and seeded autoroute peer choice, not the later train-count target, and any further + weighted-lane consumer would have to live outside the currently grounded local chain. diff --git a/docs/atlas/runtime-and-world-tools.md b/docs/atlas/runtime-and-world-tools.md index 8e3b664..36f9e2c 100644 --- a/docs/atlas/runtime-and-world-tools.md +++ b/docs/atlas/runtime-and-world-tools.md @@ -129,12 +129,11 @@ What this note is for: - Track-lay and station-placement semantics - Train detail and trainbuy command ownership -Highest-value open edge: +Current bounded conclusion: -- Whether any later gameplay-owned mode introduces a distinct input or frame owner for ordinary - world interaction, or whether the grounded `shell_controller_window_message_dispatch` plus +- Current evidence points to one stable reading: no later gameplay-owned mode introduces a distinct + outer input or frame owner for ordinary world interaction. The grounded + `shell_controller_window_message_dispatch` plus `simulation_frame_accumulate_and_step_world` path remains the sole coordinator after world - entry and the first grounded non-camera world-input coordinator. Current evidence now points - strongly to the second reading: the shell-fed input and frame path remains the only grounded - coordinator after world entry, and no separate outer gameplay loop or gameplay-only input object - is grounded in the local corpus. + entry and the first grounded non-camera world-input coordinator, and no separate outer + gameplay loop or gameplay-only input object is grounded in the local corpus. diff --git a/docs/atlas/startup-shell-and-content.md b/docs/atlas/startup-shell-and-content.md index 72081b4..65acd05 100644 --- a/docs/atlas/startup-shell-and-content.md +++ b/docs/atlas/startup-shell-and-content.md @@ -28,7 +28,7 @@ What this note is for: - File-flow and content-load boundaries - World bring-up versus shell-owned cadence questions -Highest-value open edge: +Current bounded conclusion: -- Whether any long-lived gameplay cadence later escapes the bootstrap-owned shell service loop - entirely, or only nests under it. +- No later long-lived gameplay cadence is currently grounded outside the bootstrap-owned shell + service loop; the local evidence still supports the nested-under-shell reading. diff --git a/docs/control-loop-atlas.md b/docs/control-loop-atlas.md index b615361..63d5a33 100644 --- a/docs/control-loop-atlas.md +++ b/docs/control-loop-atlas.md @@ -103,15 +103,18 @@ transition. ## Map and Scenario Content Load -- Roots: `shell_map_file_entry_coordinator` at `0x00445ac0`, the first grounded world-entry branch +- Roots: `shell_map_file_entry_coordinator` at `0x00445ac0`, the larger active-mode profile owner + `shell_active_mode_run_profile_startup_and_load_dispatch` at `0x00438890`, the shell-mode + switcher `shell_transition_mode` at `0x00482ec0`, the first grounded world-entry branch `world_entry_transition_and_runtime_bringup` at `0x00443a50`, `shell_map_file_world_bundle_coordinator` at `0x00445de0`, reference-database setup via `map_bundle_open_reference_databases` at `0x00444dd0`, and narrower loaders such as `map_load_geographic_label_database` and `map_load_city_database`. - Trigger/Cadence: shell tutorial launch, editor or detail-panel file actions through `fileopt.win`, map-scenario open paths, and scenario-text export batch commands. -- Key Dispatchers: `shell_map_file_entry_coordinator`, `world_entry_transition_and_runtime_bringup`, - `world_runtime_release_global_services`, `shell_map_file_world_bundle_coordinator`, +- Key Dispatchers: `shell_map_file_entry_coordinator`, + `shell_active_mode_run_profile_startup_and_load_dispatch`, `shell_transition_mode`, + `world_entry_transition_and_runtime_bringup`, `world_runtime_release_global_services`, `shell_map_file_world_bundle_coordinator`, `map_bundle_open_reference_databases`, `map_load_geographic_label_database`, `map_load_city_database`, `scenario_text_export_build_language_file`, `scenario_text_export_report_language_file`, `scenario_text_export_batch_process_maps`. @@ -137,7 +140,188 @@ transition. mode `11` is tighter now too: it still maps to `.gmt`, but instead of looking like another gameplay save family it conditionally diverts into the same `.gmt` preview-surface pipeline owned by the Multiplayer preview dataset object at `0x006cd8d8`, and only falls back to the normal - reference-bundle path when that dataset object is absent. + reference-bundle path when that dataset object is absent. The shell-side mode owner above those + file coordinators is clearer now too. `shell_transition_mode` no longer reads like a generic mode + switch: its constructor jump table now resolves mode `1` to `Game.win`, mode `2` to `Setup.win`, + mode `3` to `Video.win`, mode `4` to `LoadScreen.win`, mode `5` to `Multiplayer.win`, mode `6` + to `Credits.win`, and mode `7` to `Campaign.win`. The strongest current load-side owner inside + that table remains the mode-`4` branch around `0x4830ca`, which publishes the new active mode + object into `0x006cec78` and then calls `shell_active_mode_run_profile_startup_and_load_dispatch` + as `thiscall(active_mode, 1, 0)`. The caller split above that owner is tighter now too: + `world_entry_transition_and_runtime_bringup` reaches the same owner at `0x443b57` with `(0, 0)` + after dismissing the current shell detail panel and servicing `0x4834e0(0, 0)`, while the + saved-runtime path at `0x446d7f` does the same before immediately building the `.smp` bundle + payloads through `0x530c80/0x531150/0x531360`. That makes the `LoadScreen.win` startup lane the + only currently grounded caller that enters `0x438890` with `(1, 0)` instead of `(0, 0)`. The + internal selector split in `0x438890` is tighter now too: `[0x006cec7c+0x01]` is a separate + seven-way startup selector, not the shell mode id. Values `1` and `7` load `Tutorial_2.gmp` and + `Tutorial_1.gmp`, values `3/5/6` collapse into the same profile-seeded file-load lane through + `0x445ac0([0x006cec7c]+0x11, 4, &out_success)`, value `2` is a world-root initialization lane + that allocates `0x0062c120` and then forces selector `3`, and value `4` is the setup-side world + reset or regeneration lane that rebuilds `0x0062c120` from `0x006d14cc/0x006d14d0` before later + world setup continues. The write side is tighter now too: `Campaign.win` writes selector `6`, + `Multiplayer.win` writes selector `3` on one pending-status path, and the larger `Setup.win` + dispatcher writes selectors `2`, `3`, `4`, and `5` on its validated launch branches. That makes + the file-load subfamily read less like one generic save-open branch and more like a shared + profile-file lane reused by setup, multiplayer, and campaign owners. The world-entry owner + boundary is tighter now too: `world_entry_transition_and_runtime_bringup` at `0x00443a50` no + longer stops at the initial shell transition and world allocation head. The same grounded + function continues through the larger post-load generation tail up to `0x00444dc2`, which means + the later `Setting up Players and Companies...` and neighboring post-load passes are not + floating raw callsites after all. That same owner now clearly covers the event-runtime refresh + through `0x433130`, chairman-profile materialization through `0x437220`, neighboring route and + tracker refresh families, and the one-shot kind-`8` runtime-effect service through `0x432f40` + before clearing shell-profile latch `[0x006cec7c+0x97]`. The `Setup.win` dispatcher + is less opaque now too: the early `0x0bc1..0x0c24` family is mostly fixed submode selection above + `0x00502c00`, except for the separate `0x0bc2/0x0bc5/0x0bc6/0x0bc7` shell-open quartet above + `0x00501f20`; `0x0c1f` is the settings-window escape; `0x0c1e/0x0c20/0x0c22` are direct shell + requests into `0x00482150`; the fixed submode buttons now have concrete lower targets such as + `0x0bc1/0x0bc8 -> 15`, `0x0bc3 -> 16`, `0x0bc4 -> 1`, `0x0c80 -> 13`, `0x0c1c -> 17`, + `0x0c1d -> 2`, `0x0c24 -> 14`, `0x0c81 -> 14`, `0x0c82 -> 6`, `0x0c83 -> 10`, and + `0x0c84 -> 12`; the + `0x0ce6/0x0ce7/0x0d49/0x0d4a/0x0e82/0x0e83` branches are bounded list or slider adjustments on + staged setup fields; and the later `0x0dca/0x0dcb/0x0de9/0x0df3/0x0e81/0x0f6f/0x0f70` controls + are the explicit selector-writing launch buttons rather than one anonymous validated-launch blob. + The constructor-side callbacks are tighter too: control `0x0ce8` is a table-driven payload-label + draw callback above `0x00502030`, not another launch root, and controls `0x0e86` and `0x0e87` + do not select more setup roots; they update the persisted shell-state selector pairs at + `[0x006cec74+0x233/+0x237]` and `[0x006cec74+0x23b/+0x23f]` through `0x00502160` and + `0x005021c0`, then immediately save config through `0x00484910(1)`. The constructor body is + tighter too: it seeds the initial `Setup.win` state by running `0x502910`, `0x502550`, and + `0x502c00(1)` before the user interacts with the window, installs `0x0c80..0x0c86` and + `0x0f6f..0x0f71` as homogeneous button bands, and treats `0x0e88` as one separate special + control with retuned float fields rather than another ordinary launch root. The remaining + optional constructor child `0x0bd0` is tighter now too: it is built from a separate template + block and optional owned heap object before registration, not another hidden setup-root button. + The generic shell helper layer beneath that constructor is tighter now too: `0x53fa50` is the + shared resource-bind and child-list initialization helper, `0x53f830` is the child-control + lookup-by-id helper over the intrusive list at `[this+0x70]`, `0x558130` is the child-control + finalizer that stamps the owner pointer and resolves localized captions before the control goes + live, and `0x53f9c0` is the ordered child-control registration helper used by the optional + `0x0bd0` branch and other shell dialogs. + The submode selector itself is tighter now too because its button-state lane is mostly decoded: + `0xbc5` tracks submode `15`, `0xbc6` tracks `16`, `0xbba` tracks `2`, `0xbbb` tracks `3`, + `0xbc3` tracks `13`, `0xbbc` groups `3/4/5`, `0xbbd` tracks `4`, `0xbbe` tracks `5`, `0xbbf` + groups `6/12/14`, `0xbc0` tracks `7`, `0xbc1` tracks `8`, `0xbc2` tracks `9`, `0xe75` tracks + `10`, and `0xf6e` tracks `17`. RT3.lng and the setup art families now also make several of those + top-level roots read less like anonymous ids and more like real menu panels: submode `1` is the + strongest current landing-panel fit, `2` is the `Single Player` root, `7/8/9` are the + `Editor` / `New Map` / `Load Map` family, `15` is `Extras`, and `17` is `Tutorial`. By + elimination against the separate shell `Credits.win` mode, the remaining top-level `Setup.win` + roots now most safely read as `13 = Multi Player` and `16 = High Scores`. + The file-backed side is tighter too: `0x502c00` now maps submodes exactly as `4 -> dataset 5`, + `9 -> 4`, `6 -> 8`, `10 -> 6`, `12 -> 10`, and `14 -> 9`, so the saved-game-backed family is + no longer one blurred list pane but a small set of stable dataset variants above + `0x4333f0/0x4336a0`. + The file-backed header split is tighter too: `0x5027b0` now maps the top header-control ids as + `4 -> 0xd4b`, `9 -> 0xde8`, `6/12/14 -> 0xdf2`, and `10 -> 0xe85`. RT3.lng closes one earlier + mistake here: those values are local setup control or resource ids, not localized text ids. + The setup art bundle now tightens that family split one step further too: under `rt3_2WIN.PK4` + the distinct file-backed setup art families are the shared `Setup_Load` lane and the separate + `Setup_Sandbox` lane, which matches the selector-side evidence that mode `10` is the + sandbox-backed `new` list while mode `12` is its `load` sibling. Combined with the builder at + `0x4333f0`, that shows only submodes `4` and `10` using the alternate localized-stem list-label + path; `6`, `9`, `12`, and `14` keep the direct filename-normalization lane. + The grouped `3/4/5` family is narrower now too: `0x0ce5` is no longer part of it, because that + control writes selector `3` and then selects submode `9` as the `Load Map` sibling. The nearby + `0x0dcb` branch instead conditionally selects submode `5` or `3`, which keeps `3` as the + strongest current `New Game` / `Options` companion and `5` as the strongest current `Sandbox` + companion. The file-backed single-player side is tighter in the same way now: modes `4` and `10` + are the only siblings using the alternate localized-stem row-label path, so they now read most + safely as the two setup-local template or profile list variants rather than ordinary save lists. + Mode `10` is the stronger one of the pair because neighboring validated launch control `0x0e81` + both routes into selector `5` and sets sandbox byte `[0x006cec7c+0x82] = 1`, which makes it the + strongest current fit for the setup-local `New Sandbox` list. The distinct `Setup_Sandbox` art + family in `rt3_2WIN.PK4` now reinforces that same split one step further, which makes mode `12` + the strongest closed fit for the paired `Load Sandbox` lane; mode `4` is therefore the strongest + remaining non-sandbox peer in that same pair and now most safely reads as the setup-local `New + Scenario`-style chooser. Modes `6`, `12`, and `14` now tighten one step further as the three + selector-`3` direct-filename setup-local `load` siblings because they stay on the direct + filename-normalization lane, share the same `0xdf2` header family, and clear the same + presence-style latch `[0x006cec7c+0x97]`; mode `14` is the strongest current landing panel for + that cluster because `0x0c24` jumps to it directly while `0x0c82` and `0x0c84` only reach the + sibling modes `6` and `12` from inside the same load family. Current control-pairing and + setup-art evidence now make `12 = Load Sandbox` the strongest closed per-submode assignment. The + remaining non-sandbox pair is closed now too: the deeper bundle filter at `0x433260` + distinguishes dataset `9` from dataset `8` by one extra nonzero payload-flag family, and the + editor-side metadata path now grounds `[0x006cec78+0x66de]` as the direct `Campaign Scenario` + checkbox bit because `editorDetail.win` ties control `0x5b6e` to localized ids `3160/3161`. + That makes dataset `9` the campaign-designated load family and dataset `8` the ordinary scenario + load family, so `14 = Load Campaign` and `6 = Load Scenario` now read as grounded rather than + residual. `0x502910` is + tighter in a + corrective way too: it is not a mode-`3`-only helper after all, but the shared non-file-backed + payload panel that formats + `0xcf3/0xcf4/0xcf5/0xd4f`, mirrors option byte `[0x006cec7c+0x7d]` into `0x0ce9..0x0ced`, + rebuilds row host `0x0ce8` from payload bytes `[+0x31b/+0x31c]`, and mirrors live row markers + into `[0x006cec7c+0x87]`. That makes mode `3` just one user of the shared payload-driven panel, + not the sole owner of it. + The payload-helper cluster under that panel is tighter now too: `0x502220` does not just + republish labels and the preview surface. It first re-enters + `shell_setup_load_selected_profile_bundle_into_payload_record` `0x442400`, which clears one full + `0x100f2`-byte setup payload record, builds a rooted path from the staged profile stem, opens the + selected bundle through `0x530c80`, and then reads either the ordinary saved-profile chunk family + or the map-style chunk family through `0x531150/0x531360` depending on the selected extension + shape. Only after that does `0x502220` copy payload fields `+0x14/+0x3b2/+0x3ba/+0x20` into the + staged runtime profile through `0x47be50`, which in turn normalizes the payload category bytes at + `[payload+0x31a + row*9]` and the local marker-slot bytes at `[payload+0x2c9..]` through + `0x47bc80`. The adjacent region-side worker family is tighter in a negative way too: the setup + payload loader is now clearly separate from the broader region-building and placement cluster + around `0x422320..0x423d30`, whose current grounded helpers now include `0x422320`, `0x4228b0`, + `0x422900`, `0x422a70`, `0x422be0`, `0x422ee0`, `0x4234e0`, `0x4235c0`, and + `world_region_refresh_cached_category_totals_and_weight_slots` `0x423d30` rather than one hidden + setup-only panel. The leading region helper is no longer unnamed either: `0x422320` is now + bounded as the recurring cached-structure-scalar normalization pass that writes + `[region+0x2e2/+0x2e6/+0x2ea/+0x2ee]`, while `0x422a70` is the shared placement-validation and + commit gate beneath both the per-region worker and one second world-side placement loop. The + neighboring `0x4234e0` accessor is tighter too: it is the shared projected structure-count scalar + query by category that later feeds both the per-region placement family and the map-editor city + count stats report. So the remaining gap is no longer “what are these setup payload helpers + doing,” but only how aggressive we want to be when naming the last top-level setup roots from + mostly RT3.lng and asset-side evidence. + The adjacent summary helper is tighter too: `0x502550` is not another hidden submode owner. It + republishes the staged path tail in `0xe7f`, the scalar summary in `0xe84`, the two persisted + selector lists in `0xe86/0xe87`, and the config toggles in `0xe88/0xe89/0xe8a`. + The remaining top-level gap is cleaner now too: submode `16` still has no distinct downstream + helper or launch branch in the local selector/refresh family, but it is no longer a blank bucket. + Current evidence now bounds it as the `0x0bc3 -> 16` top-level button whose visual-state lane is + surfaced through control `0xbc6`, and the strongest residual fit is `High Scores` because + `Credits` already lives in separate shell mode `6`. + The validated launch lane is tighter now too: it no longer just writes selector `3` or `5` as + one undifferentiated blob, and it no longer includes `0x0ce5` or `0x0dcb`. `0x0ce5` is the + `Load Map` selector because it writes selector `3` and then selects submode `9`, while `0x0dcb` + is the later conditional `5/3` companion-selector sibling rather than a file launch. The actual + validated staged-profile lane is now bounded more narrowly: `0x0cf6` and `0x0e81` are the + selector-`5` siblings, while the neighboring selector-`3` validated lane is at least shared by + `0x0de9` and `0x0df3`; the shared bridge at `0x4425d0` then forces `[0x006cec7c+0xc5] = 1`, + mirrors payload bytes into `[profile+0xc4]`, `[profile+0x7d]`, and `[profile+0xc6..+0xd5]`, and + only then issues shell request `0x0cc`. Only `0x0e81` also sets `[0x006cec7c+0x82] = 1`, which + is currently the strongest sandbox-side anchor beneath the later `.gmx` load family. + That launch band is slightly tighter now too: `0x0dca` is the grayscale-map picker branch above + the `TGA Files (*.tga)` / `.\Data\GrayscaleMaps` helper at `0x004eb0b0`, not another ordinary + save-file validator. That launch band is tighter in a second way too: `0x0ddf` is not a lobby + branch after all, but the separate windowed-mode-gated grayscale-heightmap generation path. It + reopens the `TGA Files (*.tga)` / `.\Data\GrayscaleMaps` picker through `0x0042a970`, validates + the chosen image through `0x005411c0`, and only then writes startup selector `2`. The fixed- + button side is tighter too: submode `15` now aligns with the `Extras` family because it sits + above the Readme/Weblinks shell-open quartet and the return-to-extras sibling, while submode + `17` now aligns with the tutorial chooser because it is the only branch that later exposes + startup selectors `1` and `7`, which RT3 uses for `Tutorial_2.gmp` and `Tutorial_1.gmp`. The + map-root family is tighter too: submodes `7/8/9` are the only setup branch that flips the file + root into + `maps\\*.gm*`, with mode `8` specifically the grayscale-heightmap picker and mode `9` the + file-backed map-list sibling. + Submode `13` is slightly tighter now too: current local evidence shows that it stays outside + both the dedicated file-backed pane and the mode-`3` option-heavy pane, so it is best read for + now as one top-level non-file-backed setup branch rather than another saved-game list variant. + The setup-side file roots are tighter now too: the shared file-list builder at `0x4333f0` + formats either `saved games\\*.smp` or `maps\\*.gm*` from the shell-state fields at + `[0x006cec74+0x68/+0x6c]`, with the separate `data\\tutorial` root only appearing on the + tutorial-side `[shell+0x6c] == 2` branch. That means the `Setup.win` submode families are no + longer one generic file pane: the ordinary setup-backed `.smp` family is broader than the + narrower file-list pane, because modes `3/4/5/6/10/12/14` stay on the ordinary saved-game side + while only `4/6/9/10/12/14` re-enter the dedicated file-list panel at `0x5027b0`; the `maps` + branch is the narrower setup or tutorial launch family above the same shared record builder. - Evidence: function-map map/scenario rows, analysis-context exports for `0x00445ac0`, `0x00445de0`, `0x00443a50`, `0x00434300`, and `0x00444dd0`, plus objdump string and mode-table evidence for `.gmp`, `.gmx`, `.gmc`, `.gms`, `.gmt`, `.smp`, `Quicksave`, the `0x004dd010` mode table at @@ -276,6 +460,10 @@ transition. callback `0x595bc0`, while `multiplayer_transport_route_callback_table_service_receive_decode_state_machine` `0x5908c0` is the current live receive/decode state machine serviced by `0x591290` in table states `2/3`. + The callback-owner mode split above that runtime is now explicit too: append-notify `0x590370` + publishes mode `0`, compact upsert `0x590d00` publishes mode `1`, remove-notify `0x590430` + publishes mode `2`, and the live receive/decode path `0x5908c0` publishes modes `6`, `5`, and + `3`. The route-handle lifecycle above that decode path is tighter now too: `0x590740` cleanly resets one table's live route plus decode-side runtime without destroying the outer object; `0x5907a0` is the broader destroy path that also releases the active descriptor collection; `0x590ed0` @@ -303,8 +491,18 @@ transition. in `0x595bc0` reads the same `+0x0c/+0x10/+0x18` metadata triplet and replay modes later consume the pointer through `0x5933a0`. The negative result is stronger too: local text-side xrefs still show no direct store to `[transport+0x1778]`, and a wider local sweep also failed to show any - obvious `lea`-based replay-band writer, so the sidecar writer remains upstream of this leaf - publisher. Mode `0` is now also tied more cleanly to the generic descriptor append-notify lane + obvious `lea`-based replay-band writer. The transient-request lifecycle tightens that further: + `0x593330/0x593370/0x593380/0x5934e0/0x5933a0` now fully bound `[transport+0x1780]`, `0x1784`, + and `0x1788` without ever touching `[transport+0x1778]`, and the neighboring active-opcode reset + helper `0x5929a0` is likewise scoped only to `[transport+0x17fc]`. A broader constructor and + teardown pass tightened that further too: `0x596090`, `0x5961b0`, and `0x5962e0` all touch the + neighboring replay-band fields without ever seeding `[transport+0x1778]`. A full-binary + literal-offset sweep tightens it further still: the only direct `0x1778` hit in `RT3.exe` is + the read in `0x595bc0`. One nearby ambiguity is now closed too: the + mode-`5` mirror path in `0x595a40` and `0x595e10` does not target `[transport+0x1778]`; it + writes `[transport+0x54]` and mirrors the same staged route companion dword only into queue-side + slot `[transport+0x1724+0x24]` through `0x005a0940`. So the sidecar writer remains upstream of this + leaf publisher. Mode `0` is now also tied more cleanly to the generic descriptor append-notify lane at `0x590370`, while mode `2` stays outside this helper as the separate remove-notify-and-stage path at `0x590430`. The opcode-`2` payload boundary is tighter too: `0x592ae0` now grounds that payload @@ -314,6 +512,10 @@ transition. receive-state owner callbacks emitted by `0x5911e0 -> 0x5908c0`, not loose generic replay guesses. So those paths are better read as delayed metadata replays over one cached work record, not over a separate anonymous cache blob. The neighboring + capacity-owner split is tighter now too: `0x595bc0` only stages descriptor records for modes + `0`, `3`, and `5`; the upstream route-callback-table owner still delivers modes `1`, `2`, and + `6`, but those are explicit no-ops in this capacity leaf. So the owner wiring itself is no + longer the open edge; only the upstream sidecar producer remains unresolved. The neighboring work queue is tighter too: `0x593330/0x593370/0x593380` now bound `[transport+0x1780]` as the construct/clear/destroy owner family, while `0x5933a0`, `0x5934e0`, and `0x593570` ground the remove, allocate, and completion side over that same collection. The small sibling `0x593400` is @@ -335,11 +537,13 @@ transition. remove-notify-and-stage lane, `0x590490` releases the staged list, and `0x5904d0` releases the active descriptor collection before tearing that staged list down. That also makes the earlier `0x5962e0` “release active descriptors” step explicit. The callback-table attach side now constrains the - same work-record metadata family a little further too: `0x593650` deliberately duplicates one - caller metadata dword into both fields `+0x0c` and `+0x18`, while preserving the remaining - caller callback function pointer in `+0x10`. The lower opcode wrappers are tighter now too: - `0x592a40` and `0x592a70` both consume that staged triplet in the order `( callback fn +0x10, - callback companion +0x18, drain context id +0x0c )`. The producer side is tighter too: + same work-record metadata family a little further too: `0x593650` deliberately duplicates its + first caller metadata dword into both fields `+0x0c` and `+0x10`, while carrying the second + caller metadata dword in `+0x18`. The lower opcode wrappers are tighter now too: `0x592a40` + turned out to be the explicit opcode-`1` trigger wrapper whose constructor is a no-op and whose + active-side service is `0x5913c0`, while `0x592c40` is the real `0x08`-byte explicit opcode-`5` + binding leaf. The earlier opcode-`4` read was just the table-indexing mistake in `0x5928a0`: + selector `4` lands on the row at `0x5e2044`, not the row at `0x5e2034`. The producer side is tighter too: bound-route requests, selector-text route requests, and the type-`9` text fastpath also stage that same triplet through `0x5934e0`, and the fastpath shim `0x593d00` now gives the cleanest proof of the callback split by only re-emitting the follow-on lane when `+0x10` is nonnull and @@ -351,19 +555,29 @@ transition. `1` just before the first immediate mode-`3` snapshot. The nearby route-callback-table lifecycle is tighter now too: `0x596090` seeds `[transport+0xba0]` as the callback-plumbing enable latch, clears staged payload slot `[transport+0xb50]`, and constructs the three owner - branches rooted at `[transport+0xba4]`, `[transport+0x1164]`, and `[transport+0x18bc]`. The + branches rooted at `[transport+0xba4]`, `[transport+0x1164]`, and `[transport+0x18bc]`; + `0x596210` is the recurring service sweep over those same three tables plus the local field + cache and queued-descriptor family; `0x596060` is the explicit `gsi_am_rating` reset; and + `0x596530` is the reopen-from-stored-label sibling above that same am-rating table. The matching local cleanup is tighter too: `0x5962c0` is the explicit staged route-callback payload clear on `[transport+0xb50]`, while `0x595ce0` now clearly resets only the capacity-descriptor route callback table at `[transport+0x1164]`, not the field-subscription table at - `[transport+0xba4]`. The remaining gap on the capacity side is - therefore narrower: mainly the still-unrecovered writer that stages `[transport+0x1778]`. The - carried sidecar fields themselves now read more cleanly as the cached callback-wrapper triplet - reused elsewhere (`drain context id +0x0c`, `callback fn +0x10`, `callback companion +0x18`), - and the negative result is stronger too: nearby replay-band fields `[transport+0x176c]`, + `[transport+0xba4]`. The remaining gap on the capacity side is therefore narrower: the carried + sidecar fields themselves now read more cleanly as the cached callback-wrapper triplet reused + elsewhere (`drain context id +0x0c`, `callback fn +0x10`, `callback companion +0x18`), and the + negative result is stronger too: nearby replay-band fields `[transport+0x176c]`, `[transport+0x1770]`, `[transport+0x1774]`, `[transport+0x177c]`, `[transport+0x1780]`, and `[transport+0x1784]` all have direct local owners while `[transport+0x1778]` still appears only - as the single read in `0x595bc0`. So the remaining writer looks upstream and indirect rather - than like one missing ordinary field store in the local cluster. The adjacent staged-route + as the single read in `0x595bc0`; even the broader callback-owner lifecycle now skips it while + seeding, servicing, resetting, reopening, or tearing down those neighboring tables and caches. + The constructor now closes that local search further: `0x58dc50` bulk-zeroes the full transport + body and still never writes a nonzero value into `[transport+0x1778]` before later explicit + neighbor initialization. The callback-binding owner stack now tightens that boundary too: + `0x5934e0` stages the shared work-record metadata triplet, `0x593650` binds it into the + callback-table worker path, and `0x593570` later consumes and republishes it, while + `[transport+0x1778]` still appears only as the borrowed sidecar read in `0x595bc0`. So this + edge is now locally closed, and the remaining producer looks like an upstream callback or worker + handoff rather than one missing ordinary field store in the local cluster. The adjacent staged-route callback side is tighter too: `0x595860` is now bounded as the submit-result handler beneath `0x5958e0`, and the old `[transport+0xac0]` ambiguity there is now gone. That branch is using the already-grounded third selector-generation counter at `[0xac0]` @@ -424,7 +638,7 @@ transition. callback-marshaling wrappers `0x591480` and `0x591510`, not read through any dedicated semantic accessor yet. The route-event dispatcher side is tighter too: the mode-`5` tails in both callback families do not copy a descriptor-local field but instead mirror the transport-staged - companion dword at `[this+0x490]` into `[this+0x54]` and the local field-cache family. The + companion dword at `[this+0x490]` into `[this+0x54]` and queue-side slot `[this+0x1724+0x24]`. The `gsi_am_rating` maintenance lane is tighter now too: after pruning failed descriptors it sorts the surviving primary-endpoint table through `0x590310` in mode `1` with key `gsi_am_rating`, then selects the new head through `0x590480` before re-entering the route-transition path. The @@ -492,7 +706,7 @@ transition. queued `gsi_am_rating` split, mode `1` for the ready-bit plus queued fallback, mode `2` for pending-descriptor cleanup, mode `3` for the empty-table fallback, mode `4` for deferred route-status recovery, and mode `5` for copying the staged route companion dword into `[this+0x54]` - and the local field cache. The current grounded mode transitions still switch by releasing route + and queue-side slot `[this+0x1724+0x24]`. The current grounded mode transitions still switch by releasing route objects through `multiplayer_gamespy_route_release_and_free` and rebuilding them through `multiplayer_transport_try_connect_live_route`, not by mutating callback slots in place. The parser behavior is now tighter as well: semicolon lines only dispatch when @@ -553,13 +767,43 @@ transition. stepper `simulation_advance_to_target_calendar_point`, but current grounded callers put that helper inside the larger post-load generation pipeline `world_run_post_load_generation_pipeline` at `0x004384d0` under the `Seeding Economy...` phase rather than under the ordinary player-facing - speed buttons. That setup pipeline is now clearer at the progress-banner level too: localized id - `318` `Computing Transportation and Pricing...` stays visible while the pipeline runs + speed buttons. That setup pipeline is now clearer at the progress-banner level too: on the fuller + setup path it first runs one preliminary named-candidate availability prepass through `0x00437743` + before any visible progress banner is posted. After that, localized id `318` + `Computing Transportation and Pricing...` stays visible while the pipeline runs `world_compute_transport_and_pricing_grid` `0x0044fb70`, the early collection-owned staging pass `world_setup_building_collection_phase` `0x0041ea50`, and the conditional region pair `world_region_collection_seed_default_regions` `0x00421b60` plus - `world_region_border_overlay_rebuild` `0x004882e0`; only then does the code post id `319` `Setting - up Players and Companies...`. That `319` lane is no longer just a shell-state placeholder: its + `world_region_border_overlay_rebuild` `0x004882e0`; that border pass is now tighter too: the + outer owner refreshes the companion region set `0x006cfc9c` through the reset-and-assign wrapper + `0x00487650` above the heavier record initializer `0x00487540`, then re-enters `0x004881b0` to + refresh the raw per-region cell-count band from the live world raster, and the inner emitter + `0x00487de0` clears prior chunked segment queues through `0x00533cf0`, scans the live region + raster, and appends fresh border-segment records through `0x00536ea0`. The lower presentation + helper strip under the same owner is now explicit too: `0x00533970/0x00533980` query the cached + world-grid X/Y maxima, `0x00533ae0/0x00533af0/0x00533b00` expose the secondary-raster and + companion byte-raster roots, and `0x00533b20/0x00533b30/0x00533b70/0x00533b90` expose the + normalized coordinate, strip-offset, and sample-triplet tables used by shell-side overlay + staging. If shell-state gate + `[0x006cec74+0x174]` is set it then posts id `320` `Setting Up Buildings...` for + `world_region_collection_run_building_population_pass` `0x00421c20`; if `[0x006cec74+0x178] > 0` + it then posts id `321` `Seeding Economy...` for `simulation_run_chunked_fast_forward_burst` + `0x00437b20`; only after those setup-side gates does the code post id `319` + `Setting up Players and Companies...`. That `319` lane is no longer just a shell-state placeholder: its + earlier hidden prepass is tighter now too: `0x00437743` is the scenario-side named + candidate-availability seeding pass over the live candidate pool `0x0062b268`, feeding the + override collection at `[state+0x66b2]` through `0x00434f20` before any visible banner is posted. + That candidate-side table now has a grounded fixed record layout too: each entry is a `0x22`-byte + blob with a zero-terminated candidate-name slot at `[entry+0x00..+0x1d]` and one trailing + availability dword at `[entry+0x1e]`, read through `0x00434ea0` and mirrored later into + `[candidate+0x7ac]`. The same scenario state keeps a locomotive-side sibling collection at + `[state+0x66b6]`, read through `0x00435030` and updated through `0x004350b0`, which is now the + shared named locomotive-availability lane beneath the `Locomotives` editor page and the + startup-side locomotive seeding branches. That locomotive-side table is the same pattern at a + larger width: each entry is a `0x41`-byte blob with a zero-terminated locomotive-name slot at + `[entry+0x00..+0x3c]` and one trailing availability dword at `[entry+0x3d]`, later mirrored into + `[loco+0x7b]`. Both override dwords now read most safely as simple availability bits rather than + wider mode enums. That `319` lane is no longer just a shell-state placeholder: its primary grounded work is still the chairman-profile pair `world_seed_default_chairman_profile_slots` `0x004377a0` plus `world_build_chairman_profile_slot_records` `0x00437220`, which seed the 16 selector bytes at @@ -582,8 +826,12 @@ transition. surface beside that chairman panel is clearer now too. `map_editor_scenario_metadata_panel_refresh_controls` `0x004ca790` republishes the scenario description from `[0x006cec78+0x672e]`, the start-year trio `[+0x66ca]`, `[+0x66d2]`, and - `[+0x66ce]`, and the paired boolean toggles `[+0x66de]` plus inverse `[+0x66f3]` across control - band `0x5b69..0x5b74`, while `map_editor_scenario_metadata_panel_refresh_briefing_mode` + `[+0x66ce]`, the direct campaign-designated bit `[+0x66de]` through control `0x5b6e`, and the + inverse of the paired metadata byte `[+0x66f3]` through control `0x5b74`. The resource-side + anchor is now explicit too: `editorDetail.win` carries localized ids `3160/3161` `Campaign + Scenario` and `If checked, this map will be reserved as a campaign scenario.` inside the control + record rooted at `0x5b6e`, so `[+0x66de]` is now the grounded campaign-scenario flag rather than + an anonymous metadata boolean. `map_editor_scenario_metadata_panel_refresh_briefing_mode` `0x004ca670` now bounds the single-player versus multiplayer briefing switch by flipping selector `0x621f50`, publishing localized headings `1491` and `3586`, and refreshing the two briefing texts from `[state+0x4f30]` and `[+0x5ae9]`. The companion dispatcher @@ -695,10 +943,24 @@ transition. longer just an abstract issue table lookup because its merger callsite uses issue id `0x3a`, which lines up directly with localized id `726` saying merger votes depend on public attitude toward the management of the two companies. By contrast the broader support-adjusted share-price helper - `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0` uses the broader issue - id `0x37`, which currently looks like a more general company-management or public-sentiment slot - rather than the merger-only attitude term. The supporting stat layer is bounded more cleanly now - too: the + `company_compute_public_support_adjusted_share_price_scalar` `0x00424fd0` uses issue id `0x37`, + while the finance-side debt helpers now bound `0x38` and `0x39` separately as the explicit + credit-rating and prime-rate lanes. That leaves `0x37` as the broader investor-confidence lane + behind equity support, share price, and adjacent governance pressure, with the strongest current + text anchors coming from the investor-attitude strings `1217` and `3048/3049` about company or + chairman performance rather than from the merger-only management-attitude term. One older local lead is now ruled out too: the + `0x460a90` / `0x473620` setup block is the camera-view hotkey family over localized ids + `3482..3489` (`Select/Assign Camera View 5..8`), not issue-opinion infrastructure, so it should + no longer be used as evidence for the player-facing meaning of issue `0x37`. The editor-side + `Stock Prices` label is also no longer being used as direct evidence here: the `0x4ca980` / + `0x4cadf0` panel owns a separate float-tuning block `[state+0x0bde..0x0bf6]`, with + `[state+0x0bde]` merely mirroring `[state+0x0be2]`, so that label belongs to a different + settings family than the issue table behind `0x37`. A direct shell-resource follow-up now narrows + the remaining caption question too: the extracted `CompanyDetail.win` blob from `rt3_2WIN.PK4` + contains no plain-English investor or finance caption for this lane, which matches the owner-side + read that section-0 is a dynamic `0x947f` text widget fed by + `shell_format_company_governance_and_economy_status_panel` `0x004e5cf0` rather than a separate + fixed label row. The supporting stat layer is bounded more cleanly now too: the surrounding `0x0b` setup in the merger and takeover offer builders is formatter mode rather than a player-facing issue number, while the company-side stat wrapper `company_read_year_or_control_transfer_metric_value` `0x0042a5d0` now reads as a generic @@ -722,14 +984,43 @@ transition. `world_region_collection_run_building_population_pass` `0x00421c20` plus the deeper per-region worker `world_region_balance_structure_demand_and_place_candidates` `0x004235c0`, while `[0x006cec74+0x178]` directly fronts id `321` `Seeding Economy...` and the chunked burst helper - `simulation_run_chunked_fast_forward_burst`; id `322` then fronts `Calculating Heights...`. The + `simulation_run_chunked_fast_forward_burst`, whose grounded tail now also sweeps the live region + collection through `world_region_refresh_cached_category_totals_and_weight_slots` `0x00423d30`; + id `322` then fronts `Calculating Heights...`. The master `+0x68` flag is no longer just structural: the shell load/save coordinators now use the same flag to force the editor-map `.gmp` family, so current evidence treats it as the broader editor-map mode above those later setup branches rather than an unnamed generic toggle. That worker is no longer one opaque building bucket: current grounded categories split into `House`, a weighted region-profile family surfaced through the `Industry Weightings` stats path, and a third branch whose low-level fallback token is `Commercial` but whose aligned stats label is `City - Support`. The same lower helper also reappears later on a slower simulation-side cadence with + Support`. The same placement-commit gate beneath it, `world_region_validate_and_commit_candidate_placement` + `0x00422a70`, is also corroborated by the separate world-side randomized batch helper + `world_try_place_random_structure_batch_from_compact_record` `0x00430270`, which retries + placements around one compact center/radius record rather than the ordinary per-region demand + deficits. That batch placer now sits under a wider compact runtime-effect dispatcher, + `world_apply_compact_runtime_effect_record_to_resolved_targets` `0x00431b20`, so the world-side + branch is no longer just “another caller near `0x43051e`” but one real effect family alongside + the ordinary region-demand worker. Above that, the live scenario event collection at `0x0062be18` + now has a tighter runtime-effect lane too: `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` + `0x004323a0` services one live runtime-effect record, dispatches its linked compact effects + through `0x00431b20`, and can synthesize follow-on records through + `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` + `0x00430b50`, which in turn allocates new live records through + `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` `0x00432ea0`. + Above that, `scenario_event_collection_service_runtime_effect_records_for_trigger_kind` + `0x00432f40` now bounds the collection-wide loop that services those live runtime-effect records + for one trigger kind. That trigger split is tighter now too: recurring simulation maintenance + drives kinds `1`, `0`, `3`, and `2`; the neighboring route-style follow-on drives `5` and `4`; + startup-company and named-railroad creation branches drive `7`; kind `6` is now bounded as a + mixed post-change family spanning the placed-structure post-create tail, one build-version-gated + company-startup or roster-refresh tail, and the route-entry post-change sweep on `0x006cfca8`; + one world-entry-side one-shot gate drives `8` and then clears shell-profile latch + `[0x006cec7c+0x97]`; the briefing-text query lane is kind `9`; and the collection dirty latch + still forces the internal rerun at kind `0x0a`. + That moves this branch out of the “isolated world-side placement oddity” bucket and into a real + scenario-runtime effect pipeline with a mostly bounded trigger-kind family. + The same lower helper also reappears later on a slower + simulation-side cadence with scale `1/12`, so it no longer looks like one-time setup glue only. The actual game-speed control family remains separate, rooted at `world_set_game_speed_mode` `0x00434680`, `world_adjust_game_speed_mode_delta` `0x00434850`, and `world_toggle_pause_or_restore_game_speed` @@ -1355,7 +1646,10 @@ transition. current anchor site, then either appends that entry through `0x004b3160` and refreshes the new trailing selection through `0x004b2f00`, or rotates one existing slot in place when the local two-entry cap has already been reached. So this edge now reaches an actual train-side autoroute - append lane rather than stopping at anonymous company-side cache cells. + append lane rather than stopping at anonymous company-side cache cells. The weighted cache lanes + still do not escape that route-choice family directly: this train-side append path only inherits + the weighted site and peer choice by calling `0x00408380`, not by reading cache `+0x0e/+0x16` + itself. The train-side follow-on above that seed path is bounded now too. The owning company can count its live roster through `company_count_owned_trains` `0x004264c0`, measure one aggregate linked transit site pressure through `company_compute_owned_linked_transit_site_score_total` @@ -1367,7 +1661,9 @@ transition. branch when exactly two eligible linked transit sites survive. Because it consumes `+0x12` rather than `+0x0e` or `+0x16`, current evidence now says the tracker compatibility split is more important for seeded route choice and ranked site choice than for the - final company train-count target itself. + final company train-count target itself. The local linked-transit chain is now bounded enough to + say that directly: weighted cache lanes feed `0x00408280 -> 0x00408380 -> 0x00409770/0x00409830`, + while the separate pressure or roster lane feeds `0x00408f70 -> 0x00409950` from raw `+0x12`. The balancer then applies two age bands to company-owned trains: very old trains are removed when the roster already exceeds target or upgraded when it still needs capacity, while the mid-age band can trigger one narrower upgrade pass. @@ -1469,12 +1765,16 @@ transition. `[+0x4a8b]` and `[+0x4a87]` clear, at least two bond slots live, and at least one year since founding. It derives one issue batch from outstanding shares rounded down to `1000`-share lots with floor `2000`, trims that batch until the broader support-adjusted share-price scalar times - batch no longer exceeds the `55000` gate, requires that scalar at least `22`, resolves the - highest-coupon live bond slot, and then uses current cash from `0x2329/0x0d` as a gate against - that slot's principal plus a small fixed buffer before it compares the chosen bond-rate lane - against a normalized scalar ratio built from the same support-adjusted share-price lane and - current `Book Value Per Share` from `0x2329/0x1d` through the piecewise approval ladder - `0.07/1.3 -> 0.14/0.35`. On success it issues two + batch no longer exceeds the `55000` gate, recomputes the pressured support-adjusted share-price + scalar and the paired `price/book` ratio, then tests the remaining gates in a fixed order: + share-price floor `22`, proceeds floor `55000`, current cash from `0x2329/0x0d` against the + chosen highest-coupon bond principal plus `5000`, one later stock-issue cooldown gate that + converts the current issue mixed-radix calendar tuple at `[company+0x16b/+0x16f]` through + `calendar_point_pack_tuple_to_absolute_counter` `0x0051d3c0` and compares the result against the + active world absolute calendar counter `[world+0x15]`, and only then the coupon-versus-price-to-book + approval ladder `0.07/1.3 -> 0.14/0.35`. The issue mutator preserves the previous tuple in + `[company+0x173/+0x177]` and refreshes the current tuple from `[world+0x0d/+0x11]` on the + derived-pricing lane. On success it issues two same-sized tranches through repeated `company_issue_public_shares_and_raise_capital` calls and publishes a separate equity-offering news family rooted at localized id `4053`, not the earlier debt or buyback headline family. @@ -1615,24 +1915,149 @@ transition. too: category `0` falls back to `House`, category `2` is the year-gated weighted region-profile family that also feeds the localized `Industry Weightings` stats panel, and category `3` now reaches a separate pool-driven picker whose fallback label is `Commercial` but whose aligned - player-facing stats bucket is `City Support`. The remaining setup-side uncertainty has therefore - narrowed again: the region seed and border-overlay pair clearly complete before the `Setting up - Players and Companies...` banner is posted; `[0x006cec74+0x174]` now looks like the direct - building-population gate; `[0x006cec74+0x178]` now looks like the direct seeding-burst gate; and - `[0x006cec74+0x68]` now aligns with editor-map mode because the same flag forces the `.gmp` family - in the shell file coordinators while suppressing the later building and seeding branches and - diverting the deeper region worker into alternate logic. The `319` lane itself is no longer the + player-facing stats bucket is `City Support`. The normalized region band is tighter too: + `world_region_normalize_cached_structure_balance_scalars` `0x00422320` no longer just writes an + anonymous cached preview band at `[region+0x2e2/+0x2e6/+0x2ea/+0x2ee]`. Current growth-report + evidence now grounds `[region+0x2e2]` as the weighted-profit-margin scalar and `[region+0x2ee]` + as the annual-density-adjust scalar later formatted as a percent in `Stats - City/Region`, with + `[region+0x2e6/+0x2ea]` left as the intermediate normalized-delta and clamped companion slots + beneath that final adjust term. The remaining setup-side uncertainty has therefore narrowed + again: the region seed and border-overlay pair clearly complete before the `Setting up Players and + Companies...` banner is posted; `[0x006cec74+0x174]` now looks like the direct building-population + gate; `[0x006cec74+0x178]` now looks like the direct seeding-burst gate; and `[0x006cec74+0x68]` + now aligns with editor-map mode because the same flag forces the `.gmp` family in the shell file + coordinators while suppressing the later building and seeding branches and diverting the deeper + region worker into alternate logic. The `319` lane itself is no longer the open structural gap; it now clearly owns chairman-profile slot seeding, profile-record materialization, a shell editor surface over the same local record family, and a separate live-company presentation path through the company-list window. The later interior order of that same `319` lane is tighter now too: after the route-entry collection refresh on `0x006cfca8` it refreshes the auxiliary route-entry tracker collection `0x006cfcb4`, then runs `placed_structure_collection_refresh_local_runtime_records_and_position_scalars` `0x004133b0`, - then a flagged world-grid cleanup sweep through `0x00448af0/0x00533fe0`, and only after that the - later route-entry post-pass at `0x00491c20`. The same later lane now also reaches a separate - event-side runtime branch: the live event collection at `0x0062be18` re-enters - `scenario_event_collection_refresh_runtime_records_from_packed_state` `0x00433130`, which in - turn materializes each live event record through + then a flagged world-grid cleanup sweep through the compact grid-flag query + `0x00448af0` plus the neighboring local chunk-cell write helper `0x00533fe0`, and only after + that the later route-entry post-pass at `0x00491c20`. The same `319` lane is tighter internally + now too: + before that later world and shell reactivation tail, `world_entry_transition_and_runtime_bringup` + runs one distinct post-bundle status and runtime refresh phase that posts progress ids `0x196` + and `0x197` through `0x005193f0/0x00540120` with paired `0x004834e0` follow-ons, refreshes the + live event collection at `0x0062be18` through + `scenario_event_collection_refresh_runtime_records_from_packed_state` `0x00433130`, rebuilds the + scenario-side port-or-warehouse cargo recipe runtime tables through `0x00435630`, and then runs + the named-candidate availability preseed through `0x00437743`. One later subphase is tighter now + too: before the broad world-reactivation sweep it posts progress ids `0x32dc/0x3714/0x3715`, + reloads one `0x108`-byte packed profile block through `0x00531150`, conditionally copies staged + runtime-profile bytes back into `0x006cec7c` while latch `[profile+0x97]` is set, mirrors the + grounded campaign-scenario bit `[profile+0xc5]` and sandbox bit `[profile+0x82]` into world + bytes `[world+0x66de]` and `[world+0x66f2]`, restores the selected year/profile lane through + `[profile+0x77]` into `[world+0x05/+0x09/+0x15]` through + `world_set_selected_year_and_refresh_calendar_presentation_state` `0x00409e80`; that restore now + has the explicit companion `world_refresh_selected_year_bucket_scalar_band` `0x00433bd0`, which + rebuilds the dependent selected-year bucket floats after the packed year changes; and then + rehydrates the named locomotive availability collection at `[world+0x66b6]` through + `locomotive_collection_refresh_runtime_availability_overrides_and_usage_state` `0x00461e00`. + That locomotive-side restore is tighter now too: its tail explicitly re-enters + `scenario_state_refresh_cached_available_locomotive_rating` `0x00436af0`, which rebuilds one + cached available-locomotive rating at `[state+0x4cbe]` from the current year plus the strongest + surviving available locomotive-side rating scalar `[loco+0x20]`, and the tiny query sibling + `0x00434080` is now bounded as the shell-side clamped read helper over that same cached field, + with the grounded shell-side reader later bucketing that value against `40/50/70/85/100`. The + same rehydrate band also refreshes the live structure-candidate filter and year-visible counts + through `structure_candidate_collection_refresh_filter_and_year_visible_counts` `0x0041e970`, + rebuilding the paired per-slot bands at `[candidates+0x246]` and `[candidates+0x16e]` and the + aggregate counts at `[candidates+0x31a]` and `[candidates+0x242]`; the same late checkpoint also + re-enters `placed_structure_collection_seed_candidate_subtype2_runtime_latch` `0x00434d40`, + which seeds runtime dword `[candidate+0x7b0]` across subtype-`2` candidate records before the + later world-wide reactivation sweep. That checkpoint also now has an explicit shell-facing scalar + publisher: `world_publish_shell_controller_progress_scalar_from_year_thresholds_or_selector_overrides` + `0x004354a0` writes one clamped `0..255` value into the current shell presentation object, + sourcing it either from the shell selector override pairs or from the scenario-side year-threshold + band rooted at `[state+0x3a/+0x51/+0x55/+0x59/+0x5d/+0x61]`; and just ahead of the later + scenario-side recipe rebuild, the same band also re-enters + `scenario_state_ensure_derived_year_threshold_band` `0x00435603`, which only falls into its + heavier rebuild body while `[state+0x3a] < 2` and otherwise leaves the derived year-threshold + companion slots `[state+0x51/+0x55/+0x59/+0x5d/+0x61]` unchanged. The neighboring late status + checkpoints around progress ids `0x196` and `0x197` also share one explicit stage gate now: + `world_query_global_stage_counter_reached_late_reactivation_threshold` `0x00444dc5` compares the + global counter `0x00620e94` against threshold `0x9901`, and the two current callers use a + negative result to clear `[world+0x39]` before the broader world and shell reactivation sweep. + The later reactivation tail is tighter now too: it includes the region-center world-grid flag + reseed pass + `0x0044c4b0`, which clears bit `0x10` across the live grid and then marks one representative + center cell for each class-`0` region through `0x00455f60`; its immediate sibling `0x0044c450` + then reruns `placed_structure_rebuild_candidate_cargo_service_bitsets` `0x0042c690` across every + live grid cell, and the next helper `0x0044ce60` scans the secondary raster at `[world+0x2135]` + for cells with any bits in mask `0x3e`, caching min/max bounds plus a marked-cell count in + `[world+0x21c6..+0x21d6]`; the larger sibling `0x0044c670` then consumes those cached bounds to + normalize the same raster and rebuild one dependent overlay/cache surface before the later + route-style rebuild, shell-window, and briefing branches. That overlay side is tighter now too: + after `0x0044c670` resolves scaled surface dimensions through `0x00534c50`, it walks one local + `3 x 32` sample lattice through the static offset tables at `0x00624b28/0x00624b48`, keeps only + secondary-raster classes `4..0x0d`, folds several interpolated `0x0051db80` samples into one + strongest local score, writes packed overlay pixels into the staged surface buffer, and only then + publishes that staged overlay through `0x00534af0`. The lower helper layer under that overlay + pass is tighter now too: `0x00534e10` is the reusable secondary-raster class-set + predicate for classes `1/3/4/5`, `0x00534e50` is the smaller neighboring class-subset predicate + for `1/4`, `0x00534ec0` covers `2/4/5`, `0x00534f00` covers `3/5`, `0x00534e90` is the + marked-bit query over the same 3-byte cell family, and + `0x00533e70` and `0x00534160` are the coarser siblings over the overlay table at `[world+0x1685]`: + the first clears coarse chunk objects across one clamped rectangle, while the second ensures one + chunk object and seeds local marks through its deeper stamp helper. One level up, the neighboring + rect owner `0x005374d0` now reads as the shared secondary-overlay refresh pass: it reruns the + local sample and unsigned-word reducers `0x00536230/0x00536420`, rebuilds the signed vector byte + planes through `0x00536710`, and then rebuilds the multiscale support surfaces through + `0x00533890`, whose inner reducers now explicitly target the packed sample-triplet buffer plus + the float and unsigned-word support planes rooted at the five-entry per-scale families + `[world+0x15f1..+0x1601]`, `[world+0x1605..+0x1615]`, and `[world+0x1619..+0x1629]`. The setup + side of that same family is tighter now too: + `0x005375c0` is the shared ensure-and-seed owner that allocates the sample, sidecar, mask, + raster, vector, and coarse-cell tables together; crucially, it seeds `[world+0x1655]` with byte + `0x02` and `[world+0x1659]` with byte `0x01`, which closes the default-fill split. The local + evidence now also supports a stronger negative conclusion: unlike `[world+0x1655]`, that second + mask plane is not part of the actively rebuilt runtime overlay path, and in the grounded local + corpus it behaves only as a separately seeded, cleared, and persisted sibling plane. One level + lower, the + base-plane allocator `0x00532c80` now reads more cleanly too: it is the narrower owner that + clears `[world+0x15e1]`, optionally applies the current grid dimensions, allocates the base + float-summary plane `[world+0x1605]`, the four sidecar byte planes `[world+0x1631..+0x163d]`, + both one-byte mask planes `[world+0x1655/+0x1659]`, and the packed secondary raster + `[world+0x165d]`, then seeds those planes with the same `0x02/0x01/0x00` default split. One + level higher again, the broader world-presentation reinitializer `0x00537e60` now sits above + that base allocator and the larger support-family ensure path `0x005375c0`: it stores the live + grid dimensions, hard-resets the whole overlay runtime family through `0x00532590`, + reinitializes the secondary-overlay family for those dimensions, and then republishes the + neighboring overlay constants and support owners used by both the world-side reattach branch and + the `.smp` restore-side presentation rebuild path, including several owners that all funnel + through the shared static-template slot allocator `0x00532ad0` over the local `0x100` pointer + band at `[world+0x08]`. Those neighboring owners are tighter now too: `0x00535070` is the small + primary overlay-surface-or-template setup owner, while `0x005356e0` and `0x00535890` seed two + larger static-template slot bands rooted at `[world+0x1568/+0x156c/+0x1574/+0x1578]` and + `[world+0x1560/+0x1564]` respectively; the remaining heavier sibling `0x00535430` now reads as a + shared four-slot overlay-surface rebuild owner that resamples one source or fallback descriptor + into a short local slot strip above `[world+0x155c]`. The tail of that same reinitializer is + tighter now too: after the larger support-family setup it seeds one seven-entry default overlay + companion set through `0x005373b0`, whose inner allocator `0x00535950` populates the local + `0x1b`-entry slot table from the static template rows `0x005dd300..0x005dd378`. The lifecycle + side is tighter in the same way now: `0x00536044` is the shared teardown owner that frees those same + three five-entry support families together with both mask planes, the packed secondary raster, + the vector-byte planes, the local staging buffer, and the neighboring sidecar or coarse-cell + tables. The remaining base-float lane is tighter too: the larger rebuild owner + `0x00538360` now clearly writes one base float-summary field into `[world+0x1605]`, clears both + one-byte mask planes, and then only repopulates the primary mask plane `[world+0x1655]` for the + qualifying class-`1` interior cells before re-entering `0x00532d90` to normalize that base + float-summary plane globally and `0x00532f60` to expand positive cells through one caller radius. + That asymmetry is now enough to close the local semantic edge: `[world+0x1655]` is the actively + rebuilt primary overlay mask, while `[world+0x1659]` is only the separately seeded and persisted + secondary mask sibling with no comparably grounded distinct read-side consumer. The only grounded + getter call to its root accessor `0x00533b60` is the shell staging branch at `0x00525bad`, and + that branch immediately discards the returned pointer. The bundle side is now explicit too: + `.smp` save-load treats the two mask planes as separate payloads with chunk ids `0x2cee` for + `[world+0x1655]` and `0x2d51` for `[world+0x1659]`, while the neighboring `0x2d49/0x2d50` + branches are the separate packed secondary-raster import lanes rather than alternate consumers + of the second mask plane. So, in the mapped local code, `0x1659` is best treated as a persisted + compatibility or seed-state sibling, not as a second actively consumed runtime overlay mask. The event + side is tighter too: + that `0x00433130` pass in turn materializes each live event record through `scenario_event_refresh_runtime_record_from_packed_state` `0x0042db20`. Current shell-side xrefs now tighten that event branch too: the first rebuilt linked row family under `0x0042db20` aligns with the standalone condition list later queried by `EventConditions.win`, while the second @@ -1754,18 +2179,31 @@ transition. `company_compute_cached_recent_per_share_performance_subscore`, `company_compute_five_year_weighted_shareholder_return`, and `company_compute_public_support_adjusted_share_price_scalar` bound the recent per-share - performance and investor-support/share-price blend beneath those vote resolvers, + performance and investor-support/share-price blend beneath those vote resolvers; the recent + per-share feeder now has a grounded four-lane tail too, with current partial-year weight + `(5 * [world+0x0f]) - 5`, prior full-year weights `48/36/24/12` on `0x1f/0x1e`, dividend + non-decline pair weights `9/8/7/6` on `0x20`, lane weights `40/10/20/30`, the startup age ramp + `0/0/0/100 -> 25/25/35/100 -> 50/50/65/100 -> 75/75/85/100 -> 100/100/100/100`, a strongest-lane + `*1.25` boost, a weakest-lane `*0.8` reduction, and separate bounded-intermediate versus final + difficulty applications under `0x005f33b8`; the next consumer `0x00424fd0` is also tighter now, + with the young-company interpolation against `[company+0x57]`, caller pressure clamped to + `[-0.2, 0.2]`, one `(shares / 20000)^0.33` share-count growth term, and the later threshold + ladder `0.6 / 0.45 / 0.3 / 1.7 / 2.5 / 4.0 / 6.0` before the issue-`0x37` multiplier, `scenario_state_compute_issue_opinion_multiplier` now bounds the next layer of optional company, chairman, and territory-specific opinion overrides on the active scenario state, and the broader stat-reader family around `company_read_control_transfer_metric_slot` and `company_read_year_or_control_transfer_metric_value` is no longer just a merger-premium helper. Current grounded callers show the same metric family feeding the annual shareholder-revolt and - creditor-liquidation lane surfaced by localized ids `300..304`, so the remaining gap is now mostly - semantic: the exact player-facing names of the support-and-governance metric slots behind issue - ids `0x37` and `0x3a`, plus any later chairmanship-control side effects beyond the already - grounded success or failure commit points. The packed simulation calendar tuple semantics also - remain open. The `TrackLay.win` family now clearly owns `Lay single track.` `Lay double track.` + creditor-liquidation lane surfaced by localized ids `300..304`, while the debt-side shell and + bond lane now separately close `0x38` as `Credit Rating` and `0x39` as `Prime Rate`. That means + the remaining gap is now mostly gone on the UI side too: issue `0x37` is already bounded to the + same investor-confidence family as the equity-support and governance-pressure paths, and current + grounded UI evidence still stops at the investor-attitude sentence family rather than one + standalone caption. The calendar side is tighter now too: + `[world+0x15]` is the absolute counter for the same mixed-radix `12 x 28 x 3 x 60` + year-plus-subfield tuple packed by `0x0051d3c0` and unpacked by `0x0051d460`, not just a vague + “calendar-like” blob. The `TrackLay.win` family now clearly owns `Lay single track.` `Lay double track.` and `Bulldoze` as its three primary modes, its bridge selector, its wrapped frequency preferences, and a strongly aligned pair of `Auto-Hide Trees During Track Lay` and `Auto-Show Grade During Track Lay` toggles; the `StationPlace.win` family now clearly owns its six top-level category @@ -2055,10 +2493,16 @@ transition. `0x0042cb30` is the final recent-service clamp over the primary per-candidate word table. Above that refresh lane, `placed_structure_query_candidate_local_service_metrics` `0x0047e240` is the first higher-level query, `placed_structure_count_candidates_with_local_service_metrics` - `0x0047e330` counts how many candidates currently produce that query, and + `0x0047e330` counts how many candidates currently produce that query, + `placed_structure_get_nth_candidate_id_with_local_service_metrics` `0x0047e620` is the ordinal + selector over that same visible candidate family, `placed_structure_query_cached_express_service_class_score` `0x0047e390` caches one parallel class - score for the express family now strongly aligned with `Passengers`, `Mail`, and `Troops`. Those - site-side scores now have grounded shell read-side consumers too: + score for the express family now strongly aligned with `Passengers`, `Mail`, and `Troops`, + `placed_structure_refresh_candidate_local_service_comparison_cache_against_peer_site` + `0x0047eb90` rebuilds one peer-site comparison cache over the same local-service inputs, and + `placed_structure_select_best_candidate_id_by_local_service_score` `0x0047f910` is the best-hit + selector above the direct and directional local-service query pair. Those site-side scores now + have grounded shell read-side consumers too: `shell_station_detail_format_freight_and_express_summary` `0x00506be0` formats the visible `Freight: %1` and `Express: %1` lines in `StationDetail.win`, and the same station-detail family now has a deeper candidate-service lane: diff --git a/docs/debug-load-workflow.md b/docs/debug-load-workflow.md new file mode 100644 index 0000000..2c34099 --- /dev/null +++ b/docs/debug-load-workflow.md @@ -0,0 +1,353 @@ +# Debug Load Workflow + +Use this when comparing: + +- one successful manual load of `hh` +- one failing hook-driven auto-load attempt + +The goal is to compare the real successful owner path above `0x00445ac0` against the failing hook-driven path. + +## Current Findings + +From the current logs: + +- successful manual load now has a grounded pre-call site at `0x004390cb` with: + - `ECX = 0x02af5840` + - `[0x006cec78] = 0x02af5840` + - `[0x006cec74] = 0x01d81230` + - top-of-stack dwords: + - `arg1 = 0x01db4739` + - `arg2 = 4` + - `arg3 = 0x0022fb50` + - next dword = `0x026d7b88` +- the subsequent successful `0x00445ac0` entry still has: + - `ret = 0x004390d0` + - `arg1 = 0x01db4739` + - `arg2 = 4` + - `arg3 = 0x0022fb50` +- older failing auto-load attempts never reached `0x00445ac0` +- the earlier failing breakpoint was `0x00517cf0` with: + - `[0x006cec78] = 0` + - `[0x006cec74] = 0x01d81230` +- the staged request globals at `0x006ce9b8..0x006ce9c4` and `0x006d1270..0x006d127c` are zero on the successful manual path + +That older `0x00517cf0` result is no longer the current blocker. The hook now reaches the real coordinator entry, so the remaining gap is later shell timing or re-entrancy, not request-latch shape. + +The disassembly at `0x004390b0..0x004390cb` is now the strongest grounded manual-load branch: + +- it writes `[0x006cec74+0x6c] = 1` +- it computes `arg1` from `([0x006cec7c] + 0x11)` +- it pushes `arg2 = 4` +- it passes `arg3 = &out_success` +- and then calls `0x00445ac0` + +So any hook experiment that does not reproduce that exact shape is no longer a plausible match for the successful manual path. + +## Latest Auto-Load Comparison + +The newest hook-driven debugger run now reaches `0x00445ac0` directly. + +At the auto-load `0x00445ac0` breakpoint: + +- stack: + - `ret = 0x7650505c` inside `dinput8` + - `arg1 = 0x01db4739` + - `arg2 = 4` + - `arg3 = 0x0022fcf8` +- globals: + - `[0x006cec74] = 0x01d81230` + - `[0x006cec7c] = 0x01db4728` + - `[0x006cec78] = 0x026d7b88` + +Compared to the successful manual path: + +- `arg1` matches exactly: `0x01db4739` +- `arg2` matches exactly: `4` +- `[0x006cec74]` matches exactly: `0x01d81230` +- `[0x006cec7c]` still matches the same runtime-profile base used to derive `arg1` +- `[0x006cec78]` is now non-null and published before entry + +So the hook is no longer missing the coordinator entry shape. The remaining question is no longer "can we reach `0x00445ac0`?" but "does the live non-debugger call return successfully and trigger the actual restore transition?" + +## Latest Live Crash + +The latest non-debugger auto-load run now reaches: + +- `rrt-hook: auto load ready gate passed` +- `rrt-hook: auto load restore calling` + +and then crashes at: + +- `0x0053fea6` + +The local disassembly around `0x0053fe90` shows a shell-side list traversal over `[this+0x74]` that walks linked entries and calls a virtual method on each. The crash instruction at `0x0053fea6` dereferences one traversed entry: + +- `mov eax, DWORD PTR [esi]` + +That strongly suggests the current hook is invoking the restore from the right call shape but on the wrong shell-pump turn. The active hypothesis is now timing or re-entrancy: + +- the hook detects readiness and fires restore on the same shell-pump turn +- RT3 later re-enters shell object traversal in a phase where one list entry is still invalid + +So the next experiment is to defer the actual restore by additional ready shell-pump turns instead of firing on the first ready turn. + +## Manual Owner Tail + +The branch at `0x004390b0..0x004390ea` now has a grounded post-call tail too: + +- `0x004390cb` calls `0x00445ac0` +- `0x004390d0` immediately calls `0x004834e0(0, 1)` on `0x006cec74` +- if `out_success != 0` or `esi != 0`, `0x004390ea` calls `0x004384d0` +- then `0x004390ef` calls `0x0053f310` on `0x00ccbb20` +- then `0x00439104` calls `0x004834e0(0, 1)` again + +The successful manual breakpoint at `0x004390cb` shows `ESI = 0` and `EDI = 1`, so the manual load branch only forces the `0x004384d0` post-load pipeline when `out_success` comes back nonzero. + +That makes the current hook gap narrower still: even with the correct `0x00445ac0` arguments, returning directly into `dinput8` skips RT3's own owner-tail work unless we mirror it ourselves. + +## Owner Xrefs Above `0x438890` + +The containing owner at `0x00438890` is now grounded as a larger `thiscall` shell owner with two stack arguments. Current xrefs found in local disassembly are: + +- `0x00443b57` +- `0x00446d7f` +- `0x0046b8bc` +- `0x004830ca` + +The strongest caller so far is `0x004830ca`: + +- it publishes `0x006cec78 = eax` +- then calls `0x00438890` as `thiscall(active_mode, 1, 0)` +- it sits inside `shell_transition_mode` +- it is the branch that constructs `LoadScreen.win` through `0x004ea620` +- and it continues through shell-window follow-up on `0x006d401c` after the `0x00438890` call + +The surrounding mode map is tighter now too: + +- mode `1` = `Game.win` +- mode `2` = `Setup.win` +- mode `3` = `Video.win` +- mode `4` = `LoadScreen.win` +- mode `5` = `Multiplayer.win` +- mode `6` = `Credits.win` +- mode `7` = `Campaign.win` + +That makes `0x00438890(active_mode, 1, 0)` the strongest current RT3-native entry candidate for reproducing the successful manual load branch, because it owns the internal dispatch that later reaches `0x004390cb`. + +Current static xrefs also tighten the broader ownership split: + +- `0x00443b57` calls `0x00438890` from the world-entry side, but with `(0, 0)` after dismissing the current shell detail panel and servicing `0x4834e0(0, 0)` +- `0x00446d7f` calls it from the saved-runtime restore side with the same `(0, 0)` shape before immediately building `.smp` bundle payloads through `0x530c80/0x531150/0x531360` +- `0x0046b8bc` calls it from the multiplayer preview family before a later `0x00445ac0` call +- `0x004830ca` calls it from the shell-side active-mode branch with the clearest `(1, 0)` setup + +So the function is no longer just a guessed hook target. It is now a real shared owner above world-entry, saved-runtime restore, multiplayer preview, and shell-side active-mode startup branches. + +The internal selector split inside `0x00438890` is tighter now too: + +- `[0x006cec7c+0x01]` is a startup-profile selector, not the shell mode id +- selector values `1` and `7` share the tutorial lane at `0x00438f67`, which writes + `[0x006cec74+0x6c] = 2` and loads `Tutorial_2.gmp` or `Tutorial_1.gmp` +- selector `2` is a world-root initialization lane at `0x00438fbe` that allocates `0x0062c120` + when needed, runs `0x0044faf0`, and then forces the selector to `3` +- selector `4` is a setup-side world reset or regeneration lane at `0x00439038` that rebuilds + `0x0062c120` from setup globals `0x006d14cc/0x006d14d0`, then runs `0x00535100` and `0x0040b830` +- selector values `3`, `5`, and `6` collapse into the same profile-seeded file-load lane at + `0x004390b0..0x004390ea` +- selector `6` is the one variant that explicitly writes `[0x006cec74+0x6c] = 1` before the + shared file-load call + +Current grounded writers now tighten those values too: + +- `Campaign.win` writes selector `6` at `0x004b8a2f` +- `Multiplayer.win` writes selector `3` on one pending-status branch at `0x004f041e` +- the larger `Setup.win` dispatcher around `0x005033d0..0x00503b7b` writes selectors `2`, `3`, `4`, + and `5` on several validated launch branches +- so the shared file-load lane is now best read as one reused profile-file startup family rather + than one owner-specific manual-load path + +That means the successful manual-load branch is not the whole function. It is one three-selector +subfamily inside a broader startup dispatcher that also owns tutorial and fresh-world setup lanes. + +The multiplayer preview side is also tighter now: + +- `0x0046b8bc` publishes `0x006cec78` +- calls `0x00438890` as `thiscall(active_mode, 0, 0)` +- clears `[0x006cec74+0x6c]` +- and only then calls `0x00445ac0(0x006ce630, [0x006ce9c0], 0)` + +That makes the preview relaunch path clearly different from the manual load branch, not just a differently staged copy of it. + +## Latest Headless Debugger Result + +The scripted auto-load debugger run is now useful without manual interaction: + +- all breakpoints were set successfully: + - `0x00438890` + - `0x004390cb` + - `0x00445ac0` + - `0x0053fea6` +- but only `0x0053fea6` actually fired in the captured run + +So the current non-interactive path is good enough to gather repeatable crash-side state, but it also tells us that the current auto-load code path is still not obviously traversing the larger-owner breakpoints under `winedbg`. The next step is therefore more hook-side logging around the `0x00438890` call itself rather than more manual debugger work. + +The latest static pivot also means the next reverse-engineering step does not require a live run: + +- compare the mode-`4` `LoadScreen.win` owner path at `0x004830ca` against the world-entry and + saved-runtime callers of `0x00438890` +- compare how the `(1, 0)` `LoadScreen.win` lane diverges from the `(0, 0)` world-entry and + saved-runtime lanes before control reaches the shared `0x004390b0` manual-load branch +- only then return to hook experiments + +## Launchers + +Manual debugger run: + +```bash +tools/run_rt3_winedbg.sh +``` + +Auto-load debugger run: + +```bash +tools/run_hook_auto_load_winedbg.sh hh +``` + +Both scripts use `/opt/wine-stable/bin/winedbg` explicitly, so they do not depend on `winedbg` being on `PATH`. +They also default to: + +- their matching command file in [tools/](/home/jan/projects/rrt/tools) +- a logfile in the repo root: + - [rt3_manual_load_winedbg.log](/home/jan/projects/rrt/rt3_manual_load_winedbg.log) + - [rt3_auto_load_winedbg.log](/home/jan/projects/rrt/rt3_auto_load_winedbg.log) + +To save the full interactive debugger session to a file, set `RRT_WINEDBG_LOG`: + +```bash +RRT_WINEDBG_LOG=/tmp/rt3-manual-load-winedbg.log tools/run_rt3_winedbg.sh +``` + +or: + +```bash +RRT_WINEDBG_LOG=/tmp/rt3-auto-load-winedbg.log tools/run_hook_auto_load_winedbg.sh hh +``` + +Those wrappers use `script`, so both the commands you type and the debugger output are captured. + +`winedbg` under `/opt/wine-stable` also supports command files directly: + +```bash +tools/run_rt3_winedbg.sh +``` + +and: + +```bash +tools/run_hook_auto_load_winedbg.sh hh +``` + +Override either default if needed: + +```bash +RRT_WINEDBG_LOG=/tmp/rt3-manual-load-winedbg.log tools/run_rt3_winedbg.sh +``` + +Ready-made debugger command files are also provided: + +- [winedbg_manual_load_445ac0.cmd](/home/jan/projects/rrt/tools/winedbg_manual_load_445ac0.cmd) +- [winedbg_auto_load_compare.cmd](/home/jan/projects/rrt/tools/winedbg_auto_load_compare.cmd) + +If you do not use `RRT_WINEDBG_CMD_FILE`, you can still open those files and paste their contents into the debugger manually. + +Both scripts rebuild `rrt-hook`, copy `dinput8.dll` into the Wine RT3 directory, and launch RT3 under `winedbg`. + +## Successful Manual Load + +1. Launch: + +```bash +tools/run_rt3_winedbg.sh +``` + +2. The default command file now breaks on both: + - `0x004390cb` first + - `0x00445ac0` second + +3. In RT3, load save `hh` manually. + +4. The command file will dump: + - registers + - top-of-stack dwords + - `0x006cec74` + - `0x006cec7c` + - `0x006cec78` + - `0x006ce9b8..0x006ce9c4` + - `0x006d1270..0x006d127c` + - backtrace + +Focus on: + +- whether the first hit is `0x004390cb` or `0x00445ac0` +- caller address +- `ecx` +- the three stack arguments +- `0x006cec74` +- `0x006cec7c` +- `0x006cec78` +- `0x006ce9b8..0x006ce9c4` +- `0x006d1270..` + +## Failing Auto-Load Run + +1. Launch: + +```bash +tools/run_hook_auto_load_winedbg.sh hh +``` + +2. The default command file now scripts a fuller non-interactive capture sequence: + - `0x00438890` + - `0x004390cb` + - `0x00445ac0` + - `0x0053fea6` + +3. Let the hook run. + +4. The command file will dump the same register, stack, global, and backtrace state at the first hit. + +5. Compare that output directly against the successful manual run. + +So the current auto debugger path is now mostly headless: + +- launch `tools/run_hook_auto_load_winedbg.sh hh` +- let the scripted breakpoints run +- inspect [rt3_auto_load_winedbg.log](/home/jan/projects/rrt/rt3_auto_load_winedbg.log) + +Manual typing is no longer required for the main auto-load comparison path unless we need an additional ad hoc breakpoint. + +If the run still crashes and you need even earlier crash-side inspection after that, add one temporary extra breakpoint manually for: + +- `0x00517cf0` + +## Optional Host-Side GDB Fallback + +If `winedbg` is too clumsy for repeated crashes, attach host `gdb` to the crashing Wine process after RT3 starts: + +```bash +pgrep -af 'wine.*RT3.exe' +gdb -p +``` + +Useful commands in `gdb`: + +```gdb +set pagination off +handle SIGSEGV stop print +continue +bt +info registers +x/16wx $esp +``` + +This is mainly for cleaner backtraces after the fault PC is already known from `winedbg`. diff --git a/docs/shell-load-graph.md b/docs/shell-load-graph.md new file mode 100644 index 0000000..ee0901e --- /dev/null +++ b/docs/shell-load-graph.md @@ -0,0 +1,170 @@ +# Shell Load Graph + +Generated shell-load startup graph artifacts live under `artifacts/exports/rt3-1.06/`: + +- `shell-load-subgraph.dot` +- `shell-load-subgraph.md` +- `setup-window-subgraph.dot` +- `setup-window-subgraph.md` +- `setup-window-submodes-depth5-subgraph.dot` +- `setup-window-submodes-depth5-subgraph.md` +- `setup-window-submodes-depth5-forward-subgraph.dot` +- `setup-window-submodes-depth5-forward-subgraph.md` +- `runtime-effect-service-depth7-subgraph.dot` +- `runtime-effect-service-depth7-subgraph.md` +- `runtime-effect-service-depth7-forward-subgraph.dot` +- `runtime-effect-service-depth7-forward-subgraph.md` + +The current graph is intentionally bounded rather than whole-program: + +- seed nodes: + - `0x00438890` `shell_active_mode_run_profile_startup_and_load_dispatch` + - `0x00482ec0` `shell_transition_mode` +- traversal: + - note-address references in `function-map.csv` + - depth `2` + - backreferences enabled + +This keeps the artifact useful for naming and branch comparison instead of exploding into generic +utility helpers. + +The paired `Setup.win` graph is a narrower owner-family export: + +- seeds: + - `0x00504010` `shell_setup_window_construct` + - `0x005033d0` `shell_setup_window_handle_message` + - `0x00502c00` `shell_setup_window_select_launch_mode_and_apply_shell_state` + - `0x00502910` `shell_setup_window_refresh_mode_dependent_lists` + - `0x00502550` `shell_setup_window_refresh_selection_lists_and_summary_fields` + - `0x00502220` `shell_setup_window_publish_selected_profile_labels_and_preview_surface` + +Regenerate it with: + +```bash +python3 tools/py/export_function_subgraph.py \ + artifacts/exports/rt3-1.06/function-map.csv \ + artifacts/exports/rt3-1.06/shell-load-subgraph \ + --seed 0x00438890 \ + --seed 0x00482ec0 \ + --depth 2 \ + --include-backrefs \ + --title "Shell Load Startup Subgraph" +``` + +And for the narrower `Setup.win` graph: + +```bash +python3 tools/py/export_function_subgraph.py \ + artifacts/exports/rt3-1.06/function-map.csv \ + artifacts/exports/rt3-1.06/setup-window-subgraph \ + --seed 0x00504010 \ + --seed 0x005033d0 \ + --seed 0x00502c00 \ + --seed 0x00502910 \ + --seed 0x00502550 \ + --seed 0x00502220 \ + --depth 2 \ + --include-backrefs \ + --title "Setup Window Dispatch Subgraph" +``` + +The current exporter is intentionally note-driven: + +- nodes come from `function-map.csv` +- edges come from address references embedded in notes +- so it is best used as a bounded reasoning aid over already-curated rows, not as a substitute for + raw disassembly or xref recovery + +There is now also a deeper `Setup.win` submode export: + +- the backref-enabled depth-5 variant is exploratory and broad + - seeds: the same constructor, dispatcher, selector, and refresh owners + - depth: `5` + - backrefs: enabled + - current size: `369` nodes / `753` edges +- the forward-only depth-5 variant is the recommended artifact for submode work + - seeds: the same constructor, dispatcher, selector, and refresh owners + - depth: `5` + - backrefs: disabled + - current size: `126` nodes / `246` edges + +Generate the exploratory backref-enabled graph with: + +```bash +python3 tools/py/export_function_subgraph.py \ + artifacts/exports/rt3-1.06/function-map.csv \ + artifacts/exports/rt3-1.06/setup-window-submodes-depth5-subgraph \ + --seed 0x00504010 \ + --seed 0x005033d0 \ + --seed 0x00502c00 \ + --seed 0x00502910 \ + --seed 0x005027b0 \ + --seed 0x00502550 \ + --seed 0x00502220 \ + --depth 5 \ + --include-backrefs \ + --title "Setup Window Submode Subgraph (Depth 5)" +``` + +Generate the narrower forward-only graph with: + +```bash +python3 tools/py/export_function_subgraph.py \ + artifacts/exports/rt3-1.06/function-map.csv \ + artifacts/exports/rt3-1.06/setup-window-submodes-depth5-forward-subgraph \ + --seed 0x00504010 \ + --seed 0x005033d0 \ + --seed 0x00502c00 \ + --seed 0x00502910 \ + --seed 0x005027b0 \ + --seed 0x00502550 \ + --seed 0x00502220 \ + --depth 5 \ + --title "Setup Window Submode Subgraph (Depth 5, Forward Only)" +``` + +There is now also a deeper runtime-effect export around the scenario event collection service loop: + +- the backref-enabled depth-7 variant is exploratory and broad + - seeds: + - `0x004323a0` `scenario_runtime_effect_record_service_and_dispatch_linked_compact_effects` + - `0x00431b20` `world_apply_compact_runtime_effect_record_to_resolved_targets` + - `0x00430b50` `scenario_runtime_effect_record_build_followon_effect_from_compact_record_and_targets` + - `0x00432ea0` `scenario_event_collection_allocate_runtime_effect_record_from_compact_payload` + - depth: `7` + - backrefs: enabled + - current size: `525` nodes / `1235` edges +- the forward-only depth-7 variant is the recommended artifact for this branch + - same seeds + - depth: `7` + - backrefs: disabled + - current size: `293` nodes / `752` edges + +Generate the exploratory backref-enabled graph with: + +```bash +python3 tools/py/export_function_subgraph.py \ + artifacts/exports/rt3-1.06/function-map.csv \ + artifacts/exports/rt3-1.06/runtime-effect-service-depth7-subgraph \ + --seed 0x004323a0 \ + --seed 0x00431b20 \ + --seed 0x00430b50 \ + --seed 0x00432ea0 \ + --depth 7 \ + --include-backrefs \ + --title "Scenario Runtime Effect Service Subgraph (Depth 7)" +``` + +Generate the narrower forward-only graph with: + +```bash +python3 tools/py/export_function_subgraph.py \ + artifacts/exports/rt3-1.06/function-map.csv \ + artifacts/exports/rt3-1.06/runtime-effect-service-depth7-forward-subgraph \ + --seed 0x004323a0 \ + --seed 0x00431b20 \ + --seed 0x00430b50 \ + --seed 0x00432ea0 \ + --depth 7 \ + --title "Scenario Runtime Effect Service Subgraph (Depth 7, Forward Only)" +``` diff --git a/tools/py/export_function_subgraph.py b/tools/py/export_function_subgraph.py new file mode 100644 index 0000000..af68afd --- /dev/null +++ b/tools/py/export_function_subgraph.py @@ -0,0 +1,260 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import csv +import re +from collections import deque +from dataclasses import dataclass +from pathlib import Path + + +ADDRESS_RE = re.compile(r"0x[0-9a-fA-F]{8}") + + +@dataclass(frozen=True) +class Row: + address: int + size: str + name: str + subsystem: str + calling_convention: str + prototype_status: str + source_tool: str + confidence: str + notes: str + verified_against: str + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Export a bounded function subgraph from function-map.csv notes." + ) + parser.add_argument("function_map", type=Path) + parser.add_argument("output_prefix", type=Path) + parser.add_argument( + "--seed", + action="append", + default=[], + help="Seed function address in hex. May be repeated.", + ) + parser.add_argument( + "--depth", + type=int, + default=2, + help="Traversal depth over note-address references.", + ) + parser.add_argument( + "--title", + default="Function Subgraph", + help="Title used in the markdown summary.", + ) + parser.add_argument( + "--include-backrefs", + action="store_true", + help="Also traverse rows that reference currently included nodes.", + ) + args = parser.parse_args() + if not args.seed: + parser.error("at least one --seed is required") + return args + + +def parse_hex(text: str) -> int: + value = text.strip().lower() + if value.startswith("0x"): + value = value[2:] + return int(value, 16) + + +def fmt_addr(value: int) -> str: + return f"0x{value:08x}" + + +def load_rows(path: Path) -> dict[int, Row]: + with path.open(newline="", encoding="utf-8") as handle: + reader = csv.DictReader(handle) + rows: dict[int, Row] = {} + for raw in reader: + address = parse_hex(raw["address"]) + rows[address] = Row( + address=address, + size=raw["size"], + name=raw["name"], + subsystem=raw["subsystem"], + calling_convention=raw["calling_convention"], + prototype_status=raw["prototype_status"], + source_tool=raw["source_tool"], + confidence=raw["confidence"], + notes=raw["notes"], + verified_against=raw["verified_against"], + ) + return rows + + +def extract_note_refs(rows: dict[int, Row]) -> dict[int, set[int]]: + refs: dict[int, set[int]] = {} + known = set(rows) + for address, row in rows.items(): + hits = {parse_hex(match.group(0)) for match in ADDRESS_RE.finditer(row.notes)} + refs[address] = {hit for hit in hits if hit in known and hit != address} + return refs + + +def build_backrefs(refs: dict[int, set[int]]) -> dict[int, set[int]]: + backrefs: dict[int, set[int]] = {address: set() for address in refs} + for src, dsts in refs.items(): + for dst in dsts: + backrefs.setdefault(dst, set()).add(src) + return backrefs + + +def walk_subgraph( + rows: dict[int, Row], + refs: dict[int, set[int]], + seeds: list[int], + depth: int, + include_backrefs: bool, +) -> set[int]: + backrefs = build_backrefs(refs) + seen: set[int] = set() + queue: deque[tuple[int, int]] = deque((seed, 0) for seed in seeds if seed in rows) + + while queue: + address, level = queue.popleft() + if address in seen: + continue + seen.add(address) + if level >= depth: + continue + + for dst in sorted(refs.get(address, ())): + if dst not in seen: + queue.append((dst, level + 1)) + + if include_backrefs: + for src in sorted(backrefs.get(address, ())): + if src not in seen: + queue.append((src, level + 1)) + + return seen + + +def quote_dot(text: str) -> str: + return text.replace("\\", "\\\\").replace('"', '\\"') + + +def emit_dot( + rows: dict[int, Row], + refs: dict[int, set[int]], + included: set[int], + seeds: set[int], + output_path: Path, + title: str, +) -> None: + subsystems: dict[str, list[Row]] = {} + for address in sorted(included): + row = rows[address] + subsystems.setdefault(row.subsystem, []).append(row) + + lines: list[str] = [ + "digraph shell_load {", + ' graph [rankdir=LR, labelloc="t", labeljust="l"];', + f' label="{quote_dot(title)}";', + ' node [shape=box, style="rounded,filled", fillcolor="#f8f8f8", color="#555555", fontname="Helvetica"];', + ' edge [color="#666666", fontname="Helvetica"];', + ] + + for subsystem in sorted(subsystems): + cluster_id = subsystem.replace("-", "_") + lines.append(f' subgraph cluster_{cluster_id} {{') + lines.append(f' label="{quote_dot(subsystem)}";') + lines.append(' color="#cccccc";') + for row in subsystems[subsystem]: + seed_mark = " [seed]" if row.address in seeds else "" + label = f"{fmt_addr(row.address)}\\n{row.name}{seed_mark}" + fill = "#ffe9a8" if row.address in seeds else "#f8f8f8" + lines.append( + f' "{fmt_addr(row.address)}" [label="{quote_dot(label)}", fillcolor="{fill}"];' + ) + lines.append(" }") + + for src in sorted(included): + for dst in sorted(refs.get(src, ())): + if dst not in included: + continue + lines.append(f' "{fmt_addr(src)}" -> "{fmt_addr(dst)}";') + + lines.append("}") + output_path.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def emit_markdown( + rows: dict[int, Row], + refs: dict[int, set[int]], + included: set[int], + seeds: set[int], + output_path: Path, + title: str, + dot_path: Path, +) -> None: + included_rows = [rows[address] for address in sorted(included)] + edge_count = sum( + 1 + for src in included + for dst in refs.get(src, ()) + if dst in included + ) + + lines = [ + f"# {title}", + "", + f"- Nodes: `{len(included_rows)}`", + f"- Edges: `{edge_count}`", + f"- Seeds: {', '.join(f'`{fmt_addr(seed)}`' for seed in sorted(seeds))}", + f"- Graphviz: `{dot_path.name}`", + "", + "## Nodes", + "", + "| Address | Name | Subsystem | Confidence |", + "| --- | --- | --- | --- |", + ] + + for row in included_rows: + lines.append( + f"| `{fmt_addr(row.address)}` | `{row.name}` | `{row.subsystem}` | `{row.confidence}` |" + ) + + lines.extend(["", "## Edges", ""]) + for src in sorted(included): + dsts = [dst for dst in sorted(refs.get(src, ())) if dst in included] + if not dsts: + continue + src_row = rows[src] + lines.append(f"- `{fmt_addr(src)}` `{src_row.name}`") + for dst in dsts: + dst_row = rows[dst] + lines.append(f" -> `{fmt_addr(dst)}` `{dst_row.name}`") + + output_path.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def main() -> int: + args = parse_args() + rows = load_rows(args.function_map) + refs = extract_note_refs(rows) + seeds = [parse_hex(seed) for seed in args.seed] + included = walk_subgraph(rows, refs, seeds, args.depth, args.include_backrefs) + + output_prefix = args.output_prefix.resolve() + output_prefix.parent.mkdir(parents=True, exist_ok=True) + dot_path = output_prefix.with_suffix(".dot") + md_path = output_prefix.with_suffix(".md") + + emit_dot(rows, refs, included, set(seeds), dot_path, args.title) + emit_markdown(rows, refs, included, set(seeds), md_path, args.title, dot_path) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/run_hook_auto_load.sh b/tools/run_hook_auto_load.sh new file mode 100755 index 0000000..f292423 --- /dev/null +++ b/tools/run_hook_auto_load.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +game_dir="$repo_root/rt3_wineprefix/drive_c/rt3" +log_path="$game_dir/rrt_hook_attach.log" +proxy_path="$game_dir/dinput8.dll" +save_stem="${1:-hh}" +timeout_seconds="${RRT_HOOK_TIMEOUT_SECONDS:-60}" +. "$HOME/.local/share/cargo/env" + +cargo build -p rrt-hook --target i686-pc-windows-gnu + +rm -f "$log_path" +cp "$repo_root/target/i686-pc-windows-gnu/debug/dinput8.dll" "$proxy_path" + +echo "launcher: start=$(date --iso-8601=seconds)" +echo "launcher: save_stem=$save_stem timeout_seconds=$timeout_seconds" + +set +e +( + cd "$game_dir" + export RRT_AUTO_LOAD_SAVE="$save_stem" + export WINEPREFIX="$repo_root/rt3_wineprefix" + export WINEDLLOVERRIDES="dinput8=n,b" + + timeout "${timeout_seconds}s" /opt/wine-stable/bin/wine RT3.exe +) >/tmp/rrt-hook-auto-load-wine.log 2>&1 & +launcher_pid=$! +echo "launcher: wrapper_pid=$launcher_pid" +wait "$launcher_pid" +launcher_status=$? +set -e + +echo "launcher: exit_status=$launcher_status" +echo "launcher: end=$(date --iso-8601=seconds)" + +if [[ -f "$log_path" ]]; then + cat "$log_path" +else + echo "attach-log-missing" >&2 + exit 1 +fi diff --git a/tools/run_hook_auto_load_winedbg.sh b/tools/run_hook_auto_load_winedbg.sh new file mode 100755 index 0000000..f2a0df5 --- /dev/null +++ b/tools/run_hook_auto_load_winedbg.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +game_dir="$repo_root/rt3_wineprefix/drive_c/rt3" +proxy_path="$game_dir/dinput8.dll" +save_stem="${1:-hh}" +. "$HOME/.local/share/cargo/env" + +cargo build -p rrt-hook --target i686-pc-windows-gnu +cp "$repo_root/target/i686-pc-windows-gnu/debug/dinput8.dll" "$proxy_path" + +cd "$game_dir" +export RRT_AUTO_LOAD_SAVE="$save_stem" +export WINEPREFIX="$repo_root/rt3_wineprefix" +export WINEDLLOVERRIDES="dinput8=n,b" + +cmd=(/opt/wine-stable/bin/winedbg) +cmd_file="${RRT_WINEDBG_CMD_FILE:-$repo_root/tools/winedbg_auto_load_compare.cmd}" +if [[ -n "$cmd_file" ]]; then + cmd+=(--file "$cmd_file") +fi +cmd+=(RT3.exe) + +log_file="${RRT_WINEDBG_LOG:-$repo_root/rt3_auto_load_winedbg.log}" +if [[ -n "$log_file" ]]; then + cmd_string="$(printf '%q ' "${cmd[@]}")" + exec script -qefc "${cmd_string% }" "$log_file" +fi + +exec "${cmd[@]}" diff --git a/tools/run_hook_smoke_test.sh b/tools/run_hook_smoke_test.sh index 9429d4a..27a00d4 100755 --- a/tools/run_hook_smoke_test.sh +++ b/tools/run_hook_smoke_test.sh @@ -13,9 +13,11 @@ cargo build -p rrt-hook --target i686-pc-windows-gnu rm -f "$log_path" cp "$repo_root/target/i686-pc-windows-gnu/debug/dinput8.dll" "$proxy_path" + #RRT_WRITE_FINANCE_TEMPLATE=1 \ ( cd "$game_dir" - timeout 8s env \ + timeout 600s env \ + RRT_WRITE_FINANCE_CAPTURE=1 \ WINEPREFIX="$repo_root/rt3_wineprefix" \ WINEDLLOVERRIDES="dinput8=n,b" \ /opt/wine-stable/bin/wine RT3.exe diff --git a/tools/run_rt3_winedbg.sh b/tools/run_rt3_winedbg.sh new file mode 100755 index 0000000..ced3290 --- /dev/null +++ b/tools/run_rt3_winedbg.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +game_dir="$repo_root/rt3_wineprefix/drive_c/rt3" +proxy_path="$game_dir/dinput8.dll" +. "$HOME/.local/share/cargo/env" + +cargo build -p rrt-hook --target i686-pc-windows-gnu +cp "$repo_root/target/i686-pc-windows-gnu/debug/dinput8.dll" "$proxy_path" + +cd "$game_dir" +export WINEPREFIX="$repo_root/rt3_wineprefix" +export WINEDLLOVERRIDES="dinput8=n,b" + +cmd=(/opt/wine-stable/bin/winedbg) +cmd_file="${RRT_WINEDBG_CMD_FILE:-$repo_root/tools/winedbg_manual_load_445ac0.cmd}" +if [[ -n "$cmd_file" ]]; then + cmd+=(--file "$cmd_file") +fi +cmd+=(RT3.exe) + +log_file="${RRT_WINEDBG_LOG:-$repo_root/rt3_manual_load_winedbg.log}" +if [[ -n "$log_file" ]]; then + cmd_string="$(printf '%q ' "${cmd[@]}")" + exec script -qefc "${cmd_string% }" "$log_file" +fi + +exec "${cmd[@]}" diff --git a/tools/winedbg_auto_load_compare.cmd b/tools/winedbg_auto_load_compare.cmd new file mode 100644 index 0000000..1ff7ed6 --- /dev/null +++ b/tools/winedbg_auto_load_compare.cmd @@ -0,0 +1,76 @@ +break *0x00438890 +break *0x004390cb +break *0x00445ac0 +break *0x0053fea6 +cont +info reg +print/x *(unsigned int*)($esp) +print/x *(unsigned int*)($esp+4) +print/x *(unsigned int*)($esp+8) +print/x *(unsigned int*)($esp+12) +print/x *(unsigned int*)0x006cec74 +print/x *(unsigned int*)0x006cec7c +print/x *(unsigned int*)0x006cec78 +print/x *(unsigned int*)0x006ce9b8 +print/x *(unsigned int*)0x006ce9bc +print/x *(unsigned int*)0x006ce9c0 +print/x *(unsigned int*)0x006ce9c4 +print/x *(unsigned int*)0x006d1270 +print/x *(unsigned int*)0x006d1274 +print/x *(unsigned int*)0x006d1278 +print/x *(unsigned int*)0x006d127c +bt +cont +info reg +print/x *(unsigned int*)($esp) +print/x *(unsigned int*)($esp+4) +print/x *(unsigned int*)($esp+8) +print/x *(unsigned int*)($esp+12) +print/x *(unsigned int*)0x006cec74 +print/x *(unsigned int*)0x006cec7c +print/x *(unsigned int*)0x006cec78 +print/x *(unsigned int*)0x006ce9b8 +print/x *(unsigned int*)0x006ce9bc +print/x *(unsigned int*)0x006ce9c0 +print/x *(unsigned int*)0x006ce9c4 +print/x *(unsigned int*)0x006d1270 +print/x *(unsigned int*)0x006d1274 +print/x *(unsigned int*)0x006d1278 +print/x *(unsigned int*)0x006d127c +bt +cont +info reg +print/x *(unsigned int*)($esp) +print/x *(unsigned int*)($esp+4) +print/x *(unsigned int*)($esp+8) +print/x *(unsigned int*)($esp+12) +print/x *(unsigned int*)0x006cec74 +print/x *(unsigned int*)0x006cec7c +print/x *(unsigned int*)0x006cec78 +print/x *(unsigned int*)0x006ce9b8 +print/x *(unsigned int*)0x006ce9bc +print/x *(unsigned int*)0x006ce9c0 +print/x *(unsigned int*)0x006ce9c4 +print/x *(unsigned int*)0x006d1270 +print/x *(unsigned int*)0x006d1274 +print/x *(unsigned int*)0x006d1278 +print/x *(unsigned int*)0x006d127c +bt +cont +info reg +print/x *(unsigned int*)($esp) +print/x *(unsigned int*)($esp+4) +print/x *(unsigned int*)($esp+8) +print/x *(unsigned int*)($esp+12) +print/x *(unsigned int*)0x006cec74 +print/x *(unsigned int*)0x006cec7c +print/x *(unsigned int*)0x006cec78 +print/x *(unsigned int*)0x006ce9b8 +print/x *(unsigned int*)0x006ce9bc +print/x *(unsigned int*)0x006ce9c0 +print/x *(unsigned int*)0x006ce9c4 +print/x *(unsigned int*)0x006d1270 +print/x *(unsigned int*)0x006d1274 +print/x *(unsigned int*)0x006d1278 +print/x *(unsigned int*)0x006d127c +bt diff --git a/tools/winedbg_manual_load_445ac0.cmd b/tools/winedbg_manual_load_445ac0.cmd new file mode 100644 index 0000000..0d42295 --- /dev/null +++ b/tools/winedbg_manual_load_445ac0.cmd @@ -0,0 +1,20 @@ +break *0x004390cb +break *0x00445ac0 +cont +info reg +print/x *(unsigned int*)($esp) +print/x *(unsigned int*)($esp+4) +print/x *(unsigned int*)($esp+8) +print/x *(unsigned int*)($esp+12) +print/x *(unsigned int*)0x006cec74 +print/x *(unsigned int*)0x006cec7c +print/x *(unsigned int*)0x006cec78 +print/x *(unsigned int*)0x006ce9b8 +print/x *(unsigned int*)0x006ce9bc +print/x *(unsigned int*)0x006ce9c0 +print/x *(unsigned int*)0x006ce9c4 +print/x *(unsigned int*)0x006d1270 +print/x *(unsigned int*)0x006d1274 +print/x *(unsigned int*)0x006d1278 +print/x *(unsigned int*)0x006d127c +bt