Skip to content

Commit

Permalink
Read function is settings group #14
Browse files Browse the repository at this point in the history
  • Loading branch information
SpontanCombust committed Aug 30, 2023
1 parent c236f1d commit 6d4715b
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 29 deletions.
10 changes: 8 additions & 2 deletions modSettingsFramework/content/scripts/local/settings_group.ws
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
abstract class ISettingsGroup
{
//TODO rename to just 'm_master'
protected var m_parentMaster : ISettingsMaster;

// these are set using 'default' in the child class
Expand All @@ -11,20 +12,25 @@ abstract class ISettingsGroup
{
m_parentMaster = parent_;
}

//TODO update class specification
public function Validate(): void
{
// generated child class will correct these values in this function
}

public function Read(optional config: CInGameConfigWrapper) : void
{
// child class will fetch config var values here
}

public function Reset(presetIndex: int, shouldSave: bool) : void
{
var config: CInGameConfigWrapper;

config = theGame.GetInGameConfigWrapper();

m_parentMaster.ResetSettingValues(config, id, presetIndex);
m_parentMaster.ReadSettings(); // get preset values back from config
Read(config); // get preset values back from config

if (shouldSave)
{
Expand Down
1 change: 1 addition & 0 deletions settings-parser/src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ pub const GROUP_PARENT_MASTER_VAR_NAME: &str = "m_parentMaster";
pub const GROUP_ID_VAR_NAME: &str = "id";
pub const GROUP_DEFAULT_PRESET_VAR_NAME: &str = "defaultPresetIndex";
pub const GROUP_VALIDATE_VALUES_FUNC_NAME: &str = "Validate";
pub const GROUP_READ_SETTINGS_FUNC_NAME: &str = "Read";
pub const GROUP_RESET_SETTINGS_TO_DEFAULT_FUNC_NAME: &str = "ResetToDefault";

pub const MASTER_BASE_CLASS_NAME: &str = "ISettingsMaster";
Expand Down
50 changes: 47 additions & 3 deletions settings-parser/src/settings_group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use crate::{
GROUP_VALIDATE_VALUES_FUNC_NAME,
MASTER_ENUM_MAPPING_VALIDATE_FUNC_NAME,
GROUP_PARENT_MASTER_VAR_NAME,
GROUP_PARENT_CLASS
GROUP_PARENT_CLASS, GROUP_READ_SETTINGS_FUNC_NAME, ReadSettingValueFnName
}
};

Expand All @@ -19,11 +19,12 @@ pub struct SettingsGroup {
pub class_name: String, // name of the class for this group in WitcherScript
pub var_name: String, // name of an instance of the class for this group in WitcherScript
pub default_preset_index: u8,
pub vars: Vec<SettingsVar>
pub vars: Vec<SettingsVar>,
pub validate_values: bool
}

impl SettingsGroup {
pub fn try_from(xml_group: &Group, master_class_name: &str, prefixes: &Vec<String>) -> Result<Self, String> {
pub fn try_from(xml_group: &Group, master_class_name: &str, prefixes: &Vec<String>, validate_values: bool) -> Result<Self, String> {
let default_preset_index = xml_group.default_preset_index.unwrap_or(0);
if xml_group.presets_array.len() > 0 && default_preset_index as usize >= xml_group.presets_array.len() {
return Err(format!("Invalid default preset index in Group {}", xml_group.id));
Expand Down Expand Up @@ -52,6 +53,7 @@ impl SettingsGroup {
var_name,
default_preset_index,
vars: setting_vars,
validate_values
})
}

Expand Down Expand Up @@ -89,6 +91,9 @@ impl WitcherScriptTypeDef for SettingsGroup {

buffer.new_line();
group_validate_values_function(self, buffer);

buffer.new_line();
group_read_settings_function(self, buffer);

buffer.pop_indent().push_line("}");
}
Expand Down Expand Up @@ -142,5 +147,44 @@ fn group_validate_values_function(group: &SettingsGroup, buffer: &mut WitcherScr
buffer.new_line();
buffer.push_line(&format!("super.{}();", GROUP_VALIDATE_VALUES_FUNC_NAME));

buffer.pop_indent().push_line("}");
}

fn group_read_settings_function(group: &SettingsGroup, buffer: &mut WitcherScript) {
buffer.push_line(&format!("public /* override */ function {}(optional config: CInGameConfigWrapper) : void", GROUP_READ_SETTINGS_FUNC_NAME));
buffer.push_line("{").push_indent();

buffer.push_line("if (!config)")
.push_indent()
.push_line("config = theGame.GetInGameConfigWrapper();")
.pop_indent()
.new_line();

for var in &group.vars {
// add type cast if it's an enum
let type_cast = if let SettingsVarType::Enum { val, .. } = &var.var_type {
format!("({})", val.type_name)
} else {
"".into()
};

let read_setting_value = format!("{vn} = {tc}{p}.{func}(config, '{gid}', '{vid}');",
vn = var.var_name,
tc = type_cast,
p = GROUP_PARENT_MASTER_VAR_NAME,
func = var.var_type.read_setting_value_fn(),
gid = group.id, vid = var.id);

buffer.push_line(&read_setting_value);
}
buffer.new_line();

if group.validate_values {
buffer.push_line(&format!("{}();", GROUP_VALIDATE_VALUES_FUNC_NAME))
.new_line();
}

buffer.push_line(&format!("super.{}(config);", GROUP_READ_SETTINGS_FUNC_NAME));

buffer.pop_indent().push_line("}");
}
29 changes: 5 additions & 24 deletions settings-parser/src/settings_master.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ use crate::{
MASTER_VALIDATE_VALUES_FUNC_NAME,
GROUP_VALIDATE_VALUES_FUNC_NAME,
MASTER_READ_SETTINGS_FUNC_NAME,
ReadSettingValueFnName,
MASTER_WRITE_SETTINGS_FUNC_NAME,
WriteSettingValueFnName,
MASTER_RESET_SETTINGS_TO_DEFAULT_FUNC_NAME,
GROUP_RESET_SETTINGS_TO_DEFAULT_FUNC_NAME,
MASTER_SHOULD_RESET_TO_DEFAULT_ON_INIT_FUNC_NAME,
MASTER_ENUM_MAPPING_CONFIG_TO_UNIFIED_FUNC_NAME,
MASTER_ENUM_MAPPING_UNIFIED_TO_CONFIG_FUNC_NAME,
MASTER_ENUM_MAPPING_VALIDATE_FUNC_NAME
MASTER_ENUM_MAPPING_VALIDATE_FUNC_NAME,
GROUP_READ_SETTINGS_FUNC_NAME
}
};

Expand All @@ -47,7 +47,7 @@ impl SettingsMaster {
let mut settings_groups = Vec::new();
for group in xml_user_config.groups.iter() {
if !group.ignore.unwrap_or(false) {
settings_groups.push(SettingsGroup::try_from(&group, &class_name, &xml_user_config.mod_prefixes)?);
settings_groups.push(SettingsGroup::try_from(&group, &class_name, &xml_user_config.mod_prefixes, validate_values)?);
}
}

Expand Down Expand Up @@ -303,29 +303,10 @@ fn read_settings_function(master: &SettingsMaster, buffer: &mut WitcherScript) {
buffer.new_line();

for group in &master.groups {
for var in &group.vars {
// add type cast if it's an enum
let type_cast = if let SettingsVarType::Enum { val, .. } = &var.var_type {
format!("({})", val.type_name)
} else {
"".into()
};

let read_setting_value = format!("{gn}.{vn} = {tc}{func}(config, '{gid}', '{vid}');",
gn = group.var_name, vn = var.var_name,
tc = type_cast,
func = var.var_type.read_setting_value_fn(),
gid = group.id, vid = var.id);

buffer.push_line(&read_setting_value);
}
buffer.new_line();
buffer.push_line(&format!("{}.{}(config);", group.var_name, GROUP_READ_SETTINGS_FUNC_NAME));
}

if master.validate_values {
buffer.push_line(&format!("{}();", MASTER_VALIDATE_VALUES_FUNC_NAME))
.new_line();
}
buffer.new_line();
buffer.push_line(&format!("super.{}();", MASTER_READ_SETTINGS_FUNC_NAME));

buffer.pop_indent().push_line("}");
Expand Down

0 comments on commit 6d4715b

Please sign in to comment.