From e8084b89751956d62071955bfa69add25fefc7d7 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Mon, 14 Aug 2023 06:57:27 +0100 Subject: [PATCH] InflictsDamage and ProvidesHealing now use dice rolls --- raws/items.json | 10 +++++----- raws/props.json | 4 ++-- src/components.rs | 8 ++++++-- src/inventory_system.rs | 8 ++++---- src/raws/rawmaster.rs | 15 ++++++++++++--- src/trigger_system.rs | 8 ++------ 6 files changed, 31 insertions(+), 22 deletions(-) diff --git a/raws/items.json b/raws/items.json index 7c49cbd..a14c346 100644 --- a/raws/items.json +++ b/raws/items.json @@ -6,7 +6,7 @@ "weight": 1, "value": 50, "flags": ["CONSUMABLE", "DESTRUCTIBLE"], - "effects": { "provides_healing": "12" }, + "effects": { "provides_healing": "2d4+2" }, "magic": { "class": "common", "naming": "potion" } }, { @@ -16,7 +16,7 @@ "weight": 1, "value": 25, "flags": ["CONSUMABLE", "DESTRUCTIBLE"], - "effects": { "provides_healing": "6" }, + "effects": { "provides_healing": "1d4+2" }, "magic": { "class": "common", "naming": "potion" } }, { @@ -26,7 +26,7 @@ "weight": 0.5, "value": 50, "flags": ["CONSUMABLE", "DESTRUCTIBLE"], - "effects": { "ranged": "12", "damage": "10" }, + "effects": { "ranged": "12", "damage": "3d4+3" }, "magic": { "class": "common", "naming": "scroll" } }, { @@ -36,7 +36,7 @@ "weight": 0.5, "value": 150, "flags": ["CONSUMABLE", "DESTRUCTIBLE"], - "effects": { "ranged": "10", "damage": "15", "aoe": "3" }, + "effects": { "ranged": "10", "damage": "8d6", "aoe": "3" }, "magic": { "class": "rare", "naming": "scroll" } }, { @@ -46,7 +46,7 @@ "weight": 0.5, "value": 150, "flags": ["CONSUMABLE", "DESTRUCTIBLE", "CURSED"], - "effects": { "ranged": "10", "damage": "15", "aoe": "3" }, + "effects": { "ranged": "10", "damage": "8d6", "aoe": "3" }, "magic": { "class": "rare", "naming": "scroll" } }, { diff --git a/raws/props.json b/raws/props.json index 44162d9..a759520 100644 --- a/raws/props.json +++ b/raws/props.json @@ -58,14 +58,14 @@ "name": "bear trap", "renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 }, "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], - "effects": { "damage": "6" } + "effects": { "damage": "2d4" } }, { "id": "trap_stonefall", "name": "stonefall trap", "renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 }, "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], - "effects": { "damage": "12" } + "effects": { "damage": "2d10" } }, { "id": "trap_confusion", diff --git a/src/components.rs b/src/components.rs index d229f14..217e862 100644 --- a/src/components.rs +++ b/src/components.rs @@ -311,12 +311,16 @@ pub struct Cursed {} #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct ProvidesHealing { - pub amount: i32, + pub n_dice: i32, + pub sides: i32, + pub modifier: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct InflictsDamage { - pub amount: i32, + pub n_dice: i32, + pub sides: i32, + pub modifier: i32, } #[derive(Component, Debug, ConvertSaveload, Clone)] diff --git a/src/inventory_system.rs b/src/inventory_system.rs index 2123e30..c415bdb 100644 --- a/src/inventory_system.rs +++ b/src/inventory_system.rs @@ -125,7 +125,6 @@ impl<'a> System<'a> for ItemUseSystem { let is_cursed = cursed_items.get(wants_to_use.item); let wand = wands.get_mut(wants_to_use.item); if let Some(wand) = wand { - let name = names.get_mut(wants_to_use.item).unwrap(); // If want has no uses, roll 1d121. On a 121, wrest the wand, then delete it. if wand.uses == 0 { if rng.roll_dice(1, 121) != 121 { @@ -269,8 +268,8 @@ impl<'a> System<'a> for ItemUseSystem { for target in targets.iter() { let stats = combat_stats.get_mut(*target); if let Some(stats) = stats { - stats.hit_points.current = - i32::min(stats.hit_points.max, stats.hit_points.current + heal.amount); + let roll = rng.roll_dice(heal.n_dice, heal.sides) + heal.modifier; + stats.hit_points.current = i32::min(stats.hit_points.max, stats.hit_points.current + roll); if entity == *player_entity { logger = logger.append("You recover some vigour."); } @@ -292,6 +291,7 @@ impl<'a> System<'a> for ItemUseSystem { None => {} Some(damage) => { let target_point = wants_to_use.target.unwrap(); + let damage_roll = rng.roll_dice(damage.n_dice, damage.sides) + damage.modifier; if !aoe_item { particle_builder.request_rainbow_star( target_point.x, @@ -305,7 +305,7 @@ impl<'a> System<'a> for ItemUseSystem { let entity_name = names.get(*mob).unwrap(); match destructible { None => { - SufferDamage::new_damage(&mut suffer_damage, *mob, damage.amount, true); + SufferDamage::new_damage(&mut suffer_damage, *mob, damage_roll, true); if entity == *player_entity { damage_logger = damage_logger.append("The").npc_name(&entity_name.name).append("is hit!"); diff --git a/src/raws/rawmaster.rs b/src/raws/rawmaster.rs index 4a01f47..c9e5809 100644 --- a/src/raws/rawmaster.rs +++ b/src/raws/rawmaster.rs @@ -159,9 +159,15 @@ pub fn spawn_named_item(raws: &RawMaster, ecs: &mut World, key: &str, pos: Spawn for effect in effects_list.iter() { let effect_name = effect.0.as_str(); match effect_name { - "provides_healing" => eb = eb.with(ProvidesHealing { amount: effect.1.parse::().unwrap() }), + "provides_healing" => { + let (n_dice, sides, modifier) = parse_dice_string(effect.1.as_str()); + eb = eb.with(ProvidesHealing { n_dice, sides, modifier }) + } "ranged" => eb = eb.with(Ranged { range: effect.1.parse::().unwrap() }), - "damage" => eb = eb.with(InflictsDamage { amount: effect.1.parse::().unwrap() }), + "damage" => { + let (n_dice, sides, modifier) = parse_dice_string(effect.1.as_str()); + eb = eb.with(InflictsDamage { n_dice, sides, modifier }) + } "aoe" => eb = eb.with(AOE { radius: effect.1.parse::().unwrap() }), "confusion" => eb = eb.with(Confusion { turns: effect.1.parse::().unwrap() }), "base_damage" => base_damage = effect.1, @@ -480,7 +486,10 @@ pub fn spawn_named_prop(raws: &RawMaster, ecs: &mut World, key: &str, pos: Spawn for effect in effects_list.iter() { let effect_name = effect.0.as_str(); match effect_name { - "damage" => eb = eb.with(InflictsDamage { amount: effect.1.parse::().unwrap() }), + "damage" => { + let (n_dice, sides, modifier) = parse_dice_string(effect.1.as_str()); + eb = eb.with(ProvidesHealing { n_dice, sides, modifier }) + } "confusion" => eb = eb.with(Confusion { turns: effect.1.parse::().unwrap() }), _ => rltk::console::log(format!("Warning: effect {} not implemented.", effect_name)), } diff --git a/src/trigger_system.rs b/src/trigger_system.rs index 160c4ee..e951b1d 100644 --- a/src/trigger_system.rs +++ b/src/trigger_system.rs @@ -61,13 +61,9 @@ impl<'a> System<'a> for TriggerSystem { let damage = inflicts_damage.get(*entity_id); if let Some(damage) = damage { + let damage_roll = rng.roll_dice(damage.n_dice, damage.sides) + damage.modifier; particle_builder.damage_taken(pos.x, pos.y); - SufferDamage::new_damage( - &mut inflict_damage, - entity, - rng.roll_dice(1, damage.amount), - false, - ); + SufferDamage::new_damage(&mut inflict_damage, entity, damage_roll, false); } let confuses = confusion.get(*entity_id);