aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/military/Unit.cpp
diff options
context:
space:
mode:
author zaaarf <zaaarf@proton.me>2023-11-30 21:20:37 +0100
committer zaaarf <zaaarf@proton.me>2023-12-02 01:12:12 +0100
commitc935e471782764dcc10a3175741a02ab3ffffa8e (patch)
tree49016457c09ef3583b200a8bd016dc702b6e298e /src/openvic-simulation/military/Unit.cpp
parent51583b66feb1d13b285bb2e9c05364659c854130 (diff)
feat: implemented modifier identifier flattening, added/fixed remaining tech modifiers effects
Diffstat (limited to 'src/openvic-simulation/military/Unit.cpp')
-rw-r--r--src/openvic-simulation/military/Unit.cpp61
1 files changed, 55 insertions, 6 deletions
diff --git a/src/openvic-simulation/military/Unit.cpp b/src/openvic-simulation/military/Unit.cpp
index fce4082..1c4efcf 100644
--- a/src/openvic-simulation/military/Unit.cpp
+++ b/src/openvic-simulation/military/Unit.cpp
@@ -132,7 +132,7 @@ bool UnitManager::load_unit_file(GoodManager const& good_manager, ast::NodeCPtr
bool primary_culture = false;
std::string_view sprite_override {}, sprite_mount {}, sprite_mount_attach_node {};
fixed_point_t reconnaissance = 0, attack = 0, defence = 0, discipline = 0, support = 0, maneuver = 0, siege = 0;
-
+
ret &= add_key_map_entries(key_map,
"primary_culture", ZERO_OR_ONE, expect_bool(assign_variable_callback(primary_culture)),
"sprite_override", ZERO_OR_ONE, expect_identifier(assign_variable_callback(sprite_override)),
@@ -146,9 +146,9 @@ bool UnitManager::load_unit_file(GoodManager const& good_manager, ast::NodeCPtr
"maneuver", ONE_EXACTLY, expect_fixed_point(assign_variable_callback(maneuver)),
"siege", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(siege))
);
-
+
ret &= expect_dictionary_key_map(key_map)(value);
-
+
ret &= add_land_unit(key, UNIT_ARGS, LAND_ARGS);
return ret;
@@ -180,12 +180,61 @@ bool UnitManager::load_unit_file(GoodManager const& good_manager, ast::NodeCPtr
);
ret &= expect_dictionary_key_map(key_map)(value);
-
+
ret &= add_naval_unit(key, UNIT_ARGS, NAVY_ARGS);
-
+
return ret;
}
- default: Logger::error("Unknown unit type for ", key, ": ", static_cast<int>(type)); return false;
+ default: Logger::error("Unknown unit type for ", key, ": ", static_cast<int>(type)); return false;
}
})(root);
}
+
+#define STAT_MODIFIER(name, positive_good, format) \
+ ret &= modifier_manager.add_modifier_effect(base_name + name, positive_good, ModifierEffect::format_t::format)
+
+bool UnitManager::generate_modifiers(ModifierManager& modifier_manager) {
+ std::function<bool(std::string_view, Unit::type_t)> generate_stat_modifiers = [this, &modifier_manager](std::string_view identifier, Unit::type_t type) -> bool {
+ modifier_manager.register_complex_modifier(identifier);
+ std::string base_name = std::string(identifier) + "_";
+ bool ret = true;
+
+ STAT_MODIFIER("default_organisation", true, RAW_DECIMAL);
+ STAT_MODIFIER("maximum_speed", true, RAW_DECIMAL);
+ STAT_MODIFIER("build_time", false, INT);
+ STAT_MODIFIER("supply_consumption", false, PROPORTION_DECIMAL);
+
+ switch (type) {
+ case Unit::type_t::LAND: {
+ STAT_MODIFIER("reconnaissance", true, RAW_DECIMAL);
+ STAT_MODIFIER("attack", true, RAW_DECIMAL);
+ STAT_MODIFIER("defence", true, RAW_DECIMAL);
+ STAT_MODIFIER("discipline", true, PROPORTION_DECIMAL);
+ STAT_MODIFIER("support", true, PROPORTION_DECIMAL);
+ STAT_MODIFIER("maneuver", true, INT);
+ STAT_MODIFIER("siege", true, RAW_DECIMAL);
+ break;
+ }
+ case Unit::type_t::NAVAL: {
+ STAT_MODIFIER("colonial_points", true, INT);
+ STAT_MODIFIER("supply_consumption_score", false, INT);
+ STAT_MODIFIER("hull", true, RAW_DECIMAL);
+ STAT_MODIFIER("gun_power", true, RAW_DECIMAL);
+ STAT_MODIFIER("fire_range", true, RAW_DECIMAL);
+ STAT_MODIFIER("evasion", true, PROPORTION_DECIMAL);
+ STAT_MODIFIER("torpedo_attack", true, RAW_DECIMAL);
+ break;
+ }
+ }
+
+ return ret;
+ };
+
+ bool ret = true;
+ ret &= generate_stat_modifiers("army_base", Unit::type_t::LAND);
+ ret &= generate_stat_modifiers("navy_base", Unit::type_t::NAVAL);
+ for (Unit const& unit : this->get_units())
+ ret &= generate_stat_modifiers(unit.get_identifier(), unit.get_type());
+
+ return ret;
+} \ No newline at end of file