Rehost company dividend and bonus save lanes

This commit is contained in:
Jan Petykiewicz 2026-04-17 20:33:45 -07:00
commit 77377c67a0
4 changed files with 93 additions and 0 deletions

View file

@ -5048,8 +5048,11 @@ mod tests {
cached_share_price_raw_u32: 0x42200000, cached_share_price_raw_u32: 0x42200000,
chairman_salary_baseline: 24, chairman_salary_baseline: 24,
chairman_salary_current: 30, chairman_salary_current: 30,
chairman_bonus_year: 1832,
chairman_bonus_amount: 900,
founding_year: 1831, founding_year: 1831,
last_bankruptcy_year: 0, last_bankruptcy_year: 0,
last_dividend_year: 1837,
current_issue_calendar_word: 5, current_issue_calendar_word: 5,
prior_issue_calendar_word: 4, prior_issue_calendar_word: 4,
city_connection_latch: true, city_connection_latch: true,
@ -5088,8 +5091,11 @@ mod tests {
cached_share_price_raw_u32: 0x41f80000, cached_share_price_raw_u32: 0x41f80000,
chairman_salary_baseline: 20, chairman_salary_baseline: 20,
chairman_salary_current: 22, chairman_salary_current: 22,
chairman_bonus_year: 0,
chairman_bonus_amount: 0,
founding_year: 1833, founding_year: 1833,
last_bankruptcy_year: 0, last_bankruptcy_year: 0,
last_dividend_year: 0,
current_issue_calendar_word: 3, current_issue_calendar_word: 3,
prior_issue_calendar_word: 2, prior_issue_calendar_word: 2,
city_connection_latch: false, city_connection_latch: false,
@ -6371,8 +6377,11 @@ mod tests {
cached_share_price_raw_u32: 0x42180000, cached_share_price_raw_u32: 0x42180000,
chairman_salary_baseline: 21, chairman_salary_baseline: 21,
chairman_salary_current: 24, chairman_salary_current: 24,
chairman_bonus_year: 1836,
chairman_bonus_amount: 600,
founding_year: 1834, founding_year: 1834,
last_bankruptcy_year: 0, last_bankruptcy_year: 0,
last_dividend_year: 1838,
current_issue_calendar_word: 4, current_issue_calendar_word: 4,
prior_issue_calendar_word: 3, prior_issue_calendar_word: 3,
city_connection_latch: false, city_connection_latch: false,

View file

@ -67,10 +67,16 @@ pub struct RuntimeCompanyMarketState {
#[serde(default)] #[serde(default)]
pub chairman_salary_current: u32, pub chairman_salary_current: u32,
#[serde(default)] #[serde(default)]
pub chairman_bonus_year: u32,
#[serde(default)]
pub chairman_bonus_amount: i32,
#[serde(default)]
pub founding_year: u32, pub founding_year: u32,
#[serde(default)] #[serde(default)]
pub last_bankruptcy_year: u32, pub last_bankruptcy_year: u32,
#[serde(default)] #[serde(default)]
pub last_dividend_year: u32,
#[serde(default)]
pub current_issue_calendar_word: u32, pub current_issue_calendar_word: u32,
#[serde(default)] #[serde(default)]
pub prior_issue_calendar_word: u32, pub prior_issue_calendar_word: u32,

View file

@ -2333,8 +2333,11 @@ pub struct SmpSaveCompanyRecordAnalysisEntry {
pub cached_share_price_f32: f32, pub cached_share_price_f32: f32,
pub chairman_salary_baseline: u32, pub chairman_salary_baseline: u32,
pub chairman_salary_current: u32, pub chairman_salary_current: u32,
pub chairman_bonus_year: u32,
pub chairman_bonus_amount: i32,
pub founding_year: u32, pub founding_year: u32,
pub last_bankruptcy_year: u32, pub last_bankruptcy_year: u32,
pub last_dividend_year: u32,
pub city_connection_latch: bool, pub city_connection_latch: bool,
pub linked_transit_latch: bool, pub linked_transit_latch: bool,
pub merger_cooldown_year: u32, pub merger_cooldown_year: u32,
@ -3013,6 +3016,14 @@ pub fn inspect_save_company_and_chairman_analysis_bytes(
&bytes, &bytes,
record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET, 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( let founding_year = read_u32_at(
&bytes, &bytes,
record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET, record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET,
@ -3021,6 +3032,10 @@ pub fn inspect_save_company_and_chairman_analysis_bytes(
&bytes, &bytes,
record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET, 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( let city_connection_latch = read_u8_at(
&bytes, &bytes,
record_offset + SAVE_COMPANY_RECORD_CITY_CONNECTION_LATCH_OFFSET, 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, cached_share_price_f32,
chairman_salary_baseline, chairman_salary_baseline,
chairman_salary_current, chairman_salary_current,
chairman_bonus_year,
chairman_bonus_amount,
founding_year, founding_year,
last_bankruptcy_year, last_bankruptcy_year,
last_dividend_year,
city_connection_latch, city_connection_latch,
linked_transit_latch, linked_transit_latch,
merger_cooldown_year, 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_TABLE_OFFSET: usize = 0x5f;
const SAVE_COMPANY_RECORD_BOND_SLOT_STRIDE: usize = 12; const SAVE_COMPANY_RECORD_BOND_SLOT_STRIDE: usize = 12;
const SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_BASELINE_OFFSET: usize = 0x14f; 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_MERGER_COOLDOWN_OFFSET: usize = 0x15f;
const SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET: usize = 0x157; const SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET: usize = 0x157;
const SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET: usize = 0x163; const SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET: usize = 0x163;
const SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET: usize = 0x16b; const SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET: usize = 0x16b;
const SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET: usize = 0x173; const SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET: usize = 0x173;
const SAVE_COMPANY_RECORD_TAKEOVER_COOLDOWN_OFFSET: usize = 0x289; 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_CITY_CONNECTION_LATCH_OFFSET: usize = 0x0d18;
const SAVE_COMPANY_RECORD_SUPPORT_PROGRESS_OFFSET: usize = 0x0d07; const SAVE_COMPANY_RECORD_SUPPORT_PROGRESS_OFFSET: usize = 0x0d07;
const SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET: usize = 0x0d59; const SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET: usize = 0x0d59;
@ -3551,6 +3572,14 @@ fn parse_save_company_roster_probe(
bytes, bytes,
record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET, 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( let founding_year = read_u32_at(
bytes, bytes,
record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET, record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET,
@ -3559,6 +3588,10 @@ fn parse_save_company_roster_probe(
bytes, bytes,
record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET, 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( let current_issue_calendar_word = read_u32_at(
bytes, bytes,
record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET, record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET,
@ -3608,8 +3641,11 @@ fn parse_save_company_roster_probe(
cached_share_price_raw_u32, cached_share_price_raw_u32,
chairman_salary_baseline, chairman_salary_baseline,
chairman_salary_current, chairman_salary_current,
chairman_bonus_year,
chairman_bonus_amount,
founding_year, founding_year,
last_bankruptcy_year, last_bankruptcy_year,
last_dividend_year,
current_issue_calendar_word, current_issue_calendar_word,
prior_issue_calendar_word, prior_issue_calendar_word,
city_connection_latch, city_connection_latch,
@ -15709,8 +15745,11 @@ mod tests {
cached_share_price_raw_u32, cached_share_price_raw_u32,
chairman_salary_baseline, chairman_salary_baseline,
chairman_salary_current, chairman_salary_current,
chairman_bonus_year,
chairman_bonus_amount,
founding_year, founding_year,
last_bankruptcy_year, last_bankruptcy_year,
last_dividend_year,
current_issue_calendar_word, current_issue_calendar_word,
prior_issue_calendar_word, prior_issue_calendar_word,
city_connection_latch, city_connection_latch,
@ -15732,8 +15771,11 @@ mod tests {
0x426c0000u32, 0x426c0000u32,
24u32, 24u32,
31u32, 31u32,
1849u32,
1250i32,
1842u32, 1842u32,
1851u32, 1851u32,
1848u32,
7u32, 7u32,
6u32, 6u32,
true, true,
@ -15754,8 +15796,11 @@ mod tests {
0x42780000u32, 0x42780000u32,
28u32, 28u32,
36u32, 36u32,
0u32,
0i32,
1845u32, 1845u32,
0u32, 0u32,
1850u32,
3u32, 3u32,
2u32, 2u32,
false, false,
@ -15817,12 +15862,21 @@ mod tests {
bytes[record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET bytes[record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET
..record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET + 4] ..record_offset + SAVE_COMPANY_RECORD_CHAIRMAN_SALARY_CURRENT_OFFSET + 4]
.copy_from_slice(&chairman_salary_current.to_le_bytes()); .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 bytes[record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET
..record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET + 4] ..record_offset + SAVE_COMPANY_RECORD_FOUNDING_YEAR_OFFSET + 4]
.copy_from_slice(&founding_year.to_le_bytes()); .copy_from_slice(&founding_year.to_le_bytes());
bytes[record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET bytes[record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET
..record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET + 4] ..record_offset + SAVE_COMPANY_RECORD_LAST_BANKRUPTCY_YEAR_OFFSET + 4]
.copy_from_slice(&last_bankruptcy_year.to_le_bytes()); .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 bytes[record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET
..record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET + 4] ..record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET + 4]
.copy_from_slice(&current_issue_calendar_word.to_le_bytes()); .copy_from_slice(&current_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.cached_share_price_raw_u32, 0x426c0000);
assert_eq!(market_state.chairman_salary_baseline, 24); assert_eq!(market_state.chairman_salary_baseline, 24);
assert_eq!(market_state.chairman_salary_current, 31); 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.founding_year, 1842);
assert_eq!(market_state.last_bankruptcy_year, 1851); 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.current_issue_calendar_word, 7);
assert_eq!(market_state.prior_issue_calendar_word, 6); assert_eq!(market_state.prior_issue_calendar_word, 6);
assert!(market_state.city_connection_latch); assert!(market_state.city_connection_latch);
@ -15912,6 +15969,9 @@ mod tests {
.market_state .market_state
.as_ref() .as_ref()
.expect("second company market state should load"); .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.current_issue_calendar_word, 3);
assert_eq!(second_market_state.prior_issue_calendar_word, 2); assert_eq!(second_market_state.prior_issue_calendar_word, 2);
assert!(!second_market_state.city_connection_latch); assert!(!second_market_state.city_connection_latch);

View file

@ -49,6 +49,9 @@ pub struct RuntimeSummary {
pub selected_company_outstanding_shares: Option<u32>, pub selected_company_outstanding_shares: Option<u32>,
pub selected_company_cached_share_price_value_f32_text: Option<String>, pub selected_company_cached_share_price_value_f32_text: Option<String>,
pub selected_company_mutable_support_scalar_value_f32_text: Option<String>, pub selected_company_mutable_support_scalar_value_f32_text: Option<String>,
pub selected_company_last_dividend_year: Option<u32>,
pub selected_company_chairman_bonus_year: Option<u32>,
pub selected_company_chairman_bonus_amount: Option<i32>,
pub player_count: usize, pub player_count: usize,
pub chairman_profile_count: usize, pub chairman_profile_count: usize,
pub active_chairman_profile_count: usize, pub active_chairman_profile_count: usize,
@ -246,6 +249,15 @@ impl RuntimeSummary {
.map(|market_state| { .map(|market_state| {
raw_u32_to_f32_text(market_state.mutable_support_scalar_raw_u32) 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(), player_count: state.players.len(),
chairman_profile_count: state.chairman_profiles.len(), chairman_profile_count: state.chairman_profiles.len(),
active_chairman_profile_count: state active_chairman_profile_count: state
@ -1869,8 +1881,11 @@ mod tests {
cached_share_price_raw_u32: 0x42200000, cached_share_price_raw_u32: 0x42200000,
chairman_salary_baseline: 24, chairman_salary_baseline: 24,
chairman_salary_current: 30, chairman_salary_current: 30,
chairman_bonus_year: 1842,
chairman_bonus_amount: 750,
founding_year: 1831, founding_year: 1831,
last_bankruptcy_year: 0, last_bankruptcy_year: 0,
last_dividend_year: 1841,
current_issue_calendar_word: 5, current_issue_calendar_word: 5,
prior_issue_calendar_word: 4, prior_issue_calendar_word: 4,
city_connection_latch: true, city_connection_latch: true,
@ -1892,5 +1907,8 @@ mod tests {
summary.selected_company_mutable_support_scalar_value_f32_text, summary.selected_company_mutable_support_scalar_value_f32_text,
Some("1.000000".to_string()) 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));
} }
} }