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, "weight": 1,
"value": 50, "value": 50,
"flags": ["CONSUMABLE", "DESTRUCTIBLE"], "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
"effects": { "provides_healing": "12" }, "effects": { "provides_healing": "2d4+2" },
"magic": { "class": "common", "naming": "potion" } "magic": { "class": "common", "naming": "potion" }
}, },
{ {
@ -16,7 +16,7 @@
"weight": 1, "weight": 1,
"value": 25, "value": 25,
"flags": ["CONSUMABLE", "DESTRUCTIBLE"], "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
"effects": { "provides_healing": "6" }, "effects": { "provides_healing": "1d4+2" },
"magic": { "class": "common", "naming": "potion" } "magic": { "class": "common", "naming": "potion" }
}, },
{ {
@ -26,7 +26,7 @@
"weight": 0.5, "weight": 0.5,
"value": 50, "value": 50,
"flags": ["CONSUMABLE", "DESTRUCTIBLE"], "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
"effects": { "ranged": "12", "damage": "10" }, "effects": { "ranged": "12", "damage": "3d4+3" },
"magic": { "class": "common", "naming": "scroll" } "magic": { "class": "common", "naming": "scroll" }
}, },
{ {
@ -36,7 +36,7 @@
"weight": 0.5, "weight": 0.5,
"value": 150, "value": 150,
"flags": ["CONSUMABLE", "DESTRUCTIBLE"], "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
"effects": { "ranged": "10", "damage": "15", "aoe": "3" }, "effects": { "ranged": "10", "damage": "8d6", "aoe": "3" },
"magic": { "class": "rare", "naming": "scroll" } "magic": { "class": "rare", "naming": "scroll" }
}, },
{ {
@ -46,7 +46,7 @@
"weight": 0.5, "weight": 0.5,
"value": 150, "value": 150,
"flags": ["CONSUMABLE", "DESTRUCTIBLE", "CURSED"], "flags": ["CONSUMABLE", "DESTRUCTIBLE", "CURSED"],
"effects": { "ranged": "10", "damage": "15", "aoe": "3" }, "effects": { "ranged": "10", "damage": "8d6", "aoe": "3" },
"magic": { "class": "rare", "naming": "scroll" } "magic": { "class": "rare", "naming": "scroll" }
}, },
{ {

View file

@ -58,14 +58,14 @@
"name": "bear trap", "name": "bear trap",
"renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
"flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
"effects": { "damage": "6" } "effects": { "damage": "2d4" }
}, },
{ {
"id": "trap_stonefall", "id": "trap_stonefall",
"name": "stonefall trap", "name": "stonefall trap",
"renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 }, "renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
"flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"], "flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
"effects": { "damage": "12" } "effects": { "damage": "2d10" }
}, },
{ {
"id": "trap_confusion", "id": "trap_confusion",

View file

@ -311,12 +311,16 @@ pub struct Cursed {}
#[derive(Component, Debug, ConvertSaveload, Clone)] #[derive(Component, Debug, ConvertSaveload, Clone)]
pub struct ProvidesHealing { pub struct ProvidesHealing {
pub amount: i32, pub n_dice: i32,
pub sides: i32,
pub modifier: i32,
} }
#[derive(Component, Debug, ConvertSaveload, Clone)] #[derive(Component, Debug, ConvertSaveload, Clone)]
pub struct InflictsDamage { pub struct InflictsDamage {
pub amount: i32, pub n_dice: i32,
pub sides: i32,
pub modifier: i32,
} }
#[derive(Component, Debug, ConvertSaveload, Clone)] #[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 is_cursed = cursed_items.get(wants_to_use.item);
let wand = wands.get_mut(wants_to_use.item); let wand = wands.get_mut(wants_to_use.item);
if let Some(wand) = wand { 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 want has no uses, roll 1d121. On a 121, wrest the wand, then delete it.
if wand.uses == 0 { if wand.uses == 0 {
if rng.roll_dice(1, 121) != 121 { if rng.roll_dice(1, 121) != 121 {
@ -269,8 +268,8 @@ impl<'a> System<'a> for ItemUseSystem {
for target in targets.iter() { for target in targets.iter() {
let stats = combat_stats.get_mut(*target); let stats = combat_stats.get_mut(*target);
if let Some(stats) = stats { if let Some(stats) = stats {
stats.hit_points.current = let roll = rng.roll_dice(heal.n_dice, heal.sides) + heal.modifier;
i32::min(stats.hit_points.max, stats.hit_points.current + heal.amount); stats.hit_points.current = i32::min(stats.hit_points.max, stats.hit_points.current + roll);
if entity == *player_entity { if entity == *player_entity {
logger = logger.append("You recover some vigour."); logger = logger.append("You recover some vigour.");
} }
@ -292,6 +291,7 @@ impl<'a> System<'a> for ItemUseSystem {
None => {} None => {}
Some(damage) => { Some(damage) => {
let target_point = wants_to_use.target.unwrap(); let target_point = wants_to_use.target.unwrap();
let damage_roll = rng.roll_dice(damage.n_dice, damage.sides) + damage.modifier;
if !aoe_item { if !aoe_item {
particle_builder.request_rainbow_star( particle_builder.request_rainbow_star(
target_point.x, target_point.x,
@ -305,7 +305,7 @@ impl<'a> System<'a> for ItemUseSystem {
let entity_name = names.get(*mob).unwrap(); let entity_name = names.get(*mob).unwrap();
match destructible { match destructible {
None => { 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 { if entity == *player_entity {
damage_logger = damage_logger =
damage_logger.append("The").npc_name(&entity_name.name).append("is hit!"); 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() { for effect in effects_list.iter() {
let effect_name = effect.0.as_str(); let effect_name = effect.0.as_str();
match effect_name { 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() }), "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() }), "aoe" => eb = eb.with(AOE { radius: effect.1.parse::<i32>().unwrap() }),
"confusion" => eb = eb.with(Confusion { turns: effect.1.parse::<i32>().unwrap() }), "confusion" => eb = eb.with(Confusion { turns: effect.1.parse::<i32>().unwrap() }),
"base_damage" => base_damage = effect.1, "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() { for effect in effects_list.iter() {
let effect_name = effect.0.as_str(); let effect_name = effect.0.as_str();
match effect_name { 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() }), "confusion" => eb = eb.with(Confusion { turns: effect.1.parse::<i32>().unwrap() }),
_ => rltk::console::log(format!("Warning: effect {} not implemented.", effect_name)), _ => 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); let damage = inflicts_damage.get(*entity_id);
if let Some(damage) = damage { 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); particle_builder.damage_taken(pos.x, pos.y);
SufferDamage::new_damage( SufferDamage::new_damage(&mut inflict_damage, entity, damage_roll, false);
&mut inflict_damage,
entity,
rng.roll_dice(1, damage.amount),
false,
);
} }
let confuses = confusion.get(*entity_id); let confuses = confusion.get(*entity_id);