implement CLI write-value to edit ESH values

This commit is contained in:
mykola2312 2023-09-11 00:41:19 +03:00
parent fb6c39ffd7
commit 130c200376

View file

@ -6,6 +6,7 @@ use std::path::Path;
mod fot; mod fot;
use fot::attributes::Attributes; use fot::attributes::Attributes;
use fot::esh::ESHValue;
use fot::entity::Entity; use fot::entity::Entity;
use fot::entitylist::EntityList; use fot::entitylist::EntityList;
use fot::save::Save; use fot::save::Save;
@ -50,6 +51,11 @@ enum Commands {
FindEntities, FindEntities,
/// List ESH values of selected entities /// List ESH values of selected entities
ListValues, ListValues,
/// Write ESH value to entity
WriteValue {
name: String,
value: String
},
/// List entity attributes (like special stats and skills) /// List entity attributes (like special stats and skills)
ListAttributes, ListAttributes,
/// List entity modifiers (buffs/debuffs for attributes) /// List entity modifiers (buffs/debuffs for attributes)
@ -205,6 +211,21 @@ fn list_values(ent: &Entity) {
write!(bf, "\n").expect("stdout"); write!(bf, "\n").expect("stdout");
} }
fn write_value(ent: &mut Entity, name: &String, value: &String) {
let esh = ent.get_esh_mut().expect("failed to get esh");
use ESHValue as EV;
match esh.props.get_mut(name.as_str()).unwrap() {
EV::Bool(val) => *val = value.parse().expect("parse"),
EV::Float(val) => *val = value.parse().expect("parse"),
EV::Int(val) => *val = value.parse().expect("parse"),
EV::String(val) => val.str = value.clone(),
EV::Sprite(val) => val.str = value.clone(),
EV::Enum(val) => val.str = value.clone(),
_ => panic!("unsupported ESH type input")
}
}
fn log_attributes(attrs: Attributes) { fn log_attributes(attrs: Attributes) {
let mut bf = BufWriter::new(stdout().lock()); let mut bf = BufWriter::new(stdout().lock());
@ -301,6 +322,12 @@ fn do_save(cli: Cli) {
list_values(ent); list_values(ent);
} }
} }
Commands::WriteValue { name, value } => {
for (_, ent) in get_entities_mut(&mut save.world.entlist, cli.ids, cli.find) {
write_value(ent, &name, &value);
}
save.save(Path::new(&cli.output)).expect("failed to save");
}
Commands::ListAttributes => { Commands::ListAttributes => {
for (_, ent) in get_entities(entlist, cli.ids, cli.find) { for (_, ent) in get_entities(entlist, cli.ids, cli.find) {
list_attributes(ent); list_attributes(ent);
@ -313,13 +340,13 @@ fn do_save(cli: Cli) {
} }
Commands::WriteAttribute { group, name, value } => { Commands::WriteAttribute { group, name, value } => {
for (_, ent) in get_entities_mut(&mut save.world.entlist, cli.ids, cli.find) { for (_, ent) in get_entities_mut(&mut save.world.entlist, cli.ids, cli.find) {
write_attribute(ent, group.as_str(), name.as_str(), value.as_str()) write_attribute(ent, group.as_str(), name.as_str(), value.as_str());
} }
save.save(Path::new(&cli.output)).expect("failed to save"); save.save(Path::new(&cli.output)).expect("failed to save");
} }
Commands::WriteModifier { group, name, value } => { Commands::WriteModifier { group, name, value } => {
for (_, ent) in get_entities_mut(&mut save.world.entlist, cli.ids, cli.find) { for (_, ent) in get_entities_mut(&mut save.world.entlist, cli.ids, cli.find) {
write_modifier(ent, group.as_str(), name.as_str(), value.as_str()) write_modifier(ent, group.as_str(), name.as_str(), value.as_str());
} }
save.save(Path::new(&cli.output)).expect("failed to save"); save.save(Path::new(&cli.output)).expect("failed to save");
} }