Skip to content

Commit

Permalink
Merge pull request #205 from OpenVicProject/modifier-types
Browse files Browse the repository at this point in the history
Modifier types
  • Loading branch information
Hop311 authored Sep 21, 2024
2 parents 118570d + 3fcdd0c commit e35ff8e
Show file tree
Hide file tree
Showing 16 changed files with 146 additions and 40 deletions.
3 changes: 2 additions & 1 deletion src/openvic-simulation/economy/BuildingType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ using namespace OpenVic::NodeTools;

BuildingType::BuildingType(
std::string_view identifier, building_type_args_t& building_type_args
) : Modifier { identifier, std::move(building_type_args.modifier) },
) : Modifier { identifier, std::move(building_type_args.modifier), modifier_type_t::BUILDING },
type { building_type_args.type },
on_completion { building_type_args.on_completion },
completion_size { building_type_args.completion_size },
Expand Down Expand Up @@ -154,6 +154,7 @@ bool BuildingTypeManager::load_buildings_file(
Logger::error("No port building type found!");
ret = false;
}

if (province_building_types.empty()) {
Logger::error("No province building types found!");
ret = false;
Expand Down
12 changes: 9 additions & 3 deletions src/openvic-simulation/map/Crime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@ using namespace OpenVic::NodeTools;
Crime::Crime(
std::string_view new_identifier, ModifierValue&& new_values, icon_t new_icon, ConditionScript&& new_trigger,
bool new_default_active
) : TriggeredModifier { new_identifier, std::move(new_values), new_icon, std::move(new_trigger) },
) : TriggeredModifier { new_identifier, std::move(new_values), modifier_type_t::CRIME, new_icon, std::move(new_trigger) },
default_active { new_default_active } {}

bool CrimeManager::add_crime_modifier(
std::string_view identifier, ModifierValue&& values, Modifier::icon_t icon, ConditionScript&& trigger, bool default_active
std::string_view identifier, ModifierValue&& values, IconModifier::icon_t icon, ConditionScript&& trigger,
bool default_active
) {
if (identifier.empty()) {
Logger::error("Invalid crime modifier effect identifier - empty!");
return false;
}

return crime_modifiers.add_item(
{ identifier, std::move(values), icon, std::move(trigger), default_active }, duplicate_warning_callback
);
Expand All @@ -26,7 +28,7 @@ bool CrimeManager::load_crime_modifiers(ModifierManager const& modifier_manager,
crime_modifiers,
[this, &modifier_manager](std::string_view key, ast::NodeCPtr value) -> bool {
ModifierValue modifier_value;
Modifier::icon_t icon = 0;
IconModifier::icon_t icon = 0;
ConditionScript trigger { scope_t::PROVINCE, scope_t::NO_SCOPE, scope_t::NO_SCOPE };
bool default_active = false;
bool ret = modifier_manager.expect_modifier_value_and_keys(
Expand All @@ -39,14 +41,18 @@ bool CrimeManager::load_crime_modifiers(ModifierManager const& modifier_manager,
return ret;
}
)(root);

lock_crime_modifiers();

return ret;
}

bool CrimeManager::parse_scripts(DefinitionManager const& definition_manager) {
bool ret = true;

for (Crime& crime : crime_modifiers.get_items()) {
ret &= crime.parse_scripts(definition_manager);
}

return ret;
}
2 changes: 1 addition & 1 deletion src/openvic-simulation/map/Crime.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace OpenVic {

public:
bool add_crime_modifier(
std::string_view identifier, ModifierValue&& values, Modifier::icon_t icon, ConditionScript&& trigger,
std::string_view identifier, ModifierValue&& values, IconModifier::icon_t icon, ConditionScript&& trigger,
bool default_active
);

Expand Down
4 changes: 2 additions & 2 deletions src/openvic-simulation/map/MapDefinition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -744,7 +744,7 @@ bool MapDefinition::load_climate_file(ModifierManager const& modifier_manager, a
if (cur_climate == nullptr) {
ModifierValue values;
ret &= modifier_manager.expect_modifier_value(move_variable_callback(values))(node);
ret &= climates.add_item({ identifier, std::move(values) });
ret &= climates.add_item({ identifier, std::move(values), Modifier::modifier_type_t::CLIMATE });
} else {
ret &= expect_list_reserve_length(*cur_climate, expect_province_definition_identifier(
[cur_climate, &identifier](ProvinceDefinition& province) {
Expand Down Expand Up @@ -807,7 +807,7 @@ bool MapDefinition::load_continent_file(ModifierManager const& modifier_manager,
))
)(node);

Continent continent = { identifier, std::move(values) };
Continent continent { identifier, std::move(values), Modifier::modifier_type_t::CONTINENT };
continent.add_provinces(prov_list);
continent.lock();

Expand Down
12 changes: 10 additions & 2 deletions src/openvic-simulation/map/Region.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,19 @@ bool ProvinceSet::add_province(ProvinceDefinition const* province) {
Logger::error("Cannot add province to province set - locked!");
return false;
}

if (province == nullptr) {
Logger::error("Cannot add province to province set - null province!");
return false;
}

if (contains_province(province)) {
Logger::warning("Cannot add province ", province->get_identifier(), " to province set - already in the set!");
return false;
}

provinces.push_back(province);

return true;
}

Expand All @@ -27,16 +31,20 @@ bool ProvinceSet::remove_province(ProvinceDefinition const* province) {
Logger::error("Cannot remove province from province set - locked!");
return false;
}

if (province == nullptr) {
Logger::error("Cannot remove province from province set - null province!");
return false;
}

const decltype(provinces)::const_iterator it = std::find(provinces.begin(), provinces.end(), province);
if (it == provinces.end()) {
Logger::warning("Cannot remove province ", province->get_identifier(), " from province set - already not in the set!");
return false;
}

provinces.erase(it);

return true;
}

Expand Down Expand Up @@ -84,8 +92,8 @@ bool ProvinceSet::contains_province(ProvinceDefinition const* province) const {
return province != nullptr && std::find(provinces.begin(), provinces.end(), province) != provinces.end();
}

ProvinceSetModifier::ProvinceSetModifier(std::string_view new_identifier, ModifierValue&& new_values)
: Modifier { new_identifier, std::move(new_values) } {}
ProvinceSetModifier::ProvinceSetModifier(std::string_view new_identifier, ModifierValue&& new_values, modifier_type_t new_type)
: Modifier { new_identifier, std::move(new_values), new_type } {}

Region::Region(std::string_view new_identifier, colour_t new_colour, bool new_meta)
: HasIdentifierAndColour { new_identifier, new_colour, false }, meta { new_meta } {}
2 changes: 1 addition & 1 deletion src/openvic-simulation/map/Region.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ namespace OpenVic {
struct ProvinceSetModifier : Modifier, ProvinceSet {
friend struct MapDefinition;
private:
ProvinceSetModifier(std::string_view new_identifier, ModifierValue&& new_values);
ProvinceSetModifier(std::string_view new_identifier, ModifierValue&& new_values, modifier_type_t new_type);
public:
ProvinceSetModifier(ProvinceSetModifier&&) = default;
};
Expand Down
22 changes: 21 additions & 1 deletion src/openvic-simulation/map/TerrainType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ using namespace OpenVic::NodeTools;

TerrainType::TerrainType(
std::string_view new_identifier, colour_t new_colour, ModifierValue&& new_modifier, bool new_is_water
) : Modifier { new_identifier, std::move(new_modifier) }, HasColour { new_colour, false }, is_water { new_is_water } {}
) : Modifier { new_identifier, std::move(new_modifier), modifier_type_t::TERRAIN }, HasColour { new_colour, false },
is_water { new_is_water } {}

TerrainTypeMapping::TerrainTypeMapping(
std::string_view new_identifier, TerrainType const& new_type, std::vector<index_t>&& new_terrain_indicies,
Expand All @@ -22,6 +23,7 @@ bool TerrainTypeManager::add_terrain_type(
Logger::error("Invalid terrain type identifier - empty!");
return false;
}

return terrain_types.add_item({ identifier, colour, std::move(values), is_water });
}

Expand All @@ -33,17 +35,22 @@ bool TerrainTypeManager::add_terrain_type_mapping(
Logger::error("Cannot register terrain type mappings until terrain types are locked!");
return false;
}

if (identifier.empty()) {
Logger::error("Invalid terrain type mapping identifier - empty!");
return false;
}

if (type == nullptr) {
Logger::error("Null terrain type for mapping ", identifier);
return false;
}

bool ret = true;

for (TerrainTypeMapping::index_t idx : terrain_indicies) {
const terrain_type_mappings_map_t::const_iterator it = terrain_type_mappings_map.find(idx);

if (it == terrain_type_mappings_map.end()) {
terrain_type_mappings_map.emplace(idx, terrain_type_mappings.size());
} else {
Expand All @@ -54,7 +61,9 @@ bool TerrainTypeManager::add_terrain_type_mapping(
ret = false;
}
}

ret &= terrain_type_mappings.add_item({ identifier, *type, std::move(terrain_indicies), priority, has_texture });

return ret;
}

Expand All @@ -73,7 +82,9 @@ node_callback_t TerrainTypeManager::_load_terrain_type_categories(ModifierManage
return ret;
}
)(root);

lock_terrain_types();

return ret;
};
}
Expand All @@ -83,10 +94,12 @@ bool TerrainTypeManager::_load_terrain_type_mapping(std::string_view mapping_key
Logger::error("Cannot define terrain type mapping before terrain texture limit: ", mapping_key);
return false;
}

if (!terrain_types_are_locked()) {
Logger::error("Cannot define terrain type mapping before categories: ", mapping_key);
return false;
}

TerrainType const* type = nullptr;
std::vector<TerrainTypeMapping::index_t> terrain_indicies;
TerrainTypeMapping::index_t priority = 0;
Expand All @@ -107,18 +120,23 @@ bool TerrainTypeManager::_load_terrain_type_mapping(std::string_view mapping_key
"priority", ZERO_OR_ONE, expect_uint(assign_variable_callback(priority)),
"has_texture", ZERO_OR_ONE, expect_bool(assign_variable_callback(has_texture))
)(mapping_value);

if (has_texture && ++terrain_texture_count == terrain_texture_limit + 1) {
Logger::warning("More terrain textures than limit!");
}

ret &= add_terrain_type_mapping(mapping_key, type, std::move(terrain_indicies), priority, has_texture);

return true;
}

TerrainTypeMapping const* TerrainTypeManager::get_terrain_type_mapping_for(TerrainTypeMapping::index_t idx) const {
const terrain_type_mappings_map_t::const_iterator it = terrain_type_mappings_map.find(idx);

if (it != terrain_type_mappings_map.end()) {
return terrain_type_mappings.get_item_by_index(it->second);
}

return nullptr;
}

Expand All @@ -135,6 +153,8 @@ bool TerrainTypeManager::load_terrain_types(ModifierManager const& modifier_mana
"terrain", ONE_EXACTLY, expect_uint(assign_variable_callback(terrain_texture_limit)),
"categories", ONE_EXACTLY, _load_terrain_type_categories(modifier_manager)
)(root);

lock_terrain_type_mappings();

return ret;
}
2 changes: 1 addition & 1 deletion src/openvic-simulation/military/LeaderTrait.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ using namespace OpenVic;
using namespace OpenVic::NodeTools;

LeaderTrait::LeaderTrait(std::string_view new_identifier, trait_type_t new_type, ModifierValue&& new_modifiers)
: Modifier { new_identifier, std::move(new_modifiers) }, trait_type { new_type } {}
: Modifier { new_identifier, std::move(new_modifiers), modifier_type_t::LEADER }, trait_type { new_type } {}

bool LeaderTrait::is_personality_trait() const {
return trait_type == trait_type_t::PERSONALITY;
Expand Down
45 changes: 34 additions & 11 deletions src/openvic-simulation/modifier/Modifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,17 @@ void ModifierValue::multiply_add(ModifierValue const& other, fixed_point_t multi
}
}

Modifier::Modifier(std::string_view new_identifier, ModifierValue&& new_values, icon_t new_icon)
: HasIdentifier { new_identifier }, ModifierValue { std::move(new_values) }, icon { new_icon } {}
Modifier::Modifier(std::string_view new_identifier, ModifierValue&& new_values, modifier_type_t new_type)
: HasIdentifier { new_identifier }, ModifierValue { std::move(new_values) }, type { new_type } {}

IconModifier::IconModifier(
std::string_view new_identifier, ModifierValue&& new_values, modifier_type_t new_type, icon_t new_icon
) : Modifier { new_identifier, std::move(new_values), new_type }, icon { new_icon } {}

TriggeredModifier::TriggeredModifier(
std::string_view new_identifier, ModifierValue&& new_values, icon_t new_icon, ConditionScript&& new_trigger
) : Modifier { new_identifier, std::move(new_values), new_icon }, trigger { std::move(new_trigger) } {}
std::string_view new_identifier, ModifierValue&& new_values, modifier_type_t new_type, icon_t new_icon,
ConditionScript&& new_trigger
) : IconModifier { new_identifier, std::move(new_values), new_type, new_icon }, trigger { std::move(new_trigger) } {}

bool TriggeredModifier::parse_scripts(DefinitionManager const& definition_manager) {
return trigger.parse_script(false, definition_manager);
Expand Down Expand Up @@ -404,20 +409,23 @@ std::string ModifierManager::get_flat_identifier(
return StringUtils::append_string_views(complex_modifier_identifier, " ", variant_identifier);
}

bool ModifierManager::add_event_modifier(std::string_view identifier, ModifierValue&& values, Modifier::icon_t icon) {
bool ModifierManager::add_event_modifier(std::string_view identifier, ModifierValue&& values, IconModifier::icon_t icon) {
if (identifier.empty()) {
Logger::error("Invalid event modifier effect identifier - empty!");
return false;
}
return event_modifiers.add_item({ identifier, std::move(values), icon }, duplicate_warning_callback);

return event_modifiers.add_item(
{ identifier, std::move(values), Modifier::modifier_type_t::EVENT, icon }, duplicate_warning_callback
);
}

bool ModifierManager::load_event_modifiers(ast::NodeCPtr root) {
const bool ret = expect_dictionary_reserve_length(
event_modifiers,
[this](std::string_view key, ast::NodeCPtr value) -> bool {
ModifierValue modifier_value;
Modifier::icon_t icon = 0;
IconModifier::icon_t icon = 0;
bool ret = expect_modifier_value_and_keys(
move_variable_callback(modifier_value),
"icon", ZERO_OR_ONE, expect_uint(assign_variable_callback(icon))
Expand All @@ -426,7 +434,9 @@ bool ModifierManager::load_event_modifiers(ast::NodeCPtr root) {
return ret;
}
)(root);

lock_event_modifiers();

return ret;
}

Expand All @@ -435,7 +445,10 @@ bool ModifierManager::add_static_modifier(std::string_view identifier, ModifierV
Logger::error("Invalid static modifier effect identifier - empty!");
return false;
}
return static_modifiers.add_item({ identifier, std::move(values), 0 }, duplicate_warning_callback);

return static_modifiers.add_item(
{ identifier, std::move(values), Modifier::modifier_type_t::STATIC }, duplicate_warning_callback
);
}

bool ModifierManager::load_static_modifiers(ast::NodeCPtr root) {
Expand All @@ -448,26 +461,32 @@ bool ModifierManager::load_static_modifiers(ast::NodeCPtr root) {
return ret;
}
)(root);

lock_static_modifiers();

return ret;
}

bool ModifierManager::add_triggered_modifier(
std::string_view identifier, ModifierValue&& values, Modifier::icon_t icon, ConditionScript&& trigger
std::string_view identifier, ModifierValue&& values, IconModifier::icon_t icon, ConditionScript&& trigger
) {
if (identifier.empty()) {
Logger::error("Invalid triggered modifier effect identifier - empty!");
return false;
}
return triggered_modifiers.add_item({ identifier, std::move(values), icon, std::move(trigger) }, duplicate_warning_callback);

return triggered_modifiers.add_item(
{ identifier, std::move(values), Modifier::modifier_type_t::TRIGGERED, icon, std::move(trigger) },
duplicate_warning_callback
);
}

bool ModifierManager::load_triggered_modifiers(ast::NodeCPtr root) {
const bool ret = expect_dictionary_reserve_length(
triggered_modifiers,
[this](std::string_view key, ast::NodeCPtr value) -> bool {
ModifierValue modifier_value;
Modifier::icon_t icon = 0;
IconModifier::icon_t icon = 0;
ConditionScript trigger { scope_t::COUNTRY, scope_t::COUNTRY, scope_t::NO_SCOPE };

bool ret = expect_modifier_value_and_keys(
Expand All @@ -479,15 +498,19 @@ bool ModifierManager::load_triggered_modifiers(ast::NodeCPtr root) {
return ret;
}
)(root);

lock_triggered_modifiers();

return ret;
}

bool ModifierManager::parse_scripts(DefinitionManager const& definition_manager) {
bool ret = true;

for (TriggeredModifier& modifier : triggered_modifiers.get_items()) {
ret &= modifier.parse_scripts(definition_manager);
}

return ret;
}

Expand Down
Loading

0 comments on commit e35ff8e

Please sign in to comment.