use super::ConvertError;
use crate::{Scenario, ScenarioObject, Tile, Trigger, UnitTypeID};
use nohash_hasher::IntMap;
pub struct HDToWK {
object_ids_map: IntMap<i32, UnitTypeID>,
terrain_ids_map: IntMap<u8, u8>,
}
impl Default for HDToWK {
fn default() -> Self {
let object_ids_map = [
(1103, 529), (529, 1103), (1104, 527), (527, 1104), (1001, 106), (1003, 114), (1006, 183), (1007, 203), (1009, 208), (1010, 223), (1012, 230), (1013, 260), (1015, 418), (1016, 453), (1018, 459), (1103, 467), (1105, 494), (1104, 653), (947, 699), (948, 701), (1079, 732), (1021, 734), (1120, 760), (1155, 762), (1134, 766), (1132, 774), (1131, 782), (1129, 784), (1128, 811), (1126, 823), (1125, 830), (1123, 836), (946, 848), (1004, 861), (1122, 891), ]
.iter()
.map(|(a, b)| (*a, UnitTypeID::from(*b)))
.collect();
let terrain_ids_map = [
(38, 33), (45, 38), (54, 11), (55, 20), (50, 41), (49, 16), (11, 3), (16, 0), (20, 19), ]
.iter()
.map(|(a, b)| (*a, *b))
.collect();
Self {
object_ids_map,
terrain_ids_map,
}
}
}
impl HDToWK {
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(())
}
}