{-# LANGUAGE MultiParamTypeClasses #-} data CardSym = StartShinji1 | StartUnitTwo1 | StopIt | SomethingLikeThis | ProgKnife | Maya | Adam | InstShinji1a | InstShinji1b deriving (Show) data TypeSym = Angel | Character | MainCharacter | Instrumentality | Battle | Put | Drama | Eva deriving (Show) data Faction = Blue | Red | White | Green | Yellow | Black | Purple deriving (Show) data Mark = Circle | Triangle deriving (Show) type LineMark = (Mark, Faction) type LineMarks = [LineMark] data Trait = Reaction | Other | Male | Female | Weapon deriving (Show) type Traits = [Trait] instShinji1a = CardInfo { ciName = "3rd Child - Shinji Ikari" , ciFaction = Blue , ciDP = Nothing , ciType = Instrumentality , ciLineMarks = Nothing , ciTraits = [] , ciSpeaks = Nothing , ciLine = Nothing , ciText = "Asuka is down." , ciStrength = Nothing , ciLevel = Just 1 , ciNextInst = Just InstShinji1b } instShinji1b = CardInfo { ciName = "I'm such a loser..." , ciFaction = Blue , ciDP = Nothing , ciType = Instrumentality , ciLineMarks = Nothing , ciTraits = [] , ciSpeaks = Nothing , ciLine = Nothing , ciText = "All main characters other than Shinji and Asuka are down." , ciStrength = Nothing , ciLevel = Just 2 , ciNextInst = Nothing } adam = CardInfo { ciName = "The 1st Angel - Adam" , ciFaction = Purple , ciDP = Nothing , ciType = Angel , ciLineMarks = Nothing , ciTraits = [] , ciSpeaks = Nothing , ciLine = Nothing , ciText = "When Adam is defeated, discard all Put cards in Neo-Tokyo." , ciStrength = Just 3 , ciLevel = Nothing , ciNextInst = Nothing } maya = CardInfo { ciName = "Maya Ibuki" , ciFaction = Yellow , ciDP = Just 1 , ciType = Character , ciLineMarks = Just [(Circle, Yellow)] , ciTraits = [Other, Female] , ciSpeaks = Just 1 , ciLine = Just "That's the Doctor I know!" , ciText = "Can speak one yellow Battle card each turn. Cards spoken by Maya get +1 DP." , ciStrength = Nothing , ciLevel = Nothing , ciNextInst = Nothing } progKnife = CardInfo { ciName = "Progressive Knife" , ciFaction = Blue , ciDP = Just 2 , ciType = Put , ciLineMarks = Just [(Triangle, White), (Triangle, Green), (Triangle, Yellow), (Triangle, Black)] , ciTraits = [Other, Weapon] , ciSpeaks = Nothing , ciLine = Just "That's just a selfish excuse." , ciText = "Target Eva gains +1 Strength." , ciStrength = Nothing , ciLevel = Nothing , ciNextInst = Nothing } startShinji1 = CardInfo { ciName = "3rd Child - Shinji Ikari" , ciFaction = Blue , ciDP = Just 0 , ciType = MainCharacter , ciLineMarks = Just [(Circle, Blue)] , ciTraits = [Male] , ciSpeaks = Just 1 , ciLine = Just "I feel like I belong here!" , ciText = "Can speak one blue card every turn." , ciStrength = Nothing , ciLevel = Nothing , ciNextInst = Nothing } startUnitTwo1 = CardInfo { ciName = "Evangelion Unit Two" , ciFaction = Red , ciDP = Just 1 , ciType = Eva , ciLineMarks = Just [(Circle, Red)] , ciTraits = [] , ciSpeaks = Nothing , ciLine = Just "They picked me! I'm gonna be an elite pilot protecting humanity!" , ciText = "If put on Unit Two, it gains +1 Strength and can use one additional *weapon* every Battle phase. Cannot be assigned to battle if Asuka is down." , ciStrength = Just 1 , ciLevel = Nothing , ciNextInst = Nothing } stopIt = CardInfo { ciName = "Stop it! This isn't the time..." , ciFaction = Blue , ciDP = Just 1 , ciType = Battle , ciLineMarks = Just [(Triangle, Red), (Triangle, White), (Triangle, Green), (Triangle, Black)] , ciTraits = [Reaction] , ciSpeaks = Nothing , ciLine = Just "Stop it!" , ciText = "Cancel target Drama card." , ciStrength = Nothing , ciLevel = Nothing , ciNextInst = Nothing } somethingLikeThis = CardInfo { ciName = "But when it comes to something like this..." , ciFaction = Blue , ciDP = Just 2 , ciType = Drama , ciLineMarks = Just [(Circle, Red), (Circle, White), (Circle, Green)] , ciTraits = [] , ciSpeaks = Nothing , ciLine = Just "That reminds me..." , ciText = "All characters grouped with Shinji can speak one additional card this turn." , ciStrength = Nothing , ciLevel = Nothing , ciNextInst = Nothing } data CardInfo = CardInfo { ciName :: String , ciFaction :: Faction , ciDP :: Maybe Integer , ciType :: TypeSym , ciLineMarks :: Maybe LineMarks , ciTraits :: Traits , ciSpeaks :: Maybe Integer , ciLine :: Maybe String , ciText :: String , ciStrength :: Maybe Integer , ciLevel :: Maybe Integer , ciNextInst :: Maybe CardSym } deriving (Show) data CardMeta = CardMeta { cmOwner :: PlayerId } type CardId = Integer type PlayerId = Integer class SymLookup where getSym :: CardId -> CardSym class MetaLookup where getMeta :: CardId -> CardMeta class CardLookup where getCard :: CardSym -> CardInfo