Make creature update an external function

This commit is contained in:
2022-07-20 01:22:17 +01:00
parent db44d5d6ce
commit 1f79fe157f
31 changed files with 562 additions and 462 deletions
+62
View File
@@ -0,0 +1,62 @@
module Dodge.Barreloid where
import Dodge.Data
import Dodge.WorldEvent.Explosion
import Dodge.Spark
import Dodge.Creature.State
import Geometry
import Dodge.SoundLogic
import LensHelp
import System.Random
import Data.List
updateBarreloid :: Creature -> World -> World
updateBarreloid cr = case cr ^?! crType . barrelType of
ExplosiveBarrel -> updateExpBarrel cr
PlainBarrel -> updateBarrel cr
-- should generate the sparks externally using new random generators
updateExpBarrel :: Creature -> World -> World
updateExpBarrel cr w
| _crHP cr > 0 = foldr ($) (hiss w & creatures . at (_crID cr) .~ newCr) pierceSparks
| otherwise = makeExplosionAt (_crPos cr) $ stopSounds w & creatures . at (_crID cr) .~ Nothing
where
g = _randGen w
damages = _csDamage $ _crState cr
pierceSparks :: [World -> World]
pierceSparks
= zipWith3 (\p a -> createBarrelSpark (_crPos cr +.+ p) (a + argV p))
poss as colids
as = randomRs (-0.7,0.7) g
colids = randomRs (0,11) g
poss = _piercedPoints $ _csSpState $ _crState cr
newCr = Just $ applyFuseDamage $ set (crState . csDamage) [] $ damToExpBarrel damages cr
applyFuseDamage cr' = cr' & crHP %~
subtract (length . _piercedPoints . _csSpState $ _crState cr')
hiss | null poss = id
| otherwise = soundMultiFrom [BarrelHiss 0,BarrelHiss 1] (_crPos cr) foamSprayLoopS (Just 1)
stopSounds = stopSoundFrom (BarrelHiss 0) . stopSoundFrom (BarrelHiss 1)
updateBarrel :: Creature -> World -> World
updateBarrel cr
| _crHP cr > 0 = doDamage cr
| otherwise = creatures . at (_crID cr) .~ Nothing
damToExpBarrel :: [Damage] -> Creature -> Creature
damToExpBarrel ds cr = foldr damToExpBarrel' (foldr damToExpBarrel' cr pierceDam) otherDam
where
(pierceDam,otherDam) = partition isPierce ds
isPierce Damage{_dmType = PIERCING{}} = True
isPierce _ = False
damToExpBarrel' :: Damage -> Creature -> Creature
damToExpBarrel' dm cr = case _dmType dm of
PIERCING -> over (crState . csSpState . piercedPoints) ((:) $ int -.- _crPos cr)
$ cr & crHP -~ div amount 200
POISONDAM -> cr
SPARKING -> cr
-- PUSHDAM -> cr LensHelp.& crPos .+.+~ (1 / _crMass cr *.* _dePushBack (_dmEffect dm))
_ -> cr LensHelp.& crHP -~ amount
where
amount = _dmAmount dm
int = _dmAt dm
+5 -36
View File
@@ -10,19 +10,12 @@ module Dodge.Creature
, armourChaseCrit , armourChaseCrit
) where ) where
import Dodge.Creature.State.Data import Dodge.Creature.State.Data
import Dodge.Creature.Update
import Dodge.Prop.Gib import Dodge.Prop.Gib
--import Dodge.Item.Weapon.Grenade --import Dodge.Item.Weapon.Grenade
import Dodge.Item.Equipment.Booster import Dodge.Item.Equipment.Booster
import Dodge.Item.Weapon.Utility import Dodge.Item.Weapon.Utility
import Dodge.Item.Weapon.Drone import Dodge.Item.Weapon.Drone
import Dodge.Item.Craftable import Dodge.Item.Craftable
--import Dodge.Creature.AlertLevel
--import Dodge.Creature.SetTarget
import Dodge.Creature.Volition
import Dodge.Creature.Test
--import Dodge.Creature.Impulse
import Dodge.Creature.SentinelAI
import Dodge.Creature.LauncherCrit import Dodge.Creature.LauncherCrit
import Dodge.Creature.PistolCrit import Dodge.Creature.PistolCrit
import Dodge.Creature.LtAutoCrit import Dodge.Creature.LtAutoCrit
@@ -36,9 +29,7 @@ import Dodge.Item.Weapon
import Dodge.Item.Equipment import Dodge.Item.Equipment
import Dodge.Item.Consumable import Dodge.Item.Consumable
import Dodge.WorldEvent.Cloud import Dodge.WorldEvent.Cloud
import Dodge.Creature.YourControl
import Dodge.Creature.Inanimate import Dodge.Creature.Inanimate
import Dodge.Creature.State
import Dodge.Creature.Picture import Dodge.Creature.Picture
--import Dodge.Creature.ChooseTarget --import Dodge.Creature.ChooseTarget
--import Dodge.Item --import Dodge.Item
@@ -65,20 +56,17 @@ spawnerCrit = defaultCreature
miniGunCrit :: Creature miniGunCrit :: Creature
miniGunCrit = defaultCreature miniGunCrit = defaultCreature
{ _crUpdate = defaultImpulsive [sentinelFireType (const shootTillEmpty)] { _crInv = IM.fromList [(0,miniGunX 3)]
-- , _crInv = IM.fromList [(0,autoRifle & itConsumption . ammoLoaded .~ 1000)]
, _crInv = IM.fromList [(0,miniGunX 3)]
-- , _crInv = IM.fromList [(0,autoRifle)]
, _crRad = 10 , _crRad = 10
, _crState = defaultState , _crState = defaultState
, _crHP = 500 , _crHP = 500
, _crMvType = defaultAimMvType , _crMvType = defaultAimMvType
} }
& crType . skinUpper .~ light4 red & crType . skinUpper .~ light4 red
& crType . humanoidAI .~ MiniGunAI
longCrit :: Creature longCrit :: Creature
longCrit = defaultCreature longCrit = defaultCreature
{ _crUpdate = defaultImpulsive [sentinelFireType $ const shootTillEmpty] { _crActionPlan = ActionPlan
, _crActionPlan = ActionPlan
{ _apImpulse = [] { _apImpulse = []
, _apAction = [] , _apAction = []
, _apStrategy = StrategyActions WatchAndWait [StartSentinelPost] , _apStrategy = StrategyActions WatchAndWait [StartSentinelPost]
@@ -88,34 +76,16 @@ longCrit = defaultCreature
, _crRad = 10 , _crRad = 10
, _crHP = 150 , _crHP = 150
} }
& crType . humanoidAI .~ LongAI
& crType . skinUpper .~ light4 red & crType . skinUpper .~ light4 red
multGunCrit :: Creature multGunCrit :: Creature
multGunCrit = defaultCreature multGunCrit = defaultCreature
{ _crInv = IM.fromList [(0,volleyGun 4),(1,medkit 100)] { _crInv = IM.fromList [(0,volleyGun 4),(1,medkit 100)]
, _crRad = 10 , _crRad = 10
, _crHP = 300 , _crHP = 300
, _crUpdate = defaultImpulsive [sentinelExtraWatchUpdate
[ ( const $ not . crWeaponReady
, \_ _ -> StrategyActions Reload reloadActions
)
, (const $ not . crSafeDistFromTarg 150
, \_ cr -> StrategyActions Flee
[const (not . crSafeDistFromTarg 150) `DoActionWhile` UseTarget (fleeFrom cr)
`DoActionThen` DoImpulses [ChangeStrategy WatchAndWait] ]
)
, (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
[ drawwp `DoActionThen` shootFirstMiss `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait] ]
)
]
]
} }
& crType . skinUpper .~ light4 red & crType . skinUpper .~ light4 red
where & crType . humanoidAI .~ MultGunAI
drawwp = DoActionIfElse NoAction (const crIsAiming) (DoActionThen drawWeapon (WaitThen 50 NoAction))
reloadActions =
[ holsterWeapon
, WaitThen 1 $ DoActionWhileInterrupt NoAction (const crIsReloading) (DoImpulses [ChangeStrategy WatchAndWait])
]
addArmour :: Creature -> Creature addArmour :: Creature -> Creature
addArmour = over crInv insarmour addArmour = over crInv insarmour
@@ -130,7 +100,6 @@ startCr = defaultCreature
, _crDir = pi/2 , _crDir = pi/2
, _crMvDir = pi/2 , _crMvDir = pi/2
, _crID = 0 , _crID = 0
, _crUpdate = stateUpdate yourControl
, _crRad = 10 , _crRad = 10
, _crMass = 10 , _crMass = 10
, _crHP = 1000 , _crHP = 1000
+2 -21
View File
@@ -4,36 +4,16 @@ module Dodge.Creature.ArmourChase
) where ) where
import Dodge.Data import Dodge.Data
import Dodge.Default import Dodge.Default
--import Dodge.Creature.State
import Dodge.Creature.Update
import Dodge.Creature.ChaseCrit import Dodge.Creature.ChaseCrit
--import Dodge.Creature.ChainUpdates
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
--import Dodge.Creature.Impulse
import Dodge.Creature.Action
import Dodge.Item.Equipment import Dodge.Item.Equipment
import Dodge.Item.Consumable import Dodge.Item.Consumable
--import Picture
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
import Control.Lens import Control.Lens
flockArmourChaseCrit :: Creature flockArmourChaseCrit :: Creature
flockArmourChaseCrit = defaultCreature flockArmourChaseCrit = defaultCreature
{ _crUpdate = defaultImpulsive { _crName = "armourChaseCrit"
[ watchUpdateStrat []
, const doStrategyActions
, performActions
, targetYouWhenCognizant
, setTargetMv (\_ -> _targetCr . _crIntention)
, flockACC
, perceptionUpdate [0]
, goToTarget
, const overrideMeleeCloseTarget
, const (crMeleeCooldown %~ max 0 . subtract 1)
]
, _crName = "armourChaseCrit"
, _crHP = 300 , _crHP = 300
, _crInv = IM.fromList , _crInv = IM.fromList
[(0,frontArmour) [(0,frontArmour)
@@ -49,6 +29,7 @@ flockArmourChaseCrit = defaultCreature
, _crGroup = ShieldGroup , _crGroup = ShieldGroup
, _crMvType = defaultChaseMvType , _crMvType = defaultChaseMvType
} }
& crType . humanoidAI .~ FlockArmourChaseAI
armourChaseCrit :: Creature armourChaseCrit :: Creature
armourChaseCrit = chaseCrit armourChaseCrit = chaseCrit
{ _crName = "armourChaseCrit" { _crName = "armourChaseCrit"
+3 -12
View File
@@ -3,28 +3,19 @@ module Dodge.Creature.AutoCrit
) where ) where
import Dodge.Data import Dodge.Data
import Dodge.Default import Dodge.Default
import Dodge.Creature.Update
import Dodge.Creature.SentinelAI
--import Dodge.Creature.ChooseTarget
--import Dodge.Creature.Impulse
--import Dodge.Creature.State
--import Dodge.Creature.State.Data
import Dodge.Item.Weapon.BulletGuns import Dodge.Item.Weapon.BulletGuns
import Dodge.Item.Consumable import Dodge.Item.Consumable
--import Geometry
import Picture import Picture
--import Dodge.RandomHelp
--
--import Data.Maybe
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
import Control.Lens import Control.Lens
autoCrit :: Creature autoCrit :: Creature
autoCrit = defaultCreature autoCrit = defaultCreature
{ _crUpdate = defaultImpulsive [sentinelAI] { _crInv = IM.fromList [(0,autoGun),(1,medkit 100)]
, _crInv = IM.fromList [(0,autoGun),(1,medkit 100)]
, _crRad = 10 , _crRad = 10
, _crHP = 300 , _crHP = 300
, _crMvType = defaultAimMvType , _crMvType = defaultAimMvType
} }
& crType . skinUpper .~ light4 red & crType . skinUpper .~ light4 red
& crType . humanoidAI .~ AutoAI
+2 -20
View File
@@ -6,18 +6,11 @@ module Dodge.Creature.ChaseCrit
import Dodge.Data import Dodge.Data
import Dodge.Default import Dodge.Default
import Dodge.Creature.Picture import Dodge.Creature.Picture
import Dodge.Creature.Update
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Action
import Dodge.Creature.Perception
import Dodge.Item.Consumable import Dodge.Item.Consumable
import Dodge.Item.Equipment import Dodge.Item.Equipment
import Dodge.SoundLogic import Dodge.SoundLogic
--import Geometry
import Picture import Picture
--import Dodge.RandomHelp
--import Data.Maybe
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
import Control.Lens import Control.Lens
--import System.Random --import System.Random
@@ -37,19 +30,7 @@ invisibleChaseCrit = chaseCrit
& crInvEquipped . at 0 ?~ OnLeftWrist & crInvEquipped . at 0 ?~ OnLeftWrist
chaseCrit :: Creature chaseCrit :: Creature
chaseCrit = defaultCreature chaseCrit = defaultCreature
{ _crUpdate = defaultImpulsive { _crName = "chaseCrit"
[ const doStrategyActions
, performActions
, const overrideMeleeCloseTarget
, const setViewPos
, setMvPos
, chaseCritMv
, chaseCritPerceptionUpdate [0]
, targetYouWhenCognizant
, const searchIfDamaged
, const (crMeleeCooldown %~ max 0 . subtract 1)
]
, _crName = "chaseCrit"
, _crHP = 150 , _crHP = 150
, _crInv = IM.fromList [(0,medkit 200)] , _crInv = IM.fromList [(0,medkit 200)]
, _crMeleeCooldown = 0 , _crMeleeCooldown = 0
@@ -66,3 +47,4 @@ chaseCrit = defaultCreature
] 50 0 ] 50 0
, _crMvType = defaultChaseMvType , _crMvType = defaultChaseMvType
} }
& crType . humanoidAI .~ ChaseAI
+4 -59
View File
@@ -9,23 +9,14 @@ module Dodge.Creature.Inanimate
) where ) where
import Dodge.Data import Dodge.Data
import Dodge.Creature.Lamp import Dodge.Creature.Lamp
import Dodge.WorldEvent.Explosion
import Dodge.Spark
import Dodge.Default import Dodge.Default
import Dodge.Creature.State
import qualified IntMapHelp as IM import qualified IntMapHelp as IM
import Geometry
import Dodge.SoundLogic
import LensHelp import LensHelp
import System.Random
import Data.List
barrel :: Creature barrel :: Creature
barrel = defaultInanimate barrel = defaultInanimate
{ _crUpdate = updateBarrel { _crHP = 500
, _crHP = 500 , _crType = Barreloid PlainBarrel
, _crType = Barreloid
, _crState = defaultState , _crState = defaultState
{_csSpState = Barrel [] {_csSpState = Barrel []
} }
@@ -34,57 +25,11 @@ barrel = defaultInanimate
explosiveBarrel :: Creature explosiveBarrel :: Creature
explosiveBarrel = defaultInanimate explosiveBarrel = defaultInanimate
{ _crUpdate = updateExpBarrel { _crHP = 400
, _crHP = 400 , _crType = Barreloid ExplosiveBarrel
, _crType = Barreloid
, _crState = defaultState , _crState = defaultState
{_csSpState = Barrel [] {_csSpState = Barrel []
} }
, _crInv = IM.empty -- IM.fromList [(0,frontArmour)] , _crInv = IM.empty -- IM.fromList [(0,frontArmour)]
} }
& crMaterial .~ Crystal & crMaterial .~ Crystal
updateBarrel :: Creature -> World -> World
updateBarrel cr
| _crHP cr > 0 = doDamage cr
| otherwise = creatures . at (_crID cr) .~ Nothing
-- should generate the sparks externally using new random generators
updateExpBarrel :: Creature -> World -> World
updateExpBarrel cr w
| _crHP cr > 0 = foldr ($) (hiss w & creatures . at (_crID cr) .~ newCr) pierceSparks
| otherwise = makeExplosionAt (_crPos cr) $ stopSounds w & creatures . at (_crID cr) .~ Nothing
where
g = _randGen w
damages = _csDamage $ _crState cr
pierceSparks :: [World -> World]
pierceSparks
= zipWith3 (\p a -> createBarrelSpark (_crPos cr +.+ p) (a + argV p))
poss as colids
as = randomRs (-0.7,0.7) g
colids = randomRs (0,11) g
poss = _piercedPoints $ _csSpState $ _crState cr
newCr = Just $ applyFuseDamage $ set (crState . csDamage) [] $ damToExpBarrel damages cr
applyFuseDamage cr' = cr' & crHP %~
subtract (length . _piercedPoints . _csSpState $ _crState cr')
hiss | null poss = id
| otherwise = soundMultiFrom [BarrelHiss 0,BarrelHiss 1] (_crPos cr) foamSprayLoopS (Just 1)
stopSounds = stopSoundFrom (BarrelHiss 0) . stopSoundFrom (BarrelHiss 1)
damToExpBarrel :: [Damage] -> Creature -> Creature
damToExpBarrel ds cr = foldr damToExpBarrel' (foldr damToExpBarrel' cr pierceDam) otherDam
where
(pierceDam,otherDam) = partition isPierce ds
isPierce Damage{_dmType = PIERCING{}} = True
isPierce _ = False
damToExpBarrel' :: Damage -> Creature -> Creature
damToExpBarrel' dm cr = case _dmType dm of
PIERCING -> over (crState . csSpState . piercedPoints) ((:) $ int -.- _crPos cr)
$ cr & crHP -~ div amount 200
POISONDAM -> cr
SPARKING -> cr
-- PUSHDAM -> cr LensHelp.& crPos .+.+~ (1 / _crMass cr *.* _dePushBack (_dmEffect dm))
_ -> cr LensHelp.& crHP -~ amount
where
amount = _dmAmount dm
int = _dmAt dm
+3 -34
View File
@@ -3,48 +3,17 @@ module Dodge.Creature.Lamp
, colorLamp , colorLamp
) where ) where
import Dodge.Data import Dodge.Data
import Dodge.Material.Sound
import Dodge.Default import Dodge.Default
import Dodge.LightSource import Geometry.Data
import Dodge.WorldEvent.Flash
import Dodge.WorldEvent.Sound
import Dodge.Creature.State
import Geometry
import qualified IntMapHelp as IM
import LensHelp
colorLamp colorLamp
:: Point3 -- color of lamp :: Point3 -- color of lamp
-> Float -- height of lamp -> Float -- height of lamp
-> Creature -> Creature
colorLamp col h = defaultInanimate colorLamp col h = defaultInanimate
{ _crUpdate = initialiseColorLamp col h { _crHP = 100
, _crHP = 100 , _crType = Lampoid h col Nothing
, _crType = Lampoid h
, _crRad = 3 , _crRad = 3
, _crMass = 3 , _crMass = 3
} }
lamp :: Float -> Creature lamp :: Float -> Creature
lamp = colorLamp 0.75 lamp = colorLamp 0.75
initialiseColorLamp :: Point3 -> Float -> Creature -> World -> World
initialiseColorLamp col h cr w = w
& lightSources . at lsid ?~ lsColPosID col (addZ h $ _crPos cr) lsid
& creatures . ix (_crID cr) . crUpdate .~ updateLamp h lsid
where
lsid = IM.newKey $ _lightSources w
updateLamp :: Float -> Int -> Creature -> World -> World
updateLamp h i cr w
| _crHP cr < 0 = w
& explosionFlashAt cpos
& originsIDsAt [MaterialSound Glass n | n <- [0,1,2]] (destroyMatS Glass) cpos
& lightSources . at i .~ Nothing
& creatures . at cid .~ Nothing
| otherwise = w
& lightSources . ix i . lsParam . lsPos .~ addZ h cpos
& doDamage cr
where
cpos = _crPos cr
cid = _crID cr
+2 -53
View File
@@ -4,18 +4,7 @@ module Dodge.Creature.LauncherCrit
where where
import Dodge.Data import Dodge.Data
import Dodge.Default import Dodge.Default
--import Dodge.Creature.ChainUpdates
import Dodge.Creature.Test
import Dodge.Creature.Volition
import Dodge.Creature.Strategy
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
--import Dodge.Creature.State
import Dodge.Creature.Update
import Dodge.Item.Weapon.Launcher import Dodge.Item.Weapon.Launcher
--import Dodge.Creature.Impulse
import Dodge.Creature.Action
import Geometry.Data
import Picture import Picture
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
@@ -23,53 +12,13 @@ import Control.Lens
launcherCrit :: Creature launcherCrit :: Creature
launcherCrit = defaultCreature launcherCrit = defaultCreature
{ _crUpdate = defaultImpulsive { _crInv = IM.fromList [(0,launcher)]
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0) [retreatFire])
, (const crAwayFromPost, const goToPostStrat)
]
, perceptionUpdate [0]
, const doStrategyActions
, const reloadOverride
, targetYouWhenCognizant
, const $ overrideInternal
(\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
(crActionPlan . apStrategy .~ WatchAndWait)
]
, _crInv = IM.fromList [(0,launcher)]
, _crRad = 10 , _crRad = 10
, _crState = defaultState , _crState = defaultState
, _crHP = 300 , _crHP = 300
} }
& crType . skinUpper .~ light4 red & crType . skinUpper .~ light4 red
& crType . humanoidAI .~ LauncherAI
retreatFire :: Action
retreatFire = ImpulsesList ( [ UseItem ] : replicate 20 [ Turn 0.16 ])
`DoActionThen`
holsterWeapon
`DoActionThen`
ImpulsesList ( replicate 30 [ MoveForward 3 ])
`DoActionThen`
drawWeapon
`DoActionThen`
ImpulsesList ( [UseItem] : replicate 20 [ Turn $ negate 0.16 ] )
`DoActionThen`
holsterWeapon
`DoActionThen`
ImpulsesList ( replicate 15 [ MoveForward 3 ] )
`DoActionThen`
drawWeapon
`DoActionThen`
ImpulsesList (
replicate 100 [UseItem, ImpulseUseTarget $ \tcr -> TurnToward (_crPos tcr) (pi/16) ] )
`DoActionThen`
20
`WaitThen`
holsterWeapon
`DoActionThen`
ImpulsesList ( replicate 15 [ MoveForward 3 ] )
`DoActionThen`
DoImpulses [ChangeStrategy WatchAndWait]
+2 -44
View File
@@ -3,17 +3,8 @@ module Dodge.Creature.LtAutoCrit
) where ) where
import Dodge.Data import Dodge.Data
import Dodge.Default import Dodge.Default
import Dodge.Creature.Update
import Dodge.Creature.Action
import Dodge.Creature.Test
import Dodge.Creature.Volition
import Dodge.Creature.Strategy
--import Dodge.Creature.ChooseTarget
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
import Dodge.Item.Weapon.BulletGuns import Dodge.Item.Weapon.BulletGuns
import Dodge.Item.Consumable import Dodge.Item.Consumable
import Geometry
import Picture import Picture
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
@@ -21,43 +12,10 @@ import Control.Lens
ltAutoCrit :: Creature ltAutoCrit :: Creature
ltAutoCrit = defaultCreature ltAutoCrit = defaultCreature
{ _crUpdate = defaultImpulsive { _crInv = IM.fromList [(0,autoPistol),(1,medkit 100)]
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
[DoActionIf (const $ not . crIsAiming) drawWeapon
,DoActionThen
(DoActionWhile crHasTargetLOS $ ArbitraryAction chooseMovement)
(DoImpulses [ChangeStrategy WatchAndWait])
]
)
, (const crAwayFromPost, const goToPostStrat)
]
, perceptionUpdate [0]
, const doStrategyActions
, const reloadOverride
, targetYouWhenCognizant
, const $ overrideInternal
(\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
(crActionPlan . apStrategy .~ WatchAndWait)
]
, _crInv = IM.fromList [(0,autoPistol),(1,medkit 100)]
, _crRad = 10 , _crRad = 10
, _crHP = 500 , _crHP = 500
} }
& crType . humanoidAI .~ LtAutoAI
& crType . skinUpper .~ light4 red & crType . skinUpper .~ light4 red
chooseMovement :: Creature -> World -> Action
chooseMovement cr w
| dist cpos p > 200 = DoImpulses [UseItem,TurnToward p 0.05 , MoveForward 3]
| dist cpos p < 80 = DoImpulses [UseItem,TurnToward p 0.05, MoveForward (-3) ]
| errorAngleVV 22 (p' -.- cpos) (unitVectorAtAngle (_crDir cr)) < 0.4
= DoImpulses [UseItem,TurnToward p' 0.01, Move (V2 0 3)]
| otherwise
= DoImpulses [UseItem,TurnToward p' 0.05, Move (V2 0 3)]
where
cpos = _crPos cr
tcr = _creatures w IM.! 0
p = _crPos tcr
v = vNormal $ p -.- cpos
p' = p +.+ 0.5 *.* (v -.- 20 *.* normalizeV v)
+2 -90
View File
@@ -3,109 +3,21 @@ module Dodge.Creature.PistolCrit
) where ) where
import Dodge.Data import Dodge.Data
import Dodge.Default import Dodge.Default
import Dodge.Creature.Update
import Dodge.Creature.Test
import Dodge.Creature.Action
import Dodge.Creature.Volition
import Dodge.Creature.Strategy
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
--import Dodge.Creature.State.Data
import Dodge.Item.Weapon.BulletGuns import Dodge.Item.Weapon.BulletGuns
import Dodge.Item.Consumable import Dodge.Item.Consumable
import Geometry
import Picture import Picture
import RandomHelp
import Data.Maybe
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
import Control.Lens import Control.Lens
pistolCrit :: Creature pistolCrit :: Creature
pistolCrit = defaultCreature pistolCrit = defaultCreature
{ _crUpdate = defaultImpulsive { _crInv = IM.fromList [(0,pistol),(1,medkit 100)]
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \w cr -> StrategyActions (ShootAt 0)
[DoActionIf (const $ not . crIsAiming) drawWeapon,chooseMovement cr w])
, (const crAwayFromPost, const goToPostStrat)
]
, perceptionUpdate [0]
, const doStrategyActions
, const reloadOverride
, targetYouWhenCognizant
, const $ overrideInternal
(\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
(crActionPlan . apStrategy .~ WatchAndWait)
]
, _crInv = IM.fromList [(0,pistol),(1,medkit 100)]
, _crRad = 10 , _crRad = 10
, _crHP = 500 , _crHP = 500
} }
& crType . humanoidAI .~ PistolAI
& crType . skinUpper .~ light4 red & crType . skinUpper .~ light4 red
chooseMovement :: Creature -> World -> Action
chooseMovement cr w = chooseMovement' cr w
`DoActionThen`
DoImpulses [ChangeStrategy WatchAndWait]
chooseMovement' :: Creature -> World -> Action
chooseMovement' cr w = takeOneWeighted [chargeProb,retreatProb,strafeProb,strafeProb]
[chargeActions
,retreatActions ycr cr
,strafeLeftActions
,strafeRightActions
] & evalState $ g
where
g = _randGen w
cpos = _crPos cr
ycr = _creatures w IM.! 0
ypos = _crPos ycr
chargeProb | dist cpos ypos > 300 = 5
| dist cpos ypos > 150 = 1
| otherwise = 0
strafeProb | dist cpos ypos > 150 = 1
| otherwise = 0
retreatProb | dist cpos ypos < 200 = 1 :: Float
| otherwise = 0
chargeActions =
[TurnToward ypos 0.1]
`DoImpulsesAlongside`
3
`DoReplicate`
ImpulsesList (replicate 9 [Move (V2 3 0)] ++ [[Move (V2 3 0),UseItem]])
strafeLeftActions =
DoImpulses [TurnToward yposr (2*pi)]
`DoActionThen`
3
`DoReplicate`
ImpulsesList (replicate 9 [Move (V2 0 3)] ++ [[Move (V2 0 3),UseItem]])
strafeRightActions =
DoImpulses [TurnToward yposl (2*pi)]
`DoActionThen`
3
`DoReplicate`
ImpulsesList (replicate 9 [Move (V2 0 (-3))] ++ [[Move (V2 0 (-3)),UseItem]])
yposl = ypos -.- 100 *.* vNormal (normalizeV $ ypos -.- cpos)
yposr = ypos +.+ 100 *.* vNormal (normalizeV $ ypos -.- cpos)
retreatActions :: Creature -> Creature -> Action
retreatActions tcr cr =
[TurnToward retreatOffset 0.2]
`DoImpulsesAlongside`
3
`DoReplicate`
ImpulsesList (replicate 9 [Move (V2 (-3) 0)] ++ [[UseItem]])
where
cpos = _crPos cr
tpos = _crPos tcr
retreatOffset =
let a | dist cpos tpos < 50 = 0
| isLeftOfA (_crDir cr) (argV $ tpos -.- cpos)
= -0.7
| otherwise = 0.7
in fromMaybe tpos $ intersectLineLine' cpos
(cpos +.+ rotateV a (tpos -.- cpos))
tpos
(tpos +.+ vNormal (cpos -.- tpos))
+2 -47
View File
@@ -3,64 +3,19 @@ module Dodge.Creature.SpreadGunCrit
) where ) where
import Dodge.Data import Dodge.Data
import Dodge.Default import Dodge.Default
import Dodge.Creature.Update
import Dodge.Creature.Test
import Dodge.Creature.Action
import Dodge.Creature.Volition
import Dodge.Creature.Strategy
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
--import Dodge.Creature.State.Data
import Dodge.Item.Weapon.BulletGuns import Dodge.Item.Weapon.BulletGuns
import Dodge.Item.Consumable import Dodge.Item.Consumable
import Geometry
import Picture import Picture
--import Dodge.RandomHelp
--import Data.Maybe
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
import Control.Lens import Control.Lens
spreadGunCrit :: Creature spreadGunCrit :: Creature
spreadGunCrit = defaultCreature spreadGunCrit = defaultCreature
{ _crUpdate = defaultImpulsive { _crInv = IM.fromList [(0,bangStick 6),(1,medkit 100)]
[performActions
,watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
[DoActionIf (const $ not . crIsAiming) drawWeapon
,DoActionThen
(DoActionWhile crHasTargetLOS $ ArbitraryAction chooseMovement)
(DoImpulses [ChangeStrategy WatchAndWait])
]
)
, (const crAwayFromPost, const goToPostStrat)
]
,perceptionUpdate [0]
,const doStrategyActions
,const reloadOverride
,targetYouWhenCognizant
,const $ overrideInternal
(\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
(\ cr -> cr & crActionPlan . apStrategy .~ WatchAndWait)
]
, _crInv = IM.fromList [(0,bangStick 6),(1,medkit 100)]
, _crRad = 10 , _crRad = 10
, _crHP = 500 , _crHP = 500
} }
& crType . humanoidAI .~ SpreadGunAI
& crType . skinUpper .~ light4 red & crType . skinUpper .~ light4 red
chooseMovement :: Creature -> World -> Action
chooseMovement cr w
| dist cpos p < 30 && safeAngleVV (p -.- cpos) (unitVectorAtAngle (_crDir cr)) > pi
= DoImpulses [UseItem, MoveForward (-3)]
| d < 30 = DoImpulses [UseItem,TurnToward p 0.06]
| d < 60 = DoImpulses [UseItem,TurnToward p 0.06,MoveForward 3]
| d < 100 = DoImpulses [TurnToward p 0.06, MoveForward 3 ]
| d < 200 = DoImpulses [TurnToward p (0.06 + 0.002 *(d-100)), MoveForward 3 ]
| otherwise
= DoImpulses [TurnToward p 0.26, MoveForward 3]
where
d = dist cpos p
cpos = _crPos cr
tcr = _creatures w IM.! 0
p = _crPos tcr
+1 -2
View File
@@ -62,8 +62,7 @@ checkDeath cr w
& corpseOrGib cr & corpseOrGib cr
where where
removecr removecr
| _crID cr == 0 = (creatures . ix (_crID cr) . crUpdate .~ const id) | _crID cr == 0 = (creatures . ix (_crID cr) . crType .~ NonDrawnCreature)
. (creatures . ix (_crID cr) . crType .~ NonDrawnCreature)
. (creatures . ix (_crID cr) . crHP .~ 0) . (creatures . ix (_crID cr) . crHP .~ 0)
-- hack to get around player creature being killed but left with more than 0 hp -- hack to get around player creature being killed but left with more than 0 hp
| otherwise = creatures . at (_crID cr) .~ Nothing | otherwise = creatures . at (_crID cr) .~ Nothing
+2 -18
View File
@@ -4,30 +4,13 @@ module Dodge.Creature.SwarmCrit
import Dodge.Data import Dodge.Data
import Dodge.Default import Dodge.Default
import Dodge.Creature.Picture import Dodge.Creature.Picture
import Dodge.Creature.Update
--import Dodge.Creature.ChainUpdates
import Dodge.Creature.Boid
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Perception
--import Dodge.Creature.Impulse
--import Dodge.Creature.State
import Picture import Picture
import Control.Lens import Control.Lens
swarmCrit :: Creature swarmCrit :: Creature
swarmCrit = defaultCreature swarmCrit = defaultCreature
{ _crUpdate = defaultImpulsive { _crHP = 1
[ flockToPointUsing' (encircleDistP 100) (meleeHeadingMove 0.1 0.1 (pi/4) 3.9)
, const (crMeleeCooldown %~ max 0 . subtract 1)
, perceptionUpdate [0]
, const doStrategyActions
, targetYouWhenCognizant
]
-- , doStrategyActions
-- , targetYouWhenCognizant
, _crHP = 1
, _crRad = 2 , _crRad = 2
, _crMass = 2 , _crMass = 2
, _crCorpse = basicCrCorpse , _crCorpse = basicCrCorpse
@@ -35,6 +18,7 @@ swarmCrit = defaultCreature
, _crMeleeCooldown = 0 , _crMeleeCooldown = 0
} }
& crType . skinUpper .~ light4 yellow & crType . skinUpper .~ light4 yellow
& crType . humanoidAI .~ SwarmAI
--swarmCritMoveFunc :: Creature -> Point2 -> Creature -> Point2 --swarmCritMoveFunc :: Creature -> Point2 -> Creature -> Point2
--swarmCritMoveFunc tcr cenp cr --swarmCritMoveFunc tcr cenp cr
+13
View File
@@ -3,10 +3,23 @@ import Dodge.Data
import Dodge.Creature.State import Dodge.Creature.State
import Dodge.Creature.Impulse import Dodge.Creature.Impulse
import Dodge.Creature.ChainUpdates import Dodge.Creature.ChainUpdates
import Dodge.Lampoid
import Dodge.Humanoid
import Dodge.Turretoid
import Dodge.Barreloid
import LensHelp import LensHelp
import System.Random import System.Random
updateCreature :: Creature -> World -> World
updateCreature cr = case _crType cr of
Lampoid{} -> updateLampoid cr
Humanoid{} -> updateHumanoid cr
Turretoid{} -> updateTurretoid cr
Barreloid{} -> updateBarreloid cr
NonDrawnCreature -> id
-- bit of a hack to get new random generators after each creature's update -- bit of a hack to get new random generators after each creature's update
defaultImpulsive :: [World -> Creature -> Creature] defaultImpulsive :: [World -> Creature -> Creature]
-> Creature -> World -> World -> Creature -> World -> World
+2 -11
View File
@@ -10,6 +10,7 @@ circular imports are probably not a good idea.
{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingStrategies #-}
module Dodge.Data module Dodge.Data
( module Dodge.Data ( module Dodge.Data
, module Dodge.Data.Payload
, module Dodge.Data.RadarSweep , module Dodge.Data.RadarSweep
, module Dodge.Data.PosEvent , module Dodge.Data.PosEvent
, module Dodge.Data.EnergyBall , module Dodge.Data.EnergyBall
@@ -53,6 +54,7 @@ module Dodge.Data
, module Dodge.Data.RadarBlip , module Dodge.Data.RadarBlip
, module Dodge.Data.PathGraph , module Dodge.Data.PathGraph
) where ) where
import Dodge.Data.Payload
import Dodge.Data.RadarSweep import Dodge.Data.RadarSweep
import Dodge.Data.PosEvent import Dodge.Data.PosEvent
import Dodge.Data.EnergyBall import Dodge.Data.EnergyBall
@@ -306,15 +308,6 @@ data Gust = Gust
, _guVel :: Point2 , _guVel :: Point2
, _guTime :: Int , _guTime :: Int
} }
data CreatureType
= Humanoid
{ _skinHead :: Color
, _skinUpper :: Color
, _skinLower :: Color
}
| Barreloid
| Lampoid {_lampHeight :: Float}
| NonDrawnCreature
data Creature = Creature data Creature = Creature
{ _crPos :: Point2 { _crPos :: Point2
, _crOldPos :: Point2 , _crOldPos :: Point2
@@ -325,7 +318,6 @@ data Creature = Creature
, _crTwist :: Float , _crTwist :: Float
, _crType :: CreatureType , _crType :: CreatureType
, _crID :: Int , _crID :: Int
, _crUpdate :: Creature -> World -> World
, _crRad :: Float , _crRad :: Float
, _crMass :: Float , _crMass :: Float
, _crHP :: Int , _crHP :: Int
@@ -1344,7 +1336,6 @@ makeLenses ''EquipParams
makeLenses ''TerminalCommand makeLenses ''TerminalCommand
makeLenses ''TerminalInput makeLenses ''TerminalInput
makeLenses ''GenParams makeLenses ''GenParams
makeLenses ''CreatureType
makeLenses ''Corpse makeLenses ''Corpse
----- ROOM LENSES ----- ROOM LENSES
+4
View File
@@ -0,0 +1,4 @@
--{-# LANGUAGE TemplateHaskell #-}
--{-# LANGUAGE StrictData #-}
module Dodge.Data.Ammo where
+18
View File
@@ -2,6 +2,8 @@
{-# LANGUAGE StrictData #-} {-# LANGUAGE StrictData #-}
module Dodge.Data.Creature where module Dodge.Data.Creature where
import Sound.Data import Sound.Data
import Geometry.Data
import Color
import Control.Lens import Control.Lens
data CamouflageStatus data CamouflageStatus
= FullyVisible = FullyVisible
@@ -31,6 +33,22 @@ data CrMvType
, _mvTurnJit :: Float , _mvTurnJit :: Float
, _mvAimSpeed :: Float -> Float , _mvAimSpeed :: Float -> Float
} }
data HumanoidAI = YourAI | ChaseAI | InanimateAI | SpreadGunAI | PistolAI
| LtAutoAI | LauncherAI | SwarmAI | AutoAI | FlockArmourChaseAI | MiniGunAI
| LongAI | MultGunAI
data CreatureType
= Humanoid
{ _skinHead :: Color
, _skinUpper :: Color
, _skinLower :: Color
, _humanoidAI :: HumanoidAI
}
| Barreloid {_barrelType :: BarrelType}
| Lampoid {_lampHeight :: Float, _lampColor :: Point3, _lampLSID :: Maybe Int}
| Turretoid
| NonDrawnCreature
data BarrelType = PlainBarrel | ExplosiveBarrel
makeLenses ''CreatureStatistics makeLenses ''CreatureStatistics
makeLenses ''Vocalization makeLenses ''Vocalization
makeLenses ''CrMvType makeLenses ''CrMvType
makeLenses ''CreatureType
+4
View File
@@ -0,0 +1,4 @@
--{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE StrictData #-}
module Dodge.Data.Payload where
data Payload = ExplosionPayload | DudPayload
+8
View File
@@ -0,0 +1,8 @@
--{-# LANGUAGE TemplateHaskell #-}
--{-# LANGUAGE StrictData #-}
module Dodge.Data.Projectile where
--import Dodge.Data.Ammo
--import Geometry.Data
--import Control.Lens
data ProjectileType = ShellType
+12
View File
@@ -0,0 +1,12 @@
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE StrictData #-}
module Dodge.Data.TeslaArc where
import Geometry.Data
import Color
import Control.Lens
data TeslaArc = TeslaArc
{ _taPoints :: [Point2]
, _taTimer :: Int
, _taColor :: Color
}
makeLenses ''TeslaArc
+1 -2
View File
@@ -19,7 +19,6 @@ defaultCreature = Creature
, _crTwist = 0 , _crTwist = 0
, _crID = 1 , _crID = 1
, _crType = defaultCreatureSkin , _crType = defaultCreatureSkin
, _crUpdate = const id
, _crRad = 10 , _crRad = 10
, _crMass = 10 , _crMass = 10
, _crHP = 100 , _crHP = 100
@@ -55,7 +54,7 @@ defaultCreature = Creature
, _crCamouflage = FullyVisible , _crCamouflage = FullyVisible
} }
defaultCreatureSkin :: CreatureType defaultCreatureSkin :: CreatureType
defaultCreatureSkin = Humanoid (greyN 0.9) (light4 green) (greyN 0.3) defaultCreatureSkin = Humanoid (greyN 0.9) (light4 green) (greyN 0.3) InanimateAI
defaultInanimate :: Creature defaultInanimate :: Creature
defaultInanimate = defaultCreature & crActionPlan .~ Inanimate defaultInanimate = defaultCreature & crActionPlan .~ Inanimate
+279
View File
@@ -0,0 +1,279 @@
module Dodge.Humanoid where
import Dodge.Data
import Dodge.Creature.Boid
import Dodge.Creature.YourControl
import Dodge.Creature.State
import Dodge.Creature.Impulse
import Dodge.Creature.ChainUpdates
import Dodge.Creature.Test
import Dodge.Creature.Volition
import LensHelp
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Action
import Dodge.Creature.Perception
import Dodge.Creature.Strategy
import Dodge.Creature.SentinelAI
import qualified IntMapHelp as IM
import Geometry
import RandomHelp
import Data.Maybe
updateHumanoid :: Creature -> World -> World
updateHumanoid cr = case cr ^?! crType . humanoidAI of
ChaseAI -> defaultImpulsive
[ const doStrategyActions
, performActions
, const overrideMeleeCloseTarget
, const setViewPos
, setMvPos
, chaseCritMv
, chaseCritPerceptionUpdate [0]
, targetYouWhenCognizant
, const searchIfDamaged
, const (crMeleeCooldown %~ max 0 . subtract 1)
] cr
SpreadGunAI -> defaultImpulsive
[performActions
,watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
[DoActionIf (const $ not . crIsAiming) drawWeapon
,DoActionThen
(DoActionWhile crHasTargetLOS $ ArbitraryAction chooseMovementSpreadGun)
(DoImpulses [ChangeStrategy WatchAndWait])
]
)
, (const crAwayFromPost, const goToPostStrat)
]
,perceptionUpdate [0]
,const doStrategyActions
,const reloadOverride
,targetYouWhenCognizant
,const $ overrideInternal
(\cr' -> crHasTarget cr' && crStratConMatches (GetTo (V2 0 0)) cr')
(\cr' -> cr' & crActionPlan . apStrategy .~ WatchAndWait)
] cr
PistolAI -> defaultImpulsive
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \w cr' -> StrategyActions (ShootAt 0)
[DoActionIf (const $ not . crIsAiming) drawWeapon,chooseMovementPistol cr' w])
, (const crAwayFromPost, const goToPostStrat)
]
, perceptionUpdate [0]
, const doStrategyActions
, const reloadOverride
, targetYouWhenCognizant
, const $ overrideInternal
(\cr' -> crHasTarget cr' && crStratConMatches (GetTo (V2 0 0)) cr')
(crActionPlan . apStrategy .~ WatchAndWait)
] cr
LtAutoAI -> defaultImpulsive
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
[DoActionIf (const $ not . crIsAiming) drawWeapon
,DoActionThen
(DoActionWhile crHasTargetLOS $ ArbitraryAction chooseMovementLtAuto)
(DoImpulses [ChangeStrategy WatchAndWait])
]
)
, (const crAwayFromPost, const goToPostStrat)
]
, perceptionUpdate [0]
, const doStrategyActions
, const reloadOverride
, targetYouWhenCognizant
, const $ overrideInternal
(\cr' -> crHasTarget cr' && crStratConMatches (GetTo (V2 0 0)) cr')
(crActionPlan . apStrategy .~ WatchAndWait)
] cr
LauncherAI -> defaultImpulsive
[ performActions
, watchUpdateStrat
[ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0) [retreatFireLauncher])
, (const crAwayFromPost, const goToPostStrat)
]
, perceptionUpdate [0]
, const doStrategyActions
, const reloadOverride
, targetYouWhenCognizant
, const $ overrideInternal
(\cr' -> crHasTarget cr' && crStratConMatches (GetTo (V2 0 0)) cr')
(crActionPlan . apStrategy .~ WatchAndWait)
] cr
SwarmAI -> defaultImpulsive
[ flockToPointUsing' (encircleDistP 100) (meleeHeadingMove 0.1 0.1 (pi/4) 3.9)
, const (crMeleeCooldown %~ max 0 . subtract 1)
, perceptionUpdate [0]
, const doStrategyActions
, targetYouWhenCognizant
] cr
AutoAI -> defaultImpulsive [sentinelAI] cr
FlockArmourChaseAI -> defaultImpulsive
[ watchUpdateStrat []
, const doStrategyActions
, performActions
, targetYouWhenCognizant
, setTargetMv (\_ -> _targetCr . _crIntention)
, flockACC
, perceptionUpdate [0]
, goToTarget
, const overrideMeleeCloseTarget
, const (crMeleeCooldown %~ max 0 . subtract 1)
] cr
MiniGunAI -> defaultImpulsive [sentinelFireType (const shootTillEmpty)] cr
LongAI -> defaultImpulsive [sentinelFireType $ const shootTillEmpty] cr
MultGunAI -> defaultImpulsive [sentinelExtraWatchUpdate
[ ( const $ not . crWeaponReady
, \_ _ -> StrategyActions Reload reloadActions
)
, (const $ not . crSafeDistFromTarg 150
, \_ cr' -> StrategyActions Flee
[const (not . crSafeDistFromTarg 150) `DoActionWhile` UseTarget (fleeFrom cr')
`DoActionThen` DoImpulses [ChangeStrategy WatchAndWait] ]
)
, (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0)
[ drawwp `DoActionThen` shootFirstMiss `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait] ]
)
]
] cr
YourAI -> stateUpdate yourControl cr
InanimateAI -> id
where
drawwp = DoActionIfElse NoAction (const crIsAiming) (DoActionThen drawWeapon (WaitThen 50 NoAction))
reloadActions =
[ holsterWeapon
, WaitThen 1 $ DoActionWhileInterrupt NoAction (const crIsReloading) (DoImpulses [ChangeStrategy WatchAndWait])
]
-- bit of a hack to get new random generators after each creature's update
defaultImpulsive :: [World -> Creature -> Creature]
-> Creature -> World -> World
defaultImpulsive = fmap (fmap updateRandGen) . stateUpdate . impulsiveAIBefore . chainCreatureUpdates
where
updateRandGen w = let (_,g) = randomR (0,1::Int) (_randGen w)
in w & randGen .~ g
chooseMovementSpreadGun :: Creature -> World -> Action
chooseMovementSpreadGun cr w
| dist cpos p < 30 && safeAngleVV (p -.- cpos) (unitVectorAtAngle (_crDir cr)) > pi
= DoImpulses [UseItem, MoveForward (-3)]
| d < 30 = DoImpulses [UseItem,TurnToward p 0.06]
| d < 60 = DoImpulses [UseItem,TurnToward p 0.06,MoveForward 3]
| d < 100 = DoImpulses [TurnToward p 0.06, MoveForward 3 ]
| d < 200 = DoImpulses [TurnToward p (0.06 + 0.002 *(d-100)), MoveForward 3 ]
| otherwise
= DoImpulses [TurnToward p 0.26, MoveForward 3]
where
d = dist cpos p
cpos = _crPos cr
tcr = _creatures w IM.! 0
p = _crPos tcr
chooseMovementPistol :: Creature -> World -> Action
chooseMovementPistol cr w = chooseMovementPistol' cr w
`DoActionThen`
DoImpulses [ChangeStrategy WatchAndWait]
chooseMovementPistol' :: Creature -> World -> Action
chooseMovementPistol' cr w = takeOneWeighted [chargeProb,retreatProb,strafeProb,strafeProb]
[chargeActions
,retreatActionsPistol ycr cr
,strafeLeftActions
,strafeRightActions
] & evalState $ g
where
g = _randGen w
cpos = _crPos cr
ycr = _creatures w IM.! 0
ypos = _crPos ycr
chargeProb | dist cpos ypos > 300 = 5
| dist cpos ypos > 150 = 1
| otherwise = 0
strafeProb | dist cpos ypos > 150 = 1
| otherwise = 0
retreatProb | dist cpos ypos < 200 = 1 :: Float
| otherwise = 0
chargeActions =
[TurnToward ypos 0.1]
`DoImpulsesAlongside`
3
`DoReplicate`
ImpulsesList (replicate 9 [Move (V2 3 0)] ++ [[Move (V2 3 0),UseItem]])
strafeLeftActions =
DoImpulses [TurnToward yposr (2*pi)]
`DoActionThen`
3
`DoReplicate`
ImpulsesList (replicate 9 [Move (V2 0 3)] ++ [[Move (V2 0 3),UseItem]])
strafeRightActions =
DoImpulses [TurnToward yposl (2*pi)]
`DoActionThen`
3
`DoReplicate`
ImpulsesList (replicate 9 [Move (V2 0 (-3))] ++ [[Move (V2 0 (-3)),UseItem]])
yposl = ypos -.- 100 *.* vNormal (normalizeV $ ypos -.- cpos)
yposr = ypos +.+ 100 *.* vNormal (normalizeV $ ypos -.- cpos)
retreatActionsPistol :: Creature -> Creature -> Action
retreatActionsPistol tcr cr =
[TurnToward retreatOffset 0.2]
`DoImpulsesAlongside`
3
`DoReplicate`
ImpulsesList (replicate 9 [Move (V2 (-3) 0)] ++ [[UseItem]])
where
cpos = _crPos cr
tpos = _crPos tcr
retreatOffset =
let a | dist cpos tpos < 50 = 0
| isLeftOfA (_crDir cr) (argV $ tpos -.- cpos)
= -0.7
| otherwise = 0.7
in fromMaybe tpos $ intersectLineLine' cpos
(cpos +.+ rotateV a (tpos -.- cpos))
tpos
(tpos +.+ vNormal (cpos -.- tpos))
chooseMovementLtAuto :: Creature -> World -> Action
chooseMovementLtAuto cr w
| dist cpos p > 200 = DoImpulses [UseItem,TurnToward p 0.05 , MoveForward 3]
| dist cpos p < 80 = DoImpulses [UseItem,TurnToward p 0.05, MoveForward (-3) ]
| errorAngleVV 22 (p' -.- cpos) (unitVectorAtAngle (_crDir cr)) < 0.4
= DoImpulses [UseItem,TurnToward p' 0.01, Move (V2 0 3)]
| otherwise
= DoImpulses [UseItem,TurnToward p' 0.05, Move (V2 0 3)]
where
cpos = _crPos cr
tcr = _creatures w IM.! 0
p = _crPos tcr
v = vNormal $ p -.- cpos
p' = p +.+ 0.5 *.* (v -.- 20 *.* normalizeV v)
retreatFireLauncher :: Action
retreatFireLauncher = ImpulsesList ( [ UseItem ] : replicate 20 [ Turn 0.16 ])
`DoActionThen`
holsterWeapon
`DoActionThen`
ImpulsesList ( replicate 30 [ MoveForward 3 ])
`DoActionThen`
drawWeapon
`DoActionThen`
ImpulsesList ( [UseItem] : replicate 20 [ Turn $ negate 0.16 ] )
`DoActionThen`
holsterWeapon
`DoActionThen`
ImpulsesList ( replicate 15 [ MoveForward 3 ] )
`DoActionThen`
drawWeapon
`DoActionThen`
ImpulsesList (
replicate 100 [UseItem, ImpulseUseTarget $ \tcr -> TurnToward (_crPos tcr) (pi/16) ] )
`DoActionThen`
20
`WaitThen`
holsterWeapon
`DoActionThen`
ImpulsesList ( replicate 15 [ MoveForward 3 ] )
`DoActionThen`
DoImpulses [ChangeStrategy WatchAndWait]
+29
View File
@@ -0,0 +1,29 @@
module Dodge.Lampoid where
import Dodge.Data
import Dodge.Material.Sound
import Dodge.WorldEvent.Flash
import Dodge.WorldEvent.Sound
import Dodge.Creature.State
import Dodge.LightSource
import Geometry
import LensHelp
import qualified IntMapHelp as IM
updateLampoid :: Creature -> World -> World
updateLampoid cr w = case cr ^?! crType . lampLSID of
Nothing -> let i = IM.newKey (_lightSources w)
in w & lightSources . at i ?~ lsColPosID lcol (addZ h cpos) i
Just i
| _crHP cr < 0 -> w
& explosionFlashAt cpos
& originsIDsAt [MaterialSound Glass n | n <- [0,1,2]] (destroyMatS Glass) cpos
& lightSources . at i .~ Nothing
& creatures . at cid .~ Nothing
| otherwise -> w
& lightSources . ix i . lsParam . lsPos .~ addZ h cpos
& doDamage cr
where
cpos = _crPos cr
cid = _crID cr
crtype = _crType cr
h = _lampHeight crtype
lcol = _lampColor crtype
-3
View File
@@ -9,8 +9,6 @@ import Dodge.WorldEvent.Explosion
import Dodge.FloorItem import Dodge.FloorItem
import Dodge.Item.Weapon.BatteryGuns import Dodge.Item.Weapon.BatteryGuns
import Dodge.Default import Dodge.Default
import Dodge.Creature.State
import Dodge.Creature.Impulse
import Dodge.Movement.Turn import Dodge.Movement.Turn
import Geometry import Geometry
import LensHelp import LensHelp
@@ -64,7 +62,6 @@ updateTurret rotSpeed mc w
& crOldPos .~ mcpos & crOldPos .~ mcpos
& crRad .~ 1 & crRad .~ 1
& crDir .~ mcdir & crDir .~ mcdir
& crUpdate .~ stateUpdate followThenClearImpulses
& crStance . posture .~ Aiming & crStance . posture .~ Aiming
& crMaterial .~ Crystal & crMaterial .~ Crystal
Just cid -> w' Just cid -> w'
+9
View File
@@ -0,0 +1,9 @@
module Dodge.Payload where
import Geometry.Data
import Dodge.Data
import Dodge.WorldEvent.Explosion
usePayload :: Payload -> Point2 -> World -> World
usePayload payload = case payload of
ExplosionPayload -> makeExplosionAt
DudPayload -> const id
-8
View File
@@ -1,20 +1,13 @@
module Dodge.Placement.Instance.Turret where module Dodge.Placement.Instance.Turret where
import Color import Color
import Dodge.Data import Dodge.Data
import Dodge.Creature.State
import Dodge.Creature.Impulse
import Dodge.LevelGen.Data import Dodge.LevelGen.Data
import Dodge.Default import Dodge.Default
import Dodge.Movement.Turn import Dodge.Movement.Turn
--import Dodge.Creature.Impulse.UseItem
import Dodge.FloorItem import Dodge.FloorItem
import Dodge.Wall.Delete import Dodge.Wall.Delete
import Dodge.WorldEvent.Explosion import Dodge.WorldEvent.Explosion
import Dodge.Item.Weapon.BatteryGuns import Dodge.Item.Weapon.BatteryGuns
--import Dodge.Item.Weapon.BulletGun.Cane
--import Dodge.SoundLogic.LoadSound
--import Dodge.SoundLogic
--import Dodge.Item.Draw
import Geometry import Geometry
import ShapePicture import ShapePicture
import Shape import Shape
@@ -74,7 +67,6 @@ updateTurret rotSpeed mc w
& crOldPos .~ mcpos & crOldPos .~ mcpos
& crRad .~ 1 & crRad .~ 1
& crDir .~ mcdir & crDir .~ mcdir
& crUpdate .~ stateUpdate followThenClearImpulses
& crStance . posture .~ Aiming & crStance . posture .~ Aiming
& crMaterial .~ Crystal & crMaterial .~ Crystal
Just cid -> w' Just cid -> w'
+68
View File
@@ -0,0 +1,68 @@
module Dodge.Projectile where
--createProjectile :: ProjectileType -> Item -> Creature -> World -> World
--createProjectile pt = case pt of
-- ShellType -> fireShell
--
--fireShell :: Item -> Creature -> World -> World
--fireShell it cr = makeShell it cr $ \pj -> pjEffAtTime 35 (trySpinByCID (_crID cr) spinamount) pj
-- . pjThrust thrustdelay pj
-- . reduceSpinBy (1-fromIntegral spindrag*2 / 200) pj
-- . decTimMvVel pj
-- . moveShell pj
-- where
-- params = _itParams it
-- spindrag = _shellSpinDrag params
-- spinamount = _shellSpinAmount params
-- thrustdelay = _shellThrustDelay params
--
--makeShell :: Item -> Creature -> (Projectile -> World -> World) -> World -> World
--makeShell it cr theupdate w = w & props %~ IM.insert i Shell
-- { _prPos = pos
-- , _pjZ = 20
-- , _pjStartPos = pos
-- , _pjVel = rotateV dir (V2 1 0)
-- , _pjID = i
-- , _pjUpdate = theupdate
-- , _pjAcc = rotateV dir (V2 3 0)
-- , _pjDir = dir
-- , _pjSpin = 0
-- , _pjPayload = _amPayload $ _laAmmoType am
-- , _pjTimer = 50
-- }
-- where
-- i = IM.newKey $ _props w
-- dir = _crDir cr
-- pos = _crPos cr +.+ rotateV dir (V2 (_crRad cr + 1) 0)
-- am = _itConsumption it
--
--moveShell :: Prop -- ^ Projectile id
-- -> World
-- -> World
--moveShell pj w
-- | time > 40 = if circOnSomeWall oldPos 4 w
-- then doExplode
-- else w
-- | anythingHitCirc 2 oldPos newPos w = doExplode
-- | time > -300 = w
-- | otherwise = doExplode
-- where
-- time = _pjTimer pj
-- doExplode = w
-- & usePayload (_pjPayload pj) oldPos
-- & stopSoundFrom (ShellSound i)
-- & props %~ IM.delete i
-- i = _pjID pj
-- oldPos = _prPos pj
-- vel = _pjVel pj
-- newPos = oldPos +.+ vel
--
--usePjCreation :: Item -> Creature -> World -> World
--usePjCreation it = createProjectile (_amPjCreation (_laAmmoType (_itConsumption it))) it
--
--usePjCreationX :: Int -> Item -> Creature -> World -> World
--usePjCreationX i it cr = foldr f
-- (_amPjCreation (_laAmmoType (_itConsumption it)) it cr)
-- [1..i-1]
-- where
-- f n = (. _amPjCreation (_laAmmoType (_itConsumption it)) it (cr & crDir +~ (2*pi*fromIntegral n / fromIntegral i)))
+2 -1
View File
@@ -80,7 +80,8 @@ drawCreature cr = case _crType cr of
, setDepth 0.049 . color (greyN 0.5) $ circleSolid 8 , setDepth 0.049 . color (greyN 0.5) $ circleSolid 8
, color (greyN 0.5) $ circleSolid 8 , color (greyN 0.5) $ circleSolid 8
]) cr ]) cr
Lampoid h -> picAtCrPosNoRot1 (lampCrPic h) cr Lampoid{_lampHeight=h} -> picAtCrPosNoRot1 (lampCrPic h) cr
Turretoid -> mempty
NonDrawnCreature -> mempty NonDrawnCreature -> mempty
lampCrPic :: Float -> Picture lampCrPic :: Float -> Picture
+12
View File
@@ -0,0 +1,12 @@
module Dodge.Tesla.Arc.Draw where
import Dodge.Data.TeslaArc
import Geometry
import Picture
drawTeslaArc :: TeslaArc -> Picture
drawTeslaArc pt = setLayer BloomNoZWrite $ pictures
[ setDepth 20.5 $ color (brightX 2 1 $ _taColor pt) $ thickLine 3 ps
, setDepth 20 $ color (V4 0 0 0 0.5) $ thickLine 10 ps
]
where
ps = _taPoints pt
+7
View File
@@ -0,0 +1,7 @@
module Dodge.Turretoid where
import Dodge.Data
import Dodge.Creature.State
import Dodge.Creature.Impulse
updateTurretoid :: Creature -> World -> World
updateTurretoid = stateUpdate followThenClearImpulses
+2 -1
View File
@@ -5,6 +5,7 @@ Description : Simulation update
-} -}
module Dodge.Update ( updateUniverse ) where module Dodge.Update ( updateUniverse ) where
import Dodge.Data import Dodge.Data
import Dodge.Creature.Update
import Dodge.RadarSweep import Dodge.RadarSweep
import Dodge.PosEvent import Dodge.PosEvent
import Dodge.Spark import Dodge.Spark
@@ -94,7 +95,7 @@ functionalUpdate cfig w = checkEndGame
. updateIMl' _terminals tmUpdate . updateIMl' _terminals tmUpdate
-- . updateIMl _machines mcChooseUpdate -- . updateIMl _machines mcChooseUpdate
. updateIMl' _machines updateMachine . updateIMl' _machines updateMachine
. updateIMl _creatures _crUpdate . updateIMl' _creatures updateCreature
-- creatures should be updated early so that crOldPos is set before any position change -- creatures should be updated early so that crOldPos is set before any position change
. over creatures (fmap setOldPos) . over creatures (fmap setOldPos)
. updateCreatureGroups . updateCreatureGroups