diff --git a/README.md b/README.md index d3367f8..49f0635 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,9 @@ The fixed-world finance neighborhood itself is now widened to 16 dwords rooted a so future issue-`0x38/0x39` closure can build on a broader owned restore-state window rather than another narrow one-off probe. The next company-side seam is now bundled too: a shared company market reader now exposes outstanding shares, assigned shares, public float, rounded cached share -price, salary lanes, bonus amount, and issue-calendar words from the owned annual-finance state -instead of leaving that logic spread across summary helpers. The same annual-finance state now also +price, salary lanes, bonus amount, and the full two-word current/prior issue-calendar tuples from +the owned annual-finance state instead of leaving that logic spread across summary helpers. The +same annual-finance state now also derives elapsed years since founding, last dividend, and last bankruptcy from the runtime calendar, which lines up directly with the grounded annual finance-policy gates in the atlas. Live bond-slot count is now carried through the same owned company market and annual-finance state too, which diff --git a/crates/rrt-runtime/src/import.rs b/crates/rrt-runtime/src/import.rs index 862ae11..5aac836 100644 --- a/crates/rrt-runtime/src/import.rs +++ b/crates/rrt-runtime/src/import.rs @@ -5057,7 +5057,9 @@ mod tests { last_bankruptcy_year: 0, last_dividend_year: 1837, current_issue_calendar_word: 5, + current_issue_calendar_word_2: 6, prior_issue_calendar_word: 4, + prior_issue_calendar_word_2: 5, city_connection_latch: true, linked_transit_latch: false, stat_band_root_0cfb_candidates: Vec::new(), @@ -5106,7 +5108,9 @@ mod tests { last_bankruptcy_year: 0, last_dividend_year: 0, current_issue_calendar_word: 3, + current_issue_calendar_word_2: 4, prior_issue_calendar_word: 2, + prior_issue_calendar_word_2: 3, city_connection_latch: false, linked_transit_latch: true, stat_band_root_0cfb_candidates: Vec::new(), @@ -6398,7 +6402,9 @@ mod tests { last_bankruptcy_year: 0, last_dividend_year: 1838, current_issue_calendar_word: 4, + current_issue_calendar_word_2: 5, prior_issue_calendar_word: 3, + prior_issue_calendar_word_2: 4, city_connection_latch: false, linked_transit_latch: true, stat_band_root_0cfb_candidates: Vec::new(), diff --git a/crates/rrt-runtime/src/runtime.rs b/crates/rrt-runtime/src/runtime.rs index 7c00b52..aba6367 100644 --- a/crates/rrt-runtime/src/runtime.rs +++ b/crates/rrt-runtime/src/runtime.rs @@ -85,8 +85,12 @@ pub struct RuntimeCompanyMarketState { #[serde(default)] pub current_issue_calendar_word: u32, #[serde(default)] + pub current_issue_calendar_word_2: u32, + #[serde(default)] pub prior_issue_calendar_word: u32, #[serde(default)] + pub prior_issue_calendar_word_2: u32, + #[serde(default)] pub city_connection_latch: bool, #[serde(default)] pub linked_transit_latch: bool, @@ -125,7 +129,11 @@ pub struct RuntimeCompanyAnnualFinanceState { #[serde(default)] pub years_since_last_dividend: Option, pub current_issue_calendar_word: u32, + #[serde(default)] + pub current_issue_calendar_word_2: u32, pub prior_issue_calendar_word: u32, + #[serde(default)] + pub prior_issue_calendar_word_2: u32, pub city_connection_latch: bool, pub linked_transit_latch: bool, } @@ -373,7 +381,9 @@ pub enum RuntimeCompanyMarketMetric { ChairmanSalaryCurrent, ChairmanBonusAmount, CurrentIssueCalendarWord, + CurrentIssueCalendarWord2, PriorIssueCalendarWord, + PriorIssueCalendarWord2, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] @@ -1955,7 +1965,9 @@ pub fn runtime_company_annual_finance_state( years_since_last_bankruptcy, years_since_last_dividend, current_issue_calendar_word: market_state.current_issue_calendar_word, + current_issue_calendar_word_2: market_state.current_issue_calendar_word_2, prior_issue_calendar_word: market_state.prior_issue_calendar_word, + prior_issue_calendar_word_2: market_state.prior_issue_calendar_word_2, city_connection_latch: market_state.city_connection_latch, linked_transit_latch: market_state.linked_transit_latch, }) @@ -1997,9 +2009,15 @@ pub fn runtime_company_market_value( RuntimeCompanyMarketMetric::CurrentIssueCalendarWord => { Some(annual_finance_state.current_issue_calendar_word as i64) } + RuntimeCompanyMarketMetric::CurrentIssueCalendarWord2 => { + Some(annual_finance_state.current_issue_calendar_word_2 as i64) + } RuntimeCompanyMarketMetric::PriorIssueCalendarWord => { Some(annual_finance_state.prior_issue_calendar_word as i64) } + RuntimeCompanyMarketMetric::PriorIssueCalendarWord2 => { + Some(annual_finance_state.prior_issue_calendar_word_2 as i64) + } } } @@ -4262,7 +4280,9 @@ mod tests { last_bankruptcy_year: 0, last_dividend_year: 1841, current_issue_calendar_word: 5, + current_issue_calendar_word_2: 6, prior_issue_calendar_word: 4, + prior_issue_calendar_word_2: 5, city_connection_latch: true, linked_transit_latch: false, ..RuntimeCompanyMarketState::default() @@ -4295,7 +4315,9 @@ mod tests { years_since_last_bankruptcy: None, years_since_last_dividend: None, current_issue_calendar_word: 5, + current_issue_calendar_word_2: 6, prior_issue_calendar_word: 4, + prior_issue_calendar_word_2: 5, city_connection_latch: true, linked_transit_latch: false, }) @@ -4390,7 +4412,9 @@ mod tests { last_bankruptcy_year: 0, last_dividend_year: 1842, current_issue_calendar_word: 9, + current_issue_calendar_word_2: 10, prior_issue_calendar_word: 8, + prior_issue_calendar_word_2: 9, ..RuntimeCompanyMarketState::default() }, )]), @@ -4446,6 +4470,14 @@ mod tests { ), Some(9) ); + assert_eq!( + runtime_company_market_value( + &state, + 7, + RuntimeCompanyMarketMetric::CurrentIssueCalendarWord2 + ), + Some(10) + ); assert_eq!( runtime_company_market_value( &state, @@ -4454,6 +4486,14 @@ mod tests { ), Some(8) ); + assert_eq!( + runtime_company_market_value( + &state, + 7, + RuntimeCompanyMarketMetric::PriorIssueCalendarWord2 + ), + Some(9) + ); assert_eq!( runtime_company_market_value( &state, diff --git a/crates/rrt-runtime/src/smp.rs b/crates/rrt-runtime/src/smp.rs index 2b82728..530c9ea 100644 --- a/crates/rrt-runtime/src/smp.rs +++ b/crates/rrt-runtime/src/smp.rs @@ -3497,7 +3497,9 @@ 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_CURRENT_ISSUE_CALENDAR_OFFSET_2: usize = 0x16f; const SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET: usize = 0x173; +const SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET_2: usize = 0x177; 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; @@ -3511,7 +3513,7 @@ const SAVE_COMPANY_RECORD_STAT_BAND_ROOT_0CFB_OFFSET: usize = 0x0cfb; const SAVE_COMPANY_RECORD_STAT_BAND_ROOT_0D7F_OFFSET: usize = 0x0d7f; const SAVE_COMPANY_RECORD_STAT_BAND_ROOT_1C47_OFFSET: usize = 0x1c47; const SAVE_COMPANY_RECORD_STAT_BAND_ROOT_WINDOW_LEN_DWORDS: usize = 32; -const SAVE_COMPANY_RECORD_SCALAR_CANDIDATE_FIELDS: [(&str, usize); 7] = [ +const SAVE_COMPANY_RECORD_SCALAR_CANDIDATE_FIELDS: [(&str, usize); 9] = [ ("mutable_support_scalar", 0x4f), ("young_company_support_scalar", 0x57), ( @@ -3527,10 +3529,18 @@ const SAVE_COMPANY_RECORD_SCALAR_CANDIDATE_FIELDS: [(&str, usize); 7] = [ "current_issue_calendar_word", SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET, ), + ( + "current_issue_calendar_word_2", + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET_2, + ), ( "prior_issue_calendar_word", SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET, ), + ( + "prior_issue_calendar_word_2", + SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET_2, + ), ]; const SAVE_COMPANY_RECORD_POST_CAPACITY_CANDIDATE_FIELDS: [(&str, usize); 6] = [ ("post_capacity_word_1", 0x7684), @@ -3650,10 +3660,18 @@ fn parse_save_company_roster_probe( bytes, record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET, )?; + let current_issue_calendar_word_2 = read_u32_at( + bytes, + record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET_2, + )?; let prior_issue_calendar_word = read_u32_at( bytes, record_offset + SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET, )?; + let prior_issue_calendar_word_2 = read_u32_at( + bytes, + record_offset + SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET_2, + )?; let city_connection_latch = read_u8_at( bytes, record_offset + SAVE_COMPANY_RECORD_CITY_CONNECTION_LATCH_OFFSET, @@ -3725,7 +3743,9 @@ fn parse_save_company_roster_probe( last_bankruptcy_year, last_dividend_year, current_issue_calendar_word, + current_issue_calendar_word_2, prior_issue_calendar_word, + prior_issue_calendar_word_2, city_connection_latch, linked_transit_latch, stat_band_root_0cfb_candidates: stat_band_root_0cfb_candidates @@ -15958,7 +15978,9 @@ mod tests { last_bankruptcy_year, last_dividend_year, current_issue_calendar_word, + current_issue_calendar_word_2, prior_issue_calendar_word, + prior_issue_calendar_word_2, city_connection_latch, linked_transit_latch, ), @@ -15984,7 +16006,9 @@ mod tests { 1851u32, 1848u32, 7u32, + 8u32, 6u32, + 7u32, true, false, ), @@ -16009,7 +16033,9 @@ mod tests { 0u32, 1850u32, 3u32, + 4u32, 2u32, + 3u32, false, true, ), @@ -16095,9 +16121,15 @@ mod tests { 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()); + bytes[record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET_2 + ..record_offset + SAVE_COMPANY_RECORD_CURRENT_ISSUE_CALENDAR_OFFSET_2 + 4] + .copy_from_slice(¤t_issue_calendar_word_2.to_le_bytes()); bytes[record_offset + SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET ..record_offset + SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET + 4] .copy_from_slice(&prior_issue_calendar_word.to_le_bytes()); + bytes[record_offset + SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET_2 + ..record_offset + SAVE_COMPANY_RECORD_PRIOR_ISSUE_CALENDAR_OFFSET_2 + 4] + .copy_from_slice(&prior_issue_calendar_word_2.to_le_bytes()); bytes[record_offset + SAVE_COMPANY_RECORD_CITY_CONNECTION_LATCH_OFFSET] = u8::from(city_connection_latch); bytes[record_offset + SAVE_COMPANY_RECORD_LINKED_TRANSIT_LATCH_OFFSET] = @@ -16177,7 +16209,9 @@ mod tests { 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_2, 8); assert_eq!(market_state.prior_issue_calendar_word, 6); + assert_eq!(market_state.prior_issue_calendar_word_2, 7); assert!(market_state.city_connection_latch); assert!(!market_state.linked_transit_latch); assert_eq!( @@ -16221,7 +16255,9 @@ mod tests { 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_2, 4); assert_eq!(second_market_state.prior_issue_calendar_word, 2); + assert_eq!(second_market_state.prior_issue_calendar_word_2, 3); assert!(!second_market_state.city_connection_latch); assert!(second_market_state.linked_transit_latch); } diff --git a/crates/rrt-runtime/src/summary.rs b/crates/rrt-runtime/src/summary.rs index 1bbfc5e..5a8d78d 100644 --- a/crates/rrt-runtime/src/summary.rs +++ b/crates/rrt-runtime/src/summary.rs @@ -1981,7 +1981,9 @@ mod tests { last_bankruptcy_year: 0, last_dividend_year: 1841, current_issue_calendar_word: 5, + current_issue_calendar_word_2: 6, prior_issue_calendar_word: 4, + prior_issue_calendar_word_2: 5, city_connection_latch: true, linked_transit_latch: false, stat_band_root_0cfb_candidates: vec![ diff --git a/docs/README.md b/docs/README.md index 9460944..b391893 100644 --- a/docs/README.md +++ b/docs/README.md @@ -124,9 +124,9 @@ The highest-value next passes are now: reader seam for assigned shares, public float, and rounded cached share price; the fixed-world finance neighborhood is now widened to 16 dwords rooted at `[world+0x11]` so later issue-family closure can target a broader owned restore-state window; the same annual-finance state now also - feeds a shared company market reader for stock-capital, salary, bonus, and issue-calendar values, - and now derives elapsed years since founding, last dividend, and last bankruptcy for later annual - finance-policy rehosting; live bond-slot count now travels through that same owned annual-finance + feeds a shared company market reader for stock-capital, salary, bonus, and the full two-word + current/prior issue-calendar tuples, and now derives elapsed years since founding, last dividend, + and last bankruptcy for later annual finance-policy rehosting; live bond-slot count now travels through that same owned annual-finance state for the stock-capital branch gate, and the grounded bond table now also contributes both the largest live bond principal and the chosen highest-coupon live bond principal into that same owner-state surface diff --git a/docs/runtime-rehost-plan.md b/docs/runtime-rehost-plan.md index 88faa10..c53bfc7 100644 --- a/docs/runtime-rehost-plan.md +++ b/docs/runtime-rehost-plan.md @@ -212,10 +212,10 @@ cached share price, which is a better base for later dividend / issue-calendar s scattered single-field helpers. The fixed-world finance neighborhood is now widened to 16 dwords rooted at `[world+0x11]`, so later issue-`0x38/0x39` closure can build on a broader owned restore-state window instead of another narrow probe. The same owned company annual-finance state -now also drives a shared company market reader seam for stock-capital, salary, bonus, and -issue-calendar values, which is a better base for shellless finance simulation than summary-only -helpers. That same owned annual-finance state now also derives elapsed years since founding, last -dividend, and last bankruptcy from the runtime calendar, which lines up directly with the grounded +now also drives a shared company market reader seam for stock-capital, salary, bonus, and the full +two-word current/prior issue-calendar tuples, which is a better base for shellless finance +simulation than summary-only helpers. That same owned annual-finance state now also derives elapsed +years since founding, last dividend, and last bankruptcy from the runtime calendar, which lines up directly with the grounded annual finance-policy gates in the atlas. Live bond-slot count now also flows through that same owned company market and annual-finance state, matching the stock-capital branch gate that needs at least two live bonds. The same grounded bond table now also contributes both the largest live