use super::ConvertError;
use crate::{Scenario, ScenarioObject, Tile, Trigger, UnitTypeID};
use nohash_hasher::IntMap;
pub struct AoCToWK {
object_ids_map: IntMap<i32, UnitTypeID>,
terrain_ids_map: IntMap<u8, u8>,
}
impl Default for AoCToWK {
fn default() -> Self {
let object_ids_map = [
(1103, 529), (529, 1103), (1104, 527), (527, 1104), ]
.iter()
.map(|(a, b)| (*a, UnitTypeID::from(*b)))
.collect();
let terrain_ids_map = [
(11, 3), (16, 0), (20, 19), ]
.iter()
.map(|(a, b)| (*a, *b))
.collect();
Self {
object_ids_map,
terrain_ids_map,
}
}
}
impl AoCToWK {
fn convert_object(&self, object: &mut ScenarioObject) {
if let Some(new_type) = self.object_ids_map.get(&object.object_type.into()) {
object.object_type = *new_type;
}
}
fn convert_trigger(&self, trigger: &mut Trigger) {
trigger.conditions_unordered_mut().for_each(|cond| {
if let Some(new_type) = self.object_ids_map.get(&cond.unit_type().into()) {
cond.set_unit_type(*new_type);
}
if let Some(new_type) = self.object_ids_map.get(&cond.object_type().into()) {
cond.set_object_type(*new_type);
}
});
trigger.effects_unordered_mut().for_each(|effect| {
if let Some(new_type) = self.object_ids_map.get(&effect.unit_type().into()) {
effect.set_unit_type(*new_type);
}
if let Some(new_type) = self.object_ids_map.get(&effect.object_type().into()) {
effect.set_object_type(*new_type);
}
});
}
fn convert_terrain(&self, tile: &mut Tile) {
if let Some(new_type) = self.terrain_ids_map.get(&tile.terrain) {
tile.terrain = *new_type;
}
}
pub fn convert(&self, scen: &mut Scenario) -> Result<(), ConvertError> {
for object in scen.objects_mut() {
self.convert_object(object);
}
for tile in scen.map_mut().tiles_mut() {
self.convert_terrain(tile);
}
if let Some(trigger_system) = scen.triggers_mut() {
for trigger in trigger_system.triggers_unordered_mut() {
self.convert_trigger(trigger);
}
}
Ok(())
}
}