packages feed

Allure-0.4.2: src/Content/ItemKind.hs

module Content.ItemKind (ItemKind(..)) where

import Color
import qualified Content.Content
import Effect
import Flavour
import Random

-- TODO: jpower is out of place here. It doesn't make sense for all items,
-- and will mean different things for different items. Perhaps it should
-- be part of the Effect, but then we have to be careful to distinguish
-- parts of the Effect that are rolled on item creation and those rolled
-- at each use (e.g., sword magical +damage vs. sword damage dice).
-- Another thing to keep in minds is that jpower will heavily determine
-- the value of the item for shops, treasure chests, artifact set rebalancing,
-- etc., so if we make jpower complex, the value computation gets complex too.
data ItemKind = ItemKind
  { isymbol  :: !Char       -- ^ map symbol
  , iflavour :: ![Flavour]  -- ^ possible flavours
  , iname    :: !String     -- ^ group name
  , ieffect  :: !Effect     -- ^ the effect when activated
  , icount   :: !RollQuad   -- ^ created in that quantify
  , ifreq    :: !Int        -- ^ created that often
  , ipower   :: !RollQuad   -- ^ created with that power
  }
  deriving (Show, Eq, Ord)

instance Content.Content.Content ItemKind where
  getFreq = ifreq
  content =
    [amulet, dart, gem1, gem2, gem3, gem4, gold, potion1, potion2, potion3, ring, scroll1, scroll2, sword, fist, wand]

amulet,      dart, gem1, gem2, gem3, gem4, gold, potion1, potion2, potion3, ring, scroll1, scroll2, sword, fist, wand :: ItemKind

gem, potion, scroll :: ItemKind  -- generic templates

-- rollQuad (a, b, x, y) = a * roll b + (lvl * x * roll y) / 10

amulet = ItemKind
  { isymbol  = '"'
  , iflavour = [(BrGreen, True)]
  , iname    = "amulet"
  , ieffect  = Regneration
  , icount   = intToQuad 1
  , ifreq    = 10
  , ipower   = (2, 1, 2, 2)
  }
dart = ItemKind
  { isymbol  = ')'
  , iflavour = [(Yellow, False)]
  , iname    = "dart"
  , ieffect  = Wound (1, 1)
  , icount   = (3, 3, 0, 0)
  , ifreq    = 30
  , ipower   = intToQuad 0
  }
gem = ItemKind
  { isymbol  = '*'
  , iflavour = zipPlain brightCol  -- natural, so not fancy
  , iname    = "gem"
  , ieffect  = NoEffect
  , icount   = intToQuad 0
  , ifreq    = 20  -- x4, but rare on shallow levels
  , ipower   = intToQuad 0
  }
gem1 = gem
  { icount   = (1, 1, 0, 0)  -- appears on lvl 1
  }
gem2 = gem
  { icount   = (0, 0, 2, 1)  -- appears on lvl 5, doubled on lvl 10
  }
gem3 = gem
  { icount   = (0, 0, 1, 1)  -- appears on lvl 10
  }
gem4 = gem
  { icount   = (0, 0, 1, 1)  -- appears on lvl 10
  }
gold = ItemKind
  { isymbol  = '$'
  , iflavour = [(BrYellow, False)]
  , iname    = "gold piece"
  , ieffect  = NoEffect
  , icount   = (0, 0, 10, 10)
  , ifreq    = 80
  , ipower   = intToQuad 0
  }
potion = ItemKind
  { isymbol  = '!'
  , iflavour = zipFancy stdCol
  , iname    = "potion"
  , ieffect  = NoEffect
  , icount   = intToQuad 1
  , ifreq    = 10
  , ipower   = intToQuad 0
  }
potion1 = potion
  { ieffect  = ApplyPerfume
  }
potion2 = potion
  { ieffect  = Heal
  , ipower   = (10, 1, 0, 0)
  }
potion3 = potion
  { ieffect  = Wound (0, 0)
  , ipower   = (10, 1, 0, 0)
  }
ring = ItemKind
  { isymbol  = '='
  , iflavour = [(White, False)]
  , iname    = "ring"
  , ieffect  = Searching
  , icount   = intToQuad 1
  , ifreq    = 10
  , ipower   = (1, 1, 2, 2)
  }
scroll = ItemKind
  { isymbol  = '?'
  , iflavour = zipFancy darkCol  -- arcane and old
  , iname    = "scroll"
  , ieffect  = NoEffect
  , icount   = intToQuad 1
  , ifreq    = 10
  , ipower   = intToQuad 0
  }
scroll1 = scroll
  { ieffect  = SummonFriend
  , ifreq    = 20
  }
scroll2 = scroll
  { ieffect  = SummonEnemy
  }
sword = ItemKind
  { isymbol  = ')'
  , iflavour = [(BrCyan, False)]
  , iname    = "sword"
  , ieffect  = Wound (3, 1)
  , icount   = intToQuad 1
  , ifreq    = 60
  , ipower   = (1, 2, 4, 2)
  }
fist = sword
  { iname    = "fist"
  , ifreq    = 0  -- Does not appear randomly in the dungeon.
  }
wand = ItemKind
  { isymbol  = '/'
  , iflavour = [(BrRed, True)]
  , iname    = "wand"
  , ieffect  = Dominate
  , icount   = intToQuad 1
  , ifreq    = 10
  , ipower   = intToQuad 0
  }