InflictsDamage and ProvidesHealing now use dice rolls

This commit is contained in:
Llywelwyn 2023-08-14 06:57:27 +01:00
parent 3474a782d7
commit e8084b8975
6 changed files with 31 additions and 22 deletions

View file

@ -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" }
},
{

View file

@ -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",

View file

@ -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)]

View file

@ -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!");

View file

@ -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::<i32>().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::<i32>().unwrap() }),
"damage" => eb = eb.with(InflictsDamage { amount: effect.1.parse::<i32>().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::<i32>().unwrap() }),
"confusion" => eb = eb.with(Confusion { turns: effect.1.parse::<i32>().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::<i32>().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::<i32>().unwrap() }),
_ => rltk::console::log(format!("Warning: effect {} not implemented.", effect_name)),
}

View file

@ -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);