diff --git a/src/entities/mock.rs b/src/entities/mock.rs index d3ca844..efc5008 100644 --- a/src/entities/mock.rs +++ b/src/entities/mock.rs @@ -39,21 +39,7 @@ impl Dashboard { Quest { title: "Guard the Temple".to_string(), location_taken: Some("Suzail".to_string()), location_task: Some("Temple of Lathander".to_string()), date_taken: None, date_by: None, description: Some("Protect the shrine.".to_string()), from: Some("Clerics of Lathander".to_string()), reward: Some(Balance { platinum: 0, gold: 50, electrum: 0, silver: 0, copper: 0 }) }, Quest { title: "Explore the Ruins".to_string(), location_taken: Some("Cormyr".to_string()), location_task: Some("Netherese Ruins".to_string()), date_taken: Some(NaiveDate::from_ymd_opt(1481, 9, 1).unwrap()), date_by: Some(NaiveDate::from_ymd_opt(1481, 10, 1).unwrap()), description: None, from: None, reward: None }, ]), - notes: NoteBook( - vec![ - Note("Met Elminster in Waterdeep; he hinted at a Netherese ruin nearby.".to_string()), - Note("Avoid Zhentarim agents in Baldur's Gate; they're watching the tavern.".to_string()), - Note("Phandalin: Redbrand thugs extorting locals, hideout in manor basement.".to_string()), - Note("Neverwinter's Lord Neverember offering 100gp for bandit leader's head.".to_string()), - Note("Found a strange rune in Underdark; ask Candlekeep scholars about it.".to_string()), - Note("Luskan pirates smuggling in the docks; check crates for clues.".to_string()), - Note("Silverymoon's wards flicker at midnight; possible arcane sabotage?".to_string()), - Note("Daggerford militia needs help with goblin raids from Cragmaw.".to_string()), - Note("Temple of Lathander in Suzail requests guards for festival.".to_string()), - Note("Heard rumors of a dragon in Evermoors; prepare fire resistance.".to_string()), - Note("Harpers want Zhentarim plans stolen from Zhentil Keep by next tenday.".to_string()), - Note("Keep an eye on that shady merchant in Cormyr; might be a doppelganger.".to_string()), - ]), + notes: generate_mock_notebook(), people: generate_mock_contact_book(), } } @@ -61,246 +47,26 @@ impl Dashboard { fn generate_mock_inventory() -> Inventory { let items = vec![ - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Vorpal Sword".to_string(), - weight: Some(4.0), - description: Some("A blade that severs heads with a single swing.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "weapon".to_string()), - ("rarity".to_string(), "legendary".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 3, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Potion of Healing".to_string(), - weight: Some(0.5), - description: Some("A vial of red liquid that restores vitality.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "potion".to_string()), - ("rarity".to_string(), "common".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Cloak of Elvenkind".to_string(), - weight: Some(1.0), - description: Some("A cloak that blends into shadows.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "uncommon".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 2, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Bag of Holding".to_string(), - weight: Some(15.0), - description: Some("A small bag with vast internal space.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "uncommon".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Mithril Chainmail".to_string(), - weight: Some(20.0), - description: Some("Lightweight armor that gleams like silver.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "armor".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Wand of Fireballs".to_string(), - weight: Some(0.2), - description: Some("A wand that unleashes fiery explosions.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wand".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Ring of Invisibility".to_string(), - weight: Some(0.1), - description: Some("Grants the wearer invisibility.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "ring".to_string()), - ("rarity".to_string(), "legendary".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 2, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Boots of Speed".to_string(), - weight: Some(1.5), - description: Some("Boots that enhance the wearer's speed.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Dagger of Venom".to_string(), - weight: Some(1.0), - description: Some("A dagger coated with deadly poison.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "weapon".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Staff of Power".to_string(), - weight: Some(5.0), - description: Some("A staff pulsing with arcane might.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "staff".to_string()), - ("rarity".to_string(), "very rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 4, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Torch".to_string(), - weight: Some(1.0), - description: Some("A simple torch for illumination.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "tool".to_string()), - ("rarity".to_string(), "common".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Amulet of Health".to_string(), - weight: Some(0.3), - description: Some("Boosts the wearer's vitality.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Flame Tongue".to_string(), - weight: Some(3.0), - description: Some("A sword that ignites on command.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "weapon".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 5, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Arrow of Slaying".to_string(), - weight: Some(0.1), - description: Some("An arrow designed to kill a specific foe.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "ammunition".to_string()), - ("rarity".to_string(), "very rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Cloak of Displacement".to_string(), - weight: Some(1.0), - description: Some("Makes the wearer hard to hit.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Helm of Teleportation".to_string(), - weight: Some(3.0), - description: Some("Allows teleportation to known locations.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Crystal Ball".to_string(), - weight: Some(7.0), - description: Some("A magical orb for scrying.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "very rare".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Gauntlets of Ogre Power".to_string(), - weight: Some(2.0), - description: Some("Grants the strength of an ogre.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "uncommon".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Robe of the Archmagi".to_string(), - weight: Some(1.0), - description: Some("Enhances a wizard's spellcasting.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "legendary".to_string()), - ]), - }), - }, - InventoryEntry { - quantity: 1, - item: InventoryItem::Custom(CustomInventoryItem { - name: "Horn of Blasting".to_string(), - weight: Some(2.0), - description: Some("Emits a destructive sonic blast.".to_string()), - tags: HashMap::from([ - ("type".to_string(), "wondrous".to_string()), - ("rarity".to_string(), "rare".to_string()), - ]), - }), - }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Vorpal Sword".to_string(), weight: Some(4.0), description: Some("A blade that severs heads with a single swing.".to_string()), tags: HashMap::from([ ("type".to_string(), "weapon".to_string()), ("rarity".to_string(), "legendary".to_string()), ]), }), }, + InventoryEntry { quantity: 3, item: InventoryItem::Custom(CustomInventoryItem { name: "Potion of Healing".to_string(), weight: Some(0.5), description: Some("A vial of red liquid that restores vitality.".to_string()), tags: HashMap::from([ ("type".to_string(), "potion".to_string()), ("rarity".to_string(), "common".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Cloak of Elvenkind".to_string(), weight: Some(1.0), description: Some("A cloak that blends into shadows.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "uncommon".to_string()), ]), }), }, + InventoryEntry { quantity: 2, item: InventoryItem::Custom(CustomInventoryItem { name: "Bag of Holding".to_string(), weight: Some(15.0), description: Some("A small bag with vast internal space.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "uncommon".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Mithril Chainmail".to_string(), weight: Some(20.0), description: Some("Lightweight armor that gleams like silver.".to_string()), tags: HashMap::from([ ("type".to_string(), "armor".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Wand of Fireballs".to_string(), weight: Some(0.2), description: Some("A wand that unleashes fiery explosions.".to_string()), tags: HashMap::from([ ("type".to_string(), "wand".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Ring of Invisibility".to_string(), weight: Some(0.1), description: Some("Grants the wearer invisibility.".to_string()), tags: HashMap::from([ ("type".to_string(), "ring".to_string()), ("rarity".to_string(), "legendary".to_string()), ]), }), }, + InventoryEntry { quantity: 2, item: InventoryItem::Custom(CustomInventoryItem { name: "Boots of Speed".to_string(), weight: Some(1.5), description: Some("Boots that enhance the wearer's speed.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Dagger of Venom".to_string(), weight: Some(1.0), description: Some("A dagger coated with deadly poison.".to_string()), tags: HashMap::from([ ("type".to_string(), "weapon".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Staff of Power".to_string(), weight: Some(5.0), description: Some("A staff pulsing with arcane might.".to_string()), tags: HashMap::from([ ("type".to_string(), "staff".to_string()), ("rarity".to_string(), "very rare".to_string()), ]), }), }, + InventoryEntry { quantity: 4, item: InventoryItem::Custom(CustomInventoryItem { name: "Torch".to_string(), weight: Some(1.0), description: Some("A simple torch for illumination.".to_string()), tags: HashMap::from([ ("type".to_string(), "tool".to_string()), ("rarity".to_string(), "common".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Amulet of Health".to_string(), weight: Some(0.3), description: Some("Boosts the wearer's vitality.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Flame Tongue".to_string(), weight: Some(3.0), description: Some("A sword that ignites on command.".to_string()), tags: HashMap::from([ ("type".to_string(), "weapon".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, + InventoryEntry { quantity: 5, item: InventoryItem::Custom(CustomInventoryItem { name: "Arrow of Slaying".to_string(), weight: Some(0.1), description: Some("An arrow designed to kill a specific foe.".to_string()), tags: HashMap::from([ ("type".to_string(), "ammunition".to_string()), ("rarity".to_string(), "very rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Cloak of Displacement".to_string(), weight: Some(1.0), description: Some("Makes the wearer hard to hit.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Helm of Teleportation".to_string(), weight: Some(3.0), description: Some("Allows teleportation to known locations.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Crystal Ball".to_string(), weight: Some(7.0), description: Some("A magical orb for scrying.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "very rare".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Gauntlets of Ogre Power".to_string(), weight: Some(2.0), description: Some("Grants the strength of an ogre.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "uncommon".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Robe of the Archmagi".to_string(), weight: Some(1.0), description: Some("Enhances a wizard's spellcasting.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "legendary".to_string()), ]), }), }, + InventoryEntry { quantity: 1, item: InventoryItem::Custom(CustomInventoryItem { name: "Horn of Blasting".to_string(), weight: Some(2.0), description: Some("Emits a destructive sonic blast.".to_string()), tags: HashMap::from([ ("type".to_string(), "wondrous".to_string()), ("rarity".to_string(), "rare".to_string()), ]), }), }, ]; Inventory(items) @@ -366,3 +132,21 @@ fn generate_mock_contact_book() -> ContactBook { ContactBook(contacts) } + + +fn generate_mock_notebook() -> NoteBook { + NoteBook(vec![ + Note { content: "Met Elminster in Waterdeep; hinted at Netherese ruin.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 4, 15).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-01 14:30:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Elminster".to_string(), "Waterdeep".to_string()]) }, + Note { content: "Zhentarim agents watching Baldur's Gate tavern.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 4, 16).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-02 09:15:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Zhentarim".to_string()]) }, + Note { content: "Phandalin: Redbrands extorting locals, hideout in manor.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 4, 20).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-03 18:45:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Phandalin".to_string(), "Redbrands".to_string()]) }, + Note { content: "Neverember offers 100gp for bandit leader's head.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 4, 22).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-04 11:20:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Neverwinter".to_string()]) }, + Note { content: "Strange rune in Underdark; ask Candlekeep scholars.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 5, 1).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-05 20:10:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Underdark".to_string(), "Candlekeep".to_string()]) }, + Note { content: "Luskan pirates smuggling at docks; check crates.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 5, 3).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-06 15:30:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Luskan".to_string()]) }, + Note { content: "Silverymoon wards flicker at midnight; sabotage?".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 5, 5).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-07 22:00:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Silverymoon".to_string(), "Arcane".to_string()]) }, + Note { content: "Daggerford militia needs help with Cragmaw goblins.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 5, 7).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-08 12:45:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Daggerford".to_string()]) }, + Note { content: "Suzail's Lathander temple requests festival guards.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 5, 10).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-09 10:00:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Suzail".to_string(), "Lathander".to_string()]) }, + Note { content: "Rumors of dragon in Evermoors; need fire resistance.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 5, 12).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-10 17:25:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Evermoors".to_string()]) }, + Note { content: "Harpers want Zhentarim plans from Zhentil Keep.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 5, 15).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-11 08:50:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::from_iter(vec!["Harpers".to_string(), "Zhentarim".to_string()]) }, + Note { content: "Shady Cormyr merchant; possible doppelganger.".to_string(), date_ingame: NaiveDate::from_ymd_opt(1481, 5, 17).unwrap(), date_real: NaiveDateTime::parse_from_str("2025-09-11 14:00:00", "%Y-%m-%d %H:%M:%S").unwrap(), tags: HashSet::new() }, + ]) +} diff --git a/src/entities/mod.rs b/src/entities/mod.rs index b0e35f2..f11cf86 100644 --- a/src/entities/mod.rs +++ b/src/entities/mod.rs @@ -1,4 +1,4 @@ -use chrono::NaiveDate; +use chrono::{ NaiveDate, NaiveDateTime }; use reactive_stores::Store; use crate::prelude::*; @@ -125,7 +125,12 @@ pub struct Quest { pub struct NoteBook (pub Vec); #[derive(Clone, Debug, Store)] -pub struct Note (pub String); +pub struct Note { + pub content: String, + pub date_ingame: NaiveDate, + pub date_real: NaiveDateTime, + pub tags: HashSet, +} #[derive(Clone, Debug, Store)] pub struct SpellSlots (pub [SpellSlotLevel; 9]);