packages feed

roguestar-engine-0.2.1: src/Character.hs

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]