diff --git a/raws/items.json b/raws/items.json index 7f55d95..2c0c678 100644 --- a/raws/items.json +++ b/raws/items.json @@ -74,7 +74,7 @@ "weight": 0.5, "value": 100, "flags": ["CONSUMABLE", "DESTRUCTIBLE"], - "effects": { "particle": "*;#FFA500;200.0", "ranged": "10", "damage": "4d6;magic", "aoe": "2" }, + "effects": { "particle": "*;#FFA500;200.0", "ranged": "10", "damage": "4d6;fire", "aoe": "2" }, "magic": { "class": "uncommon", "naming": "scroll" } }, { @@ -87,7 +87,7 @@ "effects": { "particle_burst": "▓;*;~;#FFA500;#000000;500.0;#ffd381;60.0", "ranged": "10", - "damage": "8d6;magic", + "damage": "8d6;fire", "aoe": "3" }, "magic": { "class": "rare", "naming": "scroll" } @@ -363,7 +363,7 @@ "weight": 2, "value": 300, "flags": ["CHARGES"], - "effects": { "ranged": "10", "damage": "8d6;magic", "aoe": "3" }, + "effects": { "ranged": "10", "damage": "8d6;fire", "aoe": "3" }, "magic": { "class": "rare", "naming": "wand" } }, { diff --git a/raws/mobs.json b/raws/mobs.json index 651f4f2..ddd6556 100644 --- a/raws/mobs.json +++ b/raws/mobs.json @@ -323,13 +323,13 @@ "id": "ant_soldier", "name": "soldier ant", "renderable": { "glyph": "a", "fg": "#ca3f26", "bg": "#000000", "order": 1 }, - "flags": ["SMALL_GROUP"], + "flags": ["SMALL_GROUP", "POISON_RES"], "level": 3, "bac": 3, "speed": 18, "attacks": [ { "name": "bites", "hit_bonus": 0, "damage": "2d4" }, - { "name": "stings", "hit_bonus": 0, "damage": "3d4" } + { "name": "stings", "hit_bonus": 0, "damage": "3d4;poison" } ], "loot": { "table": "food", "chance": 0.05 } }, @@ -503,7 +503,7 @@ "id": "treant_small", "name": "treant sapling", "renderable": { "glyph": "♠️", "fg": "#10570d", "bg": "#000000", "order": 1 }, - "flags": ["LARGE_GROUP", "GREEN_BLOOD"], + "flags": ["LARGE_GROUP", "GREEN_BLOOD", "FIRE_WEAK"], "level": 2, "bac": 12, "speed": 3, diff --git a/src/components.rs b/src/components.rs index 3a7a552..8c56cce 100644 --- a/src/components.rs +++ b/src/components.rs @@ -370,14 +370,17 @@ pub struct ProvidesHealing { #[derive(Debug, PartialEq, Eq, Hash, Copy, Clone, Serialize, Deserialize)] pub enum DamageType { Physical, - Magic, + Magic, // e.g. magic missiles, silvered weapons + Fire, // e.g. fireball + Cold, // e.g. cone of cold + Poison, // e.g. poison gas Forced, // Bypasses any immunities. e.g. Hunger ticks. } impl DamageType { pub fn is_magic(&self) -> bool { match self { - DamageType::Magic => true, + DamageType::Magic | DamageType::Fire | DamageType::Cold => true, _ => false, } } diff --git a/src/raws/rawmaster.rs b/src/raws/rawmaster.rs index 1bc355a..55753eb 100644 --- a/src/raws/rawmaster.rs +++ b/src/raws/rawmaster.rs @@ -90,12 +90,21 @@ macro_rules! apply_flags { "HERBIVORE" => $eb = $eb.with(Faction { name: "herbivore".to_string() }), "CARNIVORE" => $eb = $eb.with(Faction { name: "carnivore".to_string() }), // --- DAMAGE MODIFIERS --- + "PHYS_IMMUNITY" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Immune); } + "PHYS_WEAK" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Weakness); } + "PHYS_RES" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Resistance); } "MAGIC_IMMUNITY" => { damage_modifiers.insert(DamageType::Magic, DamageModifier::Immune); } - "MAGIC_WEAKNESS" => { damage_modifiers.insert(DamageType::Magic, DamageModifier::Weakness); } - "MAGIC_RESISTANCE" => { damage_modifiers.insert(DamageType::Magic, DamageModifier::Resistance); } - "PHYSICAL_IMMUNITY" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Immune); } - "PHYSICAL_WEAKNESS" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Weakness); } - "PHYSICAL_RESISTANCE" => { damage_modifiers.insert(DamageType::Physical, DamageModifier::Resistance); } + "MAGIC_WEAK" => { damage_modifiers.insert(DamageType::Magic, DamageModifier::Weakness); } + "MAGIC_RES" => { damage_modifiers.insert(DamageType::Magic, DamageModifier::Resistance); } + "FIRE_IMMUNITY" => { damage_modifiers.insert(DamageType::Fire, DamageModifier::Immune); } + "FIRE_WEAK" => { damage_modifiers.insert(DamageType::Fire, DamageModifier::Weakness); } + "FIRE_RES" => { damage_modifiers.insert(DamageType::Fire, DamageModifier::Resistance); } + "COLD_IMMUNITY" => { damage_modifiers.insert(DamageType::Cold, DamageModifier::Immune); } + "COLD_WEAK" => { damage_modifiers.insert(DamageType::Cold, DamageModifier::Weakness); } + "COLD_RES" => { damage_modifiers.insert(DamageType::Cold, DamageModifier::Resistance); } + "POISON_IMMUNITY" => { damage_modifiers.insert(DamageType::Poison, DamageModifier::Immune); } + "POISON_WEAK" => { damage_modifiers.insert(DamageType::Poison, DamageModifier::Weakness); } + "POISON_RES" => { damage_modifiers.insert(DamageType::Poison, DamageModifier::Resistance); } // --- MOVEMENT MODES --- ( defaults to WANDER ) "STATIC" => $eb = $eb.with(MoveMode { mode: Movement::Static }), "RANDOM_PATH" => $eb = $eb.with(MoveMode { mode: Movement::RandomWaypoint { path: None } }), @@ -1058,6 +1067,9 @@ fn parse_damage_string(n: &str) -> (DamageType, DiceType) { match tokens[1] { "physical" => DamageType::Physical, "magic" => DamageType::Magic, + "fire" => DamageType::Fire, + "cold" => DamageType::Cold, + "poison" => DamageType::Poison, _ => panic!("Unrecognised damage type in raws: {}", tokens[1]), } } else {