From 77377c67a0888650ffac2fabbc6430bd20554b3d Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Fri, 17 Apr 2026 20:33:45 -0700 Subject: [PATCH] Rehost company dividend and bonus save lanes --- crates/rrt-runtime/src/import.rs | 9 +++++ crates/rrt-runtime/src/runtime.rs | 6 ++++ crates/rrt-runtime/src/smp.rs | 60 +++++++++++++++++++++++++++++++ crates/rrt-runtime/src/summary.rs | 18 ++++++++++ 4 files changed, 93 insertions(+) diff --git a/crates/rrt-runtime/src/import.rs b/crates/rrt-runtime/src/import.rs index 6cddbea..13be5ae 100644 --- a/crates/rrt-runtime/src/import.rs +++ b/crates/rrt-runtime/src/import.rs @@ -5048,8 +5048,11 @@ mod tests { cached_share_price_raw_u32: 0x42200000, chairman_salary_baseline: 24, chairman_salary_current: 30, + chairman_bonus_year: 1832, + chairman_bonus_amount: 900, founding_year: 1831, last_bankruptcy_year: 0, + last_dividend_year: 1837, current_issue_calendar_word: 5, prior_issue_calendar_word: 4, city_connection_latch: true, @@ -5088,8 +5091,11 @@ mod tests { cached_share_price_raw_u32: 0x41f80000, chairman_salary_baseline: 20, chairman_salary_current: 22, + chairman_bonus_year: 0, + chairman_bonus_amount: 0, founding_year: 1833, last_bankruptcy_year: 0, + last_dividend_year: 0, current_issue_calendar_word: 3, prior_issue_calendar_word: 2, city_connection_latch: false, @@ -6371,8 +6377,11 @@ mod tests { cached_share_price_raw_u32: 0x42180000, chairman_salary_baseline: 21, chairman_salary_current: 24, + chairman_bonus_year: 1836, + chairman_bonus_amount: 600, founding_year: 1834, last_bankruptcy_year: 0, + last_dividend_year: 1838, current_issue_calendar_word: 4, prior_issue_calendar_word: 3, city_connection_latch: false, diff --git a/crates/rrt-runtime/src/runtime.rs b/crates/rrt-runtime/src/runtime.rs index 757223d..1649673 100644 --- a/crates/rrt-runtime/src/runtime.rs +++ b/crates/rrt-runtime/src/runtime.rs @@ -67,10 +67,16 @@ pub struct RuntimeCompanyMarketState { #[serde(default)] pub chairman_salary_current: u32, #[serde(default)] + pub chairman_bonus_year: u32, + #[serde(default)] + pub chairman_bonus_amount: i32, + #[serde(default)] pub founding_year: u32, #[serde(default)] pub last_bankruptcy_year: u32, #[serde(default)] + pub last_dividend_year: u32, + #[serde(default)] pub current_issue_calendar_word: u32, #[serde(default)] pub prior_issue_calendar_word: u32, diff --git a/crates/rrt-runtime/src/smp.rs b/crates/rrt-runtime/src/smp.rs index 0b50cf2..9b89cce 100644 --- a/crates/rrt-runtime/src/smp.rs +++ b/crates/rrt-runtime/src/smp.rs @@ -2333,8 +2333,11 @@ pub struct SmpSaveCompanyRecordAnalysisEntry { pub cached_share_price_f32: f32, pub chairman_salary_baseline: u32, pub chairman_salary_current: u32, + pub chairman_bonus_year: u32, + pub chairman_bonus_amount: i32, pub founding_year: u32, pub last_bankruptcy_year: u32, + pub last_dividend_year: u32, pub city_connection_latch: bool, pub linked_transit_latch: bool, pub merger_cooldown_year: u32, @@ -3013,6 +3016,14 @@ pub fn inspect_save_company_and_chairman_analysis_bytes( &bytes, record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET, )?; + let chairman_bonus_year = read_u32_at( + &bytes, + record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_YEAR_OFFSET, + )?; + let chairman_bonus_amount = read_i32_at( + &bytes, + record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_AMOUNT_OFFSET, + )?; let founding_year = read_u32_at( &bytes, record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET, @@ -3021,6 +3032,10 @@ pub fn inspect_save_company_and_chairman_analysis_bytes( &bytes, record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET, )?; + let last_dividend_year = read_u32_at( + &bytes, + record_offset + SAVE_COMPANY_RECORD_LAST_DIVIDEND_YEAR_OFFSET, + )?; let city_connection_latch = read_u8_at( &bytes, record_offset + SAVE_COMPANY_RECORD_CITY_CONNECTION_LATCH_OFFSET, @@ -3063,8 +3078,11 @@ pub fn inspect_save_company_and_chairman_analysis_bytes( cached_share_price_f32, chairman_salary_baseline, chairman_salary_current, + chairman_bonus_year, + chairman_bonus_amount, founding_year, last_bankruptcy_year, + last_dividend_year, city_connection_latch, linked_transit_latch, merger_cooldown_year, @@ -3428,12 +3446,15 @@ const SAVE_COMPANY_RECORD_BOND_COUNT_OFFSET: usize = 0x5b; const SAVE_COMPANY_RECORD_BOND_TABLE_OFFSET: usize = 0x5f; const SAVE_COMPANY_RECORD_BOND_SLOT_STRIDE: usize = 12; const SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_BASELINE_OFFSET: usize = 0x14f; +const SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_YEAR_OFFSET: usize = 0x34f; +const SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_AMOUNT_OFFSET: usize = 0x353; const SAVE_COMPANY_RECORD_MERGER_COOLDOWN_OFFSET: usize = 0x15f; const SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET: usize = 0x157; const SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET: usize = 0x163; const SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET: usize = 0x16b; const SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET: usize = 0x173; const SAVE_COMPANY_RECORD_TAKEOVER_COOLDOWN_OFFSET: usize = 0x289; +const SAVE_COMPANY_RECORD_LAST_DIVIDEND_YEAR_OFFSET: usize = 0x0d2d; const SAVE_COMPANY_RECORD_CITY_CONNECTION_LATCH_OFFSET: usize = 0x0d18; const SAVE_COMPANY_RECORD_SUPPORT_PROGRESS_OFFSET: usize = 0x0d07; const SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET: usize = 0x0d59; @@ -3551,6 +3572,14 @@ fn parse_save_company_roster_probe( bytes, record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET, )?; + let chairman_bonus_year = read_u32_at( + bytes, + record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_YEAR_OFFSET, + )?; + let chairman_bonus_amount = read_i32_at( + bytes, + record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_AMOUNT_OFFSET, + )?; let founding_year = read_u32_at( bytes, record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET, @@ -3559,6 +3588,10 @@ fn parse_save_company_roster_probe( bytes, record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET, )?; + let last_dividend_year = read_u32_at( + bytes, + record_offset + SAVE_COMPANY_RECORD_LAST_DIVIDEND_YEAR_OFFSET, + )?; let current_issue_calendar_word = read_u32_at( bytes, record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET, @@ -3608,8 +3641,11 @@ fn parse_save_company_roster_probe( cached_share_price_raw_u32, chairman_salary_baseline, chairman_salary_current, + chairman_bonus_year, + chairman_bonus_amount, founding_year, last_bankruptcy_year, + last_dividend_year, current_issue_calendar_word, prior_issue_calendar_word, city_connection_latch, @@ -15709,8 +15745,11 @@ mod tests { cached_share_price_raw_u32, chairman_salary_baseline, chairman_salary_current, + chairman_bonus_year, + chairman_bonus_amount, founding_year, last_bankruptcy_year, + last_dividend_year, current_issue_calendar_word, prior_issue_calendar_word, city_connection_latch, @@ -15732,8 +15771,11 @@ mod tests { 0x426c0000u32, 24u32, 31u32, + 1849u32, + 1250i32, 1842u32, 1851u32, + 1848u32, 7u32, 6u32, true, @@ -15754,8 +15796,11 @@ mod tests { 0x42780000u32, 28u32, 36u32, + 0u32, + 0i32, 1845u32, 0u32, + 1850u32, 3u32, 2u32, false, @@ -15817,12 +15862,21 @@ mod tests { bytes[record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET ..record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET + 4] .copy_from_slice(&chairman_salary_current.to_le_bytes()); + bytes[record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_YEAR_OFFSET + ..record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_YEAR_OFFSET + 4] + .copy_from_slice(&chairman_bonus_year.to_le_bytes()); + bytes[record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_AMOUNT_OFFSET + ..record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_BONUS_AMOUNT_OFFSET + 4] + .copy_from_slice(&chairman_bonus_amount.to_le_bytes()); bytes[record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET ..record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET + 4] .copy_from_slice(&founding_year.to_le_bytes()); bytes[record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET ..record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET + 4] .copy_from_slice(&last_bankruptcy_year.to_le_bytes()); + bytes[record_offset + SAVE_COMPANY_RECORD_LAST_DIVIDEND_YEAR_OFFSET + ..record_offset + SAVE_COMPANY_RECORD_LAST_DIVIDEND_YEAR_OFFSET + 4] + .copy_from_slice(&last_dividend_year.to_le_bytes()); bytes[record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET ..record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET + 4] .copy_from_slice(¤t_issue_calendar_word.to_le_bytes()); @@ -15897,8 +15951,11 @@ mod tests { assert_eq!(market_state.cached_share_price_raw_u32, 0x426c0000); assert_eq!(market_state.chairman_salary_baseline, 24); assert_eq!(market_state.chairman_salary_current, 31); + assert_eq!(market_state.chairman_bonus_year, 1849); + assert_eq!(market_state.chairman_bonus_amount, 1250); assert_eq!(market_state.founding_year, 1842); assert_eq!(market_state.last_bankruptcy_year, 1851); + assert_eq!(market_state.last_dividend_year, 1848); assert_eq!(market_state.current_issue_calendar_word, 7); assert_eq!(market_state.prior_issue_calendar_word, 6); assert!(market_state.city_connection_latch); @@ -15912,6 +15969,9 @@ mod tests { .market_state .as_ref() .expect("second company market state should load"); + assert_eq!(second_market_state.chairman_bonus_year, 0); + assert_eq!(second_market_state.chairman_bonus_amount, 0); + assert_eq!(second_market_state.last_dividend_year, 1850); assert_eq!(second_market_state.current_issue_calendar_word, 3); assert_eq!(second_market_state.prior_issue_calendar_word, 2); assert!(!second_market_state.city_connection_latch); diff --git a/crates/rrt-runtime/src/summary.rs b/crates/rrt-runtime/src/summary.rs index 434bfab..6b7daec 100644 --- a/crates/rrt-runtime/src/summary.rs +++ b/crates/rrt-runtime/src/summary.rs @@ -49,6 +49,9 @@ pub struct RuntimeSummary { pub selected_company_outstanding_shares: Option, pub selected_company_cached_share_price_value_f32_text: Option, pub selected_company_mutable_support_scalar_value_f32_text: Option, + pub selected_company_last_dividend_year: Option, + pub selected_company_chairman_bonus_year: Option, + pub selected_company_chairman_bonus_amount: Option, pub player_count: usize, pub chairman_profile_count: usize, pub active_chairman_profile_count: usize, @@ -246,6 +249,15 @@ impl RuntimeSummary { .map(|market_state| { raw_u32_to_f32_text(market_state.mutable_support_scalar_raw_u32) }), + selected_company_last_dividend_year: selected_company_market_state + .map(|market_state| market_state.last_dividend_year) + .filter(|year| *year != 0), + selected_company_chairman_bonus_year: selected_company_market_state + .map(|market_state| market_state.chairman_bonus_year) + .filter(|year| *year != 0), + selected_company_chairman_bonus_amount: selected_company_market_state + .map(|market_state| market_state.chairman_bonus_amount) + .filter(|amount| *amount != 0), player_count: state.players.len(), chairman_profile_count: state.chairman_profiles.len(), active_chairman_profile_count: state @@ -1869,8 +1881,11 @@ mod tests { cached_share_price_raw_u32: 0x42200000, chairman_salary_baseline: 24, chairman_salary_current: 30, + chairman_bonus_year: 1842, + chairman_bonus_amount: 750, founding_year: 1831, last_bankruptcy_year: 0, + last_dividend_year: 1841, current_issue_calendar_word: 5, prior_issue_calendar_word: 4, city_connection_latch: true, @@ -1892,5 +1907,8 @@ mod tests { summary.selected_company_mutable_support_scalar_value_f32_text, Some("1.000000".to_string()) ); + assert_eq!(summary.selected_company_last_dividend_year, Some(1841)); + assert_eq!(summary.selected_company_chairman_bonus_year, Some(1842)); + assert_eq!(summary.selected_company_chairman_bonus_amount, Some(750)); } }