packages feed

roguestar-engine-0.4.0.0: src/Character.hs

module Character
    (getEligableCharacterClasses,
     getEligableBaseCharacterClasses,
     applyCharacterClass)
    where

import Alignment
import CharacterData
import CreatureAttribute
import CreatureData
import TerrainData

type Prerequisite = Creature -> Bool

data CharacterClassData = CharacterClassData {
    character_class_prerequisite :: Prerequisite,
    character_class_attributes :: CreatureAttribute }

getEligableCharacterClassesComposable :: [CharacterClass] -> Creature -> [CharacterClass]
getEligableCharacterClassesComposable allowed_classes creature = 
    filter (\x -> character_class_prerequisite (classInfo x) creature || isFavoredClass x creature) allowed_classes

getEligableCharacterClasses :: Creature -> [CharacterClass]
getEligableCharacterClasses = getEligableCharacterClassesComposable all_character_classes

getEligableBaseCharacterClasses :: Creature -> [CharacterClass]
getEligableBaseCharacterClasses = getEligableCharacterClassesComposable base_character_classes

prerequisites :: [Prerequisite] -> Prerequisite
prerequisites prereqs creature = all ($ creature) prereqs

mustHave :: (CreatureScore a) => a -> Integer -> Prerequisite
mustHave score min_score creature = (rawScore score creature) >= min_score

-- |
-- Constructor function for CharacterClassData objects.
--
-- The first parameter should be the prerequisite (or more than one prerequisite using the 'prerequisites'
-- function).  The prerequisite(s) restrict what 'Creatures' can advance in the 'CharacterClass'.
--
-- The second parameter is the list of 'CreatureAttribute's that a Creature gains when it levels in the 
-- 'CharacterClass'.  
--
characterClass :: Prerequisite -> CreatureAttribute -> CharacterClassData
characterClass prereqs attribs = CharacterClassData prereqs attribs

applyCharacterClass :: CharacterClass -> Creature -> Creature
applyCharacterClass character_class creature = applyToCreature (character_class & character_class_attributes (classInfo character_class)) creature

classInfo :: CharacterClass -> CharacterClassData

-------------------------------------------------------------------------------
--
--  Base Classes
-- 
--  These are base classes: these classes have very low prerequisites,
--  with the intention that characters can choose them at the beginning
--  of a game.  They also contain extra information about the character's
--  starting equipment and situation.
--
-------------------------------------------------------------------------------

classInfo Barbarian = characterClass (prerequisites [mustHave Strength 15,mustHave Constitution 15]) $
		     DamageReductionTrait Melee & DamageReductionTrait Ranged & DamageReductionTrait Unarmed & ToughnessTrait & Speed & Constitution & Strength & Indifferent

classInfo Consular = characterClass (mustHave Charisma 20) $
		     Charisma & Diplomatic

classInfo Engineer = characterClass (mustHave Intellect 20) $
		     Intellect & Strategic

classInfo ForceAdept = characterClass (prerequisites [mustHave Intellect 15, mustHave Perception 15, mustHave Charisma 15, mustHave Mindfulness 15]) $
		     DefenseSkill Ranged & DefenseSkill Melee & AttackSkill Melee & Speed & Perception & Mindfulness & Indifferent

classInfo Marine = characterClass (prerequisites [mustHave Perception 15,mustHave Constitution 15]) $
		     AttackSkill Ranged & DefenseSkill Ranged & Constitution & Speed & Perception & Mindfulness & Tactical
		   
classInfo Ninja = characterClass (prerequisites [mustHave Speed 15,mustHave Perception 15]) $
		     HideSkill & DefenseSkill Melee & DefenseSkill Ranged & Speed & Indifferent

classInfo Pirate = characterClass (prerequisites [mustHave Strength 10,mustHave Perception 10, mustHave Speed 10, mustHave Charisma 10]) $
		     AttackSkill Ranged & ToughnessTrait & Strength & Speed

classInfo Scout = characterClass (prerequisites [mustHave Perception 20]) $
		     SpotSkill & Speed & Perception & Tactical

classInfo Shepherd = characterClass (prerequisites [mustHave Charisma 15,mustHave Mindfulness 15]) $
		     SpotSkill & TerrainAffinity Grass & Perception & Mindfulness & Indifferent

classInfo Thief = characterClass (mustHave Perception 20) $
		     HideSkill & Speed & Charisma & Perception & Tactical

classInfo Warrior = characterClass (prerequisites [mustHave Strength 15,mustHave Speed 15]) $
		    AttackSkill Melee & DefenseSkill Melee & Constitution & Strength & Speed & Mindfulness & Tactical