LambdaHack-0.10.3.0: GameDefinition/Content/ItemKindOrgan.hs
-- | 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 = ""
}