module Character (getEligableCharacterClasses, getEligableBaseCharacterClasses, applyCharacterClass) where import Data.List as List import Alignment import CharacterData import CreatureData import StatsData type Prerequisite = Creature -> Bool type CharacterClassData = (Prerequisite,[CreatureAttribute]) getEligableCharacterClassesComposable :: [CharacterClass] -> Creature -> [CharacterClass] getEligableCharacterClassesComposable allowed_classes creature = filter (\x -> (fst $ classInfo 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 :: Statistic -> Integer -> Prerequisite mustHave statistic min_score creature = (getStatistic statistic $ creature_stats creature) >= min_score -- | -- Constructor function for CharacterClassData objects. -- -- First parameter should be the CharacterClass. -- -- The second 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 third parameter is the list CreatureAttributes that a Creature gains when it levels in the -- CharacterClass. -- characterClass :: CharacterClass -> Prerequisite -> [CreatureAttribute] -> CharacterClassData characterClass character_class prereqs level_xforms = ((\x -> prereqs x || isFavoredClass character_class x),CharacterLevel character_class : level_xforms) applyCharacterClass :: CharacterClass -> Creature -> Creature applyCharacterClass character_class creature = if (fst $ classInfo character_class) creature then foldr applyCreatureAttribute creature (snd $ classInfo character_class) else error "tried to applyCharacterClass with a creature that didn't meet prerequisites" 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 Barbarian (prerequisites [mustHave Strength 15,mustHave Constitution 15]) [ToughnessTrait,DamageReductionTrait,SpeedTrait,StatBonus Constitution,StatBonus Strength,AlignmentBonus Indifferent] classInfo Consular = characterClass Consular (mustHave Charisma 20) [StatBonus Charisma,AlignmentBonus Diplomatic] classInfo Engineer = characterClass Engineer (mustHave Intelligence 20) [StatBonus Intelligence,AlignmentBonus Strategic] classInfo ForceAdept = characterClass ForceAdept (prerequisites [mustHave Intelligence 15, mustHave Perception 15, mustHave Charisma 15, mustHave Mindfulness 15]) [RangedDefenseSkill,MeleeDefenseSkill,MeleeAttackSkill,StatBonus Perception,StatBonus Mindfulness,AlignmentBonus Indifferent] classInfo Marine = characterClass Marine (prerequisites [mustHave Perception 15,mustHave Constitution 15]) [RangedAttackSkill, RangedDefenseSkill, StatBonus Constitution, StatBonus Dexterity, StatBonus Perception, StatBonus Mindfulness, AlignmentBonus Tactical] classInfo Ninja = characterClass Ninja (prerequisites [mustHave Dexterity 15,mustHave Perception 15]) [HideSkill,MeleeDefenseSkill,RangedDefenseSkill,StatBonus Dexterity,AlignmentBonus Indifferent] classInfo Pirate = characterClass Pirate (prerequisites [mustHave Strength 10,mustHave Perception 10, mustHave Dexterity 10, mustHave Charisma 10]) [RangedAttackSkill,ToughnessTrait,StatBonus Strength,StatBonus Dexterity] classInfo Scout = characterClass Scout (prerequisites [mustHave Perception 20]) [SpotSkill,StatBonus Dexterity,StatBonus Perception,AlignmentBonus Tactical] classInfo Shepherd = characterClass Shepherd (prerequisites [mustHave Charisma 15,mustHave Mindfulness 15]) [SpotSkill,StatBonus Perception,StatBonus Mindfulness,AlignmentBonus Indifferent] classInfo Thief = characterClass Thief (mustHave Perception 20) [HideSkill,StatBonus Dexterity,StatBonus Charisma,StatBonus Perception,AlignmentBonus Tactical] classInfo Warrior = characterClass Warrior (prerequisites [mustHave Strength 15,mustHave Dexterity 15]) [MeleeAttackSkill, MeleeDefenseSkill, StatBonus Constitution, StatBonus Strength, StatBonus Dexterity, StatBonus Mindfulness, AlignmentBonus Tactical]