tiger_lib/ck3/data/
modifiers.rs#![allow(non_upper_case_globals)]
use crate::block::Block;
use crate::context::ScopeContext;
use crate::db::{Db, DbKind};
use crate::everything::Everything;
use crate::game::GameFlags;
use crate::item::{Item, ItemLoader};
use crate::modif::{validate_modifs, ModifKinds};
use crate::token::Token;
use crate::validator::Validator;
#[derive(Clone, Debug)]
pub struct Modifier {}
inventory::submit! {
ItemLoader::Normal(GameFlags::Ck3, Item::Modifier, Modifier::add)
}
impl Modifier {
pub fn add(db: &mut Db, key: Token, block: Block) {
db.add_exact_dup_ok(Item::Modifier, key, block, Box::new(Self {}));
}
}
impl DbKind for Modifier {
fn validate(&self, key: &Token, block: &Block, data: &Everything) {
let mut vd = Validator::new(block, data);
data.mark_used(Item::Localization, key.as_str());
let loca = format!("{key}_desc");
data.mark_used(Item::Localization, &loca);
vd.field_icon("icon", "NGameIcons|STATICMODIFIER_ICON_PATH", ".dds");
vd.field_bool("stacking");
vd.field_bool("hide_effects");
vd.field_block("scale");
validate_modifs(block, data, ModifKinds::all(), vd);
}
fn validate_call(
&self,
_key: &Token,
block: &Block,
_from: &Token,
_from_block: &Block,
data: &Everything,
sc: &mut ScopeContext,
) {
let mut vd = Validator::new(block, data);
vd.field_validated_block("scale", |block, data| {
let mut vd = Validator::new(block, data);
vd.req_field("value");
vd.field_script_value("value", sc);
vd.field_item("desc", Item::Localization);
vd.field_choice("display_mode", &["scaled"]);
});
vd.no_warn_remaining();
}
fn validate_property_use(
&self,
_key: &Token,
block: &Block,
_property: &Token,
caller: &str,
data: &Everything,
) {
let mut vd = Validator::new(block, data);
vd.field("icon");
vd.field("stacking");
vd.field("hide_effects");
vd.field("scale");
validate_modifs(block, data, get_modif_kinds(caller), vd);
}
}
fn get_modif_kinds(name: &str) -> ModifKinds {
for substr in [
"artifact_modifier",
"character_modifier",
"dynasty_modifier",
"house_modifier",
"house_unity_modifier",
"legend_owner_modifier",
] {
if name.contains(substr) {
return ModifKinds::Character;
}
}
if name.contains("county_modifier") {
return ModifKinds::County;
}
if name.contains("province_modifier") {
return ModifKinds::Province;
}
if name.contains("scheme_modifier") {
return ModifKinds::Scheme;
}
if name.contains("travel_plan_modifier") {
return ModifKinds::TravelPlan;
}
ModifKinds::empty()
}