1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
|
-- | Temporary pseudo-organ (condition) definitions.
module Content.ItemKindTemporary
( -- * Group name patterns
pattern S_IMMOBILE, pattern S_PACIFIED, pattern S_IRREPLACEABLE, pattern S_RETAINING, pattern S_IMPATIENT, pattern S_DISPOSSESSED, pattern S_WITHHOLDING, pattern S_PARSIMONIOUS
, pattern S_MORE_MOBILE, pattern S_MORE_COMBATIVE, pattern S_MORE_DISPLACING, pattern S_MORE_MODIFYING, pattern S_MORE_PATIENT, pattern S_MORE_TIDY, pattern S_MORE_PROJECTING, pattern S_MORE_PRACTICAL
, pattern S_STRENGTHENED, pattern S_WEAKENED, pattern S_PROTECTED_FROM_MELEE, pattern S_PROTECTED_FROM_RANGED, pattern S_DEFENSELESS, pattern S_RESOLUTE, pattern S_HASTED, pattern S_SLOWED, pattern S_FAR_SIGHTED, pattern S_BLIND, pattern S_KEEN_SMELLING, pattern S_FOUL_SMELLING, pattern S_ROSE_SMELLING, pattern S_RANGED_DEFLECTING, pattern S_MELEE_DEFLECTING, pattern S_SHINY_EYED, pattern S_DEAFENED, pattern S_DEAF, pattern S_DRUNK, pattern S_FRENZIED, pattern S_REGENERATING, pattern S_POISONED, pattern S_SLOW_RESISTANT, pattern S_POISON_RESISTANT
, temporariesGNSingleton, noStatGN, bonusStatGN
, -- * Content
temporaries
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import Game.LambdaHack.Content.ItemKind
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
noStatGN :: [GroupName ItemKind]
noStatGN =
[S_IMMOBILE, S_PACIFIED, S_IRREPLACEABLE, S_RETAINING, S_IMPATIENT, S_DISPOSSESSED, S_WITHHOLDING, S_PARSIMONIOUS]
bonusStatGN :: [GroupName ItemKind]
bonusStatGN =
[S_MORE_MOBILE, S_MORE_COMBATIVE, S_MORE_DISPLACING, S_MORE_MODIFYING, S_MORE_PATIENT, S_MORE_TIDY, S_MORE_PROJECTING, S_MORE_PRACTICAL]
temporariesGNSingleton :: [GroupName ItemKind]
temporariesGNSingleton =
[S_STRENGTHENED, S_WEAKENED, S_PROTECTED_FROM_MELEE, S_PROTECTED_FROM_RANGED, S_DEFENSELESS, S_RESOLUTE, S_HASTED, S_SLOWED, S_FAR_SIGHTED, S_BLIND, S_KEEN_SMELLING, S_FOUL_SMELLING, S_ROSE_SMELLING, S_RANGED_DEFLECTING, S_MELEE_DEFLECTING, S_SHINY_EYED, S_DEAFENED, S_DEAF, S_DRUNK, S_FRENZIED, S_REGENERATING, S_POISONED, S_SLOW_RESISTANT, S_POISON_RESISTANT]
++ noStatGN ++ bonusStatGN
pattern S_IMMOBILE, S_PACIFIED, S_IRREPLACEABLE, S_RETAINING, S_IMPATIENT, S_DISPOSSESSED, S_WITHHOLDING, S_PARSIMONIOUS :: GroupName ItemKind
pattern S_MORE_MOBILE, S_MORE_COMBATIVE, S_MORE_DISPLACING, S_MORE_MODIFYING, S_MORE_PATIENT, S_MORE_TIDY, S_MORE_PROJECTING, S_MORE_PRACTICAL :: GroupName ItemKind
pattern S_STRENGTHENED, S_WEAKENED, S_PROTECTED_FROM_MELEE, S_PROTECTED_FROM_RANGED, S_DEFENSELESS, S_RESOLUTE, S_HASTED, S_SLOWED, S_FAR_SIGHTED, S_BLIND, S_KEEN_SMELLING, S_FOUL_SMELLING, S_ROSE_SMELLING, S_RANGED_DEFLECTING, S_MELEE_DEFLECTING, S_SHINY_EYED, S_DEAFENED, S_DEAF, S_DRUNK, S_FRENZIED, S_REGENERATING, S_POISONED, S_SLOW_RESISTANT, S_POISON_RESISTANT :: GroupName ItemKind
pattern S_STRENGTHENED = GroupName "strengthened"
pattern S_WEAKENED = GroupName "weakened"
pattern S_PROTECTED_FROM_MELEE = GroupName "protected from melee"
pattern S_PROTECTED_FROM_RANGED = GroupName "protected from ranged"
pattern S_DEFENSELESS = GroupName "defenseless"
pattern S_RESOLUTE = GroupName "resolute"
pattern S_HASTED = GroupName "hasted"
pattern S_SLOWED = GroupName "slowed"
pattern S_FAR_SIGHTED = GroupName "far-sighted"
pattern S_BLIND = GroupName "blind"
pattern S_KEEN_SMELLING = GroupName "keen-smelling"
pattern S_FOUL_SMELLING = GroupName "foul-smelling"
pattern S_ROSE_SMELLING = GroupName "rose-smelling"
pattern S_RANGED_DEFLECTING = GroupName "ranged-deflecting"
pattern S_MELEE_DEFLECTING = GroupName "melee-deflecting"
pattern S_SHINY_EYED = GroupName "shiny-eyed"
pattern S_DEAFENED = GroupName "deafened"
pattern S_DEAF = GroupName "deaf"
pattern S_DRUNK = GroupName "drunk"
pattern S_FRENZIED = GroupName "frenzied"
pattern S_REGENERATING = GroupName "regenerating"
pattern S_POISONED = GroupName "poisoned"
pattern S_SLOW_RESISTANT = GroupName "slow resistant"
pattern S_POISON_RESISTANT = GroupName "poison resistant"
pattern S_IMMOBILE = GroupName "immobile"
pattern S_PACIFIED = GroupName "pacified"
pattern S_IRREPLACEABLE = GroupName "irreplaceable"
pattern S_RETAINING = GroupName "retaining"
pattern S_IMPATIENT = GroupName "impatient"
pattern S_DISPOSSESSED = GroupName "dispossessed"
pattern S_WITHHOLDING = GroupName "withholding"
pattern S_PARSIMONIOUS = GroupName "parsimonious"
pattern S_MORE_MOBILE = GroupName "super-mobile"
pattern S_MORE_COMBATIVE = GroupName "super-combative"
pattern S_MORE_DISPLACING = GroupName "super-displacing"
pattern S_MORE_MODIFYING = GroupName "super-modifying"
pattern S_MORE_PATIENT = GroupName "super-patient"
pattern S_MORE_TIDY = GroupName "super-tidy"
pattern S_MORE_PROJECTING = GroupName "super-projecting"
pattern S_MORE_PRACTICAL = GroupName "super-practical"
-- * Content
temporaries :: [ItemKind]
temporaries =
[tmpStrengthened, tmpWeakened, tmpProtectedMelee, tmpProtectedRanged, tmpDefenseless, tmpResolute, tmpFast20, tmpSlow10, tmpFarSighted, tmpBlind, tmpKeenSmelling, tmpFoulSmelling, tmpRoseSmelling, tmpRangedDeflecting, tmpMeleeDeflecting, tmpNoctovision, tmpDeafened, tmpDeaf, tmpDrunk, tmpBonusSkAggresion, tmpRegenerating, tmpPoisoned, tmpSlow10Resistant, tmpPoisonResistant, tmpNoSkMove, tmpNoSkMelee, tmpNoSkDisplace, tmpNoSkAlter, tmpNoSkWait, tmpNoSkMoveItem, tmpNoSkProject, tmpNoSkApply, tmpBonusSkMove, tmpBonusSkMelee, tmpBonusSkDisplace, tmpBonusSkAlter, tmpBonusSkWait, tmpBonusSkMoveItem, tmpBonusSkProject, tmpBonusSkApply]
tmpStrengthened, tmpWeakened, tmpProtectedMelee, tmpProtectedRanged, tmpDefenseless, tmpResolute, tmpFast20, tmpSlow10, tmpFarSighted, tmpBlind, tmpKeenSmelling, tmpFoulSmelling, tmpRoseSmelling, tmpRangedDeflecting, tmpMeleeDeflecting, tmpNoctovision, tmpDeafened, tmpDeaf, tmpDrunk, tmpBonusSkAggresion, tmpRegenerating, tmpPoisoned, tmpSlow10Resistant, tmpPoisonResistant, tmpNoSkMove, tmpNoSkMelee, tmpNoSkDisplace, tmpNoSkAlter, tmpNoSkWait, tmpNoSkMoveItem, tmpNoSkProject, tmpNoSkApply, tmpBonusSkMove, tmpBonusSkMelee, tmpBonusSkDisplace, tmpBonusSkAlter, tmpBonusSkWait, tmpBonusSkMoveItem, tmpBonusSkProject, tmpBonusSkApply :: ItemKind
-- The @name@ is be used in item description, so it should be an adjective
-- describing the temporary set of aspects.
-- The messages are needed also under @OnSmash@ to display when item removed
-- via @DropItem@ and not via natural periodic activation.
tmpAspects :: GroupName ItemKind -> [Aspect] -> ItemKind
tmpAspects grp aspects =
let name = fromGroupName grp -- @iname@ must match @ifreq@, see @myBadGrps@
in ItemKind
{ isymbol = toContentSymbol '+'
, iname = name
, ifreq = [(grp, 1), (CONDITION, 1)]
, iflavour = zipPlain [BrWhite]
, icount = 1
, irarity = [(1, 1)]
, iverbHit = "affect"
, iweight = 0
, idamage = 0
, iaspects = -- timeout is 0; activates and vanishes soon,
-- depending on initial timer setting
aspects
++ [SetFlag Periodic, SetFlag Fragile, SetFlag Condition]
, ieffects = [ OnSmash $ verbMsgLess name
-- announce partial neutralization, but don't spam
-- about normal periodic wear each turn
, OnSmash $ verbMsgNoLonger name -- for forced neutralization
, verbMsgNoLonger name ] -- for periodic wear of last copy
, idesc = "" -- no description needed; powers are enough
, ikit = []
}
tmpEffects :: GroupName ItemKind -> Dice -> [Effect] -> ItemKind
tmpEffects grp icount effects =
let tmp = tmpAspects grp []
in tmp { icount
, ieffects = effects ++ ieffects tmp
}
tmpStrengthened = tmpAspects S_STRENGTHENED [AddSkill SkHurtMelee 20]
tmpWeakened = tmpAspects S_WEAKENED
[AddSkill SkHurtMelee (-30)] -- don't cancel out ^
tmpProtectedMelee = tmpAspects S_PROTECTED_FROM_MELEE
[AddSkill SkArmorMelee 50]
tmpProtectedRanged = tmpAspects S_PROTECTED_FROM_RANGED
[AddSkill SkArmorRanged 25]
tmpDefenseless = tmpAspects S_DEFENSELESS [ AddSkill SkArmorMelee (-50)
, AddSkill SkArmorRanged (-25) ]
tmpResolute = tmpAspects S_RESOLUTE [ AddSkill SkMaxCalm 60
, AddSkill SkHearing 10 ]
tmpFast20 = tmpAspects S_HASTED [AddSkill SkSpeed 20]
tmpSlow10 = tmpAspects S_SLOWED [AddSkill SkSpeed (-10)]
tmpFarSighted = tmpAspects S_FAR_SIGHTED [AddSkill SkSight 5]
tmpBlind = tmpAspects S_BLIND [ AddSkill SkSight (-99)
, AddSkill SkArmorMelee (-30)
, AddSkill SkHearing 10 ]
tmpKeenSmelling = tmpAspects S_KEEN_SMELLING [AddSkill SkSmell 2]
tmpFoulSmelling = tmpAspects S_FOUL_SMELLING [AddSkill SkOdor 2]
tmpRoseSmelling = tmpAspects S_ROSE_SMELLING [AddSkill SkOdor (-4)]
tmpRangedDeflecting =
tmpAspects S_RANGED_DEFLECTING [AddSkill SkDeflectRanged 1]
tmpMeleeDeflecting =
tmpAspects S_MELEE_DEFLECTING [AddSkill SkDeflectMelee 1]
tmpNoctovision = tmpAspects S_SHINY_EYED [AddSkill SkNocto 2]
tmpDeafened = tmpAspects S_DEAFENED [AddSkill SkHearing (-6)]
tmpDeaf = tmpAspects S_DEAF [ AddSkill SkHearing (-99)
, AddSkill SkArmorMelee (-30) ]
tmpDrunk = tmpAspects S_DRUNK [ AddSkill SkHurtMelee 30 -- fury
, AddSkill SkArmorRanged (-30)
, AddSkill SkSight (-8) ]
tmpBonusSkAggresion =
tmpAspects S_FRENZIED [ AddSkill SkAggression 5
, AddSkill SkArmorMelee (-30) ]
tmpRegenerating =
tmpEffects S_REGENERATING (4 + 1 `d` 2) [RefillHP 1]
tmpPoisoned =
tmpEffects S_POISONED (3 + 1 `d` 2) [RefillHP (-1)]
tmpSlow10Resistant =
tmpEffects S_SLOW_RESISTANT (8 + 1 `d` 4)
[DropItem 1 1 COrgan S_SLOWED]
tmpPoisonResistant =
tmpEffects S_POISON_RESISTANT (8 + 1 `d` 4)
[DropItem 1 maxBound COrgan S_POISONED]
tmpNoSkMove =
tmpAspects S_IMMOBILE [AddSkill SkMove (-99)]
tmpNoSkMelee =
tmpAspects S_PACIFIED [AddSkill SkMelee (-99)]
tmpNoSkDisplace =
tmpAspects S_IRREPLACEABLE [AddSkill SkDisplace (-99)]
tmpNoSkAlter =
tmpAspects S_RETAINING [AddSkill SkAlter (-99)]
tmpNoSkWait =
tmpAspects S_IMPATIENT [AddSkill SkWait (-99)]
tmpNoSkMoveItem =
tmpAspects S_DISPOSSESSED [AddSkill SkMoveItem (-99)]
tmpNoSkProject =
tmpAspects S_WITHHOLDING [AddSkill SkProject (-99)]
tmpNoSkApply =
tmpAspects S_PARSIMONIOUS [AddSkill SkApply (-99)]
tmpBonusSkMove =
tmpAspects S_MORE_MOBILE [AddSkill SkMove 5]
tmpBonusSkMelee =
tmpAspects S_MORE_COMBATIVE [AddSkill SkMelee 5]
tmpBonusSkDisplace =
tmpAspects S_MORE_DISPLACING [AddSkill SkDisplace 5]
tmpBonusSkAlter =
tmpAspects S_MORE_MODIFYING [AddSkill SkAlter 5]
tmpBonusSkWait =
tmpAspects S_MORE_PATIENT [AddSkill SkWait 5]
tmpBonusSkMoveItem =
tmpAspects S_MORE_TIDY [AddSkill SkMoveItem 5]
tmpBonusSkProject =
tmpAspects S_MORE_PROJECTING [AddSkill SkProject 8]
-- TODO: 11, but let player control potion throwing by non-pointmen;
-- beware also of capReinforced and other sources of the skill
tmpBonusSkApply =
tmpAspects S_MORE_PRACTICAL [AddSkill SkApply 5]
|