diff --git a/src/main.rs b/src/main.rs index 93ef0b4..d5f0b0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ use std::path::Path; mod fot; use fot::attributes::Attributes; -use fot::esh::ESHValue; +use fot::esh::{ESH, ESHValue}; use fot::entity::Entity; use fot::entitylist::EntityList; use fot::save::Save; @@ -56,6 +56,16 @@ enum Commands { name: String, value: String }, + /// Read nested ESH value from entity's ESH + ReadNested { + nested: String + }, + /// Write ESH "value" on "name" into nested ESH at "nested" in entity's ESH + WriteNested { + nested: String, + name: String, + value: String + }, /// List entity attributes (like special stats and skills) ListAttributes, /// List entity modifiers (buffs/debuffs for attributes) @@ -195,25 +205,24 @@ fn get_entities_mut( } } -fn list_values(ent: &Entity) { +fn log_esh(esh: &ESH) { let mut bf = BufWriter::new(stdout().lock()); - let esh = match ent.esh.as_ref() { - Some(esh) => esh, - None => { - write!(bf, "\n").expect("stdout"); - return; - } - }; - for (name, value) in &esh.props { write!(bf, "{}\t{}\n", name, value).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"); +fn list_values(ent: &Entity) { + let esh = match ent.esh.as_ref() { + Some(esh) => esh, + None => return + }; + log_esh(esh); +} + +fn write_esh(esh: &mut ESH, name: &String, value: &String) { use ESHValue as EV; match esh.props.get_mut(name.as_str()).unwrap() { EV::Bool(val) => *val = value.parse().expect("parse"), @@ -222,10 +231,29 @@ fn write_value(ent: &mut Entity, name: &String, value: &String) { EV::String(val) => val.str = value.clone(), EV::Sprite(val) => val.str = value.clone(), EV::Enum(val) => val.str = value.clone(), + EV::EntityFlags(val) => val.entity_id = value.parse().expect("parse"), _ => panic!("unsupported ESH type input") } } +fn write_value(ent: &mut Entity, name: &String, value: &String) { + let esh = ent.get_esh_mut().expect("failed to get esh"); + write_esh(esh, name, value); +} + +fn read_nested(ent: &Entity, nested: &String) { + let esh = ent.get_esh().expect("failed to get esh"); + let nested_esh = esh.get_nested(nested.as_str()).expect("failed to get nested"); + log_esh(&nested_esh); +} + +fn write_nested(ent: &mut Entity, nested: &String, name: &String, value: &String) { + let esh = ent.get_esh_mut().expect("failed to get esh"); + let mut nested_esh = esh.get_nested(nested.as_str()).expect("failed to get nested"); + write_esh(&mut nested_esh, name, value); + esh.set_nested(nested.as_str(), nested_esh).expect("failed to set nested esh"); +} + fn log_attributes(attrs: Attributes) { let mut bf = BufWriter::new(stdout().lock()); @@ -328,6 +356,17 @@ fn do_save(cli: Cli) { } save.save(Path::new(&cli.output)).expect("failed to save"); } + Commands::ReadNested { nested } => { + for (_, ent) in get_entities(entlist, cli.ids, cli.find) { + read_nested(ent, &nested) + } + } + Commands::WriteNested { nested, name, value } => { + for (_, ent) in get_entities_mut(&mut save.world.entlist, cli.ids, cli.find) { + write_nested(ent, &nested, &name, &value) + } + save.save(Path::new(&cli.output)).expect("failed to save"); + } Commands::ListAttributes => { for (_, ent) in get_entities(entlist, cli.ids, cli.find) { list_attributes(ent);