summaryrefslogtreecommitdiff
path: root/src/random_tables.rs
diff options
context:
space:
mode:
authorDavid Gay <eapoems@riseup.net>2023-10-01 02:34:16 -0400
committerDavid Gay <eapoems@riseup.net>2023-10-01 02:34:16 -0400
commitb77f46d0146d6b5b9acdb23546db2d57c37ed2af (patch)
treead13966380074bd581ce9efac956f65a38393095 /src/random_tables.rs
parent8bc79457594a01f22f7146d3e1855de54558c531 (diff)
Draft of random tables
Diffstat (limited to 'src/random_tables.rs')
-rw-r--r--src/random_tables.rs62
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()
+ }
+}