-- | Actor (or rather actor body trunk) definitions. module Content.ItemKindActor ( actors ) where import qualified Data.EnumMap.Strict as EM import Game.LambdaHack.Common.Ability import Game.LambdaHack.Common.Color import Game.LambdaHack.Common.Flavour import Game.LambdaHack.Common.Misc import Game.LambdaHack.Content.ItemKind actors :: [ItemKind] actors = [warrior, adventurer, blacksmith, forester, scientist, soldier, clerk, hairdresser, lawyer, peddler, taxCollector, eye, fastEye, nose, elbow, armadillo, gilaMonster, rattlesnake, komodoDragon, hyena, alligator, hornetSwarm, thornbush, geyser] warrior, adventurer, blacksmith, forester, scientist, soldier, clerk, hairdresser, lawyer, peddler, taxCollector, eye, fastEye, nose, elbow, armadillo, gilaMonster, rattlesnake, komodoDragon, hyena, alligator, hornetSwarm, thornbush, geyser :: ItemKind -- * Hunams warrior = ItemKind { isymbol = '@' , iname = "warrior" -- modified if in hero faction , ifreq = [("hero", 100), ("civilian", 100)] , iflavour = zipPlain [BrBlack] -- modified if in hero faction , icount = 1 , irarity = [(1, 5)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 60 -- partially from clothes and assumed first aid , AddMaxCalm 60, AddSpeed 20 , AddSkills $ EM.fromList [(AbProject, 1), (AbApply, 1)] -- TODO: on a ring? , AddSight 3 ] -- not via eyes, but feel, hearing, etc. , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [("fist", COrgan), ("foot", COrgan), ("eye 4", COrgan)] } adventurer = warrior { iname = "adventurer" } blacksmith = warrior { iname = "blacksmith" } forester = warrior { iname = "forester" } scientist = warrior { iname = "scientist" } soldier = warrior { iname = "soldier" , ifreq = [("soldier", 100)] , ikit = ikit warrior ++ [("starting weapon", CEqp)] } clerk = warrior { iname = "clerk" , ifreq = [("civilian", 100)] } hairdresser = clerk { iname = "hairdresser" } lawyer = clerk { iname = "lawyer" } peddler = clerk { iname = "peddler" } taxCollector = clerk { iname = "tax collector" } -- * Monsters eye = ItemKind { isymbol = 'e' , iname = "reducible eye" , ifreq = [("monster", 100), ("horror", 100)] , iflavour = zipPlain [BrRed] , icount = 1 , irarity = [(1, 10), (10, 6)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 10, AddMaxCalm 60, AddSpeed 20 , AddSkills $ EM.fromList [(AbProject, 1), (AbApply, 1)] , AddSight 4 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "Under your stare, it reduces to the bits that define its essence. Under introspection, the bits slow down and solidify into an arbitrary form again. It must be huge inside, for holographic principle to manifest so overtly." -- holographic principle is an anachronism for XIX or most of XX century, but "the cosmological scale effects" is too weak , ikit = [("lash", COrgan), ("pupil", COrgan)] } fastEye = ItemKind { isymbol = 'j' , iname = "injective jaw" , ifreq = [("monster", 100), ("horror", 100)] , iflavour = zipPlain [BrBlue] , icount = 1 , irarity = [(1, 3), (10, 5)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 5, AddMaxCalm 60, AddSpeed 30 , AddSight 7 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "Hungers but never eats. Bites but never swallows. Burrows its own image through, but never carries anything back." -- rather weak: not about injective objects, but puny, concrete, injective functions --- where's the madness in that? , ikit = [ ("tooth", COrgan), ("speed gland 10", COrgan) , ("lip", COrgan), ("lip", COrgan) ] } nose = ItemKind { isymbol = 'n' , iname = "point-free nose" , ifreq = [("monster", 100), ("horror", 100)] , iflavour = zipPlain [BrGreen] , icount = 1 , irarity = [(1, 10), (3, 0), (4, 5), (10, 5)] -- ensure explorers at lvl 3 , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 20, AddMaxCalm 30, AddSpeed 18 , AddSkills $ EM.fromList [(AbProject, -1), (AbApply, -1)] , AddSmell 3 ] -- depends solely on smell , ieffects = [] , ifeature = [Durable, Identified] , idesc = "No mouth, yet it devours everything around, constantly sniffing itself inward; pure movement structure, no constant point to focus one's maddened gaze on." , ikit = [("nose tip", COrgan), ("lip", COrgan)] } elbow = ItemKind { isymbol = 'e' , iname = "commutative elbow" , ifreq = [("monster", 100), ("horror", 100)] , iflavour = zipPlain [BrMagenta] , icount = 1 , irarity = [(6, 1), (10, 5)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 8, AddMaxCalm 90, AddSpeed 26 , AddSkills $ EM.fromList [(AbProject, 1), (AbApply, 1), (AbMelee, -1)] , AddSight 15 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "An arm strung like a bow. A few edges, but none keen enough. A few points, but none piercing. Deadly objects zip out of the void." , ikit = [ ("speed gland 4", COrgan), ("armored skin", COrgan) , ("any arrow", CInv), ("any arrow", CInv) , ("any arrow", CInv), ("any arrow", CInv) ] } -- "ground x" --- for immovable monster that can only tele or prob travel -- forgetful -- pullback -- skeletal -- * Animals -- They need rather strong melee, because they don't use items. -- Unless/until they level up. animalSkillMalus :: Skills animalSkillMalus = EM.fromList $ zip [AbDisplace, AbMoveItem, AbProject, AbApply] [-1, -1..] armadillo = ItemKind { isymbol = 'a' , iname = "giant armadillo" , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Brown] , icount = 1 , irarity = [(1, 5)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 30, AddMaxCalm 30, AddSpeed 18 , AddSkills $ EM.insert AbAlter (-1) animalSkillMalus , AddSight 3 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [ ("claw", COrgan), ("snout", COrgan), ("armored skin", COrgan) , ("nostril", COrgan) ] } gilaMonster = ItemKind { isymbol = 'g' , iname = "Gila monster" , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Magenta] , icount = 1 , irarity = [(2, 5), (10, 3)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 15, AddMaxCalm 60, AddSpeed 15 , AddSkills $ EM.insert AbAlter (-1) animalSkillMalus , AddSight 3 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [ ("venom tooth", COrgan), ("small claw", COrgan) , ("eye 4", COrgan), ("nostril", COrgan) ] } rattlesnake = ItemKind { isymbol = 'r' , iname = "rattlesnake" , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Brown] , icount = 1 , irarity = [(3, 2), (10, 4)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 25, AddMaxCalm 60, AddSpeed 15 , AddSkills $ EM.insert AbAlter (-1) animalSkillMalus , AddSight 3 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [ ("venom fang", COrgan) , ("eye 4", COrgan), ("nostril", COrgan) ] } komodoDragon = ItemKind -- bad hearing { isymbol = 'k' , iname = "Komodo dragon" , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Blue] , icount = 1 , irarity = [(5, 5), (10, 7)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 40, AddMaxCalm 60, AddSpeed 16 , AddSkills animalSkillMalus, AddSight 3 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [ ("large tail", COrgan), ("jaw", COrgan), ("small claw", COrgan) , ("speed gland 4", COrgan), ("armored skin", COrgan) , ("eye 2", COrgan), ("nostril", COrgan) ] } hyena = ItemKind { isymbol = 'h' , iname = "spotted hyena" , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Red] , icount = 1 , irarity = [(4, 6), (10, 6)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 20, AddMaxCalm 60, AddSpeed 30 , AddSkills animalSkillMalus, AddSight 3 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [("jaw", COrgan), ("eye 4", COrgan), ("nostril", COrgan)] } alligator = ItemKind { isymbol = 'a' , iname = "alligator" , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Blue] , icount = 1 , irarity = [(10, 8)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 30, AddMaxCalm 60, AddSpeed 17 , AddArmorMelee 30, AddArmorRanged 30 , AddSkills animalSkillMalus, AddSight 3 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [ ("large jaw", COrgan), ("large tail", COrgan), ("claw", COrgan) , ("armored skin", COrgan), ("eye 4", COrgan) ] } -- * Non-animal animals hornetSwarm = ItemKind { isymbol = 'h' , iname = "hornet swarm" , ifreq = [("animal", 100), ("horror", 100), ("mobile animal", 100)] , iflavour = zipPlain [Magenta] , icount = 1 , irarity = [(5, 1), (10, 5)] , iverbHit = "thud" , iweight = 1000 , iaspects = [ AddMaxHP 5, AddMaxCalm 60, AddSpeed 30, AddSight 2 , AddSkills $ EM.insert AbAlter (-1) animalSkillMalus , AddArmorMelee 90, AddArmorRanged 90 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [("sting", COrgan)] } thornbush = ItemKind { isymbol = 'b' , iname = "thornbush" , ifreq = [("animal", 100)] , iflavour = zipPlain [Brown] , icount = 1 , irarity = [(3, 2), (10, 1)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 20, AddMaxCalm 999, AddSpeed 20 , AddSkills $ EM.fromDistinctAscList (zip [minBound..maxBound] [-1, -1..]) `addSkills` EM.fromList (zip [AbWait, AbMelee] [1, 1..]) , AddArmorMelee 50, AddArmorRanged 50 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [("thorn", COrgan)] } geyser = ItemKind { isymbol = 'g' , iname = "geyser" , ifreq = [("animal", 100)] , iflavour = zipPlain [White] , icount = 1 , irarity = [(5, 2), (10, 1)] , iverbHit = "thud" , iweight = 80000 , iaspects = [ AddMaxHP 10, AddMaxCalm 999, AddSpeed 5 , AddSkills $ EM.fromDistinctAscList (zip [minBound..maxBound] [-1, -1..]) `addSkills` EM.fromList (zip [AbWait, AbMelee] [1, 1..]) , AddArmorMelee 80, AddArmorRanged 80 ] , ieffects = [] , ifeature = [Durable, Identified] , idesc = "" , ikit = [("vent", COrgan), ("fissure", COrgan)] }