use super::Plugin;
use crate::record::Record;
use crate::group::{Group, GroupChild};
impl Plugin {
pub fn eslify_formids(&mut self) -> Result<(), Box<dyn std::error::Error>> {
let mut all_records = Vec::new();
for group in &mut self.groups {
Self::extract_group_records_mut(group, &mut all_records);
}
let mut current_formid = 0x800u32;
for record in all_records {
let master_index = (record.form_id >> 24) as usize;
if master_index >= self.masters.len() {
let high_bits = record.form_id & 0xFFFFF000;
let new_formid = high_bits | (current_formid & 0xFFF);
record.form_id = new_formid;
record.is_modified = true;
current_formid += 1;
if current_formid > 0xFFF {
return Err(format!(
"ESL 插件记录数超过限制!最多支持 2048 个记录,当前已处理 {} 个",
current_formid - 0x800
).into());
}
}
}
#[cfg(debug_assertions)]
println!("ESL FormID 重编号完成:共 {} 个记录", current_formid - 0x800);
Ok(())
}
fn extract_group_records_mut<'a>(
group: &'a mut Group,
records: &mut Vec<&'a mut Record>
) {
for child in &mut group.children {
match child {
GroupChild::Record(record) => records.push(record),
GroupChild::Group(nested_group) => {
Self::extract_group_records_mut(nested_group, records);
}
}
}
}
}