roguestar-engine-0.6.0.0: src/CreatureAttribute.hs
module CreatureAttribute
(CreatureAttribute,
CreatureAttributeGenerator,
gender,
CreatureAttribute.attributeStatic,
CreatureAttribute.attributeMinMax,
AG.attributeChoice,
AG.attributeChoices,
CreatureAttribute.generateAttributes,
(&))
where
import Data.Monoid
import AttributeGeneration as AG
import CreatureData
import Control.Monad.Random
import FactionData
import SpeciesData
newtype CreatureAttribute = CreatureAttribute { fromCreatureAttribute :: Endo Creature }
instance CreatureEndo CreatureAttribute where
applyToCreature (CreatureAttribute f) = appEndo f
(&) :: (CreatureEndo x,CreatureEndo y) => x -> y -> CreatureAttribute
x & y = CreatureAttribute $ Endo $ applyToCreature x . applyToCreature y
type CreatureAttributeGenerator = AttributeGenerator CreatureAttribute
-- |
-- Generate a ratio of males to females.
--
gender :: Rational -> CreatureAttributeGenerator
gender r = AG.attributeChoice r [CreatureAttribute.attributeStatic 1 Male]
[CreatureAttribute.attributeStatic 1 Female]
attributeStatic :: (CreatureEndo a) => Integer -> a -> CreatureAttributeGenerator
attributeStatic n a = AG.attributeStatic n (CreatureAttribute $ Endo $ applyToCreature a)
attributeMinMax :: (CreatureEndo a) => (Integer,Integer) -> a -> CreatureAttributeGenerator
attributeMinMax min_max a = AG.attributeMinMax min_max (CreatureAttribute $ Endo $ applyToCreature a)
generateAttributes :: (MonadRandom m) => Faction -> Species -> CreatureAttributeGenerator -> m Creature
generateAttributes faction species_name attrib_generator =
do attribs <- AG.generateAttributes attrib_generator
random_id <- getRandomR (0,30000)
let c = empty_creature {
creature_species = species_name,
creature_random_id = random_id,
creature_faction = faction }
return $ (appEndo $ mconcat $ map fromCreatureAttribute attribs) c