-- | Actor organ definitions. module Content.ItemKindOrgan ( -- * Group name patterns pattern S_FIST, pattern S_FOOT, pattern S_HOOKED_CLAW, pattern S_SMALL_CLAW, pattern S_SNOUT, pattern S_SMALL_JAW, pattern S_JAW, pattern S_LARGE_JAW, pattern S_ANTLER, pattern S_HORN, pattern S_RHINO_HORN, pattern S_TENTACLE, pattern S_TIP, pattern S_LIP, pattern S_THORN, pattern S_BOILING_FISSURE, pattern S_ARSENIC_FISSURE, pattern S_SULFUR_FISSURE, pattern S_BEE_STING, pattern S_STING, pattern S_VENOM_TOOTH, pattern S_VENOM_FANG, pattern S_SCREECHING_BEAK, pattern S_LARGE_TAIL, pattern S_HUGE_TAIL, pattern S_ARMORED_SKIN, pattern S_BARK, pattern S_NOSTRIL, pattern S_RATLLE, pattern S_INSECT_MORTALITY, pattern S_SAPIENT_BRAIN, pattern S_ANIMAL_BRAIN, pattern S_SCENT_GLAND, pattern S_BOILING_VENT, pattern S_ARSENIC_VENT, pattern S_SULFUR_VENT, pattern S_EYE_3, pattern S_EYE_6, pattern S_EYE_8, pattern S_VISION_6, pattern S_VISION_12, pattern S_VISION_16, pattern S_EAR_3, pattern S_EAR_6, pattern S_EAR_8, pattern S_SPEED_GLAND_5, pattern S_SPEED_GLAND_10 , pattern SCAVENGER , pattern S_TOOTH, pattern S_LASH, pattern S_RIGHT_TORSION, pattern S_LEFT_TORSION, pattern S_PUPIL , organsGNSingleton, organsGN , -- * Content organs ) where import Prelude () import Game.LambdaHack.Core.Prelude import Content.ItemKindBlast import Content.ItemKindTemporary import Content.RuleKind import Game.LambdaHack.Content.ItemKind import Game.LambdaHack.Content.RuleKind import Game.LambdaHack.Core.Dice import Game.LambdaHack.Definition.Ability import Game.LambdaHack.Definition.Color import Game.LambdaHack.Definition.Defs import Game.LambdaHack.Definition.DefsInternal import Game.LambdaHack.Definition.Flavour -- * Group name patterns organsGNSingleton :: [GroupName ItemKind] organsGNSingleton = [S_FIST, S_FOOT, S_HOOKED_CLAW, S_SMALL_CLAW, S_SNOUT, S_SMALL_JAW, S_JAW, S_LARGE_JAW, S_ANTLER, S_HORN, S_RHINO_HORN, S_TENTACLE, S_TIP, S_LIP, S_THORN, S_BOILING_FISSURE, S_ARSENIC_FISSURE, S_SULFUR_FISSURE, S_BEE_STING, S_STING, S_VENOM_TOOTH, S_VENOM_FANG, S_SCREECHING_BEAK, S_LARGE_TAIL, S_HUGE_TAIL, S_ARMORED_SKIN, S_BARK, S_NOSTRIL, S_RATLLE, S_INSECT_MORTALITY, S_SAPIENT_BRAIN, S_ANIMAL_BRAIN, S_SCENT_GLAND, S_BOILING_VENT, S_ARSENIC_VENT, S_SULFUR_VENT, S_EYE_3, S_EYE_6, S_EYE_8, S_VISION_6, S_VISION_12, S_VISION_16, S_EAR_3, S_EAR_6, S_EAR_8, S_SPEED_GLAND_5, S_SPEED_GLAND_10] ++ [S_TOOTH, S_LASH, S_RIGHT_TORSION, S_LEFT_TORSION, S_PUPIL] pattern S_FIST, S_FOOT, S_HOOKED_CLAW, S_SMALL_CLAW, S_SNOUT, S_SMALL_JAW, S_JAW, S_LARGE_JAW, S_ANTLER, S_HORN, S_RHINO_HORN, S_TENTACLE, S_TIP, S_LIP, S_THORN, S_BOILING_FISSURE, S_ARSENIC_FISSURE, S_SULFUR_FISSURE, S_BEE_STING, S_STING, S_VENOM_TOOTH, S_VENOM_FANG, S_SCREECHING_BEAK, S_LARGE_TAIL, S_HUGE_TAIL, S_ARMORED_SKIN, S_BARK, S_NOSTRIL, S_RATLLE, S_INSECT_MORTALITY, S_SAPIENT_BRAIN, S_ANIMAL_BRAIN, S_SCENT_GLAND, S_BOILING_VENT, S_ARSENIC_VENT, S_SULFUR_VENT, S_EYE_3, S_EYE_6, S_EYE_8, S_VISION_6, S_VISION_12, S_VISION_16, S_EAR_3, S_EAR_6, S_EAR_8, S_SPEED_GLAND_5, S_SPEED_GLAND_10 :: GroupName ItemKind pattern S_TOOTH, S_LASH, S_RIGHT_TORSION, S_LEFT_TORSION, S_PUPIL :: GroupName ItemKind organsGN :: [GroupName ItemKind] organsGN = [SCAVENGER] pattern SCAVENGER :: GroupName ItemKind pattern S_FIST = GroupName "fist" pattern S_FOOT = GroupName "foot" pattern S_HOOKED_CLAW = GroupName "hooked claw" pattern S_SMALL_CLAW = GroupName "small claw" pattern S_SNOUT = GroupName "snout" pattern S_SMALL_JAW = GroupName "small jaw" pattern S_JAW = GroupName "jaw" pattern S_LARGE_JAW = GroupName "large jaw" pattern S_ANTLER = GroupName "antler" pattern S_HORN = GroupName "horn" pattern S_RHINO_HORN = GroupName "rhino horn" pattern S_TENTACLE = GroupName "tentacle" pattern S_TIP = GroupName "tip" pattern S_LIP = GroupName "lip" pattern S_THORN = GroupName "thorn" pattern S_BOILING_FISSURE = GroupName "boiling fissure" pattern S_ARSENIC_FISSURE = GroupName "arsenic fissure" pattern S_SULFUR_FISSURE = GroupName "sulfur fissure" pattern S_BEE_STING = GroupName "bee sting" pattern S_STING = GroupName "sting" pattern S_VENOM_TOOTH = GroupName "venom tooth" pattern S_VENOM_FANG = GroupName "venom fang" pattern S_SCREECHING_BEAK = GroupName "screeching beak" pattern S_LARGE_TAIL = GroupName "large tail" pattern S_HUGE_TAIL = GroupName "huge tail" pattern S_ARMORED_SKIN = GroupName "armored skin" pattern S_BARK = GroupName "bark" pattern S_NOSTRIL = GroupName "nostril" pattern S_RATLLE = GroupName "rattle" pattern S_INSECT_MORTALITY = GroupName "insect mortality" pattern S_SAPIENT_BRAIN = GroupName "sapient brain" pattern S_ANIMAL_BRAIN = GroupName "animal brain" pattern S_SCENT_GLAND = GroupName "scent gland" pattern S_BOILING_VENT = GroupName "boiling vent" pattern S_ARSENIC_VENT = GroupName "arsenic vent" pattern S_SULFUR_VENT = GroupName "sulfur vent" pattern S_EYE_3 = GroupName "eye 3" pattern S_EYE_6 = GroupName "eye 6" pattern S_EYE_8 = GroupName "eye 8" pattern S_VISION_6 = GroupName "vision 6" pattern S_VISION_12 = GroupName "vision 12" pattern S_VISION_16 = GroupName "vision 16" pattern S_EAR_3 = GroupName "ear 3" pattern S_EAR_6 = GroupName "ear 6" pattern S_EAR_8 = GroupName "ear 8" pattern S_SPEED_GLAND_5 = GroupName "speed gland 5" pattern S_SPEED_GLAND_10 = GroupName "speed gland 10" pattern SCAVENGER = GroupName "scavenger" -- * LH-specific pattern S_TOOTH = GroupName "tooth" pattern S_LASH = GroupName "lash" pattern S_RIGHT_TORSION = GroupName "right torsion" pattern S_LEFT_TORSION = GroupName "left torsion" pattern S_PUPIL = GroupName "pupil" -- * Content organs :: [ItemKind] organs = [fist, foot, hookedClaw, smallClaw, snout, smallJaw, jaw, largeJaw, antler, horn, rhinoHorn, tentacle, tip, lip, thorn, boilingFissure, arsenicFissure, sulfurFissure, beeSting, sting, venomTooth, venomFang, screechingBeak, largeTail, hugeTail, armoredSkin, bark, eye3, eye6, eye8, vision6, vision12, vision16, nostril, ear3, ear6, ear8, rattleOrgan, insectMortality, sapientBrain, animalBrain, speedGland5, speedGland10, scentGland, boilingVent, arsenicVent, sulfurVent, bonusHP, braced, asleep, impressed] -- LH-specific ++ [tooth, lash, torsionRight, torsionLeft, pupil] fist, foot, hookedClaw, smallClaw, snout, smallJaw, jaw, largeJaw, antler, horn, rhinoHorn, tentacle, tip, lip, thorn, boilingFissure, arsenicFissure, sulfurFissure, beeSting, sting, venomTooth, venomFang, screechingBeak, largeTail, hugeTail, armoredSkin, bark, eye3, eye6, eye8, vision6, vision12, vision16, nostril, ear3, ear6, ear8, rattleOrgan, insectMortality, sapientBrain, animalBrain, speedGland5, speedGland10, scentGland, boilingVent, arsenicVent, sulfurVent, bonusHP, braced, asleep, impressed :: ItemKind -- LH-specific tooth, lash, torsionRight, torsionLeft, pupil :: ItemKind symbolWand :: ContentSymbol ItemKind symbolWand = rsymbolWand $ ritemSymbols standardRules -- * No-cooldown melee damage organs without effects thorn = fist { isymbol = symbolWand , iname = "thorn" , ifreq = [(S_THORN, 1)] , icount = 2 + 1 `d` 2 -- unrealistic, but not boring , iverbHit = "puncture" , idamage = 2 `d` 1 , iaspects = [SetFlag Meleeable] -- not Durable , ieffects = [VerbNoLonger "be not so thorny any more" "."] , idesc = "Sharp yet brittle." } tip = fist { iname = "tip" , ifreq = [(S_TIP, 1)] , icount = 1 , iverbHit = "poke" , idamage = 2 `d` 1 , idesc = "" } fist = ItemKind { isymbol = toContentSymbol ',' , iname = "fist" , ifreq = [(S_FIST, 1)] , iflavour = zipPlain [Red] , icount = 2 , irarity = [(1, 1)] , iverbHit = "punch" , iweight = 2000 , idamage = 4 `d` 1 , iaspects = [SetFlag Durable, SetFlag Meleeable] , ieffects = [] , idesc = "Simple but effective." , ikit = [] } foot = fist { iname = "foot" , ifreq = [(S_FOOT, 1)] , iverbHit = "kick" , idamage = 4 `d` 1 , idesc = "A weapon you can still use if disarmed." -- great example of tutorial hints inside a flavourful text } smallClaw = fist { iname = "small claw" , ifreq = [(S_SMALL_CLAW, 1)] , iverbHit = "slash" , idamage = 2 `d` 1 , idesc = "A pearly spike." } snout = fist { iname = "snout" , ifreq = [(S_SNOUT, 1)] , icount = 1 , iverbHit = "bite" , idamage = 2 `d` 1 , idesc = "Sensitive and wide-nostrilled." } smallJaw = fist { iname = "small jaw" , ifreq = [(S_SMALL_JAW, 1)] , icount = 1 , iverbHit = "rip" , idamage = 3 `d` 1 , idesc = "Filled with small, even teeth." } -- * Cooldown melee damage organs without effects tentacle = fist -- two copies only { iname = "tentacle" , ifreq = [(S_TENTACLE, 1)] , iverbHit = "slap" , idamage = 4 `d` 1 , iaspects = Timeout 3 -- minimal timeout that lets other organs show : iaspects fist , idesc = "Damp and dextrous." } jaw = fist { iname = "jaw" , ifreq = [(S_JAW, 1)] , icount = 1 , iverbHit = "rip" , idamage = 5 `d` 1 , iaspects = Timeout (2 + 1 `d` 2) -- no effect, but limit raw damage : iaspects fist , idesc = "Delivers a powerful bite." } horn = fist { iname = "horn" , ifreq = [(S_HORN, 1)] , iverbHit = "impale" , idamage = 5 `d` 1 , iaspects = [ Timeout 7 -- no effect, but limit raw damage; two copies , AddSkill SkArmorMelee 10 ] -- bonus doubled ++ iaspects fist , idesc = "Sharp and long, for defence or attack." } largeJaw = fist { iname = "large jaw" , ifreq = [(S_LARGE_JAW, 1)] , icount = 1 , iverbHit = "crush" , idamage = 10 `d` 1 , iaspects = Timeout (2 + 1 `d` 2) -- no effect, but limit raw damage : iaspects fist , idesc = "Enough to swallow anything in a single gulp." } -- * Direct damage organs with effects beeSting = fist { isymbol = symbolWand , iname = "bee sting" , ifreq = [(S_BEE_STING, 1)] , icount = 1 , iverbHit = "sting" , idamage = 0 , iaspects = [ AddSkill SkArmorMelee 200, AddSkill SkArmorRanged 45 , SetFlag Meleeable ] -- not Durable , ieffects = [Paralyze 6, RefillHP 4] -- no special message when runs out, because it's 1 copy , idesc = "Painful, but beneficial." } sting = fist { isymbol = symbolWand , iname = "sting" , ifreq = [(S_STING, 1)] , icount = 1 , iverbHit = "inject" , idamage = 1 `d` 1 , iaspects = [Timeout $ 10 - 1 `dL` 4, AddSkill SkHurtMelee 40] ++ iaspects fist , ieffects = [toOrganBad S_RETAINING (3 + 1 `d` 3)] , idesc = "Painful, debilitating and harmful." } lip = fist { iname = "lip" , ifreq = [(S_LIP, 1)] , icount = 1 , iverbHit = "lap" , idamage = 1 `d` 1 , iaspects = Timeout (3 + 1 `d` 2) : iaspects fist , ieffects = [toOrganBad S_WEAKENED (2 + 1 `dL` 3)] , idesc = "" } venomTooth = fist { isymbol = symbolWand , iname = "venom tooth" , ifreq = [(S_VENOM_TOOTH, 1)] , iverbHit = "bite" , idamage = 1 `d` 1 , iaspects = Timeout (7 - 1 `dL` 3) : iaspects fist , ieffects = [toOrganBad S_SLOWED (3 + 1 `d` 3)] , idesc = "A chilling numbness spreads from its bite." } hookedClaw = fist { isymbol = symbolWand , iname = "hooked claw" , ifreq = [(S_HOOKED_CLAW, 1)] , icount = 2 -- even if more, only the fore claws used for fighting , iverbHit = "hook" , idamage = 2 `d` 1 , iaspects = Timeout (12 - 1 `dL` 3) : iaspects fist , ieffects = [toOrganBad S_SLOWED 2] , idesc = "A curved talon." } screechingBeak = fist { isymbol = symbolWand , iname = "screeching beak" , ifreq = [(S_SCREECHING_BEAK, 1)] , icount = 1 , iverbHit = "peck" , idamage = 3 `d` 1 , iaspects = Timeout (7 - 1 `dL` 3) : iaspects fist , ieffects = [Summon SCAVENGER $ 1 `dL` 3] , idesc = "Both a weapon and a beacon, calling more scavengers to the meal." } antler = fist { isymbol = symbolWand , iname = "antler" , ifreq = [(S_ANTLER, 1)] , iverbHit = "ram" , idamage = 4 `d` 1 , iaspects = [ Timeout $ 3 + (1 `d` 3) * 3 , AddSkill SkArmorMelee 10 ] -- bonus doubled ++ iaspects fist , ieffects = [PushActor (ThrowMod 100 50 1)] -- 1 step, slow , idesc = "" } rhinoHorn = fist { isymbol = symbolWand , iname = "ugly horn" -- made of keratin, unlike real horns , ifreq = [(S_RHINO_HORN, 1)] , icount = 1 -- single, unlike real horns , iverbHit = "gore" , idamage = 5 `d` 1 , iaspects = [Timeout 5, AddSkill SkHurtMelee 20] ++ iaspects fist , ieffects = [Impress, Yell] -- the owner is a mid-boss, after all , idesc = "Very solid, considering it has the same composition as fingernails." } largeTail = fist { isymbol = symbolWand , iname = "large tail" , ifreq = [(S_LARGE_TAIL, 1)] , icount = 1 , iverbHit = "knock" , idamage = 7 `d` 1 , iaspects = [Timeout $ 2 + 1 `d` 2, AddSkill SkHurtMelee 20] ++ iaspects fist -- timeout higher, lest they regain push before closing again , ieffects = [PushActor (ThrowMod 200 50 1)] -- 1 step, fast , idesc = "Almost as long as the trunk." } hugeTail = largeTail { isymbol = symbolWand , iname = "huge tail" , ifreq = [(S_HUGE_TAIL, 1)] , iverbHit = "upend" , iaspects = [Timeout $ 3 + 1 `d` 2, AddSkill SkHurtMelee 20] ++ iaspects fist -- timeout higher, lest they regain push before closing again , ieffects = [PushActor (ThrowMod 400 50 1)] -- 2 steps, fast , idesc = "Slow but immensely heavy." } -- * Melee weapons without direct damage venomFang = fist { isymbol = symbolWand , iname = "venom fang" , ifreq = [(S_VENOM_FANG, 1)] , iverbHit = "bite" , idamage = 0 , iaspects = Timeout (10 - 1 `dL` 5) : iaspects fist , ieffects = [toOrganNoTimer S_POISONED] , idesc = "Dripping with deadly venom." } -- * Special melee weapons sulfurFissure = boilingFissure { iname = "fissure" , ifreq = [(S_SULFUR_FISSURE, 1)] , icount = 2 + 1 `d` 2 , idamage = 0 -- heal not via (negative) idamage, for armour would block it , iaspects = SetFlag Benign : iaspects boilingFissure , ieffects = [ RefillHP 5 , VerbNoLonger "run out of the healing fumes" "."] , idesc = "" } boilingFissure = fist { isymbol = symbolWand , iname = "fissure" , ifreq = [(S_BOILING_FISSURE, 1)] , icount = 5 + 1 `d` 5 , iverbHit = "hiss at" , idamage = 1 `d` 1 , iaspects = [ AddSkill SkHurtMelee 20 -- decreasing as count decreases , SetFlag Meleeable ] -- not Durable , ieffects = [ DropItem 1 1 COrgan CONDITION -- useful; limited , VerbNoLonger "widen the crack, releasing pressure" "."] , idesc = "A deep crack to the underworld." } arsenicFissure = boilingFissure { iname = "fissure" , ifreq = [(S_ARSENIC_FISSURE, 1)] , icount = 3 + 1 `d` 3 , idamage = 2 `d` 1 , ieffects = [ toOrganBad S_PARSIMONIOUS (5 + 1 `d` 3) -- weaken/poison, impacting intellectual abilities first , VerbNoLonger "stop exuding stupefying vapours" "."] , idesc = "" } -- * Armor organs armoredSkin = ItemKind { isymbol = toContentSymbol ',' , iname = "armored skin" , ifreq = [(S_ARMORED_SKIN, 1)] , iflavour = zipPlain [Red] , icount = 1 , irarity = [(1, 1)] , iverbHit = "bash" , iweight = 2000 , idamage = 0 , iaspects = [ AddSkill SkArmorMelee 30, AddSkill SkArmorRanged 15 , SetFlag Durable ] , ieffects = [] , idesc = "Homemade armour is just as good." -- hmm, it may get confused with leather armor jackets, etc. , ikit = [] } bark = armoredSkin { iname = "bark" , ifreq = [(S_BARK, 1)] , idesc = "" } -- * Sense organs eye :: Int -> GroupName ItemKind -> ItemKind eye n grp = armoredSkin { iname = "eye" , ifreq = [(grp, 1)] , icount = 2 , iverbHit = "glare at" , iaspects = [ AddSkill SkSight (intToDice n) , SetFlag Durable ] , idesc = "A piercing stare." } eye3 = eye 3 S_EYE_3 eye6 = eye 6 S_EYE_6 eye8 = eye 8 S_EYE_8 vision :: Int -> GroupName ItemKind -> ItemKind vision n grp = armoredSkin { iname = "vision" , ifreq = [(grp, 1)] , iverbHit = "visualize" , iaspects = [ AddSkill SkSight (intToDice n) , SetFlag Durable ] , idesc = "" } vision6 = vision 6 S_VISION_6 vision12 = vision 12 S_VISION_12 vision16 = vision 16 S_VISION_16 nostril = armoredSkin { iname = "nostril" , ifreq = [(S_NOSTRIL, 1)] , icount = 2 , iverbHit = "snuff" , iaspects = [ AddSkill SkSmell 1 -- times 2, from icount , SetFlag Durable ] , idesc = "" } ear :: Int -> GroupName ItemKind -> ItemKind ear n grp = armoredSkin { iname = "ear" , ifreq = [(grp, 1)] , icount = 2 , iverbHit = "overhear" , iaspects = [ AddSkill SkHearing (intToDice n) , SetFlag Durable ] , idesc = "" } ear3 = ear 3 S_EAR_3 ear6 = ear 6 S_EAR_6 ear8 = ear 8 S_EAR_8 -- * Assorted rattleOrgan = armoredSkin { iname = "rattle" , ifreq = [(S_RATLLE, 1)] , iverbHit = "announce" , iaspects = [ Timeout $ 10 + (1 `d` 3) * 10 -- long, to limit spam , SetFlag Periodic, SetFlag Durable ] , ieffects = [Yell, RefillCalm 5] , idesc = "" } insectMortality = armoredSkin { iname = "insect mortality" , ifreq = [(S_INSECT_MORTALITY, 1)] , iverbHit = "age" , iaspects = [ AddSkill SkAggression 2 -- try to attack before you die , Timeout $ 30 + (1 `d` 3) * 10 -- die very slowly , SetFlag Periodic, SetFlag Durable ] , ieffects = [RefillHP (-1), Yell] , idesc = "" } sapientBrain = armoredSkin { iname = "sapient brain" , ifreq = [(S_SAPIENT_BRAIN, 1)] , iverbHit = "outbrain" , iaspects = [AddSkill sk 1 | sk <- [SkMove .. SkApply]] ++ [AddSkill SkMove 4] -- can move at once when waking up ++ [AddSkill SkAlter 4] -- can use all stairs; dig rubble, ice ++ [AddSkill SkWait 2] -- can brace and sleep ++ [AddSkill SkApply 1] -- can use most items, not just foods ++ [SetFlag Durable] , idesc = "" } animalBrain = armoredSkin { iname = "animal brain" , ifreq = [(S_ANIMAL_BRAIN, 1)] , iverbHit = "blank" , iaspects = [AddSkill sk 1 | sk <- [SkMove .. SkApply]] ++ [AddSkill SkMove 4] -- can move at once when waking up ++ [AddSkill SkAlter 2] -- can use normal stairs; can't dig ++ [AddSkill SkWait 2] -- can brace and sleep -- No @SkApply@ bonus, so can only apply foods. Note, however, -- that AI doesn't risk applying unIded items, so in early -- game animals won't eat anything. ++ [AddSkill SkDisplace (-1)] -- no melee tactics ++ [AddSkill SkMoveItem (-1)] -- no item gathering ++ [AddSkill SkProject (-1)] -- nor item flinging ++ [SetFlag Durable] , idesc = "" } speedGland :: Int -> GroupName ItemKind -> ItemKind speedGland n grp = armoredSkin { isymbol = symbolWand , iname = "speed gland" , ifreq = [(grp, 1)] , iverbHit = "spit at" , iaspects = [ Timeout $ intToDice (100 `div` n) , AddSkill SkSpeed $ intToDice n , SetFlag Periodic, SetFlag Durable ] , ieffects = [RefillHP 1] , idesc = "" } speedGland5 = speedGland 5 S_SPEED_GLAND_5 speedGland10 = speedGland 10 S_SPEED_GLAND_10 scentGland = armoredSkin { isymbol = symbolWand , iname = "scent gland" , ifreq = [(S_SCENT_GLAND, 1)] , icount = 10 + 1 `d` 3 -- runs out , iverbHit = "spray at" , iaspects = [ Timeout $ (1 `d` 3) * 10 , SetFlag Periodic, SetFlag Fragile ] -- not Durable , ieffects = [ VerbNoLonger "look spent" "." , ApplyPerfume , Explode S_DISTRESSING_ODOR ] -- keep explosion at the end to avoid the ambiguity of -- "of ([foo explosion] of [bar])" , idesc = "" } sulfurVent = armoredSkin { isymbol = toContentSymbol 'v' , iname = "vent" , ifreq = [(S_SULFUR_VENT, 1)] , iflavour = zipPlain [BrYellow] , iverbHit = "menace" , iaspects = [ Timeout $ (2 + 1 `d` 3) * 5 , SetFlag Periodic, SetFlag Durable ] , ieffects = [RefillHP 2, Explode S_DENSE_SHOWER] , idesc = "" } boilingVent = armoredSkin { isymbol = toContentSymbol 'v' , iname = "vent" , ifreq = [(S_BOILING_VENT, 1)] , iflavour = zipPlain [Blue] , iverbHit = "menace" , iaspects = [ Timeout $ (2 + 1 `d` 3) * 5 , SetFlag Periodic, SetFlag Durable ] , ieffects = [RefillHP 2, Explode S_BOILING_WATER] , idesc = "" } arsenicVent = armoredSkin { isymbol = toContentSymbol 'v' , iname = "vent" , ifreq = [(S_ARSENIC_VENT, 1)] , iflavour = zipPlain [Cyan] , iverbHit = "menace" , iaspects = [ Timeout $ (2 + 1 `d` 3) * 5 , SetFlag Periodic, SetFlag Durable ] , ieffects = [RefillHP 2, Explode S_SPARSE_SHOWER] , idesc = "" } -- * Special bonusHP = armoredSkin { isymbol = toContentSymbol 'H' -- '+' reserved for conditions , iname = "bonus HP" , ifreq = [(S_BONUS_HP, 1)] , iflavour = zipPlain [BrBlue] , iverbHit = "intimidate" , iweight = 0 , iaspects = [AddSkill SkMaxHP 1] , idesc = "Growing up in a privileged background gave you the training and the discrete garment accessories that improve your posture and resilience." } braced = armoredSkin { isymbol = toContentSymbol 'B' , iname = "braced" , ifreq = [(S_BRACED, 1)] , iflavour = zipPlain [BrGreen] , iverbHit = "brace" , iweight = 0 , iaspects = [ AddSkill SkArmorMelee 50, AddSkill SkArmorRanged 25 , AddSkill SkHearing 10 , SetFlag Condition ] -- hack: display as condition , idesc = "Apart of increased resilience to attacks, being braced protects from displacement by foes and other forms of forced translocation, e.g., pushing or pulling." } asleep = armoredSkin { isymbol = toContentSymbol 'S' , iname = "asleep" , ifreq = [(S_ASLEEP, 1)] , iflavour = zipPlain [BrGreen] -- regenerates HP (very slowly) , icount = 5 , iverbHit = "slay" , iweight = 0 , iaspects = [AddSkill sk (-1) | sk <- [SkMove .. SkApply]] ++ [ AddSkill SkMelee 1, AddSkill SkAlter 1, AddSkill SkWait 1 , AddSkill SkSight (-3), AddSkill SkArmorMelee (-10) , SetFlag Condition ] -- hack: display as condition , idesc = "Sleep helps to regain health, albeit extremely slowly. Being asleep makes you vulnerable, with gradually diminishing effects as the slumber wears off over several turns. Any non-idle action, not only combat but even yawning or stretching removes a sizable portion of the sleepiness." } impressed = armoredSkin { isymbol = toContentSymbol 'I' , iname = "impressed" -- keep the same as in @ifreq@, to simplify code , ifreq = [(S_IMPRESSED, 1), (CONDITION, 1)] , iflavour = zipPlain [BrRed] , iverbHit = "confuse" , iweight = 0 , iaspects = [ AddSkill SkMaxCalm (-1) -- to help player notice on HUD -- and to count as bad condition , SetFlag Fragile -- to announce "no longer" only when -- all copies gone , SetFlag Condition ] -- this is really a condition, -- just not a timed condition , ieffects = [ OnSmash $ verbMsgLess "impressed" , OnSmash $ verbMsgNoLonger "impressed" ] -- not periodic, so no wear each turn, so only @OnSmash@ , idesc = "Being impressed by one's adversary sounds like fun, but on battlefield it equals treason. Almost. Throw in depleted battle calm and it leads to mindless desertion outright." } -- * LH-specific tooth = fist { iname = "tooth" , ifreq = [(S_TOOTH, 1)] , icount = 3 , iverbHit = "nail" , idamage = 2 `d` 1 , idesc = "" } lash = fist { iname = "lash" , ifreq = [(S_LASH, 1)] , icount = 1 , iverbHit = "lash" , idamage = 3 `d` 1 , idesc = "" } torsionRight = fist { iname = "right torsion" , ifreq = [(S_RIGHT_TORSION, 1)] , icount = 1 , iverbHit = "twist" , idamage = 13 `d` 1 , iaspects = [Timeout $ 5 + 1 `d` 5, AddSkill SkHurtMelee 20] ++ iaspects fist , ieffects = [toOrganBad S_SLOWED (3 + 1 `d` 3)] , idesc = "" } torsionLeft = fist { iname = "left torsion" , ifreq = [(S_LEFT_TORSION, 1)] , icount = 1 , iverbHit = "untwist" , idamage = 13 `d` 1 , iaspects = [Timeout $ 5 + 1 `d` 5, AddSkill SkHurtMelee 20] ++ iaspects fist , ieffects = [toOrganBad S_WEAKENED (3 + 1 `d` 3)] , idesc = "" } pupil = fist { iname = "pupil" , ifreq = [(S_PUPIL, 1)] , icount = 1 , iverbHit = "gaze at" , idamage = 1 `d` 1 , iaspects = [AddSkill SkSight 12, Timeout 12] ++ iaspects fist , ieffects = [DropItem 1 maxBound COrgan CONDITION, RefillCalm (-10)] -- can be useful for the player, but Calm drain is a risk , idesc = "" }