use crate::{map_parameters::MapParameters, ruleset::Ruleset, tile_map::TileMap};
pub mod fractal;
pub mod pangaea;
pub trait Generator {
fn new(map_parameters: &MapParameters) -> Self;
fn into_inner(self) -> TileMap;
fn tile_map_mut(&mut self) -> &mut TileMap;
fn generate_terrain_types(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut().generate_terrain_types(map_parameters);
}
fn shift_terrain_types(&mut self) {
self.tile_map_mut().shift_terrain_types();
}
fn recalculate_areas(&mut self, ruleset: &Ruleset) {
self.tile_map_mut().recalculate_areas(ruleset);
}
fn generate_lakes(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut().generate_lakes(map_parameters);
}
fn generate_base_terrains(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut().generate_base_terrains(map_parameters);
}
fn expand_coasts(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut().expand_coasts(map_parameters);
}
fn add_rivers(&mut self) {
self.tile_map_mut().add_rivers();
}
fn add_lakes(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut().add_lakes(map_parameters);
}
fn add_features(&mut self, map_parameters: &MapParameters, ruleset: &Ruleset) {
self.tile_map_mut().add_features(map_parameters, ruleset);
}
fn generate_regions(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut().generate_regions(map_parameters);
}
fn choose_civilization_starting_tiles(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut()
.choose_civilization_starting_tiles(map_parameters);
}
fn balance_and_assign_civilization_starting_tiles(
&mut self,
map_parameters: &MapParameters,
ruleset: &Ruleset,
) {
self.tile_map_mut()
.balance_and_assign_civilization_starting_tiles(map_parameters, ruleset);
}
fn place_natural_wonders(&mut self, map_parameters: &MapParameters, ruleset: &Ruleset) {
self.tile_map_mut()
.place_natural_wonders(map_parameters, ruleset);
}
fn assign_luxury_roles(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut().assign_luxury_roles(map_parameters);
}
fn place_city_states(&mut self, map_parameters: &MapParameters, ruleset: &Ruleset) {
self.tile_map_mut()
.place_city_states(map_parameters, ruleset);
}
fn place_luxury_resources(&mut self, map_parameters: &MapParameters, ruleset: &Ruleset) {
self.tile_map_mut()
.place_luxury_resources(map_parameters, ruleset);
}
fn place_strategic_resources(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut()
.place_strategic_resources(map_parameters);
}
fn place_bonus_resources(&mut self, map_parameters: &MapParameters) {
self.tile_map_mut().place_bonus_resources(map_parameters);
}
fn normalize_city_state_locations(&mut self) {
self.tile_map_mut().normalize_city_state_locations();
}
fn fix_sugar_jungles(&mut self) {
self.tile_map_mut().fix_sugar_jungles();
}
fn generate(map_parameters: &MapParameters, ruleset: &Ruleset) -> TileMap
where
Self: Sized,
{
let mut map = Self::new(map_parameters);
map.generate_terrain_types(map_parameters);
map.shift_terrain_types();
map.recalculate_areas(ruleset);
map.generate_lakes(map_parameters);
map.generate_base_terrains(map_parameters);
map.expand_coasts(map_parameters);
map.add_rivers();
map.add_lakes(map_parameters);
map.recalculate_areas(ruleset);
map.add_features(map_parameters, ruleset);
map.recalculate_areas(ruleset);
map.generate_regions(map_parameters);
map.choose_civilization_starting_tiles(map_parameters);
map.balance_and_assign_civilization_starting_tiles(map_parameters, ruleset);
map.place_natural_wonders(map_parameters, ruleset);
map.assign_luxury_roles(map_parameters);
map.place_city_states(map_parameters, ruleset);
map.place_luxury_resources(map_parameters, ruleset);
map.place_strategic_resources(map_parameters);
map.place_bonus_resources(map_parameters);
map.normalize_city_state_locations();
map.fix_sugar_jungles();
map.recalculate_areas(ruleset);
map.into_inner()
}
}
#[macro_export]
macro_rules! generate_common_methods {
() => {
fn new(map_parameters: &MapParameters) -> Self {
Self(TileMap::new(map_parameters))
}
fn into_inner(self) -> TileMap {
self.0
}
fn tile_map_mut(&mut self) -> &mut TileMap {
&mut self.0
}
};
}