Rehost direct company control-transfer field band

This commit is contained in:
Jan Petykiewicz 2026-04-17 23:33:17 -07:00
commit 87e8742f37
6 changed files with 343 additions and 8 deletions

View file

@ -3609,6 +3609,11 @@ const SAVE_COMPANY_RECORD_YEAR_STAT_FAMILY_QWORD_COUNT: usize =
* crate::runtime::RUNTIME_COMPANY_YEAR_STAT_FAMILY_SPAN as usize;
const SAVE_COMPANY_RECORD_SPECIAL_STAT_FAMILY_232A_QWORD_COUNT: usize =
crate::runtime::RUNTIME_COMPANY_STAT_SLOT_COUNT as usize;
const SAVE_COMPANY_RECORD_DIRECT_CONTROL_TRANSFER_FLOAT_FIELDS: [usize; 10] = [
0x4b, 0x53, 0x323, 0x327, 0x32b, 0x32f, 0x333, 0x337, 0x33b, 0x33f,
];
const SAVE_COMPANY_RECORD_DIRECT_CONTROL_TRANSFER_INT_FIELDS: [usize; 5] =
[0x14f, 0x34b, 0x0d0b, 0x0d0f, 0x0d13];
const SAVE_COMPANY_RECORD_SCALAR_CANDIDATE_FIELDS: [(&str, usize); 9] = [
("mutable_support_scalar", 0x4f),
("young_company_support_scalar", 0x57),
@ -3821,6 +3826,16 @@ fn parse_save_company_roster_probe(
SAVE_COMPANY_RECORD_STAT_BAND_ROOT_1C47_OFFSET,
SAVE_COMPANY_RECORD_SPECIAL_STAT_FAMILY_232A_QWORD_COUNT,
)?;
let direct_control_transfer_float_fields_raw_u32 = build_save_u32_field_map(
bytes,
record_offset,
&SAVE_COMPANY_RECORD_DIRECT_CONTROL_TRANSFER_FLOAT_FIELDS,
)?;
let direct_control_transfer_int_fields_raw_u32 = build_save_u32_field_map(
bytes,
record_offset,
&SAVE_COMPANY_RECORD_DIRECT_CONTROL_TRANSFER_INT_FIELDS,
)?;
let issue_opinion_terms_raw_i32 = build_save_i32_term_strip(
bytes,
record_offset,
@ -3888,6 +3903,8 @@ fn parse_save_company_roster_probe(
year_stat_family_qword_bits,
special_stat_family_232a_qword_bits,
issue_opinion_terms_raw_i32,
direct_control_transfer_float_fields_raw_u32,
direct_control_transfer_int_fields_raw_u32,
}),
});
}
@ -3959,6 +3976,21 @@ fn build_save_i32_term_strip(
.collect::<Option<Vec<_>>>()
}
fn build_save_u32_field_map(
bytes: &[u8],
record_offset: usize,
offsets: &[usize],
) -> Option<BTreeMap<u32, u32>> {
let mut fields = BTreeMap::new();
for relative_offset in offsets {
fields.insert(
u32::try_from(*relative_offset).ok()?,
read_u32_at(bytes, record_offset + *relative_offset)?,
);
}
Some(fields)
}
fn decode_save_company_current_year_stat_slot(
year_stat_family_qword_bits: &[u64],
slot_id: u32,