Carry full company issue calendar tuples

This commit is contained in:
Jan Petykiewicz 2026-04-17 21:34:53 -07:00
commit 126a637bc2
7 changed files with 95 additions and 10 deletions

View file

@ -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

View file

@ -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(),

View file

@ -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<u32>,
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,

View file

@ -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(&current_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(&current_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);
}

View file

@ -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![

View file

@ -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

View file

@ -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