LambdaHack-0.2.12: GameDefinition/Content/ItemKind.hs
-- | Weapons and treasure for LambdaHack.
module Content.ItemKind ( cdefs ) where
import Game.LambdaHack.Common.Color
import Game.LambdaHack.Common.ContentDef
import Game.LambdaHack.Common.Effect
import Game.LambdaHack.Common.Flavour
import Game.LambdaHack.Common.ItemFeature
import Game.LambdaHack.Common.Random
import Game.LambdaHack.Content.ItemKind
cdefs :: ContentDef ItemKind
cdefs = ContentDef
{ getSymbol = isymbol
, getName = iname
, getFreq = ifreq
, validate = validateItemKind
, content =
[amulet, dart, gem1, gem2, gem3, currency, harpoon, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand1, wand2, fist, foot, tentacle, fragrance, mist_healing, mist_wounding, glass_piece, smoke]
}
amulet, dart, gem1, gem2, gem3, currency, harpoon, potion1, potion2, potion3, ring, scroll1, scroll2, scroll3, sword, wand1, wand2, fist, foot, tentacle, fragrance, mist_healing, mist_wounding, glass_piece, smoke :: ItemKind
gem, potion, scroll, wand :: ItemKind -- generic templates
-- castDeep (aDb, xDy) = castDice aDb + (lvl - 1) * castDice xDy / (depth - 1)
amulet = ItemKind
{ isymbol = '"'
, iname = "amulet"
, ifreq = [("useful", 6)]
, iflavour = zipFancy [BrGreen]
, icount = intToDeep 1
, iverbApply = "tear down"
, iverbProject = "cast"
, iweight = 30
, itoThrow = -50 -- not dense enough
, ifeature = [Cause $ Regeneration (rollDeep (2, 3) (1, 10))]
}
dart = ItemKind
{ isymbol = '|'
, iname = "dart"
, ifreq = [("useful", 20)]
, iflavour = zipPlain [Cyan]
, icount = rollDeep (3, 3) (0, 0)
, iverbApply = "snap"
, iverbProject = "hurl"
, iweight = 50
, itoThrow = 0 -- a cheap dart
, ifeature = [Cause $ Hurt (rollDice 1 2) (rollDeep (1, 2) (1, 2))]
}
gem = ItemKind
{ isymbol = '*'
, iname = "gem"
, ifreq = [("treasure", 20)] -- x3, but rare on shallow levels
, iflavour = zipPlain brightCol -- natural, so not fancy
, icount = intToDeep 0
, iverbApply = "crush"
, iverbProject = "toss"
, iweight = 50
, itoThrow = 0
, ifeature = []
}
gem1 = gem
{ icount = rollDeep (0, 0) (1, 1) -- appears on max depth
}
gem2 = gem
{ icount = rollDeep (0, 0) (1, 2) -- appears halfway
}
gem3 = gem
{ icount = rollDeep (0, 0) (1, 3) -- appears early
}
currency = ItemKind
{ isymbol = '$'
, iname = "gold piece"
, ifreq = [("treasure", 20), ("currency", 1)]
, iflavour = zipPlain [BrYellow]
, icount = rollDeep (0, 0) (10, 10) -- appears on lvl 2
, iverbApply = "grind"
, iverbProject = "toss"
, iweight = 31
, itoThrow = 0
, ifeature = []
}
harpoon = ItemKind
{ isymbol = '|'
, iname = "harpoon"
, ifreq = [("useful", 25)]
, iflavour = zipPlain [Brown]
, icount = rollDeep (0, 0) (2, 2)
, iverbApply = "break up"
, iverbProject = "hurl"
, iweight = 4000
, itoThrow = 0 -- cheap but deadly
, ifeature = [Cause $ Hurt (rollDice 2 2) (rollDeep (1, 2) (2, 2))]
}
potion = ItemKind
{ isymbol = '!'
, iname = "potion"
, ifreq = [("useful", 15)]
, iflavour = zipFancy stdCol
, icount = intToDeep 1
, iverbApply = "gulp down"
, iverbProject = "lob"
, iweight = 200
, itoThrow = -50 -- oily, bad grip
, ifeature = []
}
potion1 = potion
{ ifreq = [("useful", 5)]
, ifeature = [Cause ApplyPerfume, Explode "fragrance"]
}
potion2 = potion
{ ifeature = [Cause $ Heal 5, Explode "mist healing"]
}
potion3 = potion
{ ifreq = [("useful", 5)]
, ifeature = [Cause $ Heal (-5), Explode "mist wounding"]
}
ring = ItemKind
{ isymbol = '='
, iname = "ring"
, ifreq = [] -- [("useful", 10)] -- TODO: make it useful
, iflavour = zipPlain [White]
, icount = intToDeep 1
, iverbApply = "squeeze down"
, iverbProject = "toss"
, iweight = 15
, itoThrow = 0
, ifeature = [Cause $ Searching (rollDeep (1, 6) (3, 2))]
}
scroll = ItemKind
{ isymbol = '?'
, iname = "scroll"
, ifreq = [("useful", 4)]
, iflavour = zipFancy darkCol -- arcane and old
, icount = intToDeep 1
, iverbApply = "decipher"
, iverbProject = "lob"
, iweight = 50
, itoThrow = -75 -- bad shape, even rolled up
, ifeature = []
}
scroll1 = scroll
{ ifreq = [("useful", 2)]
, ifeature = [Cause $ CallFriend 1]
}
scroll2 = scroll
{ ifeature = [Cause $ Summon 1]
}
scroll3 = scroll
{ ifeature = [Cause $ Ascend (-1)]
}
sword = ItemKind
{ isymbol = ')'
, iname = "sword"
, ifreq = [("useful", 40)]
, iflavour = zipPlain [BrCyan]
, icount = intToDeep 1
, iverbApply = "hit"
, iverbProject = "heave"
, iweight = 2000
, itoThrow = -50 -- ensuring it hits with the tip costs speed
, ifeature = [Cause $ Hurt (rollDice 5 1) (rollDeep (1, 2) (4, 2))]
}
wand = ItemKind
{ isymbol = '/'
, iname = "wand"
, ifreq = [("useful", 5)]
, iflavour = zipFancy brightCol
, icount = intToDeep 1
, iverbApply = "snap"
, iverbProject = "zap"
, iweight = 300
, itoThrow = 25 -- magic
, ifeature = [Fragile]
}
wand1 = wand
{ ifeature = ifeature wand ++ [Cause Dominate]
}
wand2 = wand
{ ifreq = [("useful", 2)]
, ifeature = ifeature wand ++ [Cause $ Heal (-25)]
}
fist = sword
{ isymbol = '@'
, iname = "fist"
, ifreq = [("hth", 1), ("unarmed", 100)]
, iverbApply = "punch"
, iverbProject = "ERROR, please report: iverbProject fist"
, ifeature = [Cause $ Hurt (rollDice 5 1) (intToDeep 0)]
}
foot = sword
{ isymbol = '@'
, iname = "foot"
, ifreq = [("hth", 1), ("unarmed", 50)]
, iverbApply = "kick"
, iverbProject = "ERROR, please report: iverbProject foot"
, ifeature = [Cause $ Hurt (rollDice 5 1) (intToDeep 0)]
}
tentacle = sword
{ isymbol = 'S'
, iname = "tentacle"
, ifreq = [("hth", 1), ("monstrous", 100)]
, iverbApply = "hit"
, iverbProject = "ERROR, please report: iverbProject tentacle"
, ifeature = [Cause $ Hurt (rollDice 5 1) (intToDeep 0)]
}
fragrance = ItemKind
{ isymbol = '\''
, iname = "fragrance"
, ifreq = [("fragrance", 1)]
, iflavour = zipFancy [BrMagenta]
, icount = rollDeep (5, 2) (0, 0)
, iverbApply = "smell"
, iverbProject = "exude"
, iweight = 1
, itoThrow = -93 -- the slowest that gets anywhere (1 step only)
, ifeature = [Fragile]
}
mist_healing = ItemKind
{ isymbol = '\''
, iname = "mist"
, ifreq = [("mist healing", 1)]
, iflavour = zipFancy [White]
, icount = rollDeep (12, 2) (0, 0)
, iverbApply = "inhale"
, iverbProject = "blow"
, iweight = 1
, itoThrow = -87 -- the slowest that travels at least 2 steps
, ifeature = [Cause $ Heal 1, Fragile]
}
mist_wounding = ItemKind
{ isymbol = '\''
, iname = "mist"
, ifreq = [("mist wounding", 1)]
, iflavour = zipFancy [White]
, icount = rollDeep (12, 2) (0, 0)
, iverbApply = "inhale"
, iverbProject = "blow"
, iweight = 1
, itoThrow = -87
, ifeature = [Cause $ Heal (-1), Fragile]
}
glass_piece = ItemKind
{ isymbol = '\''
, iname = "glass piece"
, ifreq = [("glass piece", 1)]
, iflavour = zipPlain [BrBlue]
, icount = rollDeep (10, 2) (0, 0)
, iverbApply = "grate"
, iverbProject = "toss"
, iweight = 10
, itoThrow = 0
, ifeature = [Cause $ Hurt (rollDice 1 1) (intToDeep 0), Fragile, Linger 20]
}
smoke = ItemKind
{ isymbol = '\''
, iname = "smoke"
, ifreq = [("smoke", 1)]
, iflavour = zipPlain [BrBlack]
, icount = rollDeep (12, 2) (0, 0)
, iverbApply = "inhale"
, iverbProject = "blow"
, iweight = 1
, itoThrow = -70
, ifeature = [Fragile]
}