Delete cruft, add Reader monad to some internal ai
This commit is contained in:
@@ -2,7 +2,6 @@ module Dodge.Creature.Rationality
|
||||
where
|
||||
import Dodge.Data
|
||||
import Dodge.Base.Collide
|
||||
import Dodge.Creature.Rationality.Data
|
||||
import Dodge.Creature.Action
|
||||
import Dodge.Creature.Action.UseItem
|
||||
import Dodge.Creature.State.Data
|
||||
@@ -14,6 +13,7 @@ import Data.Maybe
|
||||
import qualified Data.IntMap.Strict as IM
|
||||
import System.Random
|
||||
import Control.Lens
|
||||
import Control.Monad.Reader
|
||||
|
||||
-- Alternatives would probably be a very good fit for actions...
|
||||
|
||||
@@ -24,6 +24,14 @@ composeInternalAIs
|
||||
-> Creature
|
||||
composeInternalAIs fs w c = foldr ($ w) c fs
|
||||
|
||||
impulsiveAIR
|
||||
:: (Creature -> Reader World Creature)
|
||||
-> World
|
||||
-> (World -> World, StdGen)
|
||||
-> Creature
|
||||
-> ((World -> World, StdGen) , Maybe Creature)
|
||||
impulsiveAIR impf w (f,g) cr = followImpulses w (f,g) . ($ w) . runReader . impf $ cr
|
||||
|
||||
impulsiveAI
|
||||
:: (World -> Creature -> Creature) -- ^ Internal AI update, should determine impulses
|
||||
-> World
|
||||
@@ -84,7 +92,7 @@ followImpulse cr w imp = case imp of
|
||||
rr a = fst $ randomR (-a,a) $ _randGen w
|
||||
hitCr i = over (creatures . ix i . crState . crDamage) (addDam i)
|
||||
. soundOnce (fromIntegral hitSound)
|
||||
addDam i dams = (( Blunt 100 cpos (posFromID i) (posFromID i) ) : dams )
|
||||
addDam i dams = Blunt 100 cpos (posFromID i) (posFromID i) : dams
|
||||
|
||||
actionUpdateAI
|
||||
:: (World -> Creature -> Creature) -- ^ the function updating the actions
|
||||
@@ -93,6 +101,24 @@ actionUpdateAI
|
||||
-> Creature
|
||||
actionUpdateAI actF w c = performActions w $ actF w c
|
||||
|
||||
performActionR :: Creature -> Reader World Creature
|
||||
performActionR cr = reader $ \w -> performActions w cr
|
||||
|
||||
watchUpdateStratR
|
||||
:: [ ((World, Creature) -> Bool, World -> Creature -> Strategy) ]
|
||||
-> Creature
|
||||
-> Reader World Creature
|
||||
watchUpdateStratR fs cr = case cr ^? crActionPlan . crStrategy of
|
||||
Just WatchAndWait -> reader $ \w -> cr
|
||||
& crActionPlan . crStrategy .~ listGuard (fs, \_ _ -> WatchAndWait) (w, cr) w cr
|
||||
_ -> reader $ \_ -> cr
|
||||
|
||||
listGuard :: ([(a -> Bool, b)] , b) -> a -> b
|
||||
listGuard ( (test,y):ps, z ) x
|
||||
| test x = y
|
||||
| otherwise = listGuard (ps, z) x
|
||||
listGuard (_,z) _ = z
|
||||
|
||||
performActions :: World -> Creature -> Creature
|
||||
performActions w cr = cr
|
||||
& crActionPlan . crImpulse .~ concat iss
|
||||
|
||||
Reference in New Issue
Block a user