diff options
author | David Gay <eapoems@riseup.net> | 2023-10-01 02:34:16 -0400 |
---|---|---|
committer | David Gay <eapoems@riseup.net> | 2023-10-01 02:34:16 -0400 |
commit | b77f46d0146d6b5b9acdb23546db2d57c37ed2af (patch) | |
tree | ad13966380074bd581ce9efac956f65a38393095 /src/random_tables.rs | |
parent | 8bc79457594a01f22f7146d3e1855de54558c531 (diff) |
Draft of random tables
Diffstat (limited to 'src/random_tables.rs')
-rw-r--r-- | src/random_tables.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/random_tables.rs b/src/random_tables.rs new file mode 100644 index 0000000..9f3e435 --- /dev/null +++ b/src/random_tables.rs @@ -0,0 +1,62 @@ +use serde::Deserialize; +use serde_yaml; +use std::collections::HashMap; +use std::error::Error; +use std::string::String; +use crate::dice; + +#[derive(Debug, Deserialize)] +struct RandomTable { + formula: String, + rows: Vec<TableRow>, +} + +#[derive(Debug, Deserialize)] +struct TableRow { + roll: String, + elements: Vec<TableRowElement>, +} + +#[derive(Debug, Deserialize)] +enum TableRowElement { + Text(String), + Table(String), +} + +pub struct RandomTables { + tables: HashMap<String, RandomTable>, +} + +impl RandomTables { + pub fn new() -> Result<Self, Box<dyn Error>> { + let tables_yaml = include_str!("data/random_tables/ua_magic_items.yaml"); + let tables: HashMap<String, RandomTable> = serde_yaml::from_str(tables_yaml)?; + Ok(RandomTables { tables }) + } + + pub fn roll_table(&self, table_name: &str) -> String { + let random_table = self.tables.get(table_name); + if let Some(table) = random_table { + // TODO: Probably return an error instead of using #unwrap. + let roll_result = dice::roll_formula(&table.formula).unwrap(); + let roll = roll_result.total(); + for table_row in &table.rows { + if table_row.roll.contains(&roll.to_string()) { + let mut output_text = String::new(); + for element in &table_row.elements { + match element { + TableRowElement::Text(text) => output_text.push_str(text), + TableRowElement::Table(inner_table) => { + let inner_output = self.roll_table(inner_table); + output_text.push_str(&inner_output); + } + } + output_text.push_str(" "); + } + return output_text.trim().to_string(); + } + } + } + String::new() + } +} |