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