module Activate (ActivationOutcome, resolveActivation, executeActivation) where import Tool import ToolData import Creature import DB import Control.Monad.Error import Substances -- | Outcome of activating a tool. data ActivationOutcome = Heal CreatureRef Integer | ExpendTool ToolRef ActivationOutcome | NoEffect resolveActivation :: (DBReadable db) => CreatureRef -> db ActivationOutcome resolveActivation creature_ref = do tool_ref <- maybe (throwError $ DBErrorFlag NoToolWielded) return =<< dbGetWielded creature_ref tool <- dbGetTool tool_ref case tool of DeviceTool {} -> throwError $ DBErrorFlag ToolIs_Innapropriate Sphere (ChromaliteSubstance c) -> do x <- linearRoll $ chromalitePotency c return $ if x == 0 then ExpendTool tool_ref $ NoEffect else Heal creature_ref x Sphere (MaterialSubstance m) -> do x <- linearRoll $ material_construction_value $ materialValue m return $ ExpendTool tool_ref $ Heal creature_ref x Sphere (GasSubstance g) -> do x <- linearRoll $ gasValue g return $ if x == 0 then ExpendTool tool_ref $ Heal creature_ref 1 else Heal creature_ref 1 executeActivation :: ActivationOutcome -> DB () executeActivation (NoEffect) = return () executeActivation (Heal creature_ref x) = do healCreature x creature_ref dbPushSnapshot $ HealEvent creature_ref executeActivation (ExpendTool tool_ref activation_outcome) = do executeActivation activation_outcome dbPushSnapshot $ ExpendToolEvent tool_ref deleteTool tool_ref