module PlayerState (PlayerState(..), CreatureTurnMode(..), SnapshotEvent(..), creatureOf, subjectOf, menuIndex, modifyMenuIndex) where import DBData import CreatureData import MakeData data PlayerState = RaceSelectionState | ClassSelectionState Creature | PlayerCreatureTurn CreatureRef CreatureTurnMode | SnapshotEvent SnapshotEvent | GameOver deriving (Read,Show) data CreatureTurnMode = NormalMode | MoveMode | PickupMode Integer | DropMode Integer | WieldMode Integer | MakeMode Integer PrepareMake | AttackMode | FireMode | JumpMode | TurnMode | ClearTerrainMode deriving (Read,Show) data SnapshotEvent = AttackEvent { attack_event_source_creature :: CreatureRef, attack_event_source_weapon :: Maybe ToolRef, attack_event_target_creature :: CreatureRef } | MissEvent { miss_event_creature :: CreatureRef, miss_event_weapon :: Maybe ToolRef } | KilledEvent { killed_event_creature :: CreatureRef } | WeaponOverheatsEvent { weapon_overheats_event_creature :: CreatureRef, weapon_overheats_event_weapon :: ToolRef } | WeaponExplodesEvent { weapon_explodes_event_creature :: CreatureRef, weapon_explodes_event_weapon :: ToolRef } | DisarmEvent { disarm_event_source_creature :: CreatureRef, disarm_event_target_creature :: CreatureRef, disarm_event_target_tool :: ToolRef } | SunderEvent { sunder_event_source_creature :: CreatureRef, sunder_event_source_weapon :: ToolRef, sunder_event_target_creature :: CreatureRef, sunder_event_target_tool :: ToolRef } | TeleportEvent { teleport_event_creature :: CreatureRef } | HealEvent { heal_event_creature :: CreatureRef } | ExpendToolEvent { expend_tool_event_tool :: ToolRef } deriving (Read,Show) -- | Get the 'Creature' acting in the given 'PlayerState'. creatureOf :: PlayerState -> Maybe CreatureRef creatureOf state = case state of PlayerCreatureTurn creature_ref _ -> Just creature_ref SnapshotEvent event -> subjectOf event GameOver -> Nothing ClassSelectionState {} -> Nothing RaceSelectionState {} -> Nothing -- | Get the subject creature of a 'SnapshotEvent', that is, the creature taking action. subjectOf :: SnapshotEvent -> Maybe CreatureRef subjectOf event = case event of AttackEvent { attack_event_source_creature = attacker_ref } -> Just attacker_ref MissEvent { miss_event_creature = attacker_ref } -> Just attacker_ref WeaponOverheatsEvent { weapon_overheats_event_creature = attacker_ref } -> Just attacker_ref WeaponExplodesEvent { weapon_explodes_event_creature = attacker_ref } -> Just attacker_ref KilledEvent killed_ref -> Just killed_ref DisarmEvent { disarm_event_source_creature = attacker_ref } -> Just attacker_ref SunderEvent { sunder_event_source_creature = attacker_ref } -> Just attacker_ref TeleportEvent { teleport_event_creature = creature_ref } -> Just creature_ref HealEvent { heal_event_creature = creature_ref } -> Just creature_ref ExpendToolEvent {} -> Nothing -- | Current index into the menu, if there is one. menuIndex :: PlayerState -> Maybe Integer menuIndex state = fst $ modifyMenuIndex_ id state -- | Modify the current index into the menu, if there is one (otherwise has no effect). modifyMenuIndex :: (Integer -> Integer) -> PlayerState -> PlayerState modifyMenuIndex f state = snd $ modifyMenuIndex_ f state modifyMenuIndex_ :: (Integer -> Integer) -> PlayerState -> (Maybe Integer,PlayerState) modifyMenuIndex_ f state = case state of PlayerCreatureTurn c (PickupMode n) -> (Just n,PlayerCreatureTurn c $ PickupMode $ f n) PlayerCreatureTurn c (DropMode n) -> (Just n,PlayerCreatureTurn c $ DropMode $ f n) PlayerCreatureTurn c (WieldMode n) -> (Just n,PlayerCreatureTurn c $ WieldMode $ f n) PlayerCreatureTurn c (MakeMode n make_prep) -> (Just n,PlayerCreatureTurn c $ MakeMode (f n) make_prep) x -> (Nothing,x)