Compare commits
118
Commits
ed28af8d11
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b979d92db6 | ||
|
|
03f83fc924 | ||
|
|
eb817d34ef | ||
|
|
3119f10c2c | ||
|
|
9fb5a4e0be | ||
|
|
d29c2dbd0c | ||
|
|
e8738715e5 | ||
|
|
6251e43db8 | ||
|
|
b353263b0e | ||
|
|
e8d09f773c | ||
|
|
42fd6f783f | ||
|
|
3ee29f30f3 | ||
|
|
794d733c83 | ||
|
|
75734d06af | ||
|
|
8010335ffe | ||
|
|
70479b6e79 | ||
|
|
580619280a | ||
|
|
0386683670 | ||
|
|
16def12959 | ||
|
|
ec969c924a | ||
|
|
ef70c85b79 | ||
|
|
e521a1572a | ||
|
|
4bcea5e772 | ||
|
|
db2ce72076 | ||
|
|
569ea1e1ab | ||
|
|
d5ed27f57c | ||
|
|
3a2e92169b | ||
|
|
e56a953c9b | ||
|
|
17f8707f62 | ||
|
|
c70097f1e1 | ||
|
|
06b984c2e5 | ||
|
|
59d128f87a | ||
|
|
ab393febcb | ||
|
|
44ecaf409e | ||
|
|
2d731ae1ba | ||
|
|
9df23c27c2 | ||
|
|
91480c957d | ||
|
|
e4bd971017 | ||
|
|
b213525c21 | ||
|
|
dfb451c450 | ||
|
|
72056e5e3e | ||
|
|
437ca007ef | ||
|
|
fada3c73bc | ||
|
|
12e4a278d0 | ||
|
|
34d8425520 | ||
|
|
ad998fb622 | ||
|
|
84e95da2b5 | ||
|
|
7c1ada4546 | ||
|
|
b76148ae2a | ||
|
|
e927de6508 | ||
|
|
62a9f34a26 | ||
|
|
1ec855c2fc | ||
|
|
5d5d0a539b | ||
|
|
6b3d75cbb2 | ||
|
|
aef3671063 | ||
|
|
b827827951 | ||
|
|
b7aea0eb1f | ||
|
|
31f24283d7 | ||
|
|
199f1b11b5 | ||
|
|
cfe34555b3 | ||
|
|
39bc480c03 | ||
|
|
284ea32333 | ||
|
|
259325f81f | ||
|
|
f4c59612ea | ||
|
|
264651d34a | ||
|
|
e0e346aade | ||
|
|
011286ccb5 | ||
|
|
d06660fd06 | ||
|
|
f6e257464d | ||
|
|
b5bfd365b9 | ||
|
|
73798ba07c | ||
|
|
adae6b84f4 | ||
|
|
722a25240e | ||
|
|
033991ad3f | ||
|
|
5745541e13 | ||
|
|
1f855e1321 | ||
|
|
9d1ab2cf14 | ||
|
|
9e215b474f | ||
|
|
a0ff15fe61 | ||
|
|
a060ed817c | ||
|
|
7fee343d00 | ||
|
|
a8b79a59c7 | ||
|
|
9710bb5c83 | ||
|
|
c3d9a24735 | ||
|
|
02e26c368c | ||
|
|
ce8ddc6414 | ||
|
|
431e64fbfb | ||
|
|
b8bec2c830 | ||
|
|
8a57aa2f2c | ||
|
|
f0da9b5f8c | ||
|
|
d075880248 | ||
|
|
6f2e862c65 | ||
|
|
5052ee7a9e | ||
|
|
95a6c90d01 | ||
|
|
f19e165571 | ||
|
|
b197e22de7 | ||
|
|
c861de8981 | ||
|
|
a29cb8565a | ||
|
|
8faaf54f2c | ||
|
|
ea6f4b2054 | ||
|
|
c8a06bc084 | ||
|
|
0a8a2210c0 | ||
|
|
52d389f342 | ||
|
|
77c0680bd5 | ||
|
|
34192777a6 | ||
|
|
68eaf84ec2 | ||
|
|
707ccae971 | ||
|
|
333f2875cb | ||
|
|
f0e568e694 | ||
|
|
35d169b585 | ||
|
|
608de9f2ed | ||
|
|
9d7c9f1db2 | ||
|
|
262463c52d | ||
|
|
21573d0b05 | ||
|
|
9e29550a20 | ||
|
|
4723b45ef6 | ||
|
|
c041a4d174 | ||
|
|
1f52c4b588 |
@@ -110,6 +110,7 @@ updateRenderSplit win u = do
|
|||||||
playSoundUnlessRewinding :: Universe -> IO (M.Map SoundOrigin Sound)
|
playSoundUnlessRewinding :: Universe -> IO (M.Map SoundOrigin Sound)
|
||||||
playSoundUnlessRewinding u = case w ^. timeFlow of
|
playSoundUnlessRewinding u = case w ^. timeFlow of
|
||||||
NormalTimeFlow -> playSoundAndUpdate (_soundData $ _preloadData u) (_playingSounds w) (newSoundsToPlay u)
|
NormalTimeFlow -> playSoundAndUpdate (_soundData $ _preloadData u) (_playingSounds w) (newSoundsToPlay u)
|
||||||
|
RespawnDelay{} -> playSoundAndUpdate (_soundData $ _preloadData u) (_playingSounds w) (newSoundsToPlay u)
|
||||||
_ -> stopAllSounds >> return M.empty
|
_ -> stopAllSounds >> return M.empty
|
||||||
where
|
where
|
||||||
w = _uvWorld u
|
w = _uvWorld u
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2
-1
@@ -6,7 +6,8 @@ import Data.ByteString.Lazy.Char8 (unpack)
|
|||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
|
|
||||||
getPretty :: ToJSON a => a -> [String]
|
getPretty :: ToJSON a => a -> [String]
|
||||||
getPretty = lines . unpack . AEP.encodePretty' (AEP.Config (AEP.Spaces 2) compare AEP.Generic False)
|
--getPretty = lines . unpack . AEP.encodePretty' (AEP.Config (AEP.Spaces 2) compare AEP.Generic False)
|
||||||
|
getPretty = lines . unpack . AEP.encodePretty' (AEP.Config (AEP.Spaces 2) mempty AEP.Generic False)
|
||||||
|
|
||||||
prettyShort :: ToJSON a => a -> [String]
|
prettyShort :: ToJSON a => a -> [String]
|
||||||
prettyShort = mapMaybe cullPretty . getPretty
|
prettyShort = mapMaybe cullPretty . getPretty
|
||||||
|
|||||||
@@ -26,12 +26,11 @@ updateExpBarrel ps cr w = case cr ^. crHP of
|
|||||||
& cWorld . lWorld . creatures . ix (_crID cr) %~ damsToExpBarrel damages
|
& cWorld . lWorld . creatures . ix (_crID cr) %~ damsToExpBarrel damages
|
||||||
& cWorld . lWorld . creatures . ix (_crID cr) . crHP . _HP
|
& cWorld . lWorld . creatures . ix (_crID cr) . crHP . _HP
|
||||||
-~ length (_piercedPoints . _barrelType $ _crType cr)
|
-~ length (_piercedPoints . _barrelType $ _crType cr)
|
||||||
& cWorld . lWorld . creatures . ix (_crID cr) . crDamage .~ mempty
|
|
||||||
& flip (foldl' f) ps
|
& flip (foldl' f) ps
|
||||||
HP _ ->
|
HP _ ->
|
||||||
w
|
w
|
||||||
& makeExplosionAt ((cr ^. crPos) & _z +~ 20) 0
|
& makeExplosionAt (CrIndirectO (cr ^. crID)) ((cr ^. crPos) & _z +~ 20) 0
|
||||||
& cWorld . lWorld . creatures . ix (_crID cr) . crHP .~ CrDestroyed Gibbed
|
& cWorld . lWorld . creatures . at (_crID cr) .~ Nothing
|
||||||
_ -> w
|
_ -> w
|
||||||
where
|
where
|
||||||
f w' p = makeSpark NormalSpark (p + normalizeV p + cr ^. crPos . _xy) (argV p) w'
|
f w' p = makeSpark NormalSpark (p + normalizeV p + cr ^. crPos . _xy) (argV p) w'
|
||||||
@@ -44,7 +43,7 @@ updateExpBarrel ps cr w = case cr ^. crHP of
|
|||||||
updateBarrel :: Creature -> World -> World
|
updateBarrel :: Creature -> World -> World
|
||||||
updateBarrel cr = case cr ^. crHP of
|
updateBarrel cr = case cr ^. crHP of
|
||||||
HP x | x > 0 -> doDamage (cr ^. crID)
|
HP x | x > 0 -> doDamage (cr ^. crID)
|
||||||
HP _ -> cWorld . lWorld . creatures . ix (_crID cr) . crHP .~ CrDestroyed Gibbed
|
HP _ -> cWorld . lWorld . creatures . at (_crID cr) .~ Nothing
|
||||||
_ -> id
|
_ -> id
|
||||||
|
|
||||||
damsToExpBarrel :: [Damage] -> Creature -> Creature
|
damsToExpBarrel :: [Damage] -> Creature -> Creature
|
||||||
@@ -52,7 +51,7 @@ damsToExpBarrel = flip $ foldl' damToExpBarrel
|
|||||||
|
|
||||||
damToExpBarrel :: Creature -> Damage -> Creature
|
damToExpBarrel :: Creature -> Damage -> Creature
|
||||||
damToExpBarrel cr dm = case dm of
|
damToExpBarrel cr dm = case dm of
|
||||||
Piercing x p _ ->
|
Piercing x p _ _ ->
|
||||||
cr & crHP . _HP -~ div x 200
|
cr & crHP . _HP -~ div x 200
|
||||||
& crType . barrelType . piercedPoints .:~ (p - cr ^. crPos . _xy)
|
& crType . barrelType . piercedPoints .:~ (p - cr ^. crPos . _xy)
|
||||||
Poison{} -> cr
|
Poison{} -> cr
|
||||||
|
|||||||
@@ -21,6 +21,14 @@ cardVec = \case
|
|||||||
East -> V2 1 0
|
East -> V2 1 0
|
||||||
West -> V2 (-1) 0
|
West -> V2 (-1) 0
|
||||||
|
|
||||||
|
vecCard :: Point2 -> CardinalPoint
|
||||||
|
vecCard 0 = error "vecCard null"
|
||||||
|
vecCard (V2 x y)
|
||||||
|
| x > abs y = East
|
||||||
|
| -x > abs y = West
|
||||||
|
| y > 0 = North
|
||||||
|
| otherwise = South
|
||||||
|
|
||||||
card8Vec :: Cardinal8 -> Point2
|
card8Vec :: Cardinal8 -> Point2
|
||||||
card8Vec cp = case cp of
|
card8Vec cp = case cp of
|
||||||
North8 -> V2 0 1
|
North8 -> V2 0 1
|
||||||
|
|||||||
+46
-21
@@ -18,6 +18,7 @@ module Dodge.Base.Collide (
|
|||||||
collideCircWalls,
|
collideCircWalls,
|
||||||
overlapSegWalls,
|
overlapSegWalls,
|
||||||
overlapSegCrs,
|
overlapSegCrs,
|
||||||
|
overlapSegCrs',
|
||||||
bouncePoint,
|
bouncePoint,
|
||||||
circOnSomeWall,
|
circOnSomeWall,
|
||||||
circOnAnyCr,
|
circOnAnyCr,
|
||||||
@@ -33,8 +34,11 @@ module Dodge.Base.Collide (
|
|||||||
collide3WallsFloor,
|
collide3WallsFloor,
|
||||||
collide3,
|
collide3,
|
||||||
crHeight,
|
crHeight,
|
||||||
|
crMid,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import AesonHelp
|
||||||
|
import Control.Applicative
|
||||||
import Data.Foldable
|
import Data.Foldable
|
||||||
import qualified Data.IntMap.Strict as IM
|
import qualified Data.IntMap.Strict as IM
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
@@ -66,6 +70,15 @@ overlapSegCrs sp ep = mapMaybe f
|
|||||||
(,cr)
|
(,cr)
|
||||||
<$> fst (intersectCircSeg (cr ^. crPos . _xy) (crRad $ cr ^. crType) sp ep)
|
<$> fst (intersectCircSeg (cr ^. crPos . _xy) (crRad $ cr ^. crType) sp ep)
|
||||||
|
|
||||||
|
overlapSegCrs' :: Point2 -> Point2 -> [Creature] -> [(Point2, Creature)]
|
||||||
|
{-# INLINE overlapSegCrs' #-}
|
||||||
|
overlapSegCrs' sp ep = mapMaybe f
|
||||||
|
where
|
||||||
|
f cr =
|
||||||
|
(,cr)
|
||||||
|
<$> g (intersectCircSeg (cr ^. crPos . _xy) (crRad $ cr ^. crType) sp ep)
|
||||||
|
g (a,b) = a <|> b
|
||||||
|
|
||||||
doBounce :: Float -> Point2 -> Point2 -> (Point2, Maybe Wall) -> Maybe (Point2, Point2)
|
doBounce :: Float -> Point2 -> Point2 -> (Point2, Maybe Wall) -> Maybe (Point2, Point2)
|
||||||
{-# INLINE doBounce #-}
|
{-# INLINE doBounce #-}
|
||||||
doBounce x sp ep (p, mwl) = fmap f mwl
|
doBounce x sp ep (p, mwl) = fmap f mwl
|
||||||
@@ -162,26 +175,41 @@ collide3Wall sp wl (ep, mo) = maybe (ep, mo) (,Just (n, OWall wl)) $ intersectSe
|
|||||||
|
|
||||||
collide3Creature :: Point3 -> Creature -> (Point3, MPO) -> (Point3, MPO)
|
collide3Creature :: Point3 -> Creature -> (Point3, MPO) -> (Point3, MPO)
|
||||||
collide3Creature sp cr (ep, m) = fromMaybe (ep, m) $ do
|
collide3Creature sp cr (ep, m) = fromMaybe (ep, m) $ do
|
||||||
h <- crHeight cr
|
let h = crHeight cr
|
||||||
(p, n) <-
|
(p, n) <- fst $ intersectCylSeg (cr ^. crPos) (crRad $ cr ^. crType) h sp ep
|
||||||
fst $
|
|
||||||
intersectCylSeg
|
|
||||||
(cr ^. crPos)
|
|
||||||
(crRad $ cr ^. crType)
|
|
||||||
h
|
|
||||||
sp
|
|
||||||
ep
|
|
||||||
return (p, Just (n, OCreature cr))
|
return (p, Just (n, OCreature cr))
|
||||||
|
|
||||||
crHeight :: Creature -> Maybe Float
|
crHeight :: Creature -> Float
|
||||||
crHeight cr = case cr ^. crHP of
|
crHeight cr = case cr ^. crHP of
|
||||||
HP{} -> Just $ case cr ^. crType of
|
HP{} -> case cr ^. crType of
|
||||||
HoverCrit {} -> 10
|
HoverCrit {} -> 10
|
||||||
ChaseCrit {} -> 25
|
ChaseCrit {} -> 25
|
||||||
Avatar {} -> 25
|
Avatar {} -> 25
|
||||||
_ -> error "Need to define crHeight for this crType"
|
CrabCrit {} -> 25
|
||||||
CrIsCorpse{} -> Just 5
|
SlinkCrit {} -> 25
|
||||||
CrDestroyed{} -> Nothing
|
SlimeCrit {_slimeSlime = r} -> min 25 $ 2 * slimeToRad r
|
||||||
|
BeeCrit {} -> 10
|
||||||
|
HiveCrit {} -> 25
|
||||||
|
BarrelCrit{} -> 20
|
||||||
|
_ -> error $ "Need to define crHeight for this crType:\n" <> unlines (prettyShort (cr ^. crType))
|
||||||
|
CrIsCorpse{} -> 5
|
||||||
|
AvatarDestroyed{} -> 0
|
||||||
|
|
||||||
|
crMid :: Creature -> Float
|
||||||
|
crMid cr = case cr ^. crHP of
|
||||||
|
HP{} -> case cr ^. crType of
|
||||||
|
HoverCrit {} -> 2
|
||||||
|
ChaseCrit {} -> 20
|
||||||
|
Avatar {} -> 20
|
||||||
|
CrabCrit {} -> 20
|
||||||
|
SlinkCrit {} -> 20
|
||||||
|
SlimeCrit {_slimeSlime = r} -> max 3 . min 20 $ 2 * slimeToRad r - 5
|
||||||
|
BeeCrit {} -> 2
|
||||||
|
HiveCrit {} -> 20
|
||||||
|
BarrelCrit{} -> 20
|
||||||
|
_ -> error $ "Need to define crHeight for this crType:\n" <> unlines (prettyShort (cr ^. crType))
|
||||||
|
CrIsCorpse{} -> 2
|
||||||
|
AvatarDestroyed{} -> 0
|
||||||
|
|
||||||
wallToSurface :: Wall -> (Point3, Point3, [(Point3, Point3)])
|
wallToSurface :: Wall -> (Point3, Point3, [(Point3, Point3)])
|
||||||
wallToSurface wl = (g x, g $ vNormal (x - y), [(g x, g (y - x)), (g y, g (x - y))])
|
wallToSurface wl = (g x, g $ vNormal (x - y), [(g x, g (y - x)), (g y, g (x - y))])
|
||||||
@@ -253,7 +281,7 @@ circHitWall sp ep r w =
|
|||||||
xep = ep + x
|
xep = ep + x
|
||||||
|
|
||||||
-- | note that this does not push the circle away from the wall at all
|
-- | note that this does not push the circle away from the wall at all
|
||||||
collideCircWalls :: Point2 -> Point2 -> Float -> [Wall] -> (Point2, Maybe Wall)
|
collideCircWalls :: Foldable t => Point2 -> Point2 -> Float -> t Wall -> (Point2, Maybe Wall)
|
||||||
{-# INLINE collideCircWalls #-}
|
{-# INLINE collideCircWalls #-}
|
||||||
collideCircWalls sp ep rad = foldl' findPoint (ep, Nothing)
|
collideCircWalls sp ep rad = foldl' findPoint (ep, Nothing)
|
||||||
where
|
where
|
||||||
@@ -264,14 +292,11 @@ collideCircWalls sp ep rad = foldl' findPoint (ep, Nothing)
|
|||||||
. _wlLine
|
. _wlLine
|
||||||
$ wl
|
$ wl
|
||||||
shiftbyrad (a, b) =
|
shiftbyrad (a, b) =
|
||||||
bimap
|
( f $ a + rad *^ normalizeV (a - b)
|
||||||
f
|
, f $ b + rad *^ normalizeV (b - a)
|
||||||
f
|
|
||||||
( a +.+ rad *.* normalizeV (a -.- b)
|
|
||||||
, b +.+ rad *.* normalizeV (b -.- a)
|
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
f = (+.+) (rad *.* normalizeV (vNormal $ a -.- b))
|
f = (+ rad *^ normalizeV (vNormal $ a - b))
|
||||||
|
|
||||||
overlapCircWallsClosest :: Point2 -> Float -> [Wall] -> Maybe (Point2, Wall)
|
overlapCircWallsClosest :: Point2 -> Float -> [Wall] -> Maybe (Point2, Wall)
|
||||||
{-# INLINE overlapCircWallsClosest #-}
|
{-# INLINE overlapCircWallsClosest #-}
|
||||||
|
|||||||
@@ -19,19 +19,19 @@ you w = w ^?! cWorld . lWorld . creatures . ix 0
|
|||||||
|
|
||||||
yourSelectedItem :: World -> Maybe Item
|
yourSelectedItem :: World -> Maybe Item
|
||||||
yourSelectedItem w = do
|
yourSelectedItem w = do
|
||||||
i <- you w ^? crManipulation . manObject . imSelectedItem
|
Sel 0 i <- w ^? hud . diSelection . _Just
|
||||||
j <- _crInv (you w) ^? ix i
|
j <- w ^? cWorld . lWorld . creatures . ix 0 . crInv . ix (NInt i)
|
||||||
w ^? cWorld . lWorld . items . ix j
|
w ^? cWorld . lWorld . items . ix j
|
||||||
|
|
||||||
yourRootItem :: World -> Maybe Item
|
yourRootItem :: World -> Maybe Item
|
||||||
yourRootItem w = do
|
yourRootItem w = do
|
||||||
i <- you w ^? crManipulation . manObject . imRootSelectedItem
|
i <- w ^? hud . manObject . hiRootSelectedItem
|
||||||
j <- _crInv (you w) ^? ix i
|
j <- w ^? cWorld . lWorld . creatures . ix 0 . crInv . ix i
|
||||||
w ^? cWorld . lWorld . items . ix j
|
w ^? cWorld . lWorld . items . ix j
|
||||||
|
|
||||||
yourRootItemDT :: World -> Maybe (DTree OItem)
|
yourRootItemDT :: World -> Maybe (DTree OItem)
|
||||||
yourRootItemDT w = do
|
yourRootItemDT w = do
|
||||||
i <- you w ^? crManipulation . manObject . imRootSelectedItem . unNInt
|
i <- w^?hud. manObject . hiRootSelectedItem . unNInt
|
||||||
invIMDT ((\k -> w ^?! cWorld . lWorld . items . ix k) <$> you w ^. crInv) ^? ix i
|
invIMDT ((\k -> w ^?! cWorld . lWorld . items . ix k) <$> you w ^. crInv) ^? ix i
|
||||||
|
|
||||||
yourInv :: World -> NewIntMap InvInt Item
|
yourInv :: World -> NewIntMap InvInt Item
|
||||||
|
|||||||
+16
-14
@@ -108,26 +108,28 @@ updateBulVel bt = bt & buVel .*.*~ _buDrag bt
|
|||||||
-- return $ BezierTrajectory sp tpos (mouseWorldPos (w ^. input) (w ^. wCam))
|
-- return $ BezierTrajectory sp tpos (mouseWorldPos (w ^. input) (w ^. wCam))
|
||||||
|
|
||||||
-- might want to restrict what/how bounces by material type
|
-- might want to restrict what/how bounces by material type
|
||||||
bounceDir :: IM.IntMap Item -> (Point2, Either Creature Wall) -> Maybe Point2
|
bounceDir :: World -> IM.IntMap Item -> (Point2, Either Creature Wall) -> Maybe Point2
|
||||||
bounceDir _ (_, Right wl) = Just $ uncurry (-) (_wlLine wl)
|
bounceDir _ _ (_, Right wl) = Just $ uncurry (-) (_wlLine wl)
|
||||||
bounceDir m (p, Left cr) | crIsArmouredFrom m p cr
|
bounceDir w m (p, Left cr) | crIsArmouredFrom m p w cr
|
||||||
= Just $ vNormal $ p - (cr ^. crPos . _xy)
|
= Just $ vNormal $ p - (cr ^. crPos . _xy)
|
||||||
bounceDir _ _ = Nothing
|
bounceDir _ _ _ = Nothing
|
||||||
|
|
||||||
useBulletPayload :: Bullet -> Point2 -> World -> World
|
useBulletPayload :: Bullet -> Point2 -> World -> World
|
||||||
useBulletPayload bu = case _buPayload bu of
|
useBulletPayload bu = case _buPayload bu of
|
||||||
BulPlain _ -> const id
|
BulPlain _ -> const id
|
||||||
BulFlak -> makeFlak bu
|
BulFlak -> makeFlak bu
|
||||||
BulFrag -> makeFragBullets
|
BulFrag -> makeFragBullets
|
||||||
BulGas -> (`makeGasCloud` V2 0 0)
|
BulGas -> (\p -> makeGasCloud o p (V2 0 0))
|
||||||
BulBall ExplosiveBall -> makeMovingEB (_buVel bu) ExplosiveBall
|
BulBall eb@ExplosiveBall{} -> makeMovingEB (_buVel bu) eb o
|
||||||
BulBall ElectricalBall{} ->
|
BulBall ElectricalBall{} ->
|
||||||
makeMovingEB
|
makeMovingEB
|
||||||
(_buVel bu)
|
(_buVel bu)
|
||||||
(ElectricalBall (round $ bu ^. buPos . _1))
|
(ElectricalBall (round $ bu ^. buPos . _1)) o
|
||||||
BulBall FlashBall -> makeMovingEB (_buVel bu) FlashBall
|
BulBall eb@FlashBall{} -> makeMovingEB (_buVel bu) eb o
|
||||||
BulBall (FlameletBall x) -> makeMovingEB (_buVel bu) (FlameletBall x)
|
BulBall eb@FlameletBall{} -> makeMovingEB (_buVel bu) eb o
|
||||||
BulBall IncendiaryBall -> makeMovingEB (_buVel bu) IncendiaryBall
|
BulBall eb@IncendiaryBall{} -> makeMovingEB (_buVel bu) eb o
|
||||||
|
where
|
||||||
|
o = bu ^. buOrigin
|
||||||
|
|
||||||
makeFragBullets :: Point2 -> World -> World
|
makeFragBullets :: Point2 -> World -> World
|
||||||
makeFragBullets p w = w & cWorld . lWorld . bullets .++~ bus
|
makeFragBullets p w = w & cWorld . lWorld . bullets .++~ bus
|
||||||
@@ -158,7 +160,7 @@ hitEffFromBul w bu = case _buEffect bu of
|
|||||||
PenetrateBullet -> movePenBullet bu hitstream w
|
PenetrateBullet -> movePenBullet bu hitstream w
|
||||||
BounceBullet -> fromMaybe (expireAndDamage bu hitstream w) $ do
|
BounceBullet -> fromMaybe (expireAndDamage bu hitstream w) $ do
|
||||||
(hp, crwl) <- hitstream ^? _head
|
(hp, crwl) <- hitstream ^? _head
|
||||||
dir <- bounceDir (w ^. cWorld . lWorld . items) (hp, crwl)
|
dir <- bounceDir w (w ^. cWorld . lWorld . items) (hp, crwl)
|
||||||
return
|
return
|
||||||
( w
|
( w
|
||||||
, bu
|
, bu
|
||||||
@@ -168,12 +170,12 @@ hitEffFromBul w bu = case _buEffect bu of
|
|||||||
DestroyBullet -> expireAndDamage bu hitstream w
|
DestroyBullet -> expireAndDamage bu hitstream w
|
||||||
where
|
where
|
||||||
sp = _buPos bu
|
sp = _buPos bu
|
||||||
hitstream = thingsHitZ 20 sp (sp + _buVel bu) w
|
hitstream = thingsHitZ' 20 sp (sp + _buVel bu) w
|
||||||
|
|
||||||
getBulHitDams :: Bullet -> Point2 -> [Damage]
|
getBulHitDams :: Bullet -> Point2 -> [Damage]
|
||||||
getBulHitDams bu p = case _buPayload bu of
|
getBulHitDams bu p = case _buPayload bu of
|
||||||
BulPlain x -> [Piercing x p v
|
BulPlain x -> [Piercing x p v (bu ^. buOrigin)
|
||||||
,Inertial 0 p v]
|
,Inertial 0 p v (bu ^. buOrigin)]
|
||||||
_ -> []
|
_ -> []
|
||||||
where
|
where
|
||||||
v = _buVel bu
|
v = _buVel bu
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
module Dodge.Corpse.Make (makeCorpse) where
|
|
||||||
|
|
||||||
import qualified Quaternion as Q
|
|
||||||
import Linear
|
|
||||||
import Control.Lens
|
|
||||||
import Dodge.Creature.Picture
|
|
||||||
import Dodge.Creature.Radius
|
|
||||||
import Dodge.Creature.Shape
|
|
||||||
--import Dodge.Data.Corpse
|
|
||||||
import Dodge.Data.Creature
|
|
||||||
import Geometry
|
|
||||||
import Shape
|
|
||||||
import ShapePicture
|
|
||||||
|
|
||||||
makeCorpse :: Creature -> SPic
|
|
||||||
makeCorpse cr = case cr ^. crType of
|
|
||||||
HoverCrit{} -> noPic $ drawHoverCrit cr
|
|
||||||
ChaseCrit{} -> noPic $ chaseCorpse cr
|
|
||||||
_ ->
|
|
||||||
noPic
|
|
||||||
. scaleSH (V3 crsize crsize crsize)
|
|
||||||
$ mconcat
|
|
||||||
[ colorSH (_skinHead cskin) $ deadScalp cr
|
|
||||||
, colorSH (_skinUpper cskin) $ deadUpperBody cr
|
|
||||||
, rotmdir $ colorSH (_skinLower cskin) $ deadFeet cr
|
|
||||||
]
|
|
||||||
where
|
|
||||||
cskin = crShape $ _crType cr -- this should be fixed
|
|
||||||
crsize = 0.1 * crRad (cr ^. crType)
|
|
||||||
rotmdir = rotateSH (_crMvDir cr - _crDir cr)
|
|
||||||
|
|
||||||
chaseCorpse :: Creature -> Shape
|
|
||||||
chaseCorpse cr = mconcat
|
|
||||||
[colorSH (_skinUpper cskin) . upperPrismPolyHalfMI 0 $ polyCirc 3 12
|
|
||||||
& each %~ vNormal
|
|
||||||
& each . _y *~ 0.6
|
|
||||||
, colorSH (_skinUpper cskin) . overPosSH (Q.apply neckq) $
|
|
||||||
upperPrismPolyHalfMI 3 ((+ V2 8 0) . vNormal <$> trapTBH 2 5 8)
|
|
||||||
, colorSH (_skinHead cskin)
|
|
||||||
(overPosSH (Q.apply headq) (upperBox Medium Important 2 [V2 0 (-4), V2 9 0, V2 0 4]))
|
|
||||||
, rotmdir $ colorSH (_skinLower cskin) $ deadFeet cr
|
|
||||||
]
|
|
||||||
where
|
|
||||||
neckq = (V3 6 0 0, Q.qid)
|
|
||||||
cskin = crShape $ _crType cr -- this should be fixed
|
|
||||||
rotmdir = rotateSH (_crMvDir cr - _crDir cr)
|
|
||||||
headq = neckq `Q.comp` (V3 16 0 0, Q.qid )
|
|
||||||
@@ -3,8 +3,6 @@ module Dodge.Creature (
|
|||||||
module Dodge.Creature.ChaseCrit,
|
module Dodge.Creature.ChaseCrit,
|
||||||
module Dodge.Creature.Inanimate,
|
module Dodge.Creature.Inanimate,
|
||||||
launcherCrit,
|
launcherCrit,
|
||||||
-- pistolCrit,
|
|
||||||
ltAutoCrit,
|
|
||||||
spreadGunCrit,
|
spreadGunCrit,
|
||||||
autoCrit,
|
autoCrit,
|
||||||
armourChaseCrit,
|
armourChaseCrit,
|
||||||
@@ -13,11 +11,8 @@ module Dodge.Creature (
|
|||||||
module Dodge.Creature.Impulse,
|
module Dodge.Creature.Impulse,
|
||||||
module Dodge.Creature.Perception,
|
module Dodge.Creature.Perception,
|
||||||
module Dodge.Creature.ReaderUpdate,
|
module Dodge.Creature.ReaderUpdate,
|
||||||
module Dodge.Creature.SentinelAI,
|
|
||||||
module Dodge.Creature.State,
|
module Dodge.Creature.State,
|
||||||
module Dodge.Creature.Strategy,
|
|
||||||
module Dodge.Creature.Test,
|
module Dodge.Creature.Test,
|
||||||
module Dodge.Creature.Volition,
|
|
||||||
module Dodge.Creature.YourControl,
|
module Dodge.Creature.YourControl,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
@@ -34,15 +29,11 @@ import Dodge.Creature.ChaseCrit
|
|||||||
import Dodge.Creature.Impulse
|
import Dodge.Creature.Impulse
|
||||||
import Dodge.Creature.Inanimate
|
import Dodge.Creature.Inanimate
|
||||||
import Dodge.Creature.LauncherCrit
|
import Dodge.Creature.LauncherCrit
|
||||||
import Dodge.Creature.LtAutoCrit
|
|
||||||
import Dodge.Creature.Perception
|
import Dodge.Creature.Perception
|
||||||
import Dodge.Creature.ReaderUpdate
|
import Dodge.Creature.ReaderUpdate
|
||||||
import Dodge.Creature.SentinelAI
|
|
||||||
import Dodge.Creature.SpreadGunCrit
|
import Dodge.Creature.SpreadGunCrit
|
||||||
import Dodge.Creature.State
|
import Dodge.Creature.State
|
||||||
import Dodge.Creature.Strategy
|
|
||||||
import Dodge.Creature.Test
|
import Dodge.Creature.Test
|
||||||
import Dodge.Creature.Volition
|
|
||||||
import Dodge.Creature.YourControl
|
import Dodge.Creature.YourControl
|
||||||
import Dodge.Data.Creature
|
import Dodge.Data.Creature
|
||||||
import Dodge.Default
|
import Dodge.Default
|
||||||
@@ -98,7 +89,6 @@ startCr =
|
|||||||
& crHP .~ HP 10000
|
& crHP .~ HP 10000
|
||||||
& crInv .~ mempty
|
& crInv .~ mempty
|
||||||
& crFaction .~ PlayerFaction
|
& crFaction .~ PlayerFaction
|
||||||
-- & crMvType .~ MvWalking yourDefaultSpeed
|
|
||||||
& crType .~ Avatar (PulseStatus 55 0) Flesh 50 50 50 AvPosture LeftForward 0
|
& crType .~ Avatar (PulseStatus 55 0) Flesh 50 50 50 AvPosture LeftForward 0
|
||||||
|
|
||||||
-- | Items you start with.
|
-- | Items you start with.
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ module Dodge.Creature.Action (
|
|||||||
youDropItem,
|
youDropItem,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import qualified IntSetHelp as IS
|
||||||
|
import Dodge.DisplayInventory
|
||||||
|
import Dodge.Data.SelectionList
|
||||||
|
import RandomHelp
|
||||||
import Dodge.WorldEvent.ThingsHit
|
import Dodge.WorldEvent.ThingsHit
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
@@ -38,78 +42,86 @@ import qualified Data.Set as S
|
|||||||
-- it is desirable to be able to determine when an action is finished,
|
-- it is desirable to be able to determine when an action is finished,
|
||||||
-- so that DoActionThen and the like are easy to define
|
-- so that DoActionThen and the like are easy to define
|
||||||
performActions :: Int -> World -> World
|
performActions :: Int -> World -> World
|
||||||
performActions cid w =
|
performActions cid w = fromMaybe w $ do
|
||||||
foldl'
|
a <- cr ^?crActionPlan.apAction
|
||||||
|
let (iss, mayas) = performAction cr w a
|
||||||
|
return $ foldl'
|
||||||
(followImpulse cid)
|
(followImpulse cid)
|
||||||
(w & cWorld . lWorld . creatures . ix cid . crActionPlan . apAction .~ mayas)
|
(w & cWorld . lWorld . creatures . ix cid . crActionPlan . apAction .~ mayas)
|
||||||
iss
|
iss
|
||||||
where
|
where
|
||||||
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
||||||
(iss, mayas) = foldMap (performAction cr w) $ cr ^. crActionPlan . apAction
|
-- (iss, mayas) = maybe ([],NoAction) (performAction cr w) (cr ^? crActionPlan . apAction)
|
||||||
|
|
||||||
type ActionUpdate = ([Impulse], [Action])
|
type ActionUpdate = ([Impulse], Action)
|
||||||
|
|
||||||
{- | Performing an action on a frame creates an ActionUpdate:
|
{- | Performing an action on a frame creates an ActionUpdate:
|
||||||
gives impulses and updates/deletes the action itself.
|
gives impulses and updates/deletes the action itself.
|
||||||
-}
|
-}
|
||||||
performAction :: Creature -> World -> Action -> ActionUpdate
|
performAction :: Creature -> World -> Action -> ActionUpdate
|
||||||
performAction cr w ac = case ac of
|
performAction cr w ac = case ac of
|
||||||
|
Eat i x -> ([],Eat i x)
|
||||||
|
-- Eat i x | x <= 0 -> ([],NoAction)
|
||||||
|
-- Eat i x -> ([],Eat i (x-1))
|
||||||
AimAt tcid p -> performAimAt cr w tcid p
|
AimAt tcid p -> performAimAt cr w tcid p
|
||||||
WaitThen 0 newAc -> ([], [newAc])
|
WaitThen 0 newAc -> ([], newAc)
|
||||||
WaitThen t newAc -> ([], [WaitThen (t -1) newAc])
|
WaitThen t newAc -> ([], WaitThen (t -1) newAc)
|
||||||
ImpulsesList (xs : xss) -> (xs, [ImpulsesList xss])
|
ImpulsesList (xs : xss) a -> performAction cr w a & _1 <>~ xs
|
||||||
ImpulsesList _ -> ([], mempty)
|
& _2 %~ ImpulsesList xss
|
||||||
DoImpulses imps -> (imps, mempty)
|
ImpulsesList _ a -> performAction cr w a
|
||||||
DoActionThen fsta afta -> case performAction cr w fsta of -- NOTE this only does ONE continuation action
|
DoImpulses imps -> (imps, NoAction)
|
||||||
(imps, nxta : _) -> (imps, [DoActionThen nxta afta])
|
DoActionThen fsta afta -> case performAction cr w fsta of
|
||||||
(imps, []) -> (imps, [afta])
|
(imps, NoAction) -> (imps, afta)
|
||||||
DoActionWhile f act -> performAction cr w $ DoActionWhilePartial act f act
|
(imps, nxta) -> (imps, DoActionThen nxta afta)
|
||||||
|
-- DoActionWhile f act -> performAction cr w $ DoActionWhilePartial act f act
|
||||||
DoActionWhilePartial partAc f resetAc
|
DoActionWhilePartial partAc f resetAc
|
||||||
| doWdCrBl f w cr -> case performAction cr w partAc of
|
| doWdCrBl f w cr -> case performAction cr w partAc of
|
||||||
(imps, nxta : _) -> (imps, [DoActionWhilePartial nxta f resetAc])
|
(imps, NoAction) -> (imps, DoActionWhilePartial resetAc f resetAc)
|
||||||
(imps, []) -> (imps, [DoActionWhilePartial resetAc f resetAc])
|
(imps, nxta ) -> (imps, DoActionWhilePartial nxta f resetAc)
|
||||||
| otherwise -> performAction cr w partAc
|
| otherwise -> performAction cr w partAc
|
||||||
DoActionIf f ifa
|
DoActionIf f ifa
|
||||||
| doWdCrBl f w cr -> performAction cr w ifa
|
| doWdCrBl f w cr -> performAction cr w ifa
|
||||||
| otherwise -> ([], mempty)
|
| otherwise -> ([], NoAction)
|
||||||
DoActionIfElse ifa f elsea
|
DoActionIfElse ifa f elsea
|
||||||
| doWdCrBl f w cr -> performAction cr w ifa
|
| doWdCrBl f w cr -> performAction cr w ifa
|
||||||
| otherwise -> performAction cr w elsea
|
| otherwise -> performAction cr w elsea
|
||||||
DoActionWhileInterrupt repa f afta
|
DoActionWhileInterrupt repa f afta
|
||||||
| doWdCrBl f w cr -> (fst $ performAction cr w repa, [DoActionWhileInterrupt repa f afta])
|
| doWdCrBl f w cr -> (fst $ performAction cr w repa, DoActionWhileInterrupt repa f afta)
|
||||||
| otherwise -> performAction cr w afta
|
| otherwise -> performAction cr w afta
|
||||||
DoActions [] -> ([], mempty)
|
|
||||||
DoActions acs ->
|
|
||||||
let (imps, newAcs) = foldMap (performAction cr w) acs
|
|
||||||
in (imps, newAcs)
|
|
||||||
StartSentinelPost -> ([AddGoal $ SentinelAt (cr ^. crPos . _xy) (_crDir cr)], mempty)
|
|
||||||
PathTo p a -> performPathTo a cr w p
|
PathTo p a -> performPathTo a cr w p
|
||||||
|
EvadeAim -> tryEvadeSideways cr w
|
||||||
TurnToPoint p -> performTurnToA cr p
|
TurnToPoint p -> performTurnToA cr p
|
||||||
LeadTarget p -> fromMaybe ([], mempty) $ do
|
LeadTarget p -> fromMaybe ([], NoAction) $ do
|
||||||
i <- cr ^? crIntention . targetCr . _Just
|
i <- cr ^? crIntention . targetCr . _Just
|
||||||
tcr <- w ^? cWorld . lWorld . creatures . ix i
|
tcr <- w ^? cWorld . lWorld . creatures . ix i
|
||||||
return ([TurnTo (tcr ^. crPos . _xy +.+ rotateV (_crDir tcr) p)], mempty)
|
return ([TurnTo (tcr ^. crPos . _xy +.+ rotateV (_crDir tcr) p)], NoAction)
|
||||||
UseSelf f -> performAction cr w $ doCrAc f cr
|
DoImpulsesAlongside sideImp mainAc -> performAction cr w mainAc & _1 <>~ sideImp
|
||||||
ArbitraryAction f -> performAction cr w (doCrWdAc f cr w)
|
|
||||||
DoImpulsesAlongside sideImp mainAc -> case performAction cr w mainAc of
|
|
||||||
(imp, [nxtac]) -> (sideImp ++ imp, [DoImpulsesAlongside sideImp nxtac])
|
|
||||||
(imp, _) -> (sideImp ++ imp, mempty)
|
|
||||||
DoReplicate t nxtac -> performAction cr w $ DoReplicatePartial nxtac t nxtac
|
DoReplicate t nxtac -> performAction cr w $ DoReplicatePartial nxtac t nxtac
|
||||||
DoReplicatePartial _ 0 pac -> performAction cr w pac
|
DoReplicatePartial _ 0 pac -> performAction cr w pac
|
||||||
DoReplicatePartial startac t partac -> case performAction cr w partac of
|
DoReplicatePartial startac t partac -> case performAction cr w partac of
|
||||||
(imps, [nextac]) -> (imps, [DoReplicatePartial startac t nextac])
|
(imps, NoAction) -> (imps, DoReplicatePartial startac (t -1) startac)
|
||||||
(imps, _) -> (imps, [DoReplicatePartial startac (t -1) startac])
|
(imps, nextac) -> (imps, DoReplicatePartial startac t nextac)
|
||||||
NoAction -> ([], mempty)
|
NoAction -> ([], NoAction)
|
||||||
|
|
||||||
|
tryEvadeSideways :: Creature -> World -> ActionUpdate
|
||||||
|
tryEvadeSideways _ w = jumpleft -- (mv,mempty)
|
||||||
|
where
|
||||||
|
jumpleft = (mv,DoReplicate 5 (DoImpulses mv))
|
||||||
|
mv = [Walk (V2 0 d),UpdateRandGen]
|
||||||
|
d = evalState (takeOne [3,-3]) (w ^. randGen)
|
||||||
|
|
||||||
performAimAt :: Creature -> World -> Int -> Point2 -> ActionUpdate
|
performAimAt :: Creature -> World -> Int -> Point2 -> ActionUpdate
|
||||||
performAimAt cr w tcid p = ([TurnToward tpos aimSp], [AimAt tcid tpos])
|
performAimAt cr w tcid p = ([TurnToward tpos aimSp], AimAt tcid tpos)
|
||||||
where
|
where
|
||||||
cdir = _crDir cr
|
cdir = _crDir cr
|
||||||
cpos = cr ^. crPos . _xy
|
cpos = cr ^. crPos . _xy
|
||||||
canSee' = canSee (_crID cr) tcid w
|
canSee' = canSee (_crID cr) tcid w
|
||||||
aimSp = case crMvType cr ^? mvAimSpeed of
|
aimSp = case crMvType cr ^? mvTurnRad of
|
||||||
Just f -> doFloatFloat f $ safeAngleVV (unitVectorAtAngle cdir) (tpos - cpos)
|
Just f -> doFloatFloat f $ safeAngleVV (unitVectorAtAngle cdir) (tpos - cpos)
|
||||||
Nothing -> error "creature without aiming type"
|
Nothing -> error "creature without aiming type"
|
||||||
|
-- aimSp = case crMvType cr ^? mvAimSpeed of
|
||||||
|
-- Just f -> doFloatFloat f $ safeAngleVV (unitVectorAtAngle cdir) (tpos - cpos)
|
||||||
|
-- Nothing -> error "creature without aiming type"
|
||||||
tpos
|
tpos
|
||||||
| canSee' = w ^?! cWorld . lWorld . creatures . ix tcid . crPos . _xy
|
| canSee' = w ^?! cWorld . lWorld . creatures . ix tcid . crPos . _xy
|
||||||
| otherwise = p
|
| otherwise = p
|
||||||
@@ -121,76 +133,76 @@ crPathing cr = case cr ^. crStance . carriage of
|
|||||||
|
|
||||||
performPathTo :: Action -> Creature -> World -> Point2 -> ActionUpdate
|
performPathTo :: Action -> Creature -> World -> Point2 -> ActionUpdate
|
||||||
performPathTo a cr w p
|
performPathTo a cr w p
|
||||||
| dist cpos p <= crRad (cr ^. crType) = mempty
|
| dist cpos p <= crRad (cr ^. crType) = (mempty,NoAction)
|
||||||
| fst (crPathing cr) cpos p w = gotowards p
|
| fst (crPathing cr) cpos p w = gotowards p
|
||||||
| otherwise = case uncurry pointTowardsImpulse' (crPathing cr) cpos p w of
|
| otherwise = case uncurry pointTowardsImpulse' (crPathing cr) cpos p w of
|
||||||
Just q -> gotowards q
|
Just q -> gotowards q
|
||||||
_ -> ([], [a])
|
_ -> ([], a)
|
||||||
where
|
where
|
||||||
gotowards q = ( [MvTurnToward q, MvForward, RandomTurn jit] , [PathTo p a])
|
gotowards q = ( crMoveImpulses cr q , PathTo p a)
|
||||||
cpos = cr ^. crPos . _xy
|
cpos = cr ^. crPos . _xy
|
||||||
jit = _mvTurnJit $ crMvType cr
|
|
||||||
|
crMoveImpulses :: Creature -> Point2 -> [Impulse]
|
||||||
|
crMoveImpulses cr p = case crMvType cr of
|
||||||
|
NoMvType -> [MvTurnToward p, MvForward]
|
||||||
|
MvWalking {} -> [MvTurnToward p, MvForward]
|
||||||
|
JitMvType {_mvTurnJit = x} -> [MvTurnToward p, MvForward, RandomTurn x]
|
||||||
|
StartStopMvType {} -> [MvTurnToward p, MvForward]
|
||||||
|
BeeMvType {} | cr ^?! crType . startStopMv == 0 -> [SetBeeRandomMovement, MvForward, MvTurnToward p]
|
||||||
|
BeeMvType {} -> [MvTurnToward p, MvForward]
|
||||||
|
|
||||||
performTurnToA :: Creature -> Point2 -> ActionUpdate
|
performTurnToA :: Creature -> Point2 -> ActionUpdate
|
||||||
performTurnToA cr p
|
performTurnToA cr p
|
||||||
| angleVV cdirv dirv < 0.1 = mempty
|
| angleVV cdirv dirv < 0.1 = (mempty,NoAction)
|
||||||
| otherwise = ([MvTurnToward p, RandomTurn jit], [TurnToPoint p])
|
| otherwise = ([MvTurnToward p, RandomTurn jit], TurnToPoint p)
|
||||||
where
|
where
|
||||||
cpos = cr ^. crPos . _xy
|
cpos = cr ^. crPos . _xy
|
||||||
cdirv = unitVectorAtAngle (_crDir cr)
|
cdirv = unitVectorAtAngle (_crDir cr)
|
||||||
dirv = p -.- cpos
|
dirv = p -.- cpos
|
||||||
jit = _mvTurnJit $ crMvType cr
|
jit = _mvTurnJit $ crMvType cr
|
||||||
|
|
||||||
--setMinInvSize :: Int -> Creature -> World -> World
|
|
||||||
--setMinInvSize n cr = cWorld . lWorld . creatures . ix (_crID cr) . crInvCapacity .~ n
|
|
||||||
|
|
||||||
--organiseInvKeys :: Int -> World -> World
|
|
||||||
--organiseInvKeys cid w =
|
|
||||||
-- w & cWorld . lWorld . creatures . ix cid
|
|
||||||
-- %~ ( (crInvSel . iselPos .~ newSelKey)
|
|
||||||
-- . (crInv .~ newInv)
|
|
||||||
-- . (crInvSel . iselAction .~ NoInvSelAction)
|
|
||||||
-- )
|
|
||||||
-- where
|
|
||||||
-- cr = w ^?! cWorld . lWorld . creatures . ix cid -- _creatures (_cWorld w) IM.! cid
|
|
||||||
-- pairs = IM.toList (_crInv cr)
|
|
||||||
-- newSelKey = fromMaybe 0 $ findIndex ((== crSel cr) . fst) pairs
|
|
||||||
-- newInv = IM.fromAscList $ zip [0 ..] $ map snd pairs
|
|
||||||
|
|
||||||
-- why not a cid (Int)?
|
-- why not a cid (Int)?
|
||||||
dropItem :: Creature -> Int -> World -> World
|
dropItem :: Creature -> Int -> World -> World
|
||||||
dropItem cr invid w' =
|
dropItem cr invid w =
|
||||||
doanyitemdropeffect
|
itEffectOnDrop itm cr
|
||||||
|
. maybesetdropped
|
||||||
|
. (hud . diSections . ix 3 . ssSet %~ IS.map (+ 1))
|
||||||
|
. (hud . diSections . ix 0 . ssSet %~ IS.deleteShift invid)
|
||||||
. maybeshiftseldown
|
. maybeshiftseldown
|
||||||
. copyItemToFloor (cr ^. crPos . _xy) itm -- . mayberemoveequip
|
. copyItemToFloor (cr ^. crPos . _xy) itm -- . mayberemoveequip
|
||||||
. rmInvItem (_crID cr) (NInt invid) -- it is important
|
. rmInvItem (_crID cr) (NInt invid) -- it is important
|
||||||
-- to do this before copying the item to the floor!
|
-- to do this before copying the item to the floor!
|
||||||
. soundStart (CrSound (_crID cr)) (cr ^. crPos . _xy) whiteNoiseFadeOutS Nothing
|
. soundStart (CrSound (_crID cr)) (cr ^. crPos . _xy) whiteNoiseFadeOutS Nothing
|
||||||
$ w'
|
$ w
|
||||||
where
|
where
|
||||||
--doanyitemdropeffect = fromMaybe id $ do
|
|
||||||
-- rmf <- itm ^? itEffect . ieOnDrop
|
|
||||||
-- return $ doInvEffect rmf itm cr
|
|
||||||
doanyitemdropeffect = itEffectOnDrop itm cr
|
|
||||||
itm = fromMaybe (error "dropItem cannot find item") $ do
|
itm = fromMaybe (error "dropItem cannot find item") $ do
|
||||||
itid <- cr ^? crInv . ix (NInt invid)
|
itid <- cr ^? crInv . ix (NInt invid)
|
||||||
w' ^? cWorld . lWorld . items . ix itid
|
w ^? cWorld . lWorld . items . ix itid
|
||||||
maybeshiftseldown w = fromMaybe w $ do
|
t = fromMaybe True $ do
|
||||||
|
s <- w ^? hud . diCloseFilter . _Just
|
||||||
|
si <- w ^? hud . diSections . ix 0 . ssItems . ix invid
|
||||||
|
return $ plainRegex s si
|
||||||
|
maybesetdropped = fromMaybe id $ do
|
||||||
|
guard $ t && (invid `IS.member` (w ^?! hud . diSections . ix 0 . ssSet))
|
||||||
|
return $ hud . diSections . ix 3 . ssSet %~ IS.insert 0
|
||||||
|
maybeshiftseldown = fromMaybe id $ do
|
||||||
|
guard t
|
||||||
3 <- w ^? hud . diSelection . _Just . slSec
|
3 <- w ^? hud . diSelection . _Just . slSec
|
||||||
return $ w & hud . diSelection . _Just . slInt +~ 1
|
return $ hud . diSelection . _Just . slInt +~ 1
|
||||||
|
|
||||||
-- | Get your creature to drop the item under the cursor.
|
-- | Get your creature to drop the item under the cursor.
|
||||||
youDropItem :: World -> World
|
youDropItem :: World -> World
|
||||||
youDropItem w = fromMaybe w $ do
|
youDropItem w = fromMaybe w $ do
|
||||||
curpos <-
|
curpos <- mi <|> fmap fst (IM.lookupMax (cr ^. crInv . unNIntMap))
|
||||||
cr ^? crManipulation . manObject . imSelectedItem . unNInt
|
|
||||||
<|> fmap fst (IM.lookupMax (cr ^. crInv . unNIntMap))
|
|
||||||
guard $ not $ w ^. cWorld . lWorld . lInvLock
|
guard $ not $ w ^. cWorld . lWorld . lInvLock
|
||||||
return $ case cr ^. crStance . posture of
|
return $ case cr ^. crStance . posture of
|
||||||
Aiming{} -> throwItem w
|
Aiming{} -> throwItem w
|
||||||
AtEase -> dropItem cr curpos w
|
AtEase -> setInvPosFromSS $ dropItem cr curpos w
|
||||||
where
|
where
|
||||||
cr = you w
|
cr = you w
|
||||||
|
mi = do
|
||||||
|
Sel 0 i <- w^?hud.diSelection._Just
|
||||||
|
return i
|
||||||
|
|
||||||
-- placeholder, remember to deal with two handed weapon twist
|
-- placeholder, remember to deal with two handed weapon twist
|
||||||
-- should throw all attached items?
|
-- should throw all attached items?
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ blinkActionMousePos cr w =
|
|||||||
& blinkDistortions cpos p3
|
& blinkDistortions cpos p3
|
||||||
& cWorld . lWorld . creatures . ix cid . crPos . _xy .~ p3
|
& cWorld . lWorld . creatures . ix cid . crPos . _xy .~ p3
|
||||||
& blinkShockwave cid p3
|
& blinkShockwave cid p3
|
||||||
& inverseShockwaveAt (cpos `v2z` 20) 40 2 2
|
& inverseShockwaveAt (cpos `v2z` 20) 40 2 2 (CrIndirectO cid)
|
||||||
where
|
where
|
||||||
cid = _crID cr
|
cid = _crID cr
|
||||||
p1 = w ^. cWorld . lWorld . lAimPos
|
p1 = w ^. cWorld . lWorld . lAimPos
|
||||||
@@ -63,11 +63,11 @@ unsafeBlinkAction cr w
|
|||||||
. blinkDistortions cpos mwp
|
. blinkDistortions cpos mwp
|
||||||
. set (cWorld . lWorld . creatures . ix cid . crPos . _xy) mwp
|
. set (cWorld . lWorld . creatures . ix cid . crPos . _xy) mwp
|
||||||
. blinkShockwave cid mwp
|
. blinkShockwave cid mwp
|
||||||
$ inverseShockwaveAt (cpos `v2z` 20) 40 2 2 w
|
$ inverseShockwaveAt (cpos `v2z` 20) 40 2 2 (CrIndirectO cid) w
|
||||||
| otherwise =
|
| otherwise =
|
||||||
w
|
w
|
||||||
& blinkActionFail cr
|
& blinkActionFail cr
|
||||||
& cWorld . lWorld . creatures . ix cid . crDamage .:~ Enterrement 100000000
|
& cWorld . lWorld . creatures . ix cid . crDamage .:~ Enterrement 100000000 (CrIndirectO cid)
|
||||||
where
|
where
|
||||||
success = fromMaybe True $ do
|
success = fromMaybe True $ do
|
||||||
wl <- snd $ collidePointWallsFilter (const True) mwp cpos w
|
wl <- snd $ collidePointWallsFilter (const True) mwp cpos w
|
||||||
@@ -82,7 +82,7 @@ blinkShockwave ::
|
|||||||
Point2 ->
|
Point2 ->
|
||||||
World ->
|
World ->
|
||||||
World
|
World
|
||||||
blinkShockwave i p = makeShockwaveAt [i] (p `v2z` 20) 60 1 2 cyan
|
blinkShockwave i p = makeShockwaveAt [i] (p `v2z` 20) 60 1 2 cyan (CrIndirectO i)
|
||||||
|
|
||||||
-- | Like a blink action, but no ingoing distortion
|
-- | Like a blink action, but no ingoing distortion
|
||||||
blinkActionFail :: Creature -> World -> World
|
blinkActionFail :: Creature -> World -> World
|
||||||
@@ -91,7 +91,7 @@ blinkActionFail cr w =
|
|||||||
& soundMultiFrom [TeleSound 0, TeleSound 1] p3 teleS Nothing
|
& soundMultiFrom [TeleSound 0, TeleSound 1] p3 teleS Nothing
|
||||||
-- & cWorld . lWorld . distortions .:~ distortionBulge
|
-- & cWorld . lWorld . distortions .:~ distortionBulge
|
||||||
& cWorld . lWorld . creatures . ix cid . crPos . _xy .~ p3
|
& cWorld . lWorld . creatures . ix cid . crPos . _xy .~ p3
|
||||||
& inverseShockwaveAt (cpos `v2z` 20) 40 2 2
|
& inverseShockwaveAt (cpos `v2z` 20) 40 2 2 (CrIndirectO cid)
|
||||||
where
|
where
|
||||||
-- distR = 120
|
-- distR = 120
|
||||||
-- distortionBulge = RadialDistortion cpos (cpos +.+ V2 distR 0) (cpos +.+ V2 0 distR) 1.9
|
-- distortionBulge = RadialDistortion cpos (cpos +.+ V2 distR 0) (cpos +.+ V2 0 distR) 1.9
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ flockArmourChaseCrit =
|
|||||||
-- IM.fromList
|
-- IM.fromList
|
||||||
-- [ --(0, frontArmour)
|
-- [ --(0, frontArmour)
|
||||||
-- ]
|
-- ]
|
||||||
, _crActionPlan =
|
-- , _crActionPlan =
|
||||||
ActionPlan
|
-- ActionPlan
|
||||||
{ _apAction = []
|
-- { _apAction = NoAction
|
||||||
, _apStrategy = FollowImpulses
|
---- , _apStrategy = FollowImpulses
|
||||||
, _apGoal = [Kill 0]
|
-- , _apGoal = Kill 0
|
||||||
}
|
-- }
|
||||||
, _crGroup = ShieldGroup
|
, _crGroup = ShieldGroup
|
||||||
-- , _crMvType = defaultChaseMvType
|
-- , _crMvType = defaultChaseMvType
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,18 @@
|
|||||||
module Dodge.Creature.ChaseCrit (
|
module Dodge.Creature.ChaseCrit (
|
||||||
smallChaseCrit,
|
smallChaseCrit,
|
||||||
invisibleChaseCrit,
|
invisibleChaseCrit,
|
||||||
|
crabCrit,
|
||||||
chaseCrit,
|
chaseCrit,
|
||||||
hoverCrit,
|
hoverCrit,
|
||||||
|
slinkCrit,
|
||||||
|
slimeCrit,
|
||||||
|
beeCrit,
|
||||||
|
hiveCrit,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
--import Dodge.Data.Equipment.Misc
|
import qualified Quaternion as Q
|
||||||
|
import Linear
|
||||||
|
import Dodge.Data.FloatFunction
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Dodge.Data.Creature
|
import Dodge.Data.Creature
|
||||||
import Dodge.Default
|
import Dodge.Default
|
||||||
@@ -31,6 +38,47 @@ chaseCrit =
|
|||||||
& crName .~ "chaseCrit"
|
& crName .~ "chaseCrit"
|
||||||
& crHP .~ HP 150
|
& crHP .~ HP 150
|
||||||
& crFaction .~ ColorFaction green
|
& crFaction .~ ColorFaction green
|
||||||
|
& crActionPlan . apGoal .~ SearchForFood
|
||||||
|
& crActionPlan . apStrategy .~ Search
|
||||||
|
|
||||||
|
crabCrit :: Creature
|
||||||
|
crabCrit = defaultCreature
|
||||||
|
& crName .~ "chaseCrit"
|
||||||
|
& crHP .~ HP 350
|
||||||
|
& crType .~ CrabCrit
|
||||||
|
{ _meleeCooldownL = 0
|
||||||
|
, _meleeCooldownR = 0
|
||||||
|
, _dodgeCooldown = 0
|
||||||
|
, _lFootPos = 0
|
||||||
|
, _rFootPos = 0
|
||||||
|
}
|
||||||
|
& crFaction .~ ColorFaction red
|
||||||
|
& crPerception . cpVision . viFOV .~ FloatFOV pi
|
||||||
|
|
||||||
|
slinkCrit :: Creature
|
||||||
|
slinkCrit = defaultCreature
|
||||||
|
& crName .~ "slinkCrit"
|
||||||
|
& crHP .~ HP 1000
|
||||||
|
& crType .~ SlinkCrit
|
||||||
|
{ _meleeCooldown = 0
|
||||||
|
, _slinkSpine = replicate 15 (V3 0 0 2, Q.axisAngle (V3 0 1 0) (pi/15))
|
||||||
|
, _slinkHeadPos = (V3 20 0 15, Q.axisAngle (V3 0 1 0) (pi/2))
|
||||||
|
}
|
||||||
|
& crFaction .~ ColorFaction red
|
||||||
|
& crPerception . cpVision . viFOV .~ FloatFOV pi
|
||||||
|
|
||||||
|
slimeCrit :: Creature
|
||||||
|
slimeCrit = defaultCreature
|
||||||
|
& crName .~ "slimeCrit"
|
||||||
|
& crHP .~ HP 1000
|
||||||
|
-- & crType .~ SlimeCrit r 0 0 (V2 (slimeToRad r) 0) False 0
|
||||||
|
& crType .~ SlimeCrit r 0 NoSlimeDistortion 1 False 0
|
||||||
|
& crFaction .~ ColorFaction (light green)
|
||||||
|
& crPerception . cpVision . viFOV .~ FloatFOV pi
|
||||||
|
& crActionPlan .~ SlimeIntelligence
|
||||||
|
& crStance . carriage .~ Crawling
|
||||||
|
where
|
||||||
|
r = 250000
|
||||||
|
|
||||||
hoverCrit :: Creature
|
hoverCrit :: Creature
|
||||||
hoverCrit =
|
hoverCrit =
|
||||||
@@ -39,4 +87,22 @@ hoverCrit =
|
|||||||
& crHP .~ HP 150
|
& crHP .~ HP 150
|
||||||
& crType .~ HoverCrit 0
|
& crType .~ HoverCrit 0
|
||||||
& crFaction .~ ColorFaction blue
|
& crFaction .~ ColorFaction blue
|
||||||
& crStance . carriage .~ Flying 15 0.975
|
& crStance . carriage .~ Flying 15
|
||||||
|
|
||||||
|
beeCrit :: Creature
|
||||||
|
beeCrit =
|
||||||
|
defaultCreature
|
||||||
|
& crName .~ "beeCrit"
|
||||||
|
& crHP .~ HP 100
|
||||||
|
& crType .~ BeeCrit 0 Nothing 0 0 0 Nothing 1
|
||||||
|
& crFaction .~ ColorFaction yellow
|
||||||
|
& crStance . carriage .~ Flying 15
|
||||||
|
|
||||||
|
hiveCrit :: Creature
|
||||||
|
hiveCrit =
|
||||||
|
defaultCreature
|
||||||
|
& crName .~ "hiveCrit"
|
||||||
|
& crHP .~ HP 100000
|
||||||
|
& crType .~ HiveCrit mempty 0 400
|
||||||
|
& crStance . carriage .~ Rooted
|
||||||
|
& crFaction .~ ColorFaction yellow
|
||||||
|
|||||||
@@ -12,32 +12,17 @@ import Dodge.Data.World
|
|||||||
--import Geometry
|
--import Geometry
|
||||||
import LensHelp
|
import LensHelp
|
||||||
|
|
||||||
applyCreatureDamage :: [Damage] -> Creature -> World -> World
|
applyCreatureDamage :: Int -> Creature -> World -> World
|
||||||
applyCreatureDamage dms cr w = foldl' (applyIndividualDamage cr) w dms
|
applyCreatureDamage cid cr w = foldl' (applyIndividualDamage cid cr) w (cr ^. crDamage)
|
||||||
|
|
||||||
applyIndividualDamage :: Creature -> World -> Damage -> World
|
applyIndividualDamage :: Int -> Creature -> World -> Damage -> World
|
||||||
applyIndividualDamage cr w (Inertial _ _ v) = w
|
applyIndividualDamage cid cr w (Inertial _ _ v _) = w
|
||||||
& cWorld . lWorld . creatures . ix (_crID cr) . crPos . _xy +~ fmap (/ crMass (cr ^. crType)) v
|
& cWorld . lWorld . creatures . ix cid . crPos . _xy +~ fmap (/ crMass (cr ^. crType)) v
|
||||||
applyIndividualDamage cr w dm =
|
applyIndividualDamage cid cr w dm =
|
||||||
let (i,w') = damMatSideEffect dm (crMaterial (_crType cr)) (Left cr) w
|
let (x,w') = damMatSideEffect dm (crMaterial (_crType cr)) (Left cr) w
|
||||||
in w' & damageHP cr i
|
in w' & damageHP cid x
|
||||||
-- case dm of
|
|
||||||
-- Piercing{} -> applyPiercingDamage cr dm w
|
|
||||||
-- _ -> w & damageHP cr (_dmAmount dm)
|
|
||||||
|
|
||||||
--applyPiercingDamage :: Creature -> Damage -> World -> World
|
damageHP :: Int -> Int -> World -> World
|
||||||
--applyPiercingDamage cr dm w
|
damageHP cid x =
|
||||||
-- | crIsArmouredFrom (w ^. cWorld . lWorld . items) p cr
|
(cWorld . lWorld . creatures . ix cid . crHP . _HP -~ x)
|
||||||
-- = f . makeSpark NormalSpark p1 (argV (p1 - p)) $ w
|
. (cWorld . lWorld . creatures . ix cid . crPain +~ x)
|
||||||
-- | otherwise = f . damageHP cr (_dmAmount dm) $ w
|
|
||||||
-- where
|
|
||||||
-- f = cWorld . lWorld . creatures . ix (_crID cr) . crPos . _xy +~ _dmVector dm
|
|
||||||
-- / V2 x x
|
|
||||||
-- x = crMass (_crType cr)
|
|
||||||
-- p = _dmPos dm
|
|
||||||
-- p1 = p + 2 *.* squashNormalizeV (p - cr ^. crPos . _xy)
|
|
||||||
|
|
||||||
damageHP :: Creature -> Int -> World -> World
|
|
||||||
damageHP cr x =
|
|
||||||
(cWorld . lWorld . creatures . ix (_crID cr) . crHP . _HP -~ x)
|
|
||||||
. (cWorld . lWorld . creatures . ix (_crID cr) . crPain +~ x)
|
|
||||||
|
|||||||
@@ -16,32 +16,32 @@ module Dodge.Creature.HandPos (
|
|||||||
strideLength,
|
strideLength,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Dodge.Data.World
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import qualified Data.IntMap.Strict as IM
|
import qualified Data.IntMap.Strict as IM
|
||||||
import Linear
|
import Linear
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Dodge.Creature.Test
|
import Dodge.Creature.Test
|
||||||
import Dodge.Data.Creature
|
|
||||||
import Dodge.Data.Equipment.Misc
|
import Dodge.Data.Equipment.Misc
|
||||||
import Geometry
|
import Geometry
|
||||||
import qualified Quaternion as Q
|
import qualified Quaternion as Q
|
||||||
import ShapePicture
|
import ShapePicture
|
||||||
|
|
||||||
translateToES :: Creature -> EquipSite -> Point3 -> Point3
|
translateToES :: World -> Creature -> EquipSite -> Point3 -> Point3
|
||||||
translateToES cr es p = fst (equipSitePQ es cr `Q.comp` (p, Q.qid))
|
translateToES w cr es p = fst (equipSitePQ es w cr `Q.comp` (p, Q.qid))
|
||||||
|
|
||||||
equipSitePQ :: EquipSite -> Creature -> Point3Q
|
equipSitePQ :: EquipSite -> World -> Creature -> Point3Q
|
||||||
equipSitePQ = \case
|
equipSitePQ = \case
|
||||||
OnLeftWrist -> leftWristPQ
|
OnLeftWrist -> leftWristPQ
|
||||||
OnRightWrist -> rightWristPQ
|
OnRightWrist -> rightWristPQ
|
||||||
OnHead -> headPQ
|
OnHead -> headPQ
|
||||||
OnChest -> chestPQ
|
OnChest -> chestPQ
|
||||||
OnBack -> backPQ
|
OnBack -> backPQ
|
||||||
OnLeftLeg -> legPQ LeftForward
|
OnLeftLeg -> const $ legPQ LeftForward
|
||||||
OnRightLeg -> legPQ RightForward
|
OnRightLeg -> const $ legPQ RightForward
|
||||||
|
|
||||||
translatePointToRightHand :: Creature -> Point3 -> Point3
|
translatePointToRightHand :: World -> Creature -> Point3 -> Point3
|
||||||
translatePointToRightHand cr p = fst (rightHandPQ cr `Q.comp` (p, Q.qid))
|
translatePointToRightHand w cr p = fst (rightHandPQ w cr `Q.comp` (p, Q.qid))
|
||||||
|
|
||||||
strideLength :: Creature -> Float
|
strideLength :: Creature -> Float
|
||||||
strideLength cr = case cr ^. crType of
|
strideLength cr = case cr ^. crType of
|
||||||
@@ -61,14 +61,14 @@ handWalkingPos b off cr = case (cr ^? crType . strideAmount,cr ^? crType . footF
|
|||||||
zeroOneSmooth :: Float -> Float
|
zeroOneSmooth :: Float -> Float
|
||||||
zeroOneSmooth x = (1 - cos (pi * x)) / 2
|
zeroOneSmooth x = (1 - cos (pi * x)) / 2
|
||||||
|
|
||||||
rightHandPQ :: Creature -> Point3Q
|
rightHandPQ :: World -> Creature -> Point3Q
|
||||||
rightHandPQ cr
|
rightHandPQ w cr
|
||||||
| oneH cr = (V3 11 (-3) 20, Q.qid)
|
| oneH w cr = (V3 11 (-3) 20, Q.qid)
|
||||||
| twists cr = (V3 0 5 20, Q.qz (-1)) `Q.comp` (V3 4 (-10) 0, Q.qz 1)
|
| twists w cr = (V3 0 5 20, Q.qz (-1)) `Q.comp` (V3 4 (-10) 0, Q.qz 1)
|
||||||
| twoFlat cr = (V3 8 (-8) 12, Q.qid)
|
| twoFlat w cr = (V3 8 (-8) 12, Q.qid)
|
||||||
| Just TwoHandTwist <- cr ^? crManipulation . manObject . imAimStance
|
| Just TwoHandTwist <- w ^? hud . manObject . hiAimStance
|
||||||
= (V3 6 (-6) 10, Q.qid)
|
= (V3 6 (-6) 10, Q.qid)
|
||||||
| Just TwoHandFlat <- cr ^? crManipulation . manObject . imAimStance
|
| Just TwoHandFlat <- w ^? hud . manObject . hiAimStance
|
||||||
= (V3 (8 - twoHandOffY cr) (-8) 12, Q.qid)
|
= (V3 (8 - twoHandOffY cr) (-8) 12, Q.qid)
|
||||||
| Just p <- crRightHandWall cr = (20 & _xy .~ p, Q.qid)
|
| Just p <- crRightHandWall cr = (20 & _xy .~ p, Q.qid)
|
||||||
| otherwise = (handWalkingPos LeftForward (-8) cr, Q.qid)
|
| otherwise = (handWalkingPos LeftForward (-8) cr, Q.qid)
|
||||||
@@ -109,22 +109,22 @@ crLeftHandWall cr = do
|
|||||||
cd = cr ^. crDir
|
cd = cr ^. crDir
|
||||||
rot = rotateV (negate cd)
|
rot = rotateV (negate cd)
|
||||||
|
|
||||||
translateToRightHand :: Creature -> SPic -> SPic
|
translateToRightHand :: World -> Creature -> SPic -> SPic
|
||||||
translateToRightHand = overPosSP . translatePointToRightHand
|
translateToRightHand w = overPosSP . translatePointToRightHand w
|
||||||
|
|
||||||
rightWristPQ :: Creature -> Point3Q
|
rightWristPQ :: World -> Creature -> Point3Q
|
||||||
rightWristPQ cr = rightHandPQ cr `Q.comp` (V3 0 (-4) (-4), Q.qid)
|
rightWristPQ w cr = rightHandPQ w cr `Q.comp` (V3 0 (-4) (-4), Q.qid)
|
||||||
|
|
||||||
leftHandPQ :: Creature -> Point3Q
|
leftHandPQ :: World -> Creature -> Point3Q
|
||||||
leftHandPQ cr
|
leftHandPQ w cr
|
||||||
| twists cr = (V3 0 5 20, Q.qz (-1)) `Q.comp` (V3 12 4 0, Q.qz 0.4)
|
| twists w cr = (V3 0 5 20, Q.qz (-1)) `Q.comp` (V3 12 4 0, Q.qz 0.4)
|
||||||
| twoFlat cr = (V3 8 8 12, Q.qid)
|
| twoFlat w cr = (V3 8 8 12, Q.qid)
|
||||||
| Just TwoHandTwist <- cr ^? crManipulation . manObject . imAimStance
|
| Just TwoHandTwist <- w ^? hud . manObject . hiAimStance
|
||||||
= (V3 (10 + twoHandOffY cr) 6 20, Q.qid)
|
= (V3 (10 + twoHandOffY cr) 6 20, Q.qid)
|
||||||
| Just TwoHandFlat <- cr ^? crManipulation . manObject . imAimStance
|
| Just TwoHandFlat <- w ^? hud . manObject . hiAimStance
|
||||||
= (V3 (8 + twoHandOffY cr) 6 12, Q.qid)
|
= (V3 (8 + twoHandOffY cr) 6 12, Q.qid)
|
||||||
| Just p <- crLeftHandWall cr = (20 & _xy .~ p, Q.qid)
|
| Just p <- crLeftHandWall cr = (20 & _xy .~ p, Q.qid)
|
||||||
| oneH cr = (V3 0 8 10, Q.qz 0.4)
|
| oneH w cr = (V3 0 8 10, Q.qz 0.4)
|
||||||
| otherwise = (handWalkingPos RightForward 8 cr, Q.qid)
|
| otherwise = (handWalkingPos RightForward 8 cr, Q.qid)
|
||||||
|
|
||||||
twoHandOffY :: Creature -> Float
|
twoHandOffY :: Creature -> Float
|
||||||
@@ -137,14 +137,14 @@ twoHandOffY cr = zeroOneSmooth $ case (cr ^? crType . strideAmount,cr ^? crType
|
|||||||
in f sa
|
in f sa
|
||||||
_ -> 0
|
_ -> 0
|
||||||
|
|
||||||
translatePointToLeftHand :: Creature -> Point3 -> Point3
|
translatePointToLeftHand :: World -> Creature -> Point3 -> Point3
|
||||||
translatePointToLeftHand cr p = fst (leftHandPQ cr `Q.comp` (p, Q.qid))
|
translatePointToLeftHand w cr p = fst (leftHandPQ w cr `Q.comp` (p, Q.qid))
|
||||||
|
|
||||||
translateToLeftHand :: Creature -> SPic -> SPic
|
translateToLeftHand :: World -> Creature -> SPic -> SPic
|
||||||
translateToLeftHand = overPosSP . translatePointToLeftHand
|
translateToLeftHand w = overPosSP . translatePointToLeftHand w
|
||||||
|
|
||||||
leftWristPQ :: Creature -> Point3Q
|
leftWristPQ :: World -> Creature -> Point3Q
|
||||||
leftWristPQ cr = leftHandPQ cr `Q.comp` (V3 0 4 (-4), Q.qid)
|
leftWristPQ w cr = leftHandPQ w cr `Q.comp` (V3 0 4 (-4), Q.qid)
|
||||||
|
|
||||||
translateToLeftLeg :: Creature -> SPic -> SPic
|
translateToLeftLeg :: Creature -> SPic -> SPic
|
||||||
translateToLeftLeg cr = overPosSP (\p -> fst (legPQ LeftForward cr `Q.comp` (p, Q.qid)))
|
translateToLeftLeg cr = overPosSP (\p -> fst (legPQ LeftForward cr `Q.comp` (p, Q.qid)))
|
||||||
@@ -171,17 +171,17 @@ legPQ' g cr =
|
|||||||
translateToRightLeg :: Creature -> SPic -> SPic
|
translateToRightLeg :: Creature -> SPic -> SPic
|
||||||
translateToRightLeg cr = overPosSP (\p -> fst (legPQ RightForward cr `Q.comp` (p, Q.qid)))
|
translateToRightLeg cr = overPosSP (\p -> fst (legPQ RightForward cr `Q.comp` (p, Q.qid)))
|
||||||
|
|
||||||
headPQ :: Creature -> Point3Q
|
headPQ :: World -> Creature -> Point3Q
|
||||||
headPQ cr
|
headPQ w cr
|
||||||
| twists cr = (V3 0 2 20, Q.qz (-1)) `Q.comp` (V3 (negate 2.5) 0.25 0, Q.qz 1)
|
| twists w cr = (V3 0 2 20, Q.qz (-1)) `Q.comp` (V3 (negate 2.5) 0.25 0, Q.qz 1)
|
||||||
| oneH cr = (V3 0 0 20, Q.qz 0.5) `Q.comp` (V3 2.5 0 0, Q.qz (-0.5))
|
| oneH w cr = (V3 0 0 20, Q.qz 0.5) `Q.comp` (V3 2.5 0 0, Q.qz (-0.5))
|
||||||
| otherwise = (V3 2.5 0 20, Q.qid)
|
| otherwise = (V3 2.5 0 20, Q.qid)
|
||||||
|
|
||||||
chestPQ :: Creature -> Point3Q
|
chestPQ :: World -> Creature -> Point3Q
|
||||||
chestPQ cr = backPQ cr `Q.comp` (0, Q.qz pi)
|
chestPQ w cr = backPQ w cr `Q.comp` (0, Q.qz pi)
|
||||||
|
|
||||||
backPQ :: Creature -> Point3Q
|
backPQ :: World -> Creature -> Point3Q
|
||||||
backPQ cr
|
backPQ w cr
|
||||||
| oneH cr = (V3 0 0 10, Q.qz 0.5)
|
| oneH w cr = (V3 0 0 10, Q.qz 0.5)
|
||||||
| twists cr = (V3 0 3 10, Q.qz (-1.5))
|
| twists w cr = (V3 0 3 10, Q.qz (-1.5))
|
||||||
| otherwise = (V3 0 0 10, Q.qz 0)
|
| otherwise = (V3 0 0 10, Q.qz 0)
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
module Dodge.Creature.Impulse (followImpulse) where
|
module Dodge.Creature.Impulse (followImpulse) where
|
||||||
|
|
||||||
import Control.Monad.Trans.State.Lazy
|
import RandomHelp
|
||||||
|
import Control.Applicative
|
||||||
|
--import Control.Monad.Trans.State.Lazy
|
||||||
--import Control.Monad.State -- moving from mtl to transformers
|
--import Control.Monad.State -- moving from mtl to transformers
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Dodge.Creature.Impulse.Movement
|
import Dodge.Creature.Impulse.Movement
|
||||||
@@ -18,11 +20,12 @@ import Dodge.SoundLogic
|
|||||||
import Geometry
|
import Geometry
|
||||||
import LensHelp
|
import LensHelp
|
||||||
import Linear
|
import Linear
|
||||||
import System.Random
|
--import System.Random
|
||||||
|
|
||||||
-- note SwitchToItem doesn't necessarily update the root item correctly
|
-- note SwitchToItem doesn't necessarily update the root item correctly
|
||||||
followImpulse :: Int -> World -> Impulse -> World
|
followImpulse :: Int -> World -> Impulse -> World
|
||||||
followImpulse cid w = \case
|
followImpulse cid w = \case
|
||||||
|
UpdateRandGen -> w & randGen %~ (snd . randomR (0::Int,1))
|
||||||
ImpulseNothing -> w
|
ImpulseNothing -> w
|
||||||
RandomImpulse rimp ->
|
RandomImpulse rimp ->
|
||||||
let (newimp, newgen) = runState (doRandImpulse rimp) (_randGen w)
|
let (newimp, newgen) = runState (doRandImpulse rimp) (_randGen w)
|
||||||
@@ -30,46 +33,87 @@ followImpulse cid w = \case
|
|||||||
Bark sid ->
|
Bark sid ->
|
||||||
soundStart (CrMouth cid) cpos sid Nothing $
|
soundStart (CrMouth cid) cpos sid Nothing $
|
||||||
w & clens %~ resetCrVocCoolDown w
|
w & clens %~ resetCrVocCoolDown w
|
||||||
Move p -> crup $ crMvBy p (w ^. cWorld . lWorld)
|
Move p -> crup $ crMvBy p w
|
||||||
MoveForward x -> crup $ crMvForward x (w ^. cWorld . lWorld)
|
Walk p -> crup $ crWalk p w
|
||||||
MoveNoStride p -> crup $ crMvByNoStride p (w ^. cWorld . lWorld)
|
MoveForward x -> crup $ crMvForward x w
|
||||||
|
MoveNoStride p -> crup $ crMvByNoStride p w
|
||||||
Turn a -> crup $ crDir +~ a
|
Turn a -> crup $ crDir +~ a
|
||||||
TurnToward p a -> crup $ creatureTurnToward p a
|
TurnToward p a -> crup $ creatureTurnToward p a
|
||||||
TurnTo p -> crup $ creatureTurnTo p
|
TurnTo p -> crup $ creatureTurnTo p
|
||||||
ChangePosture post -> crup $ crStance . posture .~ post
|
ChangePosture post -> crup $ crStance . posture .~ post
|
||||||
UseItem -> undefined
|
UseItem -> undefined
|
||||||
-- SwitchToItem i -> crup $ crManipulation . manObject .~ SelectedItem (NInt i) (NInt i) mempty
|
-- SwitchToItem i -> crup $ crManipulation . manObject .~ SelectedItem (NInt i) (NInt i) mempty
|
||||||
Melee cid' ->
|
Melee tid ->
|
||||||
hitCr cid' $
|
hitCr tid $ crup $ meleeMovement w tid . (crType . meleeCooldown .~ 20)
|
||||||
|
MeleeL cid' ->
|
||||||
|
hitCrd (-pi/2) cid' $
|
||||||
crup
|
crup
|
||||||
( crMvAbsolute (w ^. cWorld . lWorld) (10 *.* normalizeV (posFromID cid' -.- cpos)) . (crType . meleeCooldown .~ 20)
|
-- ( crMvAbsolute (w ^. cWorld . lWorld) (vNormal $ 10 *.* normalizeV (posFromID cid' -.- cpos))
|
||||||
)
|
-- .
|
||||||
|
(crType . meleeCooldownL .~ 20)
|
||||||
|
-- )
|
||||||
|
MeleeR cid' ->
|
||||||
|
hitCrd (pi/2) cid' $
|
||||||
|
crup
|
||||||
|
--( crMvAbsolute (w ^. cWorld . lWorld) (vNormal $ (-10) *.* normalizeV (posFromID cid' -.- cpos)) .
|
||||||
|
(crType . meleeCooldownR .~ 20)
|
||||||
|
--)
|
||||||
RandomTurn a ->
|
RandomTurn a ->
|
||||||
let (aa, g) = rr a
|
let (aa, g) = rr a
|
||||||
in (randGen .~ g) (crup (crDir +~ aa))
|
in (randGen .~ g) (crup (crDir +~ aa))
|
||||||
MakeSound sid -> soundStart (CrSound (_crID cr)) (cr ^. crPos . _xy) sid Nothing w
|
MakeSound sid -> soundStart (CrSound (_crID cr)) (cr ^. crPos . _xy) sid Nothing w
|
||||||
DropItem -> undefined
|
DropItem -> undefined
|
||||||
ChangeStrategy strat -> crup $ crActionPlan . apStrategy .~ strat
|
ChangeStrategy strat -> crup $ crActionPlan . apStrategy .~ strat
|
||||||
AddGoal gl -> crup $ crActionPlan . apGoal .:~ gl
|
-- AddGoal gl -> crup $ crActionPlan . apGoal .:~ gl
|
||||||
ImpulseUseTarget f -> fromMaybe w $ do
|
ImpulseUseTarget f -> fromMaybe w $ do
|
||||||
i <- cr ^? crIntention . targetCr . _Just
|
i <- cr ^? crIntention . targetCr . _Just
|
||||||
tcr <- w ^? cWorld . lWorld . creatures . ix i
|
tcr <- w ^? cWorld . lWorld . creatures . ix i
|
||||||
return $ followImpulse cid w (doCrImp f tcr)
|
return $ followImpulse cid w (doCrImp f tcr)
|
||||||
MvForward -> crup $ crMvForward speed (w ^. cWorld . lWorld)
|
MvForward -> crup $ crMvForward' w
|
||||||
MvTurnToward p ->
|
MvTurnToward p ->
|
||||||
crup $
|
crup $
|
||||||
creatureTurnToward p (turnRad $ safeAngleVV (p -.- cpos) (unitVectorAtAngle cdir))
|
mvTurnToward p (turnRad $ safeAngleVV (p -.- cpos) (unitVectorAtAngle cdir))
|
||||||
|
SetBeeRandomMovement -> w & setBeeRandomMovement cid
|
||||||
where
|
where
|
||||||
clens = cWorld . lWorld . creatures . ix cid
|
clens = cWorld . lWorld . creatures . ix cid
|
||||||
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
||||||
crup f = over clens f w
|
crup f = over clens f w
|
||||||
mvType = crMvType cr
|
mvType = crMvType cr
|
||||||
speed = _mvSpeed mvType
|
-- speed = _mvSpeed mvType
|
||||||
turnRad = doFloatFloat $ _mvTurnRad mvType
|
turnRad = fromMaybe (const 0.1) $
|
||||||
|
mvType ^? mvTurnRad . to doFloatFloat
|
||||||
|
<|> mvType ^? mvTurnSpeed . to const
|
||||||
|
-- | Just x <- = doFloatFloat $ _mvTurnRad mvType
|
||||||
cpos = cr ^. crPos . _xy
|
cpos = cr ^. crPos . _xy
|
||||||
cdir = _crDir cr
|
cdir = _crDir cr
|
||||||
posFromID cid' = w ^?! cWorld . lWorld . creatures . ix cid' . crPos . _xy
|
posFromID cid' = w ^?! cWorld . lWorld . creatures . ix cid' . crPos . _xy
|
||||||
rr a = randomR (- a, a) $ _randGen w
|
rr a = randomR (- a, a) $ _randGen w
|
||||||
hitCr i =
|
hitCr i =
|
||||||
cWorld . lWorld . creatures . ix i . crDamage
|
cWorld . lWorld . creatures . ix i . crDamage
|
||||||
.:~ Blunt 100 (posFromID i) (posFromID i - cpos)
|
.:~ Blunt 100 (posFromID i) (posFromID i - cpos) (CrMeleeO cid)
|
||||||
|
hitCrd a i =
|
||||||
|
cWorld . lWorld . creatures . ix i . crDamage
|
||||||
|
<>~ [Blunt 100 (posFromID i) (posFromID i - cpos) (CrMeleeO cid)
|
||||||
|
, Inertial 0 (posFromID i) (50 * unitVectorAtAngle (cr ^. crDir + a)) (CrMeleeO cid)
|
||||||
|
]
|
||||||
|
|
||||||
|
meleeMovement :: World -> Int -> Creature -> Creature
|
||||||
|
meleeMovement w tid cr = case cr ^. crType of
|
||||||
|
HoverCrit {} -> fromMaybe cr $ do
|
||||||
|
txy <- w ^? cWorld . lWorld . creatures . ix tid . crPos . _xy
|
||||||
|
return $ crMvAbsolute w (5 *^ normalizeV (cr ^. crPos . _xy - txy)) cr
|
||||||
|
ChaseCrit {} -> fromMaybe cr $ do
|
||||||
|
txy <- w ^? cWorld . lWorld . creatures . ix tid . crPos . _xy
|
||||||
|
return $ crMvAbsolute w (5 *^ normalizeV (txy - cr ^. crPos . _xy)) cr
|
||||||
|
_ -> cr
|
||||||
|
|
||||||
|
setBeeRandomMovement :: Int -> World -> World
|
||||||
|
setBeeRandomMovement cid w = fromMaybe w $ do
|
||||||
|
mff <- w ^? cWorld . lWorld . creatures . ix cid . crType . beeRandomMovement
|
||||||
|
return $ case mff of
|
||||||
|
Just _ -> w & cWorld . lWorld . creatures . ix cid . crType . beeRandomMovement .~ Nothing
|
||||||
|
Nothing -> w & cWorld . lWorld . creatures . ix cid . crType . beeRandomMovement .~ x
|
||||||
|
& randGen .~ g
|
||||||
|
where
|
||||||
|
(x,g) = runState (takeOne [Nothing,Just LeftForward,Just RightForward]) (w ^. randGen)
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,16 @@ module Dodge.Creature.Impulse.Movement (
|
|||||||
creatureTurnTowardDir,
|
creatureTurnTowardDir,
|
||||||
crMvAbsolute,
|
crMvAbsolute,
|
||||||
crMvBy,
|
crMvBy,
|
||||||
|
crWalk,
|
||||||
crMvByNoStride,
|
crMvByNoStride,
|
||||||
crMvForward,
|
crMvForward,
|
||||||
|
crMvForward',
|
||||||
creatureTurnTo,
|
creatureTurnTo,
|
||||||
|
mvTurnToward,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Dodge.Creature.State.WalkCycle
|
||||||
|
import Dodge.Creature.MoveType
|
||||||
import Linear
|
import Linear
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Dodge.Base
|
import Dodge.Base
|
||||||
@@ -18,32 +23,37 @@ import Geometry
|
|||||||
{- | Creature attempts to moves under its own steam.
|
{- | Creature attempts to moves under its own steam.
|
||||||
The idea is that this may or may not work, depending on the status of the creature.
|
The idea is that this may or may not work, depending on the status of the creature.
|
||||||
For now, though, this cannot fail.
|
For now, though, this cannot fail.
|
||||||
|
p is the movement translation vector, will be made relative to creature direction
|
||||||
-}
|
-}
|
||||||
crMvBy ::
|
crMvBy :: Point2 -> World -> Creature -> Creature
|
||||||
-- | Movement translation vector, will be made relative to creature direction
|
|
||||||
Point2 ->
|
|
||||||
LWorld ->
|
|
||||||
Creature ->
|
|
||||||
Creature
|
|
||||||
crMvBy p lw cr = crMvAbsolute lw (rotateV (_crDir cr) p) cr
|
crMvBy p lw cr = crMvAbsolute lw (rotateV (_crDir cr) p) cr
|
||||||
|
|
||||||
crMvByNoStride ::
|
-- | p is the movement translation vector, made relative to creature direction
|
||||||
-- | Movement translation vector, will be made relative to creature direction
|
crWalk :: Point2 -> World -> Creature -> Creature
|
||||||
Point2 ->
|
crWalk p lw cr = crWalkAbsolute lw (rotateV (_crDir cr) p) cr
|
||||||
LWorld ->
|
|
||||||
Creature ->
|
-- | p is the movement translation vector, made relative to creature direction
|
||||||
Creature
|
crMvByNoStride :: Point2 -> World -> Creature -> Creature
|
||||||
crMvByNoStride p lw cr = crMvAbsoluteNoStride lw (rotateV (_crDir cr) p) cr
|
crMvByNoStride p lw cr = crMvAbsoluteNoStride lw (rotateV (_crDir cr) p) cr
|
||||||
|
|
||||||
crMvAbsolute :: LWorld -> Point2 -> Creature -> Creature
|
crMvAbsolute :: World -> Point2 -> Creature -> Creature
|
||||||
crMvAbsolute lw p' cr =
|
crMvAbsolute w p' cr =
|
||||||
cr
|
cr
|
||||||
& crPos . _xy +~ p
|
& crPos . _xy +~ p
|
||||||
& crMvDir .~ argV (p + cr ^. crOldPos . _xy - cr ^. crOldOldPos . _xy)
|
& crMvDir .~ argV (p + cr ^. crOldPos . _xy - cr ^. crOldOldPos . _xy)
|
||||||
|
where
|
||||||
|
p = strengthFactor (getCrMoveSpeed w cr) *^ p'
|
||||||
|
|
||||||
|
crWalkAbsolute :: World -> Point2 -> Creature -> Creature
|
||||||
|
crWalkAbsolute lw p' cr
|
||||||
|
| Walking <- cr ^. crStance . carriage = cr
|
||||||
|
& crPos . _xy +~ p
|
||||||
|
& crMvDir .~ argV (p + cr ^. crOldPos . _xy - cr ^. crOldOldPos . _xy)
|
||||||
|
| otherwise = cr
|
||||||
where
|
where
|
||||||
p = strengthFactor (getCrMoveSpeed lw cr) *.* p'
|
p = strengthFactor (getCrMoveSpeed lw cr) *.* p'
|
||||||
|
|
||||||
crMvAbsoluteNoStride :: LWorld -> Point2 -> Creature -> Creature
|
crMvAbsoluteNoStride :: World -> Point2 -> Creature -> Creature
|
||||||
crMvAbsoluteNoStride lw p' cr = cr & crPos . _xy +~ p
|
crMvAbsoluteNoStride lw p' cr = cr & crPos . _xy +~ p
|
||||||
where
|
where
|
||||||
p = strengthFactor (getCrMoveSpeed lw cr) *.* p'
|
p = strengthFactor (getCrMoveSpeed lw cr) *.* p'
|
||||||
@@ -54,7 +64,28 @@ strengthFactor i
|
|||||||
| i < 1 = 0
|
| i < 1 = 0
|
||||||
| otherwise = 0.02 * fromIntegral i
|
| otherwise = 0.02 * fromIntegral i
|
||||||
|
|
||||||
crMvForward :: Float -> LWorld -> Creature -> Creature
|
crMvForward' :: World -> Creature -> Creature
|
||||||
|
crMvForward' lw cr = case crMvType cr of
|
||||||
|
JitMvType s _ _ -> crMvBy (V2 s 0) lw cr
|
||||||
|
StartStopMvType s _ n ->
|
||||||
|
let speed | cr ^?! crType . startStopMv > n = 0
|
||||||
|
| otherwise = s
|
||||||
|
in crMvBy (V2 speed 0) lw cr
|
||||||
|
& crType . startStopMv %~ ((`mod` (n*2)) . (+1))
|
||||||
|
BeeMvType s _ n ->
|
||||||
|
let speed | cr ^?! crType . startStopMv > n = 0
|
||||||
|
| otherwise = s
|
||||||
|
v = case cr ^?! crType . beeRandomMovement of
|
||||||
|
Nothing -> V2 speed 0
|
||||||
|
Just LeftForward -> V2 0 speed
|
||||||
|
Just RightForward -> V2 0 (-speed)
|
||||||
|
in crMvBy v lw cr
|
||||||
|
& crType . startStopMv %~ ((`mod` (n*2)) . (+1))
|
||||||
|
NoMvType -> cr
|
||||||
|
MvWalking s -> crMvBy (V2 s 0) lw cr
|
||||||
|
|
||||||
|
|
||||||
|
crMvForward :: Float -> World -> Creature -> Creature
|
||||||
crMvForward speed = crMvBy (V2 speed 0)
|
crMvForward speed = crMvBy (V2 speed 0)
|
||||||
|
|
||||||
creatureTurnTo :: Point2 -> Creature -> Creature
|
creatureTurnTo :: Point2 -> Creature -> Creature
|
||||||
@@ -89,3 +120,23 @@ creatureTurnToward p turnSpeed cr
|
|||||||
where
|
where
|
||||||
vToTarg = p -.- cr ^. crPos . _xy
|
vToTarg = p -.- cr ^. crPos . _xy
|
||||||
dirToTarget = argV vToTarg
|
dirToTarget = argV vToTarg
|
||||||
|
|
||||||
|
-- I feel like this is inefficient
|
||||||
|
mvTurnToward :: Point2 -> Float -> Creature -> Creature
|
||||||
|
mvTurnToward p' turnSpeed cr
|
||||||
|
| vToTarg == V2 0 0 = cr -- this should deal with the angleVV error
|
||||||
|
| angleVV vToTarg (unitVectorAtAngle (_crDir cr)) <= turnSpeed =
|
||||||
|
cr & crDir .~ dirToTarget
|
||||||
|
| isLeftOfA (normalizeAngle dirToTarget) (normalizeAngle $ _crDir cr) = cr & crDir +~ turnSpeed
|
||||||
|
| otherwise = cr & crDir -~ turnSpeed
|
||||||
|
where
|
||||||
|
-- when flying, inertia is high enough that overturning can be useful
|
||||||
|
p | Flying {} <- cr ^. crStance . carriage
|
||||||
|
= let v = flyInertia cr *^ (cr ^. crOldPos . _xy - cr ^. crOldOldPos . _xy)
|
||||||
|
-- u = normalize $ vNormal $ p' - cxy
|
||||||
|
--in p' - dot v u *^ u
|
||||||
|
in p' - v
|
||||||
|
| otherwise = p'
|
||||||
|
cxy = cr ^. crPos . _xy
|
||||||
|
vToTarg = p -.- cxy
|
||||||
|
dirToTarget = argV vToTarg
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
module Dodge.Creature.Impulse.UseItem (useItem) where
|
module Dodge.Creature.Impulse.UseItem (useItem) where
|
||||||
|
|
||||||
|
import qualified Data.IntSet as IS
|
||||||
import Dodge.Euse
|
import Dodge.Euse
|
||||||
import NewInt
|
import NewInt
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
@@ -14,7 +15,9 @@ import Dodge.HeldUse
|
|||||||
import Dodge.Inventory
|
import Dodge.Inventory
|
||||||
import Dodge.Item.Grammar
|
import Dodge.Item.Grammar
|
||||||
import Dodge.Item.Location
|
import Dodge.Item.Location
|
||||||
--import qualified IntMapHelp as IM
|
|
||||||
|
--note :: a -> Maybe b -> Either a b
|
||||||
|
--note x = maybe (Left x) Right
|
||||||
|
|
||||||
useItem :: Int -> Int -> World -> Maybe World
|
useItem :: Int -> Int -> World -> Maybe World
|
||||||
useItem invid pt w = fmap (worldEventFlags . at InventoryChange ?~ ()) $ do
|
useItem invid pt w = fmap (worldEventFlags . at InventoryChange ?~ ()) $ do
|
||||||
@@ -26,7 +29,10 @@ useItem invid pt w = fmap (worldEventFlags . at InventoryChange ?~ ()) $ do
|
|||||||
useItemLoc :: Creature -> LocationDT OItem -> Int -> World -> Maybe World
|
useItemLoc :: Creature -> LocationDT OItem -> Int -> World -> Maybe World
|
||||||
useItemLoc cr loc pt w
|
useItemLoc cr loc pt w
|
||||||
| aimuse
|
| aimuse
|
||||||
, fromMaybe False $ loc ^? locDT . dtValue . _1 . itLocation . ilIsAttached
|
, fromMaybe False $ do
|
||||||
|
i <- loc ^? locDT . dtValue . _1 . itLocation . ilInvID . unNInt
|
||||||
|
is <- w ^? hud . manObject . hiAttachedItems
|
||||||
|
return $ i `IS.member` is
|
||||||
, Aiming{} <- cr ^. crStance . posture =
|
, Aiming{} <- cr ^. crStance . posture =
|
||||||
return $ gadgetEffect pt loc cr w
|
return $ gadgetEffect pt loc cr w
|
||||||
| GadgetPlatformSF <- sf =
|
| GadgetPlatformSF <- sf =
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
module Dodge.Creature.LtAutoCrit (
|
|
||||||
ltAutoCrit,
|
|
||||||
) where
|
|
||||||
|
|
||||||
--import Control.Lens
|
|
||||||
import Dodge.Data.Creature
|
|
||||||
import Dodge.Default
|
|
||||||
--import Dodge.Item.Held.Stick
|
|
||||||
--import qualified IntMapHelp as IM
|
|
||||||
--import Picture
|
|
||||||
|
|
||||||
ltAutoCrit :: Creature
|
|
||||||
ltAutoCrit =
|
|
||||||
defaultCreature
|
|
||||||
{ --_crInv = IM.fromList [(0, autoPistol)]
|
|
||||||
_crHP = HP 500
|
|
||||||
}
|
|
||||||
-- & crType .~ LtAutoCrit
|
|
||||||
-- & crType . humanoidAI .~ LtAutoAI
|
|
||||||
-- & crType . skinUpper .~ lightx4 red
|
|
||||||
@@ -5,9 +5,14 @@ import Dodge.Data.Creature.Misc
|
|||||||
crMass :: CreatureType -> Float
|
crMass :: CreatureType -> Float
|
||||||
crMass = \case
|
crMass = \case
|
||||||
Avatar {} -> 10
|
Avatar {} -> 10
|
||||||
ChaseCrit {} -> 12
|
ChaseCrit {} -> 10
|
||||||
|
CrabCrit {} -> 10
|
||||||
HoverCrit {} -> 5
|
HoverCrit {} -> 5
|
||||||
SwarmCrit -> 2
|
SwarmCrit -> 2
|
||||||
AutoCrit -> 10
|
AutoCrit -> 10
|
||||||
BarrelCrit{} -> 10
|
BarrelCrit{} -> 10
|
||||||
|
SlinkCrit{} -> 100
|
||||||
LampCrit {} -> 3
|
LampCrit {} -> 3
|
||||||
|
SlimeCrit {_slimeSlime = r} -> fromIntegral r / 1000
|
||||||
|
BeeCrit {_beeSlime = x} -> 3 + fromIntegral x / 100
|
||||||
|
HiveCrit {} -> 100
|
||||||
|
|||||||
@@ -9,8 +9,13 @@ crMaterial :: CreatureType -> Material
|
|||||||
crMaterial = \case
|
crMaterial = \case
|
||||||
Avatar{_avatarMaterial = mt} -> mt
|
Avatar{_avatarMaterial = mt} -> mt
|
||||||
ChaseCrit {} -> Flesh
|
ChaseCrit {} -> Flesh
|
||||||
|
CrabCrit {} -> Flesh
|
||||||
HoverCrit {} -> Metal
|
HoverCrit {} -> Metal
|
||||||
SwarmCrit -> Flesh
|
SwarmCrit -> Flesh
|
||||||
AutoCrit -> Flesh
|
AutoCrit -> Flesh
|
||||||
|
SlinkCrit{} -> Flesh
|
||||||
BarrelCrit{} -> Metal
|
BarrelCrit{} -> Metal
|
||||||
LampCrit{} -> Glass
|
LampCrit{} -> Glass
|
||||||
|
SlimeCrit{} -> Flesh
|
||||||
|
BeeCrit{} -> Flesh
|
||||||
|
HiveCrit{} -> Flesh
|
||||||
|
|||||||
@@ -7,9 +7,13 @@ crMaxHP :: CreatureType -> Int
|
|||||||
crMaxHP = \case
|
crMaxHP = \case
|
||||||
Avatar {} -> 15000
|
Avatar {} -> 15000
|
||||||
ChaseCrit {} -> 150
|
ChaseCrit {} -> 150
|
||||||
|
CrabCrit {} -> 350
|
||||||
HoverCrit {} -> 100
|
HoverCrit {} -> 100
|
||||||
SwarmCrit -> 50
|
SwarmCrit -> 50
|
||||||
AutoCrit -> 100
|
AutoCrit -> 100
|
||||||
BarrelCrit{} -> 100
|
BarrelCrit{} -> 100
|
||||||
LampCrit {} -> 50
|
LampCrit {} -> 50
|
||||||
|
SlinkCrit {} -> 1000
|
||||||
|
SlimeCrit {} -> 1000
|
||||||
|
BeeCrit {} -> 100
|
||||||
|
HiveCrit {} -> 10000
|
||||||
|
|||||||
@@ -7,28 +7,35 @@ import Control.Lens
|
|||||||
crMvType :: Creature -> CrMvType
|
crMvType :: Creature -> CrMvType
|
||||||
crMvType cr = case _crType cr of
|
crMvType cr = case _crType cr of
|
||||||
Avatar {} -> MvWalking 1.5
|
Avatar {} -> MvWalking 1.5
|
||||||
ChaseCrit {} -> defaultChaseMvType
|
SlinkCrit {} -> NoMvType
|
||||||
HoverCrit {} -> defaultChaseMvType & mvSpeed .~ 0.15
|
ChaseCrit {} -> defaultChaseMvType & mvSpeed .~ 1.8
|
||||||
|
CrabCrit {} -> defaultChaseMvType & mvSpeed .~ 0.5
|
||||||
|
& mvTurnJit .~ 0.01
|
||||||
|
HoverCrit {} -> defaultChaseMvType & mvSpeed .~ 0.16
|
||||||
SwarmCrit -> defaultChaseMvType
|
SwarmCrit -> defaultChaseMvType
|
||||||
AutoCrit -> defaultAimMvType
|
AutoCrit -> defaultAimMvType
|
||||||
BarrelCrit {} -> defaultAimMvType
|
BarrelCrit {} -> defaultAimMvType
|
||||||
LampCrit {} -> defaultAimMvType
|
LampCrit {} -> defaultAimMvType
|
||||||
|
SlimeCrit {} -> NoMvType
|
||||||
|
BeeCrit {} -> BeeMvType 0.2 0.1 15
|
||||||
|
--BeeCrit {} -> BeeMvType 0.2 0.1 25
|
||||||
|
HiveCrit{} -> NoMvType
|
||||||
|
|
||||||
defaultAimMvType :: CrMvType
|
defaultAimMvType :: CrMvType
|
||||||
defaultAimMvType =
|
defaultAimMvType =
|
||||||
CrMvType
|
JitMvType
|
||||||
{ _mvSpeed = 3
|
{ _mvSpeed = 3
|
||||||
, _mvTurnRad = FloatConst 0.2
|
, _mvTurnRad = FloatConst 0.2
|
||||||
, _mvTurnJit = 0.05
|
, _mvTurnJit = 0.05
|
||||||
, _mvAimSpeed = FloatAbsCheckGreaterLess (pi / 8) 0.2 0.01
|
-- , _mvAimSpeed = FloatAbsCheckGreaterLess (pi / 8) 0.2 0.01
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultChaseMvType :: CrMvType
|
defaultChaseMvType :: CrMvType
|
||||||
defaultChaseMvType =
|
defaultChaseMvType =
|
||||||
CrMvType
|
JitMvType
|
||||||
{ _mvSpeed = 2
|
{ _mvSpeed = 2
|
||||||
, _mvTurnRad = FloatAbsCheckGreaterLess (pi / 4) 0.2 0.05
|
, _mvTurnRad = FloatAbsCheckGreaterLess (pi / 4) 0.2 0.05
|
||||||
--, _mvTurnJit = 0.3
|
--, _mvTurnJit = 0.3
|
||||||
, _mvTurnJit = 0.05
|
, _mvTurnJit = 0.05
|
||||||
, _mvAimSpeed = FloatAbsCheckGreaterLess (pi / 8) 0.2 0.01
|
-- , _mvAimSpeed = FloatAbsCheckGreaterLess (pi / 8) 0.2 0.01
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,12 +21,8 @@ import Linear
|
|||||||
import RandomHelp
|
import RandomHelp
|
||||||
import Sound.Data
|
import Sound.Data
|
||||||
|
|
||||||
perceptionUpdate ::
|
-- | The [Int] is a list of creature ids that may direct attention and awareness
|
||||||
-- | List of creature ids that may direct attention and awareness
|
perceptionUpdate :: [Int] -> World -> Creature -> Creature
|
||||||
[Int] ->
|
|
||||||
World ->
|
|
||||||
Creature ->
|
|
||||||
Creature
|
|
||||||
perceptionUpdate is w = rememberSounds w . basicAwarenessUpdate w . basicAttentionUpdate is w
|
perceptionUpdate is w = rememberSounds w . basicAwarenessUpdate w . basicAttentionUpdate is w
|
||||||
|
|
||||||
{- | Update a creatures awareness based upon the creatures' current direction
|
{- | Update a creatures awareness based upon the creatures' current direction
|
||||||
@@ -55,9 +51,9 @@ basicAwarenessUpdate w cr = case _cpAttention $ _crPerception cr of
|
|||||||
return $
|
return $
|
||||||
(crActionPlan . apStrategy .~ WarningCry) .
|
(crActionPlan . apStrategy .~ WarningCry) .
|
||||||
(crActionPlan . apAction
|
(crActionPlan . apAction
|
||||||
.~ [ImpulsesList (crImpulsesOnCognizant w cr)
|
.~ ImpulsesList (crImpulsesOnCognizant w cr)
|
||||||
, AimAt 0 (w ^?! cWorld . lWorld . creatures . ix 0 . crPos . _xy)
|
(AimAt 0 (w ^?! cWorld . lWorld . creatures . ix 0 . crPos . _xy))
|
||||||
])
|
)
|
||||||
|
|
||||||
crImpulsesOnCognizant :: World -> Creature -> [[Impulse]]
|
crImpulsesOnCognizant :: World -> Creature -> [[Impulse]]
|
||||||
crImpulsesOnCognizant w cr = case cr ^. crType of
|
crImpulsesOnCognizant w cr = case cr ^. crType of
|
||||||
@@ -65,6 +61,7 @@ crImpulsesOnCognizant w cr = case cr ^. crType of
|
|||||||
<> [[ChangeStrategy $ CloseToMelee 0]]
|
<> [[ChangeStrategy $ CloseToMelee 0]]
|
||||||
HoverCrit {} | Just sid <- cognizantVoc w cr -> [Bark sid]:
|
HoverCrit {} | Just sid <- cognizantVoc w cr -> [Bark sid]:
|
||||||
[[ChangeStrategy $ CloseToMelee 0]]
|
[[ChangeStrategy $ CloseToMelee 0]]
|
||||||
|
CrabCrit {} -> [[ChangeStrategy $ CloseToMelee 0]]
|
||||||
_ | Just sid <- cognizantVoc w cr -> [Bark sid]: replicate 5 [RandomImpulse $ RandImpulseCircMove 1]
|
_ | Just sid <- cognizantVoc w cr -> [Bark sid]: replicate 5 [RandomImpulse $ RandImpulseCircMove 1]
|
||||||
_ -> replicate 5 [RandomImpulse $ RandImpulseCircMove 3]
|
_ -> replicate 5 [RandomImpulse $ RandImpulseCircMove 3]
|
||||||
|
|
||||||
@@ -135,14 +132,10 @@ decreaseAwareness (Cognizant 0) = Just $ Suspicious 1000
|
|||||||
decreaseAwareness (Cognizant x) = Just $ Cognizant $ x - 50
|
decreaseAwareness (Cognizant x) = Just $ Cognizant $ x - 50
|
||||||
|
|
||||||
{- | Given a fixed group of creatures, direct attention to those of them that
|
{- | Given a fixed group of creatures, direct attention to those of them that
|
||||||
- are in view.
|
are in view.
|
||||||
|
The ints are ids of creatures that may attract this creature's attention
|
||||||
-}
|
-}
|
||||||
basicAttentionUpdate ::
|
basicAttentionUpdate :: [Int] -> World -> Creature -> Creature
|
||||||
-- | Creatures that may attract this creature's attention
|
|
||||||
[Int] ->
|
|
||||||
World ->
|
|
||||||
Creature ->
|
|
||||||
Creature
|
|
||||||
basicAttentionUpdate cids w cr =
|
basicAttentionUpdate cids w cr =
|
||||||
cr & crPerception . cpAttention
|
cr & crPerception . cpAttention
|
||||||
.~ AttentiveTo (IM.mapMaybe (newExtraAwareness cr w) $ IM.fromList $ zip cids cids)
|
.~ AttentiveTo (IM.mapMaybe (newExtraAwareness cr w) $ IM.fromList $ zip cids cids)
|
||||||
|
|||||||
+374
-78
@@ -3,145 +3,430 @@ Drawing of creatures.
|
|||||||
Takes into account damage etc.
|
Takes into account damage etc.
|
||||||
-}
|
-}
|
||||||
module Dodge.Creature.Picture (
|
module Dodge.Creature.Picture (
|
||||||
basicCrPict,
|
makeCorpse,
|
||||||
deadScalp,
|
drawCreature,
|
||||||
deadUpperBody,
|
|
||||||
deadFeet,
|
|
||||||
drawChaseCrit,
|
|
||||||
drawHoverCrit,
|
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Dodge.Base.Collide
|
|
||||||
import Control.Monad
|
|
||||||
import Data.Maybe
|
|
||||||
import Dodge.Data.World
|
|
||||||
import Linear
|
|
||||||
import Dodge.Data.Equipment.Misc
|
|
||||||
import Dodge.Creature.HandPos
|
|
||||||
import qualified Data.IntMap.Strict as IM
|
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
|
import Control.Monad
|
||||||
|
import Data.Foldable
|
||||||
|
import qualified Data.IntMap.Strict as IM
|
||||||
|
import Data.Maybe
|
||||||
|
import qualified Data.Strict.Tuple as ST
|
||||||
|
import Dodge.Base.Collide
|
||||||
|
import Dodge.Creature.HandPos
|
||||||
import Dodge.Creature.Radius
|
import Dodge.Creature.Radius
|
||||||
import Dodge.Creature.Shape
|
import Dodge.Creature.Shape
|
||||||
--import Dodge.Creature.Test
|
import Dodge.Creature.Slime
|
||||||
import Dodge.Damage
|
import Dodge.Damage
|
||||||
--import Dodge.Data.Creature
|
import Dodge.Data.Equipment.Misc
|
||||||
|
import Dodge.Data.World
|
||||||
import Dodge.Item.Draw
|
import Dodge.Item.Draw
|
||||||
import Dodge.Item.Grammar
|
import Dodge.Item.Grammar
|
||||||
import Geometry
|
import Geometry
|
||||||
|
import Geometry.Zone
|
||||||
|
import Linear
|
||||||
import Picture
|
import Picture
|
||||||
import qualified Quaternion as Q
|
import qualified Quaternion as Q
|
||||||
|
import RandomHelp
|
||||||
import Shape
|
import Shape
|
||||||
--import Shape
|
|
||||||
import ShapePicture
|
import ShapePicture
|
||||||
|
|
||||||
basicCrPict :: IM.IntMap Item -> Creature -> SPic
|
drawCreature :: World -> IM.IntMap Item -> Creature -> SPic
|
||||||
basicCrPict m cr = drawEquipment m cr <> noPic (basicCrShape cr)
|
drawCreature w m cr = translateSP (_crPos cr) . fallrot . rotateSP (_crDir cr) $
|
||||||
|
case cr ^. crType of
|
||||||
|
_ | CrIsCorpse sp <- cr ^. crHP -> sp
|
||||||
|
_ | null (cr ^? crHP . _HP) -> mempty
|
||||||
|
BarrelCrit{} -> barrelShape
|
||||||
|
LampCrit{_lampHeight = h} -> lampCrSPic h
|
||||||
|
ChaseCrit{} -> noPic $ drawChaseCrit w cr
|
||||||
|
Avatar{} -> basicCrPict w m cr
|
||||||
|
SwarmCrit -> basicCrPict w m cr
|
||||||
|
AutoCrit -> basicCrPict w m cr
|
||||||
|
CrabCrit{} -> noPic $ drawCrabCrit w cr
|
||||||
|
HoverCrit{} -> noPic $ drawHoverCrit cr
|
||||||
|
SlinkCrit{} -> noPic $ drawSlinkCrit cr
|
||||||
|
SlimeCrit{} -> noPic $ drawSlimeCrit cr
|
||||||
|
BeeCrit{} -> noPic $ drawBeeCrit cr
|
||||||
|
HiveCrit{} -> drawHive
|
||||||
|
where
|
||||||
|
fallrot = case cr ^? crStance . carriage . carDir of
|
||||||
|
Just q -> _1 . each . sfVs . each %~ Q.rotate q
|
||||||
|
_ -> id
|
||||||
|
|
||||||
crCamouflage :: Creature -> CamouflageStatus
|
drawSlimeCrit :: Creature -> Shape
|
||||||
crCamouflage _ = FullyVisible
|
drawSlimeCrit cr =
|
||||||
|
colorSH green $
|
||||||
|
upperPrismPolyHalf Medium Typical (cr ^?! crType . slimeEngulfProgress + min 15 r) ps
|
||||||
|
where
|
||||||
|
r = slimeToRad $ cr ^?! crType . slimeSlime - cr ^?! crType . slimeSlimeChange
|
||||||
|
so = slimeOutline cr
|
||||||
|
ps = fromMaybe so $ do
|
||||||
|
SlimeDistortion x' qs _ <- cr ^? crType . slimeDistortion
|
||||||
|
let x = fromIntegral x'
|
||||||
|
guard $ length qs == 12
|
||||||
|
return $ zipWith (+) (fmap (0.1 * (10 - x) *^) so) (fmap (0.1 * x *^) qs)
|
||||||
|
|
||||||
basicCrShape :: Creature -> Shape
|
basicCrPict :: World -> IM.IntMap Item -> Creature -> SPic
|
||||||
basicCrShape cr
|
basicCrPict w m cr = drawEquipment w m cr <> noPic (basicCrShape w cr)
|
||||||
| crCamouflage cr == Invisible = mempty
|
|
||||||
| otherwise =
|
basicCrShape :: World -> Creature -> Shape
|
||||||
scaleSH (V3 crsize crsize crsize) $
|
basicCrShape w cr =
|
||||||
mconcat
|
scaleSH (V3 crsize crsize crsize) $
|
||||||
[ colorSH (_skinHead cskin) . overPosSH (translateToES cr OnHead) $ scalp
|
mconcat
|
||||||
, colorSH (_skinUpper cskin) $ upperBody cr
|
[ colorSH (_skinHead cskin) . overPosSH (translateToES w cr OnHead) $ scalp
|
||||||
, rotmdir $ colorSH (_skinLower cskin) $ feet cr
|
, colorSH (_skinUpper cskin) $ upperBody w cr
|
||||||
]
|
, rotmdir $ colorSH (_skinLower cskin) $ feet cr
|
||||||
|
]
|
||||||
where
|
where
|
||||||
cskin = crShape $ _crType cr
|
cskin = crShape $ _crType cr
|
||||||
crsize = 0.1 * crRad (cr ^. crType)
|
crsize = 0.1 * crRad (cr ^. crType)
|
||||||
rotmdir = rotateSH (_crMvDir cr - _crDir cr)
|
rotmdir = rotateSH (_crMvDir cr - _crDir cr)
|
||||||
|
|
||||||
|
drawSlinkCrit :: Creature -> Shape
|
||||||
|
drawSlinkCrit cr =
|
||||||
|
snd (foldl' f ((V3 0 0 0, Q.qid), mempty) $ cr ^?! crType . slinkSpine)
|
||||||
|
<> shead
|
||||||
|
& each . sfColor .~ cskin ^?! skinUpper
|
||||||
|
where
|
||||||
|
shead =
|
||||||
|
polyCirc 6 15
|
||||||
|
& upperPrismPoly Medium Important 10
|
||||||
|
& each . sfVs . each %~ Q.apply (cr ^?! crType . slinkHeadPos)
|
||||||
|
cskin = crShape $ _crType cr
|
||||||
|
f ((p, q), sh) (p', q') = ((p, q) `Q.comp` (p', q'), sh <> (g p' & each . sfVs . each %~ Q.apply (p, q)))
|
||||||
|
g _ = upperPrismPoly Medium Important 2 $ polyCirc 6 15
|
||||||
|
|
||||||
drawHoverCrit :: Creature -> Shape
|
drawHoverCrit :: Creature -> Shape
|
||||||
drawHoverCrit cr = colorSH (_skinHead cskin)
|
drawHoverCrit cr =
|
||||||
(overPosSH (Q.apply tpq) $ upperBoxHalf Medium Typical 1 $ square 4)
|
colorSH
|
||||||
<> colorSH (_skinUpper cskin)
|
(_skinHead cskin)
|
||||||
(mconcat [overPosSH (Q.apply $ f a) $ upperBox Medium Typical 1 $ polyCirc 3 5 | a <- [0,pi/2,pi,1.5*pi]])
|
(overPosSH (Q.apply tpq) $ upperBoxHalf Medium Typical 1 $ square 4)
|
||||||
|
<> colorSH
|
||||||
|
(_skinUpper cskin)
|
||||||
|
(mconcat [overPosSH (Q.apply $ f a) $ upperBox Medium Typical 1 $ polyCirc 3 5 | a <- [0, pi / 2, pi, 1.5 * pi]])
|
||||||
where
|
where
|
||||||
cskin = crShape $ _crType cr
|
cskin = crShape $ _crType cr
|
||||||
f a = tpq `Q.comp` (1 & _xy .~ rotateV a 5, Q.qid)
|
f a = tpq `Q.comp` (1 & _xy .~ rotateV a 5, Q.qid)
|
||||||
tpq = (V3 0 0 0, Q.qid)
|
tpq = (V3 0 0 0, Q.qid)
|
||||||
|
|
||||||
|
drawHive :: SPic
|
||||||
|
drawHive = noPic $ upperPrismPolyHalfMI 25 $ polyCirc 6 20
|
||||||
|
|
||||||
|
drawBeeCrit :: Creature -> Shape
|
||||||
|
drawBeeCrit cr =
|
||||||
|
colorSH
|
||||||
|
col
|
||||||
|
(f . upperPrismPolyHalfMI 3 $ polyCirc 6 r)
|
||||||
|
<> colorSH (dark col) (overPosSH (Q.apply beakpos) $ upperPrismPolyHalfST 1 [V2 0 (-2), V2 4 0, V2 0 2])
|
||||||
|
where
|
||||||
|
r = cr ^. crType . to crRad
|
||||||
|
beakpos = (V3 (r - 1) 0 0, Q.qid)
|
||||||
|
col | cr ^?! crType . beeAggro > 0 = red
|
||||||
|
| otherwise = yellow
|
||||||
|
f | Mounted{} <- cr ^. crStance . carriage =
|
||||||
|
each.sfVs.each._y *~ g (modTo 1 $ cr ^?! crType . beeSlime . to ((/ 100) . fromIntegral))
|
||||||
|
| otherwise = id
|
||||||
|
g x | x > 0.5 = 2 - x
|
||||||
|
| otherwise = 1 + x
|
||||||
|
|
||||||
|
drawCrabCrit :: World -> Creature -> Shape
|
||||||
|
drawCrabCrit w cr =
|
||||||
|
mconcat
|
||||||
|
[ crabUpperBody w cr
|
||||||
|
, colorSH (_skinLower cskin) $ crabFeet w cr
|
||||||
|
]
|
||||||
|
where
|
||||||
|
cskin = crShape $ _crType cr
|
||||||
|
|
||||||
drawChaseCrit :: World -> Creature -> Shape
|
drawChaseCrit :: World -> Creature -> Shape
|
||||||
drawChaseCrit w cr = mconcat
|
drawChaseCrit w cr =
|
||||||
[ chaseUpperBody w cr
|
mconcat
|
||||||
, rotmdir $ colorSH (_skinLower cskin) $ feet cr
|
[ chaseUpperBody w cr
|
||||||
]
|
, rotmdir $ colorSH (_skinLower cskin) $ feet cr
|
||||||
|
]
|
||||||
where
|
where
|
||||||
cskin = crShape $ _crType cr
|
cskin = crShape $ _crType cr
|
||||||
rotmdir = rotateSH (_crMvDir cr - _crDir cr)
|
rotmdir = rotateSH (_crMvDir cr - _crDir cr)
|
||||||
|
|
||||||
chaseUpperBody :: World -> Creature -> Shape
|
crabUpperBody :: World -> Creature -> Shape
|
||||||
chaseUpperBody w cr = colorSH (_skinUpper cskin)
|
crabUpperBody _ cr =
|
||||||
(overPosSH (Q.apply torsoq) (upperPrismPolyHalfMI tz $ polyCirc 3 12
|
colorSH
|
||||||
& each %~ vNormal
|
(_skinUpper cskin)
|
||||||
& each . _y *~ 0.6)
|
( overPosSH
|
||||||
<> overPosSH (Q.apply neckq) (upperPrismPolyHalfMI 3 $ (+ V2 8 0) . vNormal <$> trapTBH 2 5 8)
|
(Q.apply torsoq)
|
||||||
)
|
( upperPrismPolyHalfMI 5 $
|
||||||
<> colorSH (_skinHead cskin)
|
polyCirc 4 10
|
||||||
(overPosSH (Q.apply headq) (upperBox Medium Important 2 [V2 0 (-4), V2 9 0, V2 0 4]))
|
& each . _x *~ 0.6
|
||||||
|
)
|
||||||
|
<> overPosSH (Q.apply lclawq) (upperPrismPolyHalfMI 4 $ rectNSWE 20 0 (-2) 2)
|
||||||
|
<> overPosSH (Q.apply rclawq) (upperPrismPolyHalfMI 4 $ rectNSWE 0 (-20) (-2) 2)
|
||||||
|
)
|
||||||
|
<> colorSH
|
||||||
|
(_skinHead cskin)
|
||||||
|
(overPosSH (Q.apply headq) (upperPrismPolyHalfMI 1 $ square 2))
|
||||||
where
|
where
|
||||||
-- time = fromIntegral (mod (w ^. unpauseClock) 100) / 5
|
torsoq = (V3 0 0 10, Q.qid)
|
||||||
|
lclawq = torsoq `Q.comp` (V3 2 8 1, Q.slerp latck lrest lcool)
|
||||||
|
latck = Q.axisAngle (V3 0 0 1) (-0.5 * pi)
|
||||||
|
lrest = Q.axisAngle (V3 1 0 0) 1
|
||||||
|
cskin = crShape $ _crType cr
|
||||||
|
lcool = 1 - min 10 (fromIntegral . _meleeCooldownL $ _crType cr) / 10
|
||||||
|
rclawq = torsoq `Q.comp` (V3 2 (-8) 1, Q.slerp ratck rrest rcool)
|
||||||
|
ratck = Q.axisAngle (V3 0 0 1) (0.5 * pi)
|
||||||
|
rrest = Q.axisAngle (V3 1 0 0) (-1)
|
||||||
|
rcool = 1 - min 10 (fromIntegral . _meleeCooldownR $ _crType cr) / 10
|
||||||
|
headq = torsoq `Q.comp` (V3 3 0 4, Q.qid)
|
||||||
|
|
||||||
|
chaseUpperBody :: World -> Creature -> Shape
|
||||||
|
chaseUpperBody w cr =
|
||||||
|
-- colorSH
|
||||||
|
-- (_skinUpper cskin)
|
||||||
|
( overPosSH
|
||||||
|
(Q.apply torsoq)
|
||||||
|
( upperPrismPolyHalfMI tz $
|
||||||
|
polyCirc 3 12
|
||||||
|
& each %~ vNormal
|
||||||
|
& each . _y *~ 0.6
|
||||||
|
)
|
||||||
|
<> overPosSH (Q.apply neckq) lneckshape
|
||||||
|
<> overPosSH (Q.apply neckq2) uneckshape
|
||||||
|
)
|
||||||
|
<> colorSH
|
||||||
|
-- (_skinHead cskin)
|
||||||
|
yellow headshape
|
||||||
|
where
|
||||||
|
-- time = fromIntegral (mod (w ^. unpauseClock) 100) / 5
|
||||||
tz = 4
|
tz = 4
|
||||||
cskin = crShape $ _crType cr
|
cskin = crShape $ _crType cr
|
||||||
torsoq = (V3 0 0 (10 + tz + tbob),Q.qid)
|
torsoq = (V3 0 0 (10 + tz + tbob), Q.qy (-cr ^?! crType . chaseqy0))
|
||||||
mcool = 1 - min 10 (fromIntegral . _meleeCooldown $ _crType cr) / 10
|
mcool = 1 - min 10 (fromIntegral . _meleeCooldown $ _crType cr) / 10
|
||||||
neckq = torsoq `Q.comp` (V3 6 0 0, Q.qz aimrot * Q.axisAngle (V3 0 1 0) (-1.8*mcool))
|
-- (qy1,qy2,qy3)
|
||||||
headq = neckq `Q.comp` (V3 16 0 0, Q.axisAngle (V3 0 1 0) (2*mcool+vocaltilt) * Q.qz aimrot )
|
---- | CloseToMelee i <- cr ^?!crActionPlan.apStrategy
|
||||||
|
---- = (0,0,0)
|
||||||
|
-- | otherwise = (pi/3,-2*pi/3,pi/3)
|
||||||
|
-- | otherwise = (pi * w^.cWorld.cClock.to ((*0.01).fromIntegral),0,0)
|
||||||
|
-- | otherwise = (-1.8 * mcool , 0, 2 * mcool + vocaltilt)
|
||||||
|
qy1 = cr ^?! crType . chaseqy1
|
||||||
|
qy2 = cr ^?! crType . chaseqy2
|
||||||
|
qy3 = cr ^?! crType . chaseqy3
|
||||||
|
lneckshape = colorSH red $ upperPrismPolyHalfMI 4 (vNormal <$> trapTBH 2 5 (nlen/4))
|
||||||
|
& each . sfVs . each +~ V3 (nlen/4) 0 (-2)
|
||||||
|
uneckshape = colorSH green $ upperPrismPolyHalfMI 3 (vNormal <$> trapTBH 3 2 (nlen/4))
|
||||||
|
& each . sfVs . each +~ V3 (nlen/4) 0 (-1.5)
|
||||||
|
headshape = overPosSH (Q.apply headq) (upperBox Medium Important 2 [V2 0 (-4), V2 9 0, V2 0 4])
|
||||||
|
neckq = torsoq `Q.comp` (V3 8 0 4, Q.qz aimrot * Q.qy (pi + qy1))
|
||||||
|
neckq2 = neckq `Q.comp` (V3 (nlen/2) 0 0, Q.qy qy2)
|
||||||
|
headq = neckq2 `Q.comp` (V3 (nlen/2) 0 0, Q.qy (pi + qy3) * Q.qz aimrot)
|
||||||
|
nlen = 16
|
||||||
vocaltilt = case cr ^? crVocalization . vcTime of
|
vocaltilt = case cr ^? crVocalization . vcTime of
|
||||||
Just x | x < 20 -> -pi * 0.05 * (10 - abs (fromIntegral x - 10))
|
Just x | x < 20 -> -pi * 0.05 * (10 - abs (fromIntegral x - 10))
|
||||||
_ -> 0
|
_ -> 0
|
||||||
sLen = strideLength cr
|
sLen = strideLength cr
|
||||||
tbob = 5 * (1 - oneSmooth (abs llegpos))
|
tbob = 5 * (1 - oneSmooth (abs llegpos))
|
||||||
llegpos = case (cr ^? crType . strideAmount,cr ^? crType . footForward) of
|
llegpos = case (cr ^? crType . strideAmount, cr ^? crType . footForward) of
|
||||||
(Just sa, Just LeftForward) -> f sa
|
(Just sa, Just LeftForward) -> f sa
|
||||||
(Just sa, Just RightForward) -> -f sa
|
(Just sa, Just RightForward) -> -f sa
|
||||||
_ -> 0
|
_ -> 0
|
||||||
--tbob = 2 * oneSmooth ((sLen - 2*i) / sLen)
|
-- tbob = 2 * oneSmooth ((sLen - 2*i) / sLen)
|
||||||
f i = (sLen - 2*i) / sLen
|
f i = (sLen - 2 * i) / sLen
|
||||||
cxy = cr ^. crPos . _xy
|
cxy = cr ^. crPos . _xy
|
||||||
aimrot = fromMaybe pi $ do
|
aimrot = fromMaybe pi $ do
|
||||||
i <- cr ^. crIntention . targetCr
|
i <- cr ^. crIntention . targetCr
|
||||||
tcxy <- w ^? cWorld . lWorld . creatures . ix i . crPos . _xy
|
tcxy <- w ^? cWorld . lWorld . creatures . ix i . crPos . _xy
|
||||||
guard $ hasLOSIndirect cxy tcxy w
|
guard $ hasLOSIndirect cxy tcxy w
|
||||||
return . (0.5*) . nearZeroAngle $ argV (tcxy - cxy) - cr ^. crDir
|
return . (0.5 *) . nearZeroAngle $ argV (tcxy - cxy) - cr ^. crDir
|
||||||
|
|
||||||
|
{- NECK ARTICULATION
|
||||||
|
Viewed from side, all hinges, torso/lower neck also hinges in Q.qz (not shown)
|
||||||
|
na1 na2 na3 <- angles, in diagram all == 0, in Q.qy
|
||||||
|
| | |
|
||||||
|
---.---.---.--- z
|
||||||
|
| | | | ^>x
|
||||||
|
torso | u.neck|
|
||||||
|
l.neck head
|
||||||
|
Rough examples
|
||||||
|
Flat aim: Resting:
|
||||||
|
.\\
|
||||||
|
\ \\
|
||||||
|
. .
|
||||||
|
/ \ /
|
||||||
|
---. .--- ---.
|
||||||
|
a1 = 60 a1 = 60
|
||||||
|
a2 = -120 a2 = 60
|
||||||
|
a3 = 60 a3 = -160
|
||||||
|
-}
|
||||||
|
|
||||||
|
--ikTwoArms :: Point3 -> Point3 -> Point3 -> Point3 -> (QFloat,QFloat)
|
||||||
|
--ikTwoArms
|
||||||
|
|
||||||
oneSmooth :: Float -> Float
|
oneSmooth :: Float -> Float
|
||||||
oneSmooth x = sin (pi * x * 0.5)
|
oneSmooth x = sin (pi * x * 0.5)
|
||||||
|
|
||||||
feet :: Creature -> Shape
|
feet :: Creature -> Shape
|
||||||
{-# INLINE feet #-}
|
{-# INLINE feet #-}
|
||||||
feet cr = case (cr ^? crType . strideAmount,cr ^? crType . footForward) of
|
feet cr = case (cr ^? crType . strideAmount, cr ^? crType . footForward) of
|
||||||
(Just sa,Just LeftForward) -> sh (f sa)
|
(Just sa, Just LeftForward) -> sh (f sa)
|
||||||
(Just sa,Just RightForward) -> sh (-f sa)
|
(Just sa, Just RightForward) -> sh (-f sa)
|
||||||
_ -> sh 0
|
_ -> sh 0
|
||||||
where
|
where
|
||||||
sh x = translateSHxy x off aFoot <> translateSHxy (- x) (- off) aFoot
|
sh x = translateSHxy x off aFoot <> translateSHxy (-x) (-off) aFoot
|
||||||
aFoot = upperPrismPolyST 10 $ polyCirc 3 4
|
aFoot = upperPrismPolyST 10 $ polyCirc 3 4
|
||||||
off = 5
|
off = 5
|
||||||
sLen = strideLength cr
|
sLen = strideLength cr
|
||||||
-- f i = 8 * (sLen - 2*i) / sLen
|
-- f i = 8 * (sLen - 2*i) / sLen
|
||||||
f i = 8 * oneSmooth ((sLen - 2*i) / sLen)
|
f i = 8 * oneSmooth ((sLen - 2 * i) / sLen)
|
||||||
|
|
||||||
|
crabFeet :: World -> Creature -> Shape
|
||||||
|
{-# INLINE crabFeet #-}
|
||||||
|
crabFeet _ cr =
|
||||||
|
uncurryV translateSHxy rpos (afoot & each . sfVs . each %~ Q.rotate r1)
|
||||||
|
<> ( afoot
|
||||||
|
& each . sfVs . each %~ Q.rotate r2
|
||||||
|
& each . sfVs . each +~ V3 0 2 5
|
||||||
|
)
|
||||||
|
<> uncurryV translateSHxy rpos' (afoot & each . sfVs . each %~ Q.rotate r1')
|
||||||
|
<> ( afoot
|
||||||
|
& each . sfVs . each %~ Q.rotate r2'
|
||||||
|
& each . sfVs . each +~ V3 0 2 5
|
||||||
|
)
|
||||||
|
<> uncurryV translateSHxy lpos (afoot & each . sfVs . each %~ Q.rotate l1)
|
||||||
|
<> ( afoot
|
||||||
|
& each . sfVs . each %~ Q.rotate l2
|
||||||
|
& each . sfVs . each +~ V3 0 (-2) 5
|
||||||
|
)
|
||||||
|
<> uncurryV translateSHxy lpos' (afoot & each . sfVs . each %~ Q.rotate l1')
|
||||||
|
<> ( afoot
|
||||||
|
& each . sfVs . each %~ Q.rotate l2'
|
||||||
|
& each . sfVs . each +~ V3 0 (-2) 5
|
||||||
|
)
|
||||||
|
where
|
||||||
|
rpos = rot (cr ^?! crType . rFootPos - cxy)
|
||||||
|
rot = rotateV cdir
|
||||||
|
lpos = rot (cr ^?! crType . lFootPos - cxy)
|
||||||
|
f p q = q + 2 *^ (p - q)
|
||||||
|
cdir = -cr ^. crDir
|
||||||
|
cxy = cr ^. crPos . _xy
|
||||||
|
afoot = upperPrismPolyHalfST 10 $ polyCirc 3 2
|
||||||
|
(r1, r2) = spiderJoint (0 & _xy .~ rpos) (V3 0 2 5)
|
||||||
|
rpos' = f (V2 0 10) rpos
|
||||||
|
(r1', r2') = spiderJoint (0 & _xy .~ rpos') (V3 0 2 5)
|
||||||
|
(l1, l2) = spiderJoint (0 & _xy .~ lpos) (V3 0 (-2) 5)
|
||||||
|
lpos' = f (V2 0 (-10)) lpos
|
||||||
|
(l1', l2') = spiderJoint (0 & _xy .~ lpos') (V3 0 (-2) 5)
|
||||||
|
|
||||||
|
spiderJoint :: Point3 -> Point3 -> (Q.Quaternion Float, Q.Quaternion Float)
|
||||||
|
spiderJoint p q = (f $ Q.axisAngle (V3 0 (-1) 0) (pi - (a + b)), f . Q.axisAngle (V3 0 (-1) 0) $ a - b)
|
||||||
|
where
|
||||||
|
-- spiderJoint p q = (Q.qz c, Q.axisAngle (V3 0 (-1) 0) $ a)
|
||||||
|
|
||||||
|
a = angleThreeSides 10 (distance p q) 10
|
||||||
|
b = angleVV3 (q - p) (V3 0 0 (-1))
|
||||||
|
c = argV $ (p - q) ^. _xy
|
||||||
|
f x = Q.qz c * x
|
||||||
|
|
||||||
|
-- spiderJoint' :: Point3 -> Float -> Float -> Point3 -> (Q.Quaternion Float, Q.Quaternion Float)
|
||||||
|
-- spiderJoint' p l1 l2 q = (f $ Q.axisAngle (V3 0 (-1) 0) (pi - (a+b)), f . Q.axisAngle (V3 0 (-1) 0) $ a - b)
|
||||||
|
----spiderJoint p q = (Q.qz c, Q.axisAngle (V3 0 (-1) 0) $ a)
|
||||||
|
-- where
|
||||||
|
-- a = angleThreeSides 10 (distance p q) 10
|
||||||
|
-- b = angleVV3 (q-p) (V3 0 0 (-1))
|
||||||
|
-- c = argV $ (p-q) ^. _xy
|
||||||
|
-- f x = Q.qz c * x
|
||||||
|
|
||||||
|
makeCorpse :: World -> StdGen -> Creature -> SPic
|
||||||
|
makeCorpse w g cr = case cr ^. crType of
|
||||||
|
HoverCrit{} -> noPic $ drawHoverCrit cr
|
||||||
|
ChaseCrit{} -> noPic $ chaseCorpse g cr
|
||||||
|
CrabCrit{} -> noPic $ crabCorpse g cr
|
||||||
|
BeeCrit{} -> noPic $ drawBeeCrit cr
|
||||||
|
_ ->
|
||||||
|
noPic
|
||||||
|
. scaleSH (V3 crsize crsize crsize)
|
||||||
|
$ mconcat
|
||||||
|
[ colorSH (_skinHead cskin) $ deadScalp cr
|
||||||
|
, colorSH (_skinUpper cskin) $ deadUpperBody w cr
|
||||||
|
, rotmdir $ colorSH (_skinLower cskin) $ deadFeet cr
|
||||||
|
]
|
||||||
|
where
|
||||||
|
cskin = crShape $ _crType cr -- this should be fixed
|
||||||
|
crsize = 0.1 * crRad (cr ^. crType)
|
||||||
|
rotmdir = rotateSH (_crMvDir cr - _crDir cr)
|
||||||
|
|
||||||
|
chaseCorpse :: StdGen -> Creature -> Shape
|
||||||
|
chaseCorpse g cr =
|
||||||
|
mconcat
|
||||||
|
[ colorSH (_skinUpper cskin) . upperPrismPolyHalfMI 0 $
|
||||||
|
polyCirc 3 12
|
||||||
|
& each %~ vNormal
|
||||||
|
& each . _y *~ 0.6
|
||||||
|
, colorSH (_skinUpper cskin) . overPosSH (Q.apply neckq) $
|
||||||
|
upperPrismPolyHalfMI 3 ((+ V2 8 0) . vNormal <$> trapTBH 2 5 8)
|
||||||
|
, colorSH
|
||||||
|
(_skinHead cskin)
|
||||||
|
(overPosSH (Q.apply headq) (upperBox Medium Important 2 [V2 0 (-4), V2 9 0, V2 0 4]))
|
||||||
|
, rotmdir $ colorSH (_skinLower cskin) $ deadFeet cr
|
||||||
|
]
|
||||||
|
where
|
||||||
|
neckq = (V3 6 0 0, Q.qz a)
|
||||||
|
(a, g') = randomR (-2, 2) g
|
||||||
|
b = fst $ randomR (-2, 2) g'
|
||||||
|
cskin = crShape $ _crType cr -- this should be fixed
|
||||||
|
rotmdir = rotateSH (_crMvDir cr - _crDir cr)
|
||||||
|
headq = neckq `Q.comp` (V3 16 0 0, Q.qz b)
|
||||||
|
|
||||||
|
crabCorpse :: StdGen -> Creature -> Shape
|
||||||
|
crabCorpse g cr =
|
||||||
|
mconcat
|
||||||
|
[ colorSH (_skinUpper cskin) $
|
||||||
|
overPosSH
|
||||||
|
(Q.apply torsoq)
|
||||||
|
( upperPrismPolyHalfMI 5 $
|
||||||
|
polyCirc 4 10
|
||||||
|
& each . _x *~ 0.6
|
||||||
|
)
|
||||||
|
, colorSH (_skinUpper cskin) $
|
||||||
|
overPosSH (Q.apply lclawq) (upperPrismPolyHalfMI 4 $ rectNSWE 20 0 (-2) 2)
|
||||||
|
<> overPosSH (Q.apply rclawq) (upperPrismPolyHalfMI 4 $ rectNSWE 0 (-20) (-2) 2)
|
||||||
|
, colorSH (cskin ^?! skinLower) $
|
||||||
|
foldMap (mkfoot 5) (take 2 ps)
|
||||||
|
<> foldMap (mkfoot (-5)) (take 2 $ drop 2 ps)
|
||||||
|
, colorSH
|
||||||
|
(_skinHead cskin)
|
||||||
|
(overPosSH (Q.apply headq) (upperPrismPolyHalfMI 1 $ square 2))
|
||||||
|
]
|
||||||
|
where
|
||||||
|
headq = torsoq `Q.comp` (V3 3 0 4, Q.qid)
|
||||||
|
torsoq = (V3 0 0 0, Q.qid)
|
||||||
|
lclawq = torsoq `Q.comp` (V3 2 8 1, Q.axisAngle (V3 1 0 0) (-0.1) * Q.qz la)
|
||||||
|
(la, g') = randomR (-2, 2) g
|
||||||
|
ra = fst $ randomR (-2, 2) g'
|
||||||
|
ps = evalState (replicateM 4 (randInCirc 9)) g
|
||||||
|
mkfoot y p =
|
||||||
|
let p' = 0 & _xy .~ p + V2 0 (3 * y)
|
||||||
|
(q1, q2) = spiderJoint (V3 0 y 0) p'
|
||||||
|
in (afoot & each . sfVs . each %~ Q.apply (V3 0 y 0, q1))
|
||||||
|
<> (afoot & each . sfVs . each %~ Q.apply (p', q2))
|
||||||
|
afoot = upperPrismPolyST 10 $ polyCirc 3 2
|
||||||
|
rclawq = torsoq `Q.comp` (V3 2 (-8) 1, Q.axisAngle (V3 1 0 0) 0.1 * Q.qz ra)
|
||||||
|
cskin = crShape $ _crType cr -- this should be fixed
|
||||||
|
|
||||||
deadFeet :: Creature -> Shape
|
deadFeet :: Creature -> Shape
|
||||||
{-# INLINE deadFeet #-}
|
{-# INLINE deadFeet #-}
|
||||||
deadFeet = feet
|
deadFeet = feet
|
||||||
|
|
||||||
arms :: Creature -> Shape
|
arms :: World -> Creature -> Shape
|
||||||
{-# INLINE arms #-}
|
{-# INLINE arms #-}
|
||||||
arms cr =
|
arms w cr =
|
||||||
(^. _1) $
|
(^. _1) $
|
||||||
translateToRightHand cr aHand
|
translateToRightHand w cr aHand
|
||||||
<> translateToLeftHand cr aHand
|
<> translateToLeftHand w cr aHand
|
||||||
where
|
where
|
||||||
aHand = noPic $ translateSHz (-2) . upperPrismPolyHalfST 2 $ polyCirc 3 4
|
aHand = noPic $ translateSHz (-2) . upperPrismPolyHalfST 2 $ polyCirc 3 4
|
||||||
|
|
||||||
deadScalp :: Creature -> Shape
|
deadScalp :: Creature -> Shape
|
||||||
--deadScalp cr = deadRot cr . translateSHz 5 . scalp $ cr
|
-- deadScalp cr = deadRot cr . translateSHz 5 . scalp $ cr
|
||||||
--deadScalp cr = deadRot cr . translateSHz (-5) . scalp $ cr
|
-- deadScalp cr = deadRot cr . translateSHz (-5) . scalp $ cr
|
||||||
deadScalp _ = translateSH (V3 (-13) 0 0) scalp
|
deadScalp _ = translateSH (V3 (-13) 0 0) scalp
|
||||||
|
|
||||||
deadRot :: Creature -> Shape -> Shape
|
deadRot :: Creature -> Shape -> Shape
|
||||||
@@ -155,28 +440,39 @@ deadRot cr = overPosSH (Q.rotateToZ d)
|
|||||||
|
|
||||||
scalp :: Shape
|
scalp :: Shape
|
||||||
{-# INLINE scalp #-}
|
{-# INLINE scalp #-}
|
||||||
scalp = (colorSH (greyN 0.9) . upperPrismPolyHalfST 5 $ polyCirc 3 5)
|
scalp =
|
||||||
|
(colorSH (greyN 0.9) . upperPrismPolyHalfST 5 $ polyCirc 3 5)
|
||||||
& each . sfShadowImportance .~ Unimportant
|
& each . sfShadowImportance .~ Unimportant
|
||||||
|
|
||||||
torso :: Creature -> Shape
|
torso :: World -> Creature -> Shape
|
||||||
{-# INLINE torso #-}
|
{-# INLINE torso #-}
|
||||||
torso cr = overPosSH (translateToES cr OnBack) tsh
|
torso w cr = overPosSH (translateToES w cr OnBack) tsh
|
||||||
where
|
where
|
||||||
tsh = ashoulder 3 (-0.2) <> ashoulder (-3) 0.2
|
tsh = ashoulder 3 (-0.2) <> ashoulder (-3) 0.2
|
||||||
ashoulder y a = translateSHxy 0 y . rotateSH a $ scaleSH (V3 10 10 1) baseShoulder
|
ashoulder y a = translateSHxy 0 y . rotateSH a $ scaleSH (V3 10 10 1) baseShoulder
|
||||||
|
|
||||||
deadUpperBody :: Creature -> Shape
|
deadUpperBody :: World -> Creature -> Shape
|
||||||
deadUpperBody cr = deadRot cr . translateSHz (negate 10) . upperBody $ cr
|
deadUpperBody w cr = deadRot cr . translateSHz (negate 10) . upperBody w $ cr
|
||||||
|
|
||||||
baseShoulder :: Shape
|
baseShoulder :: Shape
|
||||||
{-# INLINE baseShoulder #-}
|
{-# INLINE baseShoulder #-}
|
||||||
--baseShoulder = translateSHz (-20) . scaleSH (V3 0.5 1 1) . upperPrismPolyHalfMI 10 $ polyCirc 3 1
|
-- baseShoulder = translateSHz (-20) . scaleSH (V3 0.5 1 1) . upperPrismPolyHalfMI 10 $ polyCirc 3 1
|
||||||
baseShoulder = scaleSH (V3 0.5 1 1) . upperPrismPolyHalfMI 10 $ polyCirc 3 1
|
baseShoulder = scaleSH (V3 0.5 1 1) . upperPrismPolyHalfMI 10 $ polyCirc 3 1
|
||||||
|
|
||||||
upperBody :: Creature -> Shape
|
upperBody :: World -> Creature -> Shape
|
||||||
{-# INLINE upperBody #-}
|
{-# INLINE upperBody #-}
|
||||||
upperBody cr = arms cr <> torso cr
|
upperBody w cr = arms w cr <> torso w cr
|
||||||
|
|
||||||
drawEquipment :: IM.IntMap Item -> Creature -> SPic
|
drawEquipment :: World -> IM.IntMap Item -> Creature -> SPic
|
||||||
{-# INLINE drawEquipment #-}
|
{-# INLINE drawEquipment #-}
|
||||||
drawEquipment m cr = foldMap (itemEquipPict cr) (invDT . fmap (\i -> m ^?! ix i) $ _crInv cr)
|
drawEquipment w m cr = foldMap (itemEquipPict w cr) (invDT . fmap (\i -> m ^?! ix i) $ _crInv cr)
|
||||||
|
|
||||||
|
barrelShape :: SPic
|
||||||
|
barrelShape = noPic $ cylinderPoly Medium Important (map (addZ 20) ps) (map (addZ 0) ps)
|
||||||
|
where
|
||||||
|
ps = polyCirc 3 10
|
||||||
|
|
||||||
|
lampCrSPic :: Float -> SPic
|
||||||
|
lampCrSPic h =
|
||||||
|
colorSH blue (upperBox Small Undesired h $ rectWH 5 5)
|
||||||
|
ST.:!: setLayer BloomLayer (setDepth h . color white $ circleSolid 3)
|
||||||
|
|||||||
@@ -9,8 +9,13 @@ crRad :: CreatureType -> Float
|
|||||||
crRad = \case
|
crRad = \case
|
||||||
Avatar {} -> 10
|
Avatar {} -> 10
|
||||||
ChaseCrit {} -> 10
|
ChaseCrit {} -> 10
|
||||||
|
CrabCrit {} -> 10
|
||||||
HoverCrit {} -> 8
|
HoverCrit {} -> 8
|
||||||
|
BeeCrit {_beeSlime = x} -> sqrt $ 4 + (fromIntegral x / 100)
|
||||||
SwarmCrit -> 2
|
SwarmCrit -> 2
|
||||||
AutoCrit -> 10
|
AutoCrit -> 10
|
||||||
BarrelCrit{} -> 10
|
BarrelCrit{} -> 10
|
||||||
LampCrit {} -> 3
|
LampCrit {} -> 3
|
||||||
|
SlinkCrit {} -> 10
|
||||||
|
HiveCrit {} -> 20
|
||||||
|
SlimeCrit {_slimeSlime = r,_slimeSlimeChange = x} -> slimeToRad (r - x)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
|
{-# LANGUAGE LambdaCase #-}
|
||||||
module Dodge.Creature.ReaderUpdate (
|
module Dodge.Creature.ReaderUpdate (
|
||||||
doStrategyActions,
|
|
||||||
setTargetMv,
|
|
||||||
targetYouWhenCognizant,
|
targetYouWhenCognizant,
|
||||||
overrideMeleeCloseTarget,
|
overrideMeleeCloseTarget,
|
||||||
watchUpdateStrat,
|
watchUpdateStrat,
|
||||||
@@ -9,11 +8,13 @@ module Dodge.Creature.ReaderUpdate (
|
|||||||
-- goToTarget,
|
-- goToTarget,
|
||||||
flockACC,
|
flockACC,
|
||||||
chaseCritMv,
|
chaseCritMv,
|
||||||
setMvPos,
|
crabActionUpdate,
|
||||||
|
setMvPosToTargetCr,
|
||||||
setViewPos,
|
setViewPos,
|
||||||
hoverCritMv,
|
hoverCritMv,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Dodge.WorldEvent.ThingsHit
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import Data.Bifunctor
|
import Data.Bifunctor
|
||||||
@@ -23,7 +24,7 @@ import Dodge.Base
|
|||||||
import Dodge.Creature.Perception
|
import Dodge.Creature.Perception
|
||||||
import Dodge.Creature.Radius
|
import Dodge.Creature.Radius
|
||||||
import Dodge.Creature.Vocalization
|
import Dodge.Creature.Vocalization
|
||||||
import Dodge.Data.CreatureEffect
|
--import Dodge.Data.CreatureEffect
|
||||||
import Dodge.Data.World
|
import Dodge.Data.World
|
||||||
import Dodge.Zoning.Creature
|
import Dodge.Zoning.Creature
|
||||||
import FoldableHelp
|
import FoldableHelp
|
||||||
@@ -43,21 +44,20 @@ tryMeleeAttack cr tcr
|
|||||||
| _meleeCooldown (_crType cr) == 0
|
| _meleeCooldown (_crType cr) == 0
|
||||||
&& Just (_crID tcr) == cr ^? crActionPlan . apStrategy . meleeTarget
|
&& Just (_crID tcr) == cr ^? crActionPlan . apStrategy . meleeTarget
|
||||||
&& dist tpos cpos < crRad (cr ^. crType) + crRad (tcr ^. crType) + 5
|
&& dist tpos cpos < crRad (cr ^. crType) + crRad (tcr ^. crType) + 5
|
||||||
&& abs (_crDir cr - argV (tpos -.- cpos)) < pi / 4 =
|
&& abs (_crDir cr - argV (tpos - cpos)) < pi / 4 =
|
||||||
cr & crActionPlan . apAction
|
cr & crActionPlan . apAction
|
||||||
.~ [ DoImpulses [Melee $ _crID tcr] `DoActionThen`
|
.~ DoImpulses [Melee $ _crID tcr] `DoActionThen`
|
||||||
DoReplicate 10 NoAction
|
DoReplicate 10 NoAction
|
||||||
`DoActionThen` DoImpulses
|
-- `DoActionThen` DoImpulses
|
||||||
[ChangeStrategy (CloseToMelee $ _crID tcr)]
|
-- [ChangeStrategy (CloseToMelee $ _crID tcr)]
|
||||||
]
|
-- & crActionPlan . apStrategy .~ MeleeStrike
|
||||||
& crActionPlan . apStrategy .~ MeleeStrike
|
|
||||||
| otherwise = cr
|
| otherwise = cr
|
||||||
where
|
where
|
||||||
cpos = cr ^. crPos . _xy
|
cpos = cr ^. crPos . _xy
|
||||||
tpos = tcr ^. crPos . _xy
|
tpos = tcr ^. crPos . _xy
|
||||||
|
|
||||||
setMvPos :: World -> Creature -> Creature
|
setMvPosToTargetCr :: World -> Creature -> Creature
|
||||||
setMvPos w cr = cr & crIntention . mvToPoint .~ mpos
|
setMvPosToTargetCr w cr = cr & crIntention . mvToPoint .~ mpos
|
||||||
where
|
where
|
||||||
int = _crIntention cr
|
int = _crIntention cr
|
||||||
mtpos = do
|
mtpos = do
|
||||||
@@ -81,17 +81,17 @@ attentionViewPoint w cr = do
|
|||||||
guard $ visionCheck cr (tcr ^. crPos . _xy) > 0
|
guard $ visionCheck cr (tcr ^. crPos . _xy) > 0
|
||||||
tcr ^? crPos . _xy
|
tcr ^? crPos . _xy
|
||||||
|
|
||||||
setTargetMv ::
|
--setTargetMv ::
|
||||||
-- | Function for determining target
|
-- -- | Function for determining target
|
||||||
(World -> Creature -> Maybe Creature) ->
|
-- (World -> Creature -> Maybe Creature) ->
|
||||||
World ->
|
-- World ->
|
||||||
Creature ->
|
-- Creature ->
|
||||||
Creature
|
-- Creature
|
||||||
setTargetMv targFunc w cr =
|
--setTargetMv targFunc w cr =
|
||||||
maybe
|
-- maybe
|
||||||
cr
|
-- cr
|
||||||
(\ctarg -> cr & crIntention . mvToPoint ?~ (ctarg ^. crPos . _xy))
|
-- (\ctarg -> cr & crIntention . mvToPoint ?~ (ctarg ^. crPos . _xy))
|
||||||
(targFunc w cr)
|
-- (targFunc w cr)
|
||||||
|
|
||||||
-- ugly
|
-- ugly
|
||||||
flockACC :: World -> Creature -> Creature
|
flockACC :: World -> Creature -> Creature
|
||||||
@@ -120,48 +120,130 @@ flockACC w cr = fromMaybe cr $ do
|
|||||||
else negate r *.* horDir
|
else negate r *.* horDir
|
||||||
in cr & crIntention . mvToPoint ?~ tpos +.+ horShift
|
in cr & crIntention . mvToPoint ?~ tpos +.+ horShift
|
||||||
|
|
||||||
|
crabActionUpdate :: Int -> World -> World
|
||||||
|
crabActionUpdate cid w = case _apStrategy (_crActionPlan cr) of
|
||||||
|
_ | Just tid <- meleel -> w & tocr . crActionPlan . apAction
|
||||||
|
.~ DoImpulses [MeleeL tid] `DoActionThen`
|
||||||
|
DoReplicate 10 NoAction
|
||||||
|
_ | Just tid <- meleer -> w & tocr . crActionPlan . apAction
|
||||||
|
.~ DoImpulses [MeleeR tid] `DoActionThen`
|
||||||
|
DoReplicate 10 NoAction
|
||||||
|
WarningCry -> w
|
||||||
|
CloseToMelee tid | aimi tid -> w & tocr . crActionPlan . apAction .~ EvadeAim
|
||||||
|
& tocr . crType . dodgeCooldown .~ dc
|
||||||
|
& randGen .~ g
|
||||||
|
CloseToMelee _ | ma <- cr ^? crActionPlan . apAction , notpath ma -> w
|
||||||
|
Wander | Just tid <- cr ^? crIntention . targetCr . _Just
|
||||||
|
, canSee tid (cr ^. crID) w -> w & tocr . crActionPlan . apStrategy .~ CloseToMelee tid
|
||||||
|
_ -> case cr ^? crIntention . mvToPoint . _Just of
|
||||||
|
Just p
|
||||||
|
| dist (cr ^. crPos . _xy) p > crRad (cr ^. crType) ->
|
||||||
|
w & tocr . crActionPlan . apAction .~ PathTo p (DoImpulses [ChangeStrategy Wander])
|
||||||
|
| otherwise ->
|
||||||
|
w -- & tocr . crActionPlan . apAction .~ bfsThenReturn 500 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
|
||||||
|
& tocr . crActionPlan . apStrategy .~ Search
|
||||||
|
& tocr . crIntention . mvToPoint .~ Nothing
|
||||||
|
_ -> w & tocr %~ viewTarget w
|
||||||
|
where
|
||||||
|
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
||||||
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
|
meleel = do
|
||||||
|
tid <- cr ^? crIntention . targetCr . _Just
|
||||||
|
tcr <- w ^? cWorld . lWorld . creatures . ix tid
|
||||||
|
let cpos = cr ^. crPos . _xy
|
||||||
|
tpos = tcr ^. crPos . _xy
|
||||||
|
guard $ _meleeCooldownL (_crType cr) == 0
|
||||||
|
&& Just (_crID tcr) == cr ^? crActionPlan . apStrategy . meleeTarget
|
||||||
|
&& dist tpos cpos < crRad (cr ^. crType) + crRad (tcr ^. crType) + 5
|
||||||
|
&& (_crDir cr - argV (tpos -.- cpos)) > (-pi / 4)
|
||||||
|
&& (_crDir cr - argV (tpos -.- cpos)) <= 0
|
||||||
|
&& cr ^?! crType . meleeCooldownR < 15
|
||||||
|
return tid
|
||||||
|
meleer = do
|
||||||
|
tid <- cr ^? crIntention . targetCr . _Just
|
||||||
|
tcr <- w ^? cWorld . lWorld . creatures . ix tid
|
||||||
|
let cpos = cr ^. crPos . _xy
|
||||||
|
tpos = tcr ^. crPos . _xy
|
||||||
|
guard $ _meleeCooldownR (_crType cr) == 0
|
||||||
|
&& Just (_crID tcr) == cr ^? crActionPlan . apStrategy . meleeTarget
|
||||||
|
&& dist tpos cpos < crRad (cr ^. crType) + crRad (tcr ^. crType) + 5
|
||||||
|
&& (_crDir cr - argV (tpos -.- cpos)) < pi / 4
|
||||||
|
&& (_crDir cr - argV (tpos -.- cpos)) >= 0
|
||||||
|
&& cr ^?! crType . meleeCooldownL < 15
|
||||||
|
return tid
|
||||||
|
(dc,g) = randomR (15,50) (w ^. randGen)
|
||||||
|
notpath = \case
|
||||||
|
Just NoAction -> False
|
||||||
|
Just PathTo {} -> False
|
||||||
|
Just AimAt {} -> False
|
||||||
|
_ -> True
|
||||||
|
aimi tid = fromMaybe False $ do
|
||||||
|
tcr <- w ^? cWorld . lWorld . creatures . ix tid
|
||||||
|
hp <- cr ^? crHP . _HP
|
||||||
|
Aiming <- tcr ^? crStance . posture
|
||||||
|
let txy = tcr ^. crPos . _xy
|
||||||
|
cxy = cr ^. crPos . _xy
|
||||||
|
0 <- cr ^? crType . dodgeCooldown
|
||||||
|
return $ hasLOS cxy txy w
|
||||||
|
&& abs (nearZeroAngle (tcr^.crDir - argV (cxy - txy))) < 0.3
|
||||||
|
&& isWalkable txy cxy w
|
||||||
|
&& diffAngles (cr ^. crDir) (argV (txy - cxy)) < 0.1
|
||||||
|
&& hp > 0
|
||||||
|
|
||||||
chaseCritMv :: World -> Creature -> Creature
|
chaseCritMv :: World -> Creature -> Creature
|
||||||
chaseCritMv w cr = case _apStrategy (_crActionPlan cr) of
|
chaseCritMv w cr = case _apStrategy (_crActionPlan cr) of
|
||||||
WarningCry -> cr
|
WarningCry -> cr
|
||||||
MeleeStrike -> cr
|
|
||||||
CloseToMelee cid
|
CloseToMelee cid
|
||||||
| VocReady == (cr ^. crVocalization) ->
|
| VocReady == (cr ^. crVocalization) ->
|
||||||
cr
|
cr
|
||||||
& crActionPlan . apAction
|
& crActionPlan . apAction
|
||||||
.:~ ImpulsesList
|
.~ ImpulsesList
|
||||||
( [Bark soundid] :
|
( [Bark soundid] :
|
||||||
replicate numjits [RandomImpulse thejitter]
|
replicate numjits [RandomImpulse thejitter]
|
||||||
++ [[ChangeStrategy (CloseToMelee cid)]]
|
++ [[ChangeStrategy (CloseToMelee cid)]]
|
||||||
)
|
) NoAction
|
||||||
& resetCrVocCoolDown w
|
& resetCrVocCoolDown w
|
||||||
& crActionPlan . apStrategy .~ WarningCry
|
& crActionPlan . apStrategy .~ WarningCry
|
||||||
where
|
where
|
||||||
thejitter = RandImpulseCircMove 3
|
thejitter = RandImpulseCircMove 3
|
||||||
soundid = evalState (takeOne (crWarningSounds cr)) (_randGen w)
|
soundid = evalState (takeOne (crWarningSounds cr)) (_randGen w)
|
||||||
numjits = fst $ randomR (15, 25) (_randGen w)
|
numjits = fst $ randomR (15, 25) (_randGen w)
|
||||||
|
CloseToMelee _ | ma <- cr ^? crActionPlan . apAction , notpath ma -> cr
|
||||||
_ -> case cr ^? crIntention . mvToPoint . _Just of
|
_ -> case cr ^? crIntention . mvToPoint . _Just of
|
||||||
Just p
|
Just p
|
||||||
| dist (cr ^. crPos . _xy) p > crRad (cr ^. crType) ->
|
| dist (cr ^. crPos . _xy) p > crRad (cr ^. crType) ->
|
||||||
cr & crActionPlan . apAction .~ [PathTo p (DoImpulses [ChangeStrategy Wander])]
|
cr & crActionPlan . apAction .~ PathTo p (DoImpulses [ChangeStrategy Wander])
|
||||||
| otherwise ->
|
| otherwise ->
|
||||||
cr & crActionPlan . apAction .~ [bfsThenReturn 500 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]]
|
cr -- & crActionPlan . apAction .~ bfsThenReturn 500 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
|
||||||
& crActionPlan . apStrategy .~ WatchAndWait
|
& crActionPlan . apStrategy .~ Search
|
||||||
& crIntention . mvToPoint .~ Nothing
|
& crIntention . mvToPoint .~ Nothing
|
||||||
_ -> viewTarget w cr
|
_ -> viewTarget w cr
|
||||||
|
where
|
||||||
|
notpath = \case
|
||||||
|
Just NoAction -> False
|
||||||
|
Just PathTo {} -> False
|
||||||
|
Just AimAt {} -> False
|
||||||
|
_ -> True
|
||||||
|
|
||||||
hoverCritMv :: World -> Creature -> Creature
|
hoverCritMv :: World -> Creature -> Creature
|
||||||
hoverCritMv w cr = case _apStrategy (_crActionPlan cr) of
|
hoverCritMv w cr = case _apStrategy (_crActionPlan cr) of
|
||||||
WarningCry -> cr
|
WarningCry -> cr
|
||||||
MeleeStrike -> cr
|
CloseToMelee _ | ma <- cr ^? crActionPlan . apAction , notpath ma -> cr
|
||||||
_ -> case cr ^? crIntention . mvToPoint . _Just of
|
_ -> case cr ^? crIntention . mvToPoint . _Just of
|
||||||
Just p
|
Just p
|
||||||
| dist (cr ^. crPos . _xy) p > crRad (cr ^. crType) ->
|
| dist (cr ^. crPos . _xy) p > crRad (cr ^. crType) ->
|
||||||
cr & crActionPlan . apAction .~ [PathTo p (DoImpulses [ChangeStrategy Wander])]
|
cr & crActionPlan . apAction .~ PathTo p (DoImpulses [ChangeStrategy Wander])
|
||||||
| otherwise ->
|
| otherwise ->
|
||||||
cr & crActionPlan . apAction .~ [bfsThenReturn 500 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]]
|
cr -- & crActionPlan . apAction .~ bfsThenReturn 500 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
|
||||||
& crActionPlan . apStrategy .~ WatchAndWait
|
& crActionPlan . apStrategy .~ Search
|
||||||
& crIntention . mvToPoint .~ Nothing
|
& crIntention . mvToPoint .~ Nothing
|
||||||
_ -> viewTarget w cr
|
_ -> viewTarget w cr
|
||||||
|
where
|
||||||
|
notpath = \case
|
||||||
|
Just NoAction -> False
|
||||||
|
Just PathTo {} -> False
|
||||||
|
Just AimAt {} -> False
|
||||||
|
_ -> True
|
||||||
|
|
||||||
--goToTarget :: World -> Creature -> Creature
|
--goToTarget :: World -> Creature -> Creature
|
||||||
--goToTarget w cr = case cr ^? crIntention . mvToPoint . _Just of
|
--goToTarget w cr = case cr ^? crIntention . mvToPoint . _Just of
|
||||||
@@ -173,25 +255,18 @@ viewTarget w cr = case cr ^? crIntention . viewPoint . _Just of
|
|||||||
Just p
|
Just p
|
||||||
| hasLOSIndirect p (cr ^. crPos . _xy) w ->
|
| hasLOSIndirect p (cr ^. crPos . _xy) w ->
|
||||||
cr
|
cr
|
||||||
& crActionPlan . apAction .~ [TurnToPoint p]
|
& crActionPlan . apAction .~ TurnToPoint p
|
||||||
& crIntention . viewPoint .~ Nothing
|
& crIntention . viewPoint .~ Nothing
|
||||||
& crActionPlan . apStrategy .~ Investigate
|
& crActionPlan . apStrategy .~ Investigate
|
||||||
| otherwise ->
|
| otherwise ->
|
||||||
cr & crActionPlan . apAction %~ replaceNullWith (PathTo p (DoImpulses [ChangeStrategy Wander]))
|
-- cr & crActionPlan . apAction %~ replaceNullWith (PathTo p (DoImpulses [ChangeStrategy Wander]))
|
||||||
|
cr & crActionPlan . apAction .~ PathTo p (DoImpulses [ChangeStrategy Wander])
|
||||||
& crActionPlan . apStrategy .~ Investigate
|
& crActionPlan . apStrategy .~ Investigate
|
||||||
Nothing -> cr
|
Nothing -> cr
|
||||||
|
|
||||||
replaceNullWith :: a -> [a] -> [a]
|
--replaceNullWith :: a -> [a] -> [a]
|
||||||
replaceNullWith x [] = [x]
|
--replaceNullWith x [] = [x]
|
||||||
replaceNullWith _ xs = xs
|
--replaceNullWith _ xs = xs
|
||||||
|
|
||||||
doStrategyActions :: Creature -> Creature
|
|
||||||
doStrategyActions cr = case cr ^? crActionPlan . apStrategy of
|
|
||||||
Just (StrategyActions strat acs) ->
|
|
||||||
cr
|
|
||||||
& crActionPlan . apAction .~ acs
|
|
||||||
& crActionPlan . apStrategy .~ strat
|
|
||||||
_ -> cr
|
|
||||||
|
|
||||||
overrideInternal :: (Creature -> Bool) -> (Creature -> Creature) -> Creature -> Creature
|
overrideInternal :: (Creature -> Bool) -> (Creature -> Creature) -> Creature -> Creature
|
||||||
overrideInternal test update cr
|
overrideInternal test update cr
|
||||||
@@ -231,16 +306,11 @@ searchIfDamaged cr
|
|||||||
| _crPain cr > 0
|
| _crPain cr > 0
|
||||||
&& _apStrategy (_crActionPlan cr) == WatchAndWait =
|
&& _apStrategy (_crActionPlan cr) == WatchAndWait =
|
||||||
cr & crPerception . cpVigilance .~ Vigilant
|
cr & crPerception . cpVigilance .~ Vigilant
|
||||||
& crActionPlan . apStrategy
|
& crActionPlan . apStrategy .~ LookAround
|
||||||
.~ StrategyActions
|
|
||||||
LookAround
|
|
||||||
[ TurnToPoint (cr ^. crPos . _xy -.- unitVectorAtAngle (_crDir cr))
|
|
||||||
`DoActionThen` 40 `WaitThen` bfsThenReturn 500
|
|
||||||
]
|
|
||||||
| otherwise = cr
|
| otherwise = cr
|
||||||
|
|
||||||
bfsThenReturn :: Int -> Action
|
--bfsThenReturn :: Int -> Action
|
||||||
bfsThenReturn t = ArbitraryAction (CrWdBFSThenReturn t)
|
--bfsThenReturn t = ArbitraryAction (CrWdBFSThenReturn t)
|
||||||
|
|
||||||
-- theaction
|
-- theaction
|
||||||
-- where
|
-- where
|
||||||
|
|||||||
@@ -1,135 +0,0 @@
|
|||||||
module Dodge.Creature.SentinelAI (
|
|
||||||
sentinelAI,
|
|
||||||
sentinelFireType,
|
|
||||||
sentinelExtraWatchUpdate,
|
|
||||||
) where
|
|
||||||
|
|
||||||
--import Control.Lens
|
|
||||||
import Data.Maybe
|
|
||||||
--import Dodge.Creature.Action
|
|
||||||
--import Dodge.Creature.ChainUpdates
|
|
||||||
--import Dodge.Creature.Perception
|
|
||||||
--import Dodge.Creature.ReaderUpdate
|
|
||||||
--import Dodge.Creature.Strategy
|
|
||||||
import Dodge.Creature.Test
|
|
||||||
import Dodge.Creature.Volition
|
|
||||||
import Dodge.Data.CreatureEffect
|
|
||||||
import Dodge.Data.World
|
|
||||||
import Geometry.Data
|
|
||||||
|
|
||||||
sentinelAI :: World -> Creature -> Creature
|
|
||||||
--sentinelAI w =
|
|
||||||
sentinelAI =
|
|
||||||
sentinelExtraWatchUpdate
|
|
||||||
[
|
|
||||||
( crHasTargetLOS
|
|
||||||
, \_ cr ->
|
|
||||||
StrategyActions
|
|
||||||
(ShootAt (fromJust $ tcid cr))
|
|
||||||
[ DoActionIf
|
|
||||||
(WdCrNegate $ WdCrBlfromCrBl CrIsAiming)
|
|
||||||
(drawWeapon `DoActionThen` (50 `WaitThen` NoAction))
|
|
||||||
`DoActionThen` lostest
|
|
||||||
`DoActionWhile` advanceShoot
|
|
||||||
`DoActionThen` 75
|
|
||||||
`DoReplicate` advanceShoot
|
|
||||||
`DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
|
|
||||||
, AimAt{_targetID = fromJust $ tcid cr, _targetSeenAt = V2 0 0}
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
where
|
|
||||||
advanceShoot = DoImpulses [UseItem, MoveForward 3]
|
|
||||||
tcid cr = _targetCr (_crIntention cr)
|
|
||||||
lostest = WdCrLOSTarget -- w' cr = maybe False (\cid -> canSee (_crID cr) cid w') (tcid cr)
|
|
||||||
|
|
||||||
--chainCreatureUpdates :: [World -> Creature -> Creature] -> World -> Creature -> Creature
|
|
||||||
--chainCreatureUpdates ls w cr = foldr (\f -> f w) cr ls
|
|
||||||
|
|
||||||
sentinelFireType :: (Int -> Action) -> World -> Creature -> Creature
|
|
||||||
sentinelFireType _ = undefined
|
|
||||||
--sentinelFireType f =
|
|
||||||
-- chainCreatureUpdates
|
|
||||||
-- [ watchUpdateStrat
|
|
||||||
-- [
|
|
||||||
-- ( crHasTargetLOS
|
|
||||||
-- , \_ _ ->
|
|
||||||
-- StrategyActions
|
|
||||||
-- (ShootAt 0)
|
|
||||||
-- [ drawwp `DoActionThen` f 0 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
|
|
||||||
-- , aiming
|
|
||||||
-- ]
|
|
||||||
-- )
|
|
||||||
-- , (const crAwayFromPost, const goToPostStrat)
|
|
||||||
-- ]
|
|
||||||
-- , perceptionUpdate [0]
|
|
||||||
-- , -- , Left $ perceptionUp 0
|
|
||||||
-- const doStrategyActions
|
|
||||||
-- , targetYouWhenCognizant
|
|
||||||
-- , const $
|
|
||||||
-- overrideInternal
|
|
||||||
-- (\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
|
|
||||||
-- (crActionPlan . apStrategy .~ WatchAndWait)
|
|
||||||
-- ]
|
|
||||||
-- where
|
|
||||||
-- drawwp = DoActionIfElse NoAction (WdCrBlfromCrBl CrIsAiming) (DoActionThen drawWeapon (WaitThen 50 NoAction))
|
|
||||||
-- aiming =
|
|
||||||
-- AimAt
|
|
||||||
-- { _targetID = 0
|
|
||||||
-- , _targetSeenAt = V2 0 0 -- hack
|
|
||||||
-- }
|
|
||||||
|
|
||||||
sentinelExtraWatchUpdate ::
|
|
||||||
[(World -> Creature -> Bool, World -> Creature -> Strategy)] ->
|
|
||||||
World ->
|
|
||||||
Creature ->
|
|
||||||
Creature
|
|
||||||
sentinelExtraWatchUpdate _ = undefined
|
|
||||||
--sentinelExtraWatchUpdate xs =
|
|
||||||
-- chainCreatureUpdates
|
|
||||||
-- [ watchUpdateStrat
|
|
||||||
-- (xs ++ [(const crAwayFromPost, const goToPostStrat)])
|
|
||||||
-- , perceptionUpdate [0]
|
|
||||||
-- , const doStrategyActions
|
|
||||||
-- , targetYouWhenCognizant
|
|
||||||
-- , const $
|
|
||||||
-- overrideInternal
|
|
||||||
-- (\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
|
|
||||||
-- (crActionPlan . apStrategy .~ WatchAndWait)
|
|
||||||
-- ]
|
|
||||||
|
|
||||||
--shootAtAdvance :: Int -> [Action]
|
|
||||||
--shootAtAdvance tcid =
|
|
||||||
-- [ DoActionIfElse NoAction crIsAiming (DoActionThen drawWeapon (WaitThen 50 NoAction))
|
|
||||||
-- `DoActionThen`
|
|
||||||
-- lostest `DoActionWhile`
|
|
||||||
-- advanceShoot `DoActionThen`
|
|
||||||
-- 75 `DoReplicate`
|
|
||||||
-- advanceShoot `DoActionThen`
|
|
||||||
-- DoImpulses [ChangeStrategy WatchAndWait]
|
|
||||||
-- , AimAt
|
|
||||||
-- { _targetID = tcid
|
|
||||||
-- , _targetSeenAt = V2 0 0 -- hack
|
|
||||||
-- }
|
|
||||||
-- ]
|
|
||||||
-- where
|
|
||||||
-- lostest (w,cr') = canSee (_crID cr') tcid w
|
|
||||||
-- advanceShoot = ImpulsesList [[UseItem, MoveForward 3]]
|
|
||||||
--
|
|
||||||
--shootAtWhileContinueTime :: Int -> World -> Creature -> Strategy
|
|
||||||
--shootAtWhileContinueTime tcid _ _ = StrategyActions (ShootAt tcid)
|
|
||||||
-- [ DoActionIfElse NoAction crIsAiming (DoActionThen drawWeapon (WaitThen 50 NoAction))
|
|
||||||
-- `DoActionThen`
|
|
||||||
-- lostest `DoActionWhile`
|
|
||||||
-- advanceShoot `DoActionThen`
|
|
||||||
-- 75 `DoReplicate`
|
|
||||||
-- advanceShoot `DoActionThen`
|
|
||||||
-- DoImpulses [ChangeStrategy WatchAndWait]
|
|
||||||
-- , AimAt
|
|
||||||
-- { _targetID = tcid
|
|
||||||
-- , _targetSeenAt = V2 0 0 -- hack
|
|
||||||
-- }
|
|
||||||
-- ]
|
|
||||||
-- where
|
|
||||||
-- lostest (w,cr') = canSee (_crID cr') tcid w
|
|
||||||
-- advanceShoot = ImpulsesList [[UseItem, MoveForward 3]]
|
|
||||||
@@ -9,8 +9,13 @@ crShape :: CreatureType -> CreatureShape
|
|||||||
crShape = \case
|
crShape = \case
|
||||||
Avatar{} -> Humanoid (greyN 0.9) (lightx4 black) (greyN 0.3)
|
Avatar{} -> Humanoid (greyN 0.9) (lightx4 black) (greyN 0.3)
|
||||||
ChaseCrit {} -> Humanoid (greyN 0.9) (lightx4 green) (greyN 0.3)
|
ChaseCrit {} -> Humanoid (greyN 0.9) (lightx4 green) (greyN 0.3)
|
||||||
|
CrabCrit {} -> Humanoid (greyN 0.9) (lightx4 red) (greyN 0.3)
|
||||||
HoverCrit {} -> Humanoid (greyN 0.9) (light blue) (greyN 0.3)
|
HoverCrit {} -> Humanoid (greyN 0.9) (light blue) (greyN 0.3)
|
||||||
SwarmCrit -> Humanoid (greyN 0.9) (lightx4 yellow) (greyN 0.3)
|
SwarmCrit -> Humanoid (greyN 0.9) (lightx4 yellow) (greyN 0.3)
|
||||||
AutoCrit -> Humanoid (greyN 0.9) (lightx4 red) (greyN 0.3)
|
AutoCrit -> Humanoid (greyN 0.9) (lightx4 red) (greyN 0.3)
|
||||||
|
SlinkCrit{} -> Humanoid (greyN 0.9) (dark . dark . dark $ orange) (greyN 0.3)
|
||||||
BarrelCrit {} -> Barreloid
|
BarrelCrit {} -> Barreloid
|
||||||
LampCrit {} -> NonDrawnCreature
|
LampCrit {} -> NoCreatureShape
|
||||||
|
SlimeCrit {} -> Humanoid (greyN 0.9) (lightx4 green) (greyN 0.3)
|
||||||
|
BeeCrit {} -> NoCreatureShape
|
||||||
|
HiveCrit {} -> NoCreatureShape
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
module Dodge.Creature.Slime (slimeOutline) where
|
||||||
|
|
||||||
|
import Control.Lens
|
||||||
|
import Dodge.Data.Creature
|
||||||
|
import Geometry.Data
|
||||||
|
import Linear
|
||||||
|
import Shape
|
||||||
|
|
||||||
|
slimeOutline :: Creature -> [Point2]
|
||||||
|
slimeOutline cr =
|
||||||
|
polyCirc 6 r
|
||||||
|
& each . _x *~ a
|
||||||
|
& each . _y %~ (/ a)
|
||||||
|
where
|
||||||
|
r = slimeToRad $ cr ^?! crType . slimeSlime - cr ^?! crType . slimeSlimeChange
|
||||||
|
a = cr ^?! crType . slimeCompression
|
||||||
+55
-23
@@ -4,6 +4,8 @@ module Dodge.Creature.State (
|
|||||||
invItemEffs,
|
invItemEffs,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import qualified Data.IntSet as IS
|
||||||
|
import Dodge.Creature.Radius
|
||||||
import qualified Data.IntMap.Strict as IM
|
import qualified Data.IntMap.Strict as IM
|
||||||
import Linear
|
import Linear
|
||||||
import NewInt
|
import NewInt
|
||||||
@@ -43,16 +45,38 @@ import qualified SDL
|
|||||||
doDamage :: Int -> World -> World
|
doDamage :: Int -> World -> World
|
||||||
doDamage cid w = fromMaybe w $ do
|
doDamage cid w = fromMaybe w $ do
|
||||||
cr <- w ^? cWorld . lWorld . creatures . ix cid
|
cr <- w ^? cWorld . lWorld . creatures . ix cid
|
||||||
return $ applyPastDamages cr $ applyCreatureDamage (cr ^. crDamage) cr w
|
return $ crPainEffect cr $ applyCreatureDamage cid cr w
|
||||||
|
|
||||||
-- TODO generalise shake to arbitrary damage amounts
|
-- TODO generalise shake to arbitrary damage amounts
|
||||||
applyPastDamages :: Creature -> World -> World
|
crPainEffect :: Creature -> World -> World
|
||||||
applyPastDamages cr w
|
crPainEffect cr = case cr ^. crType of
|
||||||
| HoverCrit {} <- cr ^. crType
|
HoverCrit {} -> hoverPainEffect cr
|
||||||
, _crPain cr > 50 = w
|
HiveCrit{} -> hivePainEffect cr
|
||||||
& cWorld . lWorld . creatures . ix (_crID cr) . crPain -~ 50
|
_ -> jitterPain cr
|
||||||
& cWorld . lWorld . creatures . ix (_crID cr) . crPos . _z %~ max 12 . subtract 1
|
|
||||||
| HoverCrit {} <- cr ^. crType = w
|
|
||||||
|
hoverPainEffect :: Creature -> World -> World
|
||||||
|
hoverPainEffect cr
|
||||||
|
| _crPain cr > 50 =
|
||||||
|
(cWorld . lWorld . creatures . ix (_crID cr) . crPain -~ 50)
|
||||||
|
. (cWorld . lWorld . creatures . ix (_crID cr) . crPos . _z %~ max 12 . subtract 1)
|
||||||
|
| otherwise = id
|
||||||
|
|
||||||
|
|
||||||
|
hivePainEffect :: Creature -> World -> World
|
||||||
|
hivePainEffect cr w
|
||||||
|
| _crPain cr > 0 = w & cWorld . lWorld . creatures . ix (cr ^. crID) . crPain %~ (max 0 . subtract 5)
|
||||||
|
& cWorld . lWorld . beePheremones .:~ BPheremone (cr ^. crPos & _xy +~ p & _z .~ 20) v 200
|
||||||
|
& randGen .~ g
|
||||||
|
| otherwise = w
|
||||||
|
where
|
||||||
|
(a,g') = randomR (0,2*pi) $ w ^. randGen
|
||||||
|
(b,g) = runState randOnUnitSphere g'
|
||||||
|
p = (crRad (cr ^. crType) + 5) *^ unitVectorAtAngle a
|
||||||
|
v = 3 *^ b
|
||||||
|
|
||||||
|
jitterPain :: Creature -> World -> World
|
||||||
|
jitterPain cr w
|
||||||
| _crPain cr > 200 = dojitter 3 100
|
| _crPain cr > 200 = dojitter 3 100
|
||||||
| _crPain cr > 20 = dojitter 2 10
|
| _crPain cr > 20 = dojitter 2 10
|
||||||
| _crPain cr > 0 = dojitter 1 1
|
| _crPain cr > 0 = dojitter 1 1
|
||||||
@@ -60,7 +84,7 @@ applyPastDamages cr w
|
|||||||
where
|
where
|
||||||
dojitter x y =
|
dojitter x y =
|
||||||
let (p, g) = runState (randInCirc x) (_randGen w)
|
let (p, g) = runState (randInCirc x) (_randGen w)
|
||||||
in w & cWorld . lWorld . creatures . ix (_crID cr) %~ crMvByNoStride p (w ^. cWorld . lWorld)
|
in w & cWorld . lWorld . creatures . ix (_crID cr) %~ crMvByNoStride p w
|
||||||
& cWorld . lWorld . creatures . ix (_crID cr) . crPain -~ y
|
& cWorld . lWorld . creatures . ix (_crID cr) . crPain -~ y
|
||||||
& randGen .~ g
|
& randGen .~ g
|
||||||
|
|
||||||
@@ -83,19 +107,23 @@ invItemLocUpdate cr loc w = doAnyEquipmentEffect loc cr $ case itm ^. itType of
|
|||||||
HELD MINIGUNX{} -> coolMinigun itm w
|
HELD MINIGUNX{} -> coolMinigun itm w
|
||||||
HELD MACHINEPISTOL{} -> coolMachinePistol cr itm w
|
HELD MACHINEPISTOL{} -> coolMachinePistol cr itm w
|
||||||
LASER | loc ^. locDT . dtValue . _2 == WeaponTargetingSF
|
LASER | loc ^. locDT . dtValue . _2 == WeaponTargetingSF
|
||||||
, itm ^? itLocation . ilIsAttached == Just True -> shineTargetLaser cr loc w
|
, isattached -> shineTargetLaser cr loc w
|
||||||
HELD LED
|
HELD LED
|
||||||
| itm ^? itLocation . ilIsAttached == Just True -> shineTorch cr loc w
|
| isattached -> shineTorch cr loc w
|
||||||
TARGETING tt
|
TARGETING tt
|
||||||
| itm ^? itLocation . ilIsAttached == Just True -> updateItemTargeting tt cr itm w
|
| isattached -> updateItemTargeting tt cr itm w
|
||||||
ARHUD
|
ARHUD
|
||||||
| itm ^? itLocation . ilIsAttached == Just True -> drawARHUD loc w
|
| isattached -> drawARHUD loc w
|
||||||
_ -> w
|
_ -> w
|
||||||
where
|
where
|
||||||
haspulse =
|
haspulse =
|
||||||
w ^? cWorld . lWorld . creatures . ix 0 . crType . avatarPulse . pulseProgress
|
w ^? cWorld . lWorld . creatures . ix 0 . crType . avatarPulse . pulseProgress
|
||||||
== Just 0
|
== Just 0
|
||||||
itm = loc ^. locDT . dtValue . _1
|
itm = loc ^. locDT . dtValue . _1
|
||||||
|
isattached = fromMaybe False $ do
|
||||||
|
i <- itm ^? itLocation . ilInvID . unNInt
|
||||||
|
is <- w ^? hud . manObject . hiAttachedItems
|
||||||
|
return $ i `IS.member` is
|
||||||
|
|
||||||
coolMinigun :: Item -> World -> World
|
coolMinigun :: Item -> World -> World
|
||||||
coolMinigun itm
|
coolMinigun itm
|
||||||
@@ -138,7 +166,7 @@ copierItemUpdate itm cr w = fromMaybe w $ do
|
|||||||
x <- itm ^? itScroll . itsInt
|
x <- itm ^? itScroll . itsInt
|
||||||
invid <- itm ^? itLocation . ilInvID
|
invid <- itm ^? itLocation . ilInvID
|
||||||
ip <- itm ^? itType . ibtPathing
|
ip <- itm ^? itType . ibtPathing
|
||||||
i <- getInventoryPath x ip (_unNInt invid) cr
|
i <- getInventoryPath w x ip (_unNInt invid) cr
|
||||||
itm' <- cr ^? crInv . ix (NInt i) >>= \k -> w ^? cWorld . lWorld . items . ix k
|
itm' <- cr ^? crInv . ix (NInt i) >>= \k -> w ^? cWorld . lWorld . items . ix k
|
||||||
v <- getItemValue itm' w cr
|
v <- getItemValue itm' w cr
|
||||||
return $ w & pointerToItem itm . itUse . uValue .~ v
|
return $ w & pointerToItem itm . itUse . uValue .~ v
|
||||||
@@ -212,7 +240,7 @@ shineTargetLaser cr loc w = fromMaybe (w & pointittarg . itTgPos .~ Nothing) $ d
|
|||||||
magitid <- mag ^? dtValue . _1 . itID . unNInt
|
magitid <- mag ^? dtValue . _1 . itID . unNInt
|
||||||
return $
|
return $
|
||||||
w
|
w
|
||||||
& worldEventFlags . at InventoryChange ?~ ()
|
& worldEventFlags . at InventoryChange ?~ () -- why?
|
||||||
& cWorld . lWorld . items
|
& cWorld . lWorld . items
|
||||||
. ix magitid
|
. ix magitid
|
||||||
. itConsumables
|
. itConsumables
|
||||||
@@ -225,9 +253,10 @@ shineTargetLaser cr loc w = fromMaybe (w & pointittarg . itTgPos .~ Nothing) $ d
|
|||||||
, _lpPos = pos
|
, _lpPos = pos
|
||||||
-- , _lpColor = col
|
-- , _lpColor = col
|
||||||
, _lpType = TargetingLaser (_itID itm)
|
, _lpType = TargetingLaser (_itID itm)
|
||||||
|
, _lpOrigin = CrWeaponO $ cr ^. crID
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
o = locOrient loc cr
|
o = locOrient w loc cr
|
||||||
itmtree = loc ^. locDT
|
itmtree = loc ^. locDT
|
||||||
(p, q) = o `Q.comp` (V3 5 0 0, Q.qid)
|
(p, q) = o `Q.comp` (V3 5 0 0, Q.qid)
|
||||||
x = 1
|
x = 1
|
||||||
@@ -240,19 +269,19 @@ shineTargetLaser cr loc w = fromMaybe (w & pointittarg . itTgPos .~ Nothing) $ d
|
|||||||
itid = itm ^. itID . unNInt
|
itid = itm ^. itID . unNInt
|
||||||
|
|
||||||
shineTorch :: Creature -> LocationDT OItem -> World -> World
|
shineTorch :: Creature -> LocationDT OItem -> World -> World
|
||||||
shineTorch cr loc = fromMaybe id $ do
|
shineTorch cr loc w = fromMaybe w $ do
|
||||||
mag <- find (isammolink . (^. dtValue . _2)) (itmtree ^. dtLeft)
|
mag <- find (isammolink . (^. dtValue . _2)) (itmtree ^. dtLeft)
|
||||||
i <- mag ^. dtValue . _1 . itConsumables
|
i <- mag ^. dtValue . _1 . itConsumables
|
||||||
-- guard $ crIsAiming cr
|
-- guard $ crIsAiming cr
|
||||||
guard $ i >= x
|
guard $ i >= x
|
||||||
itid <- mag ^? dtValue . _1 . itID . unNInt
|
itid <- mag ^? dtValue . _1 . itID . unNInt
|
||||||
return $
|
return $ w
|
||||||
(cWorld . lWorld . lights .:~ LSParam pos 150 0.3)
|
& (cWorld . lWorld . lights .:~ LSParam pos 150 0.3)
|
||||||
. (cWorld . lWorld . lights .:~ LSParam (pos + V3 0 0 15) 50 0.3)
|
& (cWorld . lWorld . lights .:~ LSParam (pos + V3 0 0 15) 50 0.3)
|
||||||
. (cWorld . lWorld . items . ix itid . itConsumables . _Just -~ x)
|
& (cWorld . lWorld . items . ix itid . itConsumables . _Just -~ x)
|
||||||
where
|
where
|
||||||
itmtree = loc ^. locDT
|
itmtree = loc ^. locDT
|
||||||
(p, q) = locOrient loc cr
|
(p, q) = locOrient w loc cr
|
||||||
x = 10
|
x = 10
|
||||||
isammolink AmmoMagSF{} = True
|
isammolink AmmoMagSF{} = True
|
||||||
isammolink _ = False
|
isammolink _ = False
|
||||||
@@ -288,7 +317,10 @@ updateItemTargeting tt cr itm w = case tt of
|
|||||||
where
|
where
|
||||||
pointittarg = cWorld . lWorld . items . ix itid . itTargeting
|
pointittarg = cWorld . lWorld . items . ix itid . itTargeting
|
||||||
itid = itm ^. itID . unNInt
|
itid = itm ^. itID . unNInt
|
||||||
isattached = itm ^?! itLocation . ilIsAttached
|
isattached = fromMaybe False $ do
|
||||||
|
i <- itm ^? itLocation . ilInvID . unNInt
|
||||||
|
is <- w ^? hud . manObject . hiAttachedItems
|
||||||
|
return $ i `IS.member` is
|
||||||
rbpressed = SDL.ButtonRight `M.member` _mouseButtons (_input w)
|
rbpressed = SDL.ButtonRight `M.member` _mouseButtons (_input w)
|
||||||
|
|
||||||
setRBCreatureTargeting :: Creature -> World -> ItemTargeting -> ItemTargeting
|
setRBCreatureTargeting :: Creature -> World -> ItemTargeting -> ItemTargeting
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
{-# LANGUAGE LambdaCase #-}
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
|
||||||
module Dodge.Creature.State.WalkCycle (updateCarriage) where
|
module Dodge.Creature.State.WalkCycle (updateCarriage
|
||||||
|
,compressionScale
|
||||||
|
, flyInertia
|
||||||
|
) where
|
||||||
|
|
||||||
|
import qualified Quaternion as Q
|
||||||
import Dodge.Creature.Radius
|
import Dodge.Creature.Radius
|
||||||
import Geometry
|
import Geometry
|
||||||
import Dodge.Update.Camera.Rotate
|
import Dodge.Update.Camera.Rotate
|
||||||
@@ -25,50 +29,71 @@ updateCarriage' cid cr w = \case
|
|||||||
Walking -> maybeTakeStep cid cr w
|
Walking -> maybeTakeStep cid cr w
|
||||||
& tocr . crPos . _xy +~ 0.5 *^ (cr ^. crOldPos - oop) ^. _xy
|
& tocr . crPos . _xy +~ 0.5 *^ (cr ^. crOldPos - oop) ^. _xy
|
||||||
& chasmTestCliffPush walkCliffPush cr
|
& chasmTestCliffPush walkCliffPush cr
|
||||||
|
Crawling -> w & chasmTestCliffPush walkCliffPush cr
|
||||||
Floating -> w
|
Floating -> w
|
||||||
Flying {_zSpeed = dz, _flyInertia = x} ->
|
Flying {_zSpeed = dz} -> let x = flyInertia cr
|
||||||
|
in
|
||||||
w & tocr . crPos . _xy +~ x *^ f (cr ^. crOldPos . _xy - oop ^. _xy)
|
w & tocr . crPos . _xy +~ x *^ f (cr ^. crOldPos . _xy - oop ^. _xy)
|
||||||
& tocr . crPos . _z +~ dz
|
& tocr . crPos . _z +~ dz
|
||||||
& tocr . crStance . carriage . zSpeed
|
& tocr . crStance . carriage . zSpeed
|
||||||
%~ if cr ^. crPos . _z < 17 then min 0.05 . (+0.001) else max (-0.05) . subtract 0.001
|
%~ if cr ^. crPos . _z < 17 then min 0.05 . (+0.001) else max (-0.05) . subtract 0.001
|
||||||
Boosting {} -> w
|
Boosting {} -> w
|
||||||
Falling {} ->
|
Falling {_fallRot = q, _carDir = q'} ->
|
||||||
let v = 0.95 *^ (cr ^. crOldPos - oop & _z -~ 0.5)
|
let v = 0.95 *^ (cr ^. crOldPos - oop & _z -~ 0.5)
|
||||||
ep = cr ^. crPos + v
|
ep = cr ^. crPos + v
|
||||||
in if ep ^. _z < 0 && cr ^. crOldPos . _z >= 0 &&
|
in if ep ^. _z < 0 && cr ^. crOldPos . _z >= 0 &&
|
||||||
(not (any (pointInPoly (ep ^. _xy)) (w ^. cWorld . chasms))
|
(not (any (pointInPoly (ep ^. _xy)) (w ^. cWorld . chasms))
|
||||||
|| any (uncurry $ crOnSeg cr) (w ^. cWorld . cliffs))
|
|| any (uncurry $ crOnSeg cr) (w ^. cWorld . cliffs))
|
||||||
then w & tocr . crPos .~ (ep & _z .~ 0)
|
then w & tocr . crPos .~ (ep & _z .~ 0)
|
||||||
& cWorld . lWorld . creatures . ix cid . crStance . carriage .~ OnGround
|
& cWorld . lWorld . creatures . ix cid . crStance . carriage .~ OnGround q'
|
||||||
else w & cWorld . lWorld . creatures . ix cid . crPos .~ ep
|
else w & cWorld . lWorld . creatures . ix cid . crPos .~ ep
|
||||||
|
& cWorld . lWorld . creatures . ix cid . crStance . carriage . carDir *~ q
|
||||||
|
|
||||||
OnGround {} -> w
|
OnGround {} -> w
|
||||||
& tocr . crPos . _xy +~ 0.8 *^ (cr ^. crOldPos . _xy - oop ^. _xy)
|
& tocr . crPos . _xy +~ 0.8 *^ (cr ^. crOldPos . _xy - oop ^. _xy)
|
||||||
& chasmTestCliffPush groundCliffPush cr
|
& chasmTestCliffPush groundCliffPush cr
|
||||||
|
Rooted {} -> w
|
||||||
|
Mounted mid p -> fromMaybe w $ do
|
||||||
|
mcr <- w ^? cWorld . lWorld . creatures . ix mid
|
||||||
|
mp <- mcr ^? crPos
|
||||||
|
d <- mcr ^? crType . slimeCompression
|
||||||
|
return $ w & tocr . crPos .~ mp + (oxyrot (mcr ^. crDir)
|
||||||
|
(oxyrot (-mcr^.crDir) p & _x *~ d & _y %~ (/d)))
|
||||||
where
|
where
|
||||||
|
oxyrot a = over _xy (rotateV a)
|
||||||
tocr = cWorld . lWorld . creatures . ix cid
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
oop = cr ^. crOldOldPos
|
oop = cr ^. crOldOldPos
|
||||||
f v | norm v > 10 = 10 *^ signorm v
|
f v | norm v > 10 = 10 *^ signorm v
|
||||||
| otherwise = v
|
| otherwise = v
|
||||||
|
|
||||||
|
compressionScale :: Point2 -> Point2 -> Point2
|
||||||
|
compressionScale d p = dot d p *^ normalize d
|
||||||
|
+ (dot d' p / norm d) *^ d'
|
||||||
|
where
|
||||||
|
d' = vNormal $ normalize d
|
||||||
|
|
||||||
|
flyInertia :: Creature -> Float
|
||||||
|
flyInertia _ = 0.975
|
||||||
|
|
||||||
pushAgainst :: Point2 -> Point2 -> Point2
|
pushAgainst :: Point2 -> Point2 -> Point2
|
||||||
pushAgainst x y
|
pushAgainst x y
|
||||||
| a > norm y = 0
|
| a > norm y = 0
|
||||||
| a > 0 = y - project y x
|
| a > 0 = y - project y x
|
||||||
| otherwise = y
|
| otherwise = y
|
||||||
where
|
where
|
||||||
-- project y x is the projection of x onto y
|
|
||||||
a = dotV (normalize y) (project y x)
|
a = dotV (normalize y) (project y x)
|
||||||
|
|
||||||
walkCliffPush :: Creature -> [(Point2,Point2)] -> Point2
|
walkCliffPush :: Creature -> [(Point2,Point2)] -> Point2
|
||||||
walkCliffPush cr xs = pushAgainst (cr ^. crOldPos . _xy - cr ^. crOldOldPos . _xy) (-h xs)
|
walkCliffPush cr xs = pushAgainst (cr ^. crOldPos . _xy - cr ^. crOldOldPos . _xy) (-h xs)
|
||||||
where
|
where
|
||||||
cxy = cr ^. crPos . _xy
|
cxy = cr ^. crPos . _xy
|
||||||
h = circSegsInside cxy (cr ^. crType . to crRad)
|
h = circSegsInside cxy (min 10 (cr ^. crType . to crRad))
|
||||||
|
|
||||||
groundCliffPush :: Creature -> [(Point2,Point2)] -> Point2
|
groundCliffPush :: Creature -> [(Point2,Point2)] -> Point2
|
||||||
groundCliffPush cr xs = x *^ circSegsInside cxy r xs
|
groundCliffPush cr xs = x *^ circSegsInside cxy r xs
|
||||||
where
|
where
|
||||||
x = max 0 $ 0.25 * (1 - dist cxy p / (2*r)) ** 2
|
-- at least 0.01 so that corpses don't hang on the edge of a cliff too long
|
||||||
|
x = max 0.01 $ 0.25 * (1 - dist cxy p / (2*r)) ** 2
|
||||||
cxy = cr ^. crPos . _xy
|
cxy = cr ^. crPos . _xy
|
||||||
r = cr ^. crType . to crRad
|
r = cr ^. crType . to crRad
|
||||||
p = circSegsInside' cxy r xs
|
p = circSegsInside' cxy r xs
|
||||||
@@ -105,14 +130,22 @@ chasmTestCliffPush f' cr w
|
|||||||
& soundContinue (CrChasm (_crID cr)) (cr ^. crPos . _xy) debrisS (Just 100)
|
& soundContinue (CrChasm (_crID cr)) (cr ^. crPos . _xy) debrisS (Just 100)
|
||||||
& tocr . crPos . _xy +~ f' cr (xy:xys) -- (f cr (xy:xys)) *^ h xy xys
|
& tocr . crPos . _xy +~ f' cr (xy:xys) -- (f cr (xy:xys)) *^ h xy xys
|
||||||
& chasmRotate cr (uncurry (-) xy)
|
& chasmRotate cr (uncurry (-) xy)
|
||||||
| any f (w ^. cWorld . chasms) = w & tocr . crStance . carriage .~ Falling -- %~ startFalling
|
| any f (w ^. cWorld . chasms) = w & tocr . crStance . carriage
|
||||||
|
.~ Falling
|
||||||
|
(Q.axisAngle (0 & _xy .~ vNormal (cr^.crOldOldPos._xy - cr^.crOldPos._xy)) 0.03)
|
||||||
|
Q.qid
|
||||||
| otherwise = w
|
| otherwise = w
|
||||||
where
|
where
|
||||||
cxy = cr ^. crPos . _xy
|
cxy = cr ^. crPos . _xy
|
||||||
tocr = cWorld . lWorld . creatures . ix (_crID cr)
|
tocr = cWorld . lWorld . creatures . ix (_crID cr)
|
||||||
g = uncurry $ crOnSeg cr
|
--g = uncurry $ crOnSeg cr
|
||||||
|
g = uncurry $ crOnSeg' cr
|
||||||
f = pointInPoly cxy
|
f = pointInPoly cxy
|
||||||
|
|
||||||
|
crOnSeg' :: Creature -> Point2 -> Point2 -> Bool
|
||||||
|
{-# INLINE crOnSeg' #-}
|
||||||
|
crOnSeg' cr = circOnSeg (cr ^. crPos . _xy) (min 10 (cr ^. crType . to crRad))
|
||||||
|
|
||||||
chasmRotate :: Creature -> Point2 -> World -> World
|
chasmRotate :: Creature -> Point2 -> World -> World
|
||||||
chasmRotate cr v w
|
chasmRotate cr v w
|
||||||
| t = rotateTo8 (argV v) w
|
| t = rotateTo8 (argV v) w
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ module Dodge.Creature.Statistics (
|
|||||||
getCrMoveSpeed,
|
getCrMoveSpeed,
|
||||||
crStrength,
|
crStrength,
|
||||||
crDexterity,
|
crDexterity,
|
||||||
crIntelligence,
|
-- crIntelligence,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Dodge.Data.World
|
||||||
import Dodge.Data.Equipment.Misc
|
import Dodge.Data.Equipment.Misc
|
||||||
import qualified Data.Map.Strict as M
|
import qualified Data.Map.Strict as M
|
||||||
import NewInt
|
import NewInt
|
||||||
import Dodge.Data.LWorld
|
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
--import qualified IntMapHelp as IM
|
--import qualified IntMapHelp as IM
|
||||||
import qualified Data.IntMap.Strict as IM
|
import qualified Data.IntMap.Strict as IM
|
||||||
@@ -25,6 +25,7 @@ crDexterity cr = case cr ^. crType of
|
|||||||
AutoCrit -> 46
|
AutoCrit -> 46
|
||||||
BarrelCrit {} -> 0
|
BarrelCrit {} -> 0
|
||||||
LampCrit {} -> 0
|
LampCrit {} -> 0
|
||||||
|
_ -> 46
|
||||||
|
|
||||||
crStrength :: Creature -> Int
|
crStrength :: Creature -> Int
|
||||||
crStrength cr = case cr ^. crType of
|
crStrength cr = case cr ^. crType of
|
||||||
@@ -35,20 +36,25 @@ crStrength cr = case cr ^. crType of
|
|||||||
AutoCrit -> 46
|
AutoCrit -> 46
|
||||||
BarrelCrit {} -> 0
|
BarrelCrit {} -> 0
|
||||||
LampCrit {} -> 0
|
LampCrit {} -> 0
|
||||||
|
_ -> 46
|
||||||
|
|
||||||
crIntelligence :: Creature -> Int
|
--crIntelligence :: Creature -> Int
|
||||||
crIntelligence cr = case cr ^. crType of
|
--crIntelligence cr = case cr ^. crType of
|
||||||
Avatar { _avIntelligence = x } -> x
|
-- Avatar { _avIntelligence = x } -> x
|
||||||
ChaseCrit {} -> 20
|
-- ChaseCrit {} -> 20
|
||||||
HoverCrit {} -> 20
|
-- CrabCrit {} -> 20
|
||||||
SwarmCrit -> 20
|
-- HoverCrit {} -> 20
|
||||||
AutoCrit -> 20
|
-- SwarmCrit -> 20
|
||||||
BarrelCrit {} -> 0
|
-- AutoCrit -> 20
|
||||||
LampCrit {} -> 0
|
-- BarrelCrit {} -> 0
|
||||||
|
-- LampCrit {} -> 0
|
||||||
|
-- SlinkCrit{} -> 5
|
||||||
|
-- SlimeCrit{} -> 1
|
||||||
|
-- BeeCrit{} -> 20
|
||||||
|
|
||||||
|
|
||||||
getCrMoveSpeed :: LWorld -> Creature -> Int
|
getCrMoveSpeed :: World -> Creature -> Int
|
||||||
getCrMoveSpeed lw cr = strFromHeldItem lw cr + strFromEquipment lw cr + crStrength cr
|
getCrMoveSpeed w cr = strFromHeldItem w cr + strFromEquipment (w^.cWorld.lWorld) cr + crStrength cr
|
||||||
|
|
||||||
strFromEquipment :: LWorld -> Creature -> Int
|
strFromEquipment :: LWorld -> Creature -> Int
|
||||||
strFromEquipment lw = sum . fmap equipmentStrValue . crCurrentEquipment lw
|
strFromEquipment lw = sum . fmap equipmentStrValue . crCurrentEquipment lw
|
||||||
@@ -64,12 +70,12 @@ crCurrentEquipment lw = fmap f . _crEquipment
|
|||||||
where
|
where
|
||||||
f i = lw ^?! items . ix (_unNInt i)
|
f i = lw ^?! items . ix (_unNInt i)
|
||||||
|
|
||||||
strFromHeldItem :: LWorld -> Creature -> Int
|
strFromHeldItem :: World -> Creature -> Int
|
||||||
strFromHeldItem lw cr = fromMaybe 0 $ do
|
strFromHeldItem w cr = fromMaybe 0 $ do
|
||||||
Aiming {} <- cr ^? crStance . posture
|
Aiming {} <- cr ^? crStance . posture
|
||||||
is <- cr ^? crManipulation . manObject . imAttachedItems
|
is <- w^?hud . manObject . hiAttachedItems
|
||||||
let js = IM.elems $ IM.restrictKeys (cr ^. crInv . unNIntMap) is
|
let js = IM.elems $ IM.restrictKeys (cr ^. crInv . unNIntMap) is
|
||||||
return . negate . sum . fmap itemWeight $ IM.restrictKeys (lw ^. items) $ IS.fromList js
|
return . negate . sum . fmap itemWeight $ IM.restrictKeys (w ^.cWorld.lWorld. items) $ IS.fromList js
|
||||||
|
|
||||||
itemWeight :: Item -> Int
|
itemWeight :: Item -> Int
|
||||||
itemWeight it = case it ^. itType of
|
itemWeight it = case it ^. itType of
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
module Dodge.Creature.Strategy (
|
|
||||||
goToPostStrat,
|
|
||||||
) where
|
|
||||||
|
|
||||||
import Data.List
|
|
||||||
import Dodge.Creature.Test
|
|
||||||
import Dodge.Creature.Volition
|
|
||||||
import Dodge.Data.Creature
|
|
||||||
|
|
||||||
goToPostStrat :: Creature -> Strategy
|
|
||||||
goToPostStrat cr = case find sentinelGoal $ _apGoal $ _crActionPlan cr of
|
|
||||||
Just (SentinelAt p _) ->
|
|
||||||
StrategyActions
|
|
||||||
(GetTo p)
|
|
||||||
[ DoActionThen (WaitThen 150 holsterIfAiming) $
|
|
||||||
DoActionThen
|
|
||||||
(PathTo p NoAction)
|
|
||||||
NoAction
|
|
||||||
-- $ DoImpulses [ChangeStrategy WatchAndWait]
|
|
||||||
]
|
|
||||||
_ -> WatchAndWait
|
|
||||||
where
|
|
||||||
sentinelGoal (SentinelAt _ _) = True
|
|
||||||
sentinelGoal _ = False
|
|
||||||
holsterIfAiming
|
|
||||||
| crIsAiming cr = holsterWeapon
|
|
||||||
| otherwise = NoAction
|
|
||||||
+25
-21
@@ -29,7 +29,6 @@ import Dodge.Creature.Radius
|
|||||||
import Dodge.Data.Equipment.Misc
|
import Dodge.Data.Equipment.Misc
|
||||||
import Dodge.Data.AimStance
|
import Dodge.Data.AimStance
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.List (find)
|
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Dodge.Base.Collide
|
import Dodge.Base.Collide
|
||||||
import Dodge.Data.World
|
import Dodge.Data.World
|
||||||
@@ -81,31 +80,28 @@ crStratConMatches strat cr = strat == _apStrategy (_crActionPlan cr)
|
|||||||
-- this equality check might be slow...
|
-- this equality check might be slow...
|
||||||
|
|
||||||
crAwayFromPost :: Creature -> Bool
|
crAwayFromPost :: Creature -> Bool
|
||||||
crAwayFromPost cr = case find sentinelGoal . _apGoal $ _crActionPlan cr of
|
crAwayFromPost cr = case _apGoal $ _crActionPlan cr of
|
||||||
Just (SentinelAt p _) -> dist p (cr ^. crPos . _xy) > 15
|
SentinelAt p _ -> dist p (cr ^. crPos . _xy) > 15
|
||||||
_ -> False
|
_ -> False
|
||||||
where
|
|
||||||
sentinelGoal (SentinelAt _ _) = True
|
|
||||||
sentinelGoal _ = False
|
|
||||||
|
|
||||||
crInAimStance :: AimStance -> Creature -> Bool
|
crInAimStance :: AimStance -> World -> Creature -> Bool
|
||||||
crInAimStance as cr = cr ^? crStance . posture == Just Aiming
|
crInAimStance as w cr = cr ^? crStance . posture == Just Aiming
|
||||||
&& cr ^? crManipulation . manObject . imAimStance == Just as
|
&& w ^? hud . manObject . hiAimStance == Just as
|
||||||
|
|
||||||
oneH :: Creature -> Bool
|
oneH :: World -> Creature -> Bool
|
||||||
oneH = crInAimStance OneHand
|
oneH = crInAimStance OneHand
|
||||||
|
|
||||||
twoFlat :: Creature -> Bool
|
twoFlat :: World -> Creature -> Bool
|
||||||
twoFlat = crInAimStance TwoHandFlat
|
twoFlat = crInAimStance TwoHandFlat
|
||||||
|
|
||||||
twists :: Creature -> Bool
|
twists :: World -> Creature -> Bool
|
||||||
twists = crInAimStance TwoHandTwist
|
twists = crInAimStance TwoHandTwist
|
||||||
|
|
||||||
-- the use of crOldPos is because the damage position is calculated on the
|
-- the use of crOldPos is because the damage position is calculated on the
|
||||||
-- previous frame
|
-- previous frame
|
||||||
-- Not sure if it is a good idea
|
-- Not sure if it is a good idea
|
||||||
crIsArmouredFrom :: IM.IntMap Item -> Point2 -> Creature -> Bool
|
crIsArmouredFrom :: IM.IntMap Item -> Point2 -> World -> Creature -> Bool
|
||||||
crIsArmouredFrom m p cr = fromMaybe False $ do
|
crIsArmouredFrom m p w cr = fromMaybe False $ do
|
||||||
NInt itid <- cr ^? crEquipment . ix OnChest
|
NInt itid <- cr ^? crEquipment . ix OnChest
|
||||||
ittype <- m ^? ix itid . itType
|
ittype <- m ^? ix itid . itType
|
||||||
return $
|
return $
|
||||||
@@ -116,8 +112,8 @@ crIsArmouredFrom m p cr = fromMaybe False $ do
|
|||||||
where
|
where
|
||||||
-- even though angleVV can generate NaN, the comparison seems to deal with it
|
-- even though angleVV can generate NaN, the comparison seems to deal with it
|
||||||
frontarmdirection
|
frontarmdirection
|
||||||
| crInAimStance OneHand cr = 0.5
|
| crInAimStance OneHand w cr = 0.5
|
||||||
| crInAimStance TwoHandTwist cr = negate 1
|
| crInAimStance TwoHandTwist w cr = negate 1
|
||||||
| otherwise = 0
|
| otherwise = 0
|
||||||
|
|
||||||
--crOnSeg :: Point2 -> Point2 -> Creature -> Bool
|
--crOnSeg :: Point2 -> Point2 -> Creature -> Bool
|
||||||
@@ -133,11 +129,19 @@ isAnimate :: Creature -> Bool
|
|||||||
{-# INLINE isAnimate #-}
|
{-# INLINE isAnimate #-}
|
||||||
isAnimate cr = case _crActionPlan cr of
|
isAnimate cr = case _crActionPlan cr of
|
||||||
Inanimate -> False
|
Inanimate -> False
|
||||||
_ -> True
|
SlimeIntelligence -> True
|
||||||
|
ActionPlan{} -> True
|
||||||
|
|
||||||
hasAutoDoorBody :: Creature -> Bool
|
hasAutoDoorBody :: Creature -> Bool
|
||||||
hasAutoDoorBody cr = case cr ^. crHP of
|
hasAutoDoorBody cr = crittype && notdestroyed
|
||||||
HP {} -> True
|
where
|
||||||
CrIsCorpse {} -> True
|
notdestroyed = case cr ^. crHP of
|
||||||
CrDestroyed {} -> False
|
HP {} -> True
|
||||||
|
CrIsCorpse {} -> True
|
||||||
|
AvatarDestroyed {} -> False
|
||||||
|
crittype = case cr ^. crType of
|
||||||
|
SlimeCrit {} -> False
|
||||||
|
BeeCrit {} -> False
|
||||||
|
HiveCrit {} -> False
|
||||||
|
_ -> True
|
||||||
|
|
||||||
|
|||||||
+521
-79
@@ -1,15 +1,28 @@
|
|||||||
{-# LANGUAGE LambdaCase #-}
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
|
||||||
module Dodge.Creature.Update (updateCreature) where
|
module Dodge.Creature.Update (updateCreature) where
|
||||||
|
|
||||||
import Dodge.Base.You
|
import qualified Data.Semigroup as Semi
|
||||||
import Control.Monad
|
import Dodge.WorldEvent.ThingsHit
|
||||||
|
import Dodge.Humanoid
|
||||||
|
import Dodge.Creature.Perception
|
||||||
|
import Dodge.Creature.ReaderUpdate
|
||||||
|
import Dodge.Creature.Slime
|
||||||
|
import Dodge.Creature.Radius
|
||||||
|
import Dodge.Creature.MoveType
|
||||||
|
import Dodge.Base.Collide
|
||||||
|
import Data.List (sortOn)
|
||||||
|
import Dodge.Zoning.Creature
|
||||||
|
import Dodge.Creature.ChaseCrit
|
||||||
|
import Dodge.Creature.Damage
|
||||||
import Color
|
import Color
|
||||||
import qualified Data.IntMap.Strict as IM
|
import Control.Monad
|
||||||
|
import qualified IntMapHelp as IM
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Dodge.Barreloid
|
import Dodge.Barreloid
|
||||||
-- import Dodge.Base.NewID
|
import Dodge.Base.You
|
||||||
import Dodge.Corpse.Make
|
|
||||||
import Dodge.Creature.Action
|
import Dodge.Creature.Action
|
||||||
|
import Dodge.Creature.Picture
|
||||||
import Dodge.Creature.State
|
import Dodge.Creature.State
|
||||||
import Dodge.Creature.State.WalkCycle
|
import Dodge.Creature.State.WalkCycle
|
||||||
import Dodge.Creature.Vocalization
|
import Dodge.Creature.Vocalization
|
||||||
@@ -17,7 +30,6 @@ import Dodge.Creature.YourControl
|
|||||||
import Dodge.Damage
|
import Dodge.Damage
|
||||||
import Dodge.Data.Damage.Type
|
import Dodge.Data.Damage.Type
|
||||||
import Dodge.Data.World
|
import Dodge.Data.World
|
||||||
import Dodge.Humanoid
|
|
||||||
import Dodge.Inventory
|
import Dodge.Inventory
|
||||||
import Dodge.Lampoid
|
import Dodge.Lampoid
|
||||||
import Dodge.Prop.Gib
|
import Dodge.Prop.Gib
|
||||||
@@ -27,52 +39,475 @@ import Geometry
|
|||||||
import LensHelp
|
import LensHelp
|
||||||
import Linear
|
import Linear
|
||||||
import NewInt
|
import NewInt
|
||||||
|
import qualified Quaternion as Q
|
||||||
import RandomHelp
|
import RandomHelp
|
||||||
import Shape
|
import Shape
|
||||||
import ShapePicture.Data
|
import ShapePicture.Data
|
||||||
|
import qualified Data.IntSet as IS
|
||||||
|
|
||||||
-- Should separate out creature movement from other parts here
|
-- Should separate out creature movement from other parts here
|
||||||
-- allow for knockbacks etc to be determined as well as intended movements
|
-- allow for knockbacks etc to be determined as well as intended movements
|
||||||
updateCreature :: Creature -> World -> World
|
updateCreature :: Creature -> World -> World
|
||||||
updateCreature cr
|
updateCreature cr
|
||||||
| cr ^. crPos . _z < negate 300 = (tocr . crHP .~ CrDestroyed Pitted) . destroyAllInvItems cr
|
| cr ^. crPos . _z < negate 300 = (cWorld . lWorld . creatures . at (cr ^. crID) %~ destroyCreature)
|
||||||
| CrIsCorpse _ <- cr ^. crHP = updateCarriage (_crID cr)
|
. destroyAllInvItems cr
|
||||||
| null (cr ^? crHP . _HP) = id
|
| otherwise = case cr ^. crHP of
|
||||||
| otherwise = updateLivingCreature cr
|
CrIsCorpse{} -> cleardamage . updateCarriage (_crID cr) . applyCreatureDamage (_crID cr) cr
|
||||||
|
AvatarDestroyed{} -> id
|
||||||
|
HP{} -> cleardamage . updateLivingCreature cr
|
||||||
where
|
where
|
||||||
tocr = cWorld . lWorld . creatures . ix (_crID cr)
|
cleardamage = cWorld . lWorld . creatures . ix (cr^.crID) . crDamage .~ mempty
|
||||||
|
|
||||||
updateLivingCreature :: Creature -> World -> World
|
updateLivingCreature :: Creature -> World -> World
|
||||||
updateLivingCreature cr =
|
updateLivingCreature cr = case cr ^. crType of
|
||||||
case _crType cr of
|
Avatar{} ->
|
||||||
Avatar{} ->
|
(cWorld . lWorld . creatures . ix 0 . crType . avatarPulse %~ updatePulse)
|
||||||
(cWorld . lWorld . creatures . ix 0 . crType . avatarPulse %~ updatePulse)
|
. crUpdate cid
|
||||||
. crUpdate cid
|
. yourControl
|
||||||
. yourControl
|
LampCrit{} -> updateLampoid cr
|
||||||
LampCrit{} -> updateLampoid cr
|
BarrelCrit bt -> updateBarreloid bt cr
|
||||||
BarrelCrit bt -> updateBarreloid bt cr
|
ChaseCrit{} -> crUpdate cid . performActions cid . setChaseCritKinematics cid . updateChaseCrit cid cr
|
||||||
ChaseCrit{} -> \w ->
|
CrabCrit{} -> crUpdate cid . performActions cid . crabCritInternal cid
|
||||||
crUpdate cid . performActions cid $
|
AutoCrit{} -> crUpdate cid
|
||||||
over (cWorld . lWorld . creatures . ix cid) (chaseCritInternal w) w
|
SwarmCrit{} -> crUpdate cid
|
||||||
AutoCrit {} -> crUpdate cid
|
HoverCrit{} -> crUpdate cid . performActions cid . hoverCritHoverSound cr .
|
||||||
SwarmCrit {} -> crUpdate cid
|
updateHoverCrit cid
|
||||||
HoverCrit {} -> \w ->
|
SlinkCrit{} -> slinkCritUpdate cid
|
||||||
crUpdate cid . performActions cid . hoverCritHoverSound cr $
|
SlimeCrit{} -> updateSlimeCrit cid
|
||||||
over (cWorld . lWorld . creatures . ix cid) (hoverCritInternal w) w
|
BeeCrit{} -> crUpdate cid . performActions cid . updateBeeFromPheremones cr cid . updateBeeCrit cr cid
|
||||||
|
HiveCrit{} -> crUpdate cid . performActions cid . updateHiveCrit cr cid
|
||||||
where
|
where
|
||||||
cid = cr ^. crID
|
cid = cr ^. crID
|
||||||
|
|
||||||
|
updateHiveCrit :: Creature -> Int -> World -> World
|
||||||
|
updateHiveCrit cr cid w
|
||||||
|
| Just x <- cr ^? crType . hiveChildren . to IS.size
|
||||||
|
, x < nbees
|
||||||
|
, Just y <- cr ^? crType . hiveGestation
|
||||||
|
, y == 0
|
||||||
|
, Just z <- cr ^? crType . hiveSlime
|
||||||
|
, z >= 400
|
||||||
|
= w
|
||||||
|
& tocr . crType . hiveChildren %~ IS.insert nid
|
||||||
|
& tocr . crType . hiveGestation .~ 50
|
||||||
|
& cWorld . lWorld . creatures . at nid ?~ ncr
|
||||||
|
& tocr . crType . hiveSlime -~ 400
|
||||||
|
| Just x <- cr ^? crType . hiveChildren . to IS.size
|
||||||
|
, x < nbees = w
|
||||||
|
& tocr . crType . hiveGestation %~ (max 0 . subtract 1)
|
||||||
|
| otherwise = w
|
||||||
|
where
|
||||||
|
nbees = 15
|
||||||
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
|
nid = IM.newKey $ w ^. cWorld . lWorld . creatures
|
||||||
|
ncr = beeCrit & crPos .~ (cr ^. crPos + (0 & _xy +~ 25))
|
||||||
|
& crID .~ nid
|
||||||
|
& crType . beeHive ?~ cid
|
||||||
|
|
||||||
|
updateBeeFromPheremones :: Creature -> Int -> World -> World
|
||||||
|
updateBeeFromPheremones cr cid w
|
||||||
|
| any f (w ^. cWorld . lWorld . beePheremones) = w
|
||||||
|
& cWorld . lWorld . creatures . ix cid . crType . beeAggro .~ 300
|
||||||
|
| otherwise = w
|
||||||
|
where
|
||||||
|
f bp = distance (cr ^. crPos . _xy) (bp ^. bpPos . _xy) < 20
|
||||||
|
|
||||||
|
updateBeeCrit :: Creature -> Int -> World -> World
|
||||||
|
updateBeeCrit cr cid
|
||||||
|
| cr ^?! crType . beeAggro > 0 = updateAggroBee cr cid
|
||||||
|
| otherwise = beeLifespanCheck cr cid . updateCalmBee cr cid
|
||||||
|
|
||||||
|
beeLifespanCheck :: Creature -> Int -> World -> World
|
||||||
|
beeLifespanCheck cr cid
|
||||||
|
| Just ls <- cr ^? crType . beeLifespan
|
||||||
|
, Just x <- cr ^? crType . beeSlime
|
||||||
|
, ls < 1
|
||||||
|
, x < 5
|
||||||
|
= cWorld . lWorld . creatures . ix cid . crHP . _HP -~ 1
|
||||||
|
| otherwise = id
|
||||||
|
|
||||||
|
updateAggroBee :: Creature -> Int -> World -> World
|
||||||
|
updateAggroBee cr cid w
|
||||||
|
| Mounted{} <- cr ^. crStance . carriage = w & tocr . crStance . carriage .~ Flying 0
|
||||||
|
| Just tcr <- atarget
|
||||||
|
, distance (tcr ^. crPos . _xy) (cr ^. crPos . _xy) < crRad (cr ^. crType) + crRad (tcr ^. crType) + 1
|
||||||
|
, nearZeroAngle (argV (tcr ^. crPos . _xy - cr ^. crPos . _xy) - cr ^. crDir) < pi / 2
|
||||||
|
, 0 <- cr ^?! crType . meleeCooldown
|
||||||
|
= w & tocr . crPos .~ (cr ^. crOldPos & _xy -~ 5 *^ unitVectorAtAngle (cr ^. crDir))
|
||||||
|
& tocr . crType . startStopMv .~ (cr ^?! to crMvType . mvPulseTime)
|
||||||
|
& cWorld . lWorld . creatures . ix (tcr ^. crID) . crDamage
|
||||||
|
.:~ Blunt 50 (cxy + crRad (cr ^. crType) *^ vdir) vdir (CrMeleeO (cr ^. crID))
|
||||||
|
& tocr . crType . meleeCooldown .~ 20
|
||||||
|
| Just tcr <- atarget = w & tocr . crActionPlan . apStrategy .~ CloseToMelee (tcr ^. crID)
|
||||||
|
& tocr . crActionPlan . apAction .~ PathTo (tcr ^. crPos . _xy) NoAction
|
||||||
|
& tocr . crType . meleeCooldown %~ (max 0 . subtract 1)
|
||||||
|
| Just PathTo{} <- cr ^? crActionPlan . apAction = w & tocr . crType . beeAggro -~ 1
|
||||||
|
& tocr . crType . meleeCooldown %~ (max 0 . subtract 1)
|
||||||
|
| otherwise = w & tocr . crType . beeAggro -~ 1
|
||||||
|
& tocr . crActionPlan . apAction .~ PathTo (cxy + p) NoAction
|
||||||
|
& tocr . crType . meleeCooldown %~ (max 0 . subtract 1)
|
||||||
|
& randGen .~ g
|
||||||
|
where
|
||||||
|
(p,g) = runState (randOnCirc 150) (w ^. randGen)
|
||||||
|
atarget = listToMaybe . sortOn (distance cxy . (^.crPos._xy)) . IM.elems . IM.filter istarget $ crsNearCirc cxy 100 w
|
||||||
|
vdir = unitVectorAtAngle (cr ^. crDir)
|
||||||
|
cxy = cr ^. crPos . _xy
|
||||||
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
|
istarget tcr = t (tcr ^. crType)
|
||||||
|
&& isJust (tcr ^? crHP . _HP)
|
||||||
|
&& hasLOS cxy (tcr ^. crPos . _xy) w
|
||||||
|
t = \case
|
||||||
|
Avatar{} -> True
|
||||||
|
ChaseCrit{} -> True
|
||||||
|
CrabCrit{} -> True
|
||||||
|
_ -> False
|
||||||
|
|
||||||
|
-- do bees need to be able to see slime targets?
|
||||||
|
-- if no path can be made, reset harvest action
|
||||||
|
-- this should all be simplified
|
||||||
|
-- should count how many are mounted on an individual slime, try for a different
|
||||||
|
-- slime if too many
|
||||||
|
updateCalmBee :: Creature -> Int -> World -> World
|
||||||
|
updateCalmBee cr cid w
|
||||||
|
| Just hcr <- gethive
|
||||||
|
, distance (cr ^. crPos . _xy) (hcr ^. crPos . _xy) < 30
|
||||||
|
, Just x <- cr ^? crType . beeSlime
|
||||||
|
, x >= 50 = w
|
||||||
|
& tocr . crType . beeSlime -~ 50
|
||||||
|
& cWorld . lWorld . creatures . ix (hcr ^. crID) . crType . hiveSlime +~ 50
|
||||||
|
| Just x <- cr ^? crType . beeSlime
|
||||||
|
, x < 50
|
||||||
|
, Just hcr <- gethive
|
||||||
|
, distance (cr ^. crPos . _xy) (hcr ^. crPos . _xy) < 30
|
||||||
|
, Just ReturnToHive <- cr ^? crActionPlan . apStrategy = startsearch
|
||||||
|
| Just ReturnToHive <- cr ^? crActionPlan . apStrategy = w
|
||||||
|
| Just x <- cr ^? crType . beeSlime
|
||||||
|
, x >= 1500 = starthivereturn
|
||||||
|
& randGen .~ gsa
|
||||||
|
& tocr . crType . beeLifespan %~ max 0 . subtract sa
|
||||||
|
| Just mid <- cr ^? crStance . carriage . mountID
|
||||||
|
, mountshakeoff mid = startsearch
|
||||||
|
| Nothing <- cr ^? crActionPlan . apStrategy . harvestTarget
|
||||||
|
, xs@(_:_) <- IM.elems . IM.filter istarget $ crsNearCirc cxy 100 w
|
||||||
|
, (tcr,g') <- runState (takeOne xs) (w ^. randGen) =
|
||||||
|
w & tocr . crActionPlan . apStrategy .~ HarvestFrom (tcr ^. crID)
|
||||||
|
& randGen .~ g'
|
||||||
|
| Just tid <- cr ^? crStance . carriage . mountID
|
||||||
|
, Just SlimeCrit{} <- w ^? cWorld . lWorld . creatures . ix tid . crType = w
|
||||||
|
& tocr . crType . beeSlime +~ sspeed
|
||||||
|
& cWorld . lWorld . creatures . ix tid . crType . slimeSlime -~ sspeed
|
||||||
|
| Just (tcr,ti) <- gettarg
|
||||||
|
, distance (cr ^. crPos . _xy) (tcr ^. crPos . _xy) < 0.8*crRad (tcr ^. crType)
|
||||||
|
, Just d <- tcr ^? crType . slimeCompression
|
||||||
|
= w
|
||||||
|
& tocr . crStance . carriage .~ Mounted ti
|
||||||
|
(oxyrot (tcr^.crDir)
|
||||||
|
(oxyrot (-tcr^.crDir) (cr ^. crPos - tcr ^. crPos) & _x %~ (/d) & _y *~ d))
|
||||||
|
& tocr . crActionPlan . apAction .~ NoAction
|
||||||
|
| Just (tcr,_) <- gettarg = w
|
||||||
|
& tocr . crActionPlan . apAction .~ PathTo (tcr ^. crPos . _xy) NoAction
|
||||||
|
| Just (HarvestFrom{}) <- cr ^? crActionPlan . apStrategy = startsearch
|
||||||
|
| Just (SearchTimed 0) <- cr ^? crActionPlan . apStrategy = starthivereturn
|
||||||
|
| Just PathTo{} <- cr ^? crActionPlan . apAction = w
|
||||||
|
& tocr . crActionPlan . apStrategy . searchTimer %~ (max 0 . subtract 1)
|
||||||
|
| otherwise = startsearch
|
||||||
|
where
|
||||||
|
oxyrot a = over _xy (rotateV a)
|
||||||
|
(sa,gsa) = runState (takeOne [0,1]) (w ^. randGen)
|
||||||
|
starthivereturn = fromMaybe w $ do
|
||||||
|
hcr <- gethive
|
||||||
|
return $ w
|
||||||
|
& tocr . crActionPlan . apAction .~ PathTo (hcr ^. crPos . _xy) NoAction
|
||||||
|
& tocr . crActionPlan . apStrategy .~ ReturnToHive
|
||||||
|
& tocr . crStance . carriage %~ dounmount
|
||||||
|
dounmount x = case x of
|
||||||
|
Flying{} -> x
|
||||||
|
_ -> Flying 0
|
||||||
|
startsearch = w
|
||||||
|
& tocr . crActionPlan . apAction .~ PathTo (cxy + p) NoAction
|
||||||
|
& tocr . crStance . carriage %~ dounmount
|
||||||
|
& randGen .~ g
|
||||||
|
& tocr . crActionPlan . apStrategy .~ SearchTimed 200
|
||||||
|
(p,g) = runState (randOnCirc 200) (w ^. randGen)
|
||||||
|
cxy = cr ^. crPos . _xy
|
||||||
|
mountshakeoff mid = fromMaybe False $ do
|
||||||
|
mcr <- w ^? cWorld . lWorld . creatures . ix mid
|
||||||
|
x <- mcr ^? crType . slimeDistortion . sdTime
|
||||||
|
return $ x > 8
|
||||||
|
sspeed = 5
|
||||||
|
gettarg = do
|
||||||
|
i <- cr ^? crActionPlan . apStrategy . harvestTarget
|
||||||
|
tcr <- w ^? cWorld . lWorld . creatures . ix i
|
||||||
|
x <- tcr ^? crType . slimeSlime . to slimeToRad
|
||||||
|
guard $ x > 12
|
||||||
|
return (tcr,i)
|
||||||
|
gethive = do
|
||||||
|
i <- cr ^? crType . beeHive . _Just
|
||||||
|
w ^? cWorld . lWorld . creatures . ix i
|
||||||
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
|
istarget tcr = fromMaybe False $ do
|
||||||
|
r <- tcr ^? crType . slimeSlime . to slimeToRad
|
||||||
|
return $ r > 12
|
||||||
|
|
||||||
|
updateSlimeCrit :: Int -> World -> World
|
||||||
|
updateSlimeCrit cid w
|
||||||
|
| cr ^?! crType . slimeSlime < 2500
|
||||||
|
= w & cWorld . lWorld . creatures . at cid .~ Nothing
|
||||||
|
| Just hitp <- w ^? cWorld . lWorld . creatures . ix cid . crDamage . ix 0 . dmPos
|
||||||
|
, Just hitv <- w ^? cWorld . lWorld . creatures . ix cid . crDamage . ix 0 . dmVector
|
||||||
|
, Just w' <- splitSlimeCrit' hitp hitv cid cr w = w'
|
||||||
|
| (cr ^?! crType . slimeIsCompressing) && 1 > p
|
||||||
|
= let (w',g) = runState (setSlimeDir cid cr w) (w ^. randGen)
|
||||||
|
in w' & randGen .~ g
|
||||||
|
| otherwise = updateCarriage cid $ w
|
||||||
|
& cWorld . lWorld . creatures . ix cid %~ mvslime
|
||||||
|
& cWorld . lWorld . creatures . ix cid . crDamage .~ []
|
||||||
|
& tocr %~ doSlimeRadChange
|
||||||
|
& tocr . crType . slimeDistortion %~ fsst
|
||||||
|
& tocr . crType . slimeEngulfProgress %~ (max 0 . subtract 0.5)
|
||||||
|
where
|
||||||
|
fsst (SlimeDistortion x ps t) | x > 0 = SlimeDistortion (x-1) ps t
|
||||||
|
fsst _ = NoSlimeDistortion
|
||||||
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
|
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
||||||
|
mvslime cr' = cr' & crType . slimeCompression +~ f (0.1/r)
|
||||||
|
& crPos . _xy +~ 0.1 *^ unitVectorAtAngle (cr' ^. crDir)
|
||||||
|
& crType . slimeIsCompressing %~ f'
|
||||||
|
f | cr ^?! crType . slimeIsCompressing = negate
|
||||||
|
| otherwise = id
|
||||||
|
f' | p > 1.5 = const True
|
||||||
|
| otherwise = id
|
||||||
|
r = cr ^?! crType . slimeSlime . to slimeToRad
|
||||||
|
p = cr ^?! crType . slimeCompression
|
||||||
|
|
||||||
|
setSlimeDir :: Int -> Creature -> World -> State StdGen World
|
||||||
|
setSlimeDir cid cr w = do
|
||||||
|
i <- state $ randomR (0,1)
|
||||||
|
d <- state $ randomR (0,2*pi)
|
||||||
|
if i < (r - 11) / 50
|
||||||
|
then do
|
||||||
|
x <- randInCirc 1
|
||||||
|
return $ fromMaybe w $ splitSlimeCrit' (x + cxy) (unitVectorAtAngle d) cid cr w
|
||||||
|
else return $ w & tocr . crDir .~ d
|
||||||
|
& tocr . crType . slimeIsCompressing .~ False
|
||||||
|
& tocr . crDamage .~ mempty
|
||||||
|
where
|
||||||
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
|
cxy = cr ^. crPos . _xy
|
||||||
|
r = cr ^?! crType . slimeSlime . to slimeToRad
|
||||||
|
|
||||||
|
doSlimeRadChange :: Creature -> Creature
|
||||||
|
doSlimeRadChange = crType . slimeSlimeChange %~ f
|
||||||
|
where
|
||||||
|
f x | x > 1000 = x - 1000
|
||||||
|
| x < -1000 = x + 1000
|
||||||
|
| otherwise = 0
|
||||||
|
|
||||||
|
splitSlimeCrit' :: Point2 -> Point2 -> Int -> Creature -> World -> Maybe World
|
||||||
|
splitSlimeCrit' p v cid cr w = do
|
||||||
|
(cr1,cr2) <- splitSlimeCrit p v cr
|
||||||
|
let cid' = IM.newKey $ w ^. cWorld . lWorld . creatures
|
||||||
|
(s,g) = runState (takeOne [popS,pop1S,pop2S,pop3S]) (w ^. randGen)
|
||||||
|
return $ w & cWorld . lWorld . creatures . ix cid .~ cr1
|
||||||
|
& cWorld . lWorld . creatures . at cid' ?~ (cr2 & crID .~ cid')
|
||||||
|
& soundStart (CrSound cid) (cr ^. crPos . _xy) s Nothing
|
||||||
|
& randGen .~ g
|
||||||
|
|
||||||
|
splitSlimeCrit :: Point2 -> Point2 -> Creature -> Maybe (Creature, Creature)
|
||||||
|
splitSlimeCrit p v cr = do
|
||||||
|
let mp = closestPointOnLine p (p+v) cxy
|
||||||
|
h = r - distance mp cxy
|
||||||
|
guard $ h > 0
|
||||||
|
let a1 = segmentArea r h
|
||||||
|
a2 = pi*r*r - a1
|
||||||
|
r1 = sqrt (a1/pi)
|
||||||
|
r2 = sqrt (a2/pi)
|
||||||
|
mvdir
|
||||||
|
| isLHS p (p+v) cxy = normalize (vNormal v)
|
||||||
|
| otherwise = - normalize (vNormal v)
|
||||||
|
(ps',qs')
|
||||||
|
| isLHS p (p+v) cxy = (ps,qs)
|
||||||
|
| otherwise = (qs,ps)
|
||||||
|
c1 = cr' & crPos . _xy .~ mp + r1 *^ mvdir
|
||||||
|
& crType . slimeSlime .~ round (r1 ^ (2 :: Int) * 100)
|
||||||
|
& crDir .~ argV mvdir
|
||||||
|
c2 = cr' & crPos . _xy .~ mp - r2 *^ mvdir
|
||||||
|
& crType . slimeSlime .~ round (r2^(2::Int) * 100)
|
||||||
|
& crDir .~ argV (-mvdir)
|
||||||
|
c1ps = qs' & each +~ cxy - (mp + r1 *^ mvdir) & each %~ rotateV (- c1 ^. crDir)
|
||||||
|
c2ps = ps' & each +~ cxy - (mp - r2 *^ mvdir) & each %~ rotateV (- c2 ^. crDir)
|
||||||
|
return (c1 & crType . slimeDistortion . sdShape .~ f c1ps c1
|
||||||
|
,c2 & crType . slimeDistortion . sdShape .~ f c2ps c2
|
||||||
|
)
|
||||||
|
where
|
||||||
|
f xs@(_:_) c = polyInPoly (centroid xs) xs (slimeOutline c)
|
||||||
|
f _ _ = mempty
|
||||||
|
cxy = cr ^. crPos . _xy
|
||||||
|
r = cr ^?! crType . slimeSlime . to slimeToRad
|
||||||
|
cr' = cr & crDamage .~ []
|
||||||
|
& crType . slimeSlimeChange .~ 0
|
||||||
|
& crType . slimeDistortion .~ SlimeDistortion 10 mempty True
|
||||||
|
& crType . slimeIsCompressing .~ False
|
||||||
|
& crType . slimeCompression .~ 1
|
||||||
|
(ps,qs) = cutPoly (p-cxy) (p+v-cxy) $ slimeOutline cr & each %~ rotateV (cr ^. crDir)
|
||||||
|
|
||||||
|
-- h is the height of the segment, ie r - distance to center
|
||||||
|
segmentArea :: Float -> Float -> Float
|
||||||
|
segmentArea r h = r*r*acos(1-h/r) - (r-h)*sqrt(h*(2*r-h))
|
||||||
|
|
||||||
|
slinkCritUpdate :: Int -> World -> World
|
||||||
|
slinkCritUpdate cid w =
|
||||||
|
w
|
||||||
|
& cWorld
|
||||||
|
. lWorld
|
||||||
|
. creatures
|
||||||
|
. ix cid
|
||||||
|
. crType
|
||||||
|
. slinkSpine
|
||||||
|
. each
|
||||||
|
. _2
|
||||||
|
*~ Q.axisAngle (V3 0 1 0) (pi / 1000)
|
||||||
|
|
||||||
|
setChaseCritKinematics :: Int -> World -> World
|
||||||
|
setChaseCritKinematics cid w = w
|
||||||
|
& cWorld . lWorld . creatures . ix cid %~ setChaseCritKinematics' w
|
||||||
|
|
||||||
|
ccAngles :: World -> Creature -> (Float,Float,Float,Float)
|
||||||
|
ccAngles w cr
|
||||||
|
| Eat i _ <- cr^?!crActionPlan.apAction = fromMaybe (0,0,0,0) $ do
|
||||||
|
tcr <- w ^? cWorld . lWorld . creatures . ix i
|
||||||
|
let tp = tcr ^. crPos + V3 0 0 (crMid tcr)
|
||||||
|
(np,_) = (cr ^. crPos, Q.qz (cr ^. crDir))
|
||||||
|
`Q.comp` (V3 8 0 14, Q.qid)
|
||||||
|
v = tp - np
|
||||||
|
a = angleVV3 v (v & _z .~ 0)
|
||||||
|
return $ f (-a) 0 0
|
||||||
|
| CloseToMelee i<-cr^?!crActionPlan.apStrategy = fromMaybe (0,0,0,0) $ do
|
||||||
|
tcr <- w ^? cWorld . lWorld . creatures . ix i
|
||||||
|
let tp = tcr ^. crPos + V3 0 0 (crMid tcr)
|
||||||
|
(np,_) = (cr ^. crPos, Q.qz (cr ^. crDir))
|
||||||
|
`Q.comp` (V3 8 0 14, Q.qid)
|
||||||
|
v = tp - np
|
||||||
|
a = angleVV3 v (v & _z .~ 0)
|
||||||
|
return $ f
|
||||||
|
(0.45*pi - a)
|
||||||
|
(-0.9*pi)
|
||||||
|
(0.45*pi)
|
||||||
|
| otherwise = f (0.6*pi) (-0.2*pi) (-0.4*pi)
|
||||||
|
where
|
||||||
|
f a b c = (0,a,b,c)
|
||||||
|
|
||||||
|
ccKState :: World -> Creature -> ChaseKState
|
||||||
|
ccKState _ cr
|
||||||
|
| Eat i _ <- cr^?!crActionPlan.apAction = PeckingCK i
|
||||||
|
| CloseToMelee i <- cr^?!crActionPlan.apStrategy = AimingCK i
|
||||||
|
| otherwise = UprightCK
|
||||||
|
|
||||||
|
setChaseCritKinematics' :: World -> Creature -> Creature
|
||||||
|
setChaseCritKinematics' w = f . g
|
||||||
|
where
|
||||||
|
g cr | ccKState w cr == cr ^?! crType . chaseKState = cr
|
||||||
|
| PeckingCK i <- ccKState w cr = cr
|
||||||
|
& crType . chaseLerp .~ 3
|
||||||
|
& crType . chaseKState .~ PeckingCK i
|
||||||
|
| otherwise = cr & crType . chaseLerp .~ 20
|
||||||
|
& crType . chaseKState .~ ccKState w cr
|
||||||
|
f cr =
|
||||||
|
let (a,b,c,d) = ccAngles w cr
|
||||||
|
x = cr ^?! crType . chaseLerp
|
||||||
|
in if x <= 1
|
||||||
|
then cr & crType . chaseqy0 .~ a
|
||||||
|
& crType . chaseqy1 .~ b
|
||||||
|
& crType . chaseqy2 .~ c
|
||||||
|
& crType . chaseqy3 .~ d
|
||||||
|
else cr
|
||||||
|
& crType . chaseqy0 %~ h x a
|
||||||
|
& crType . chaseqy1 %~ h x b
|
||||||
|
& crType . chaseqy2 %~ h x c
|
||||||
|
& crType . chaseqy3 %~ h x d
|
||||||
|
& crType . chaseLerp -~ 1
|
||||||
|
h x a b = 1/fromIntegral x * a + (1-1/fromIntegral x) * b
|
||||||
|
|
||||||
|
updateChaseCrit :: Int -> Creature -> World -> World
|
||||||
|
updateChaseCrit cid cr
|
||||||
|
| SearchForFood <- cr ^?! crActionPlan . apGoal = updateFoodSearchChaseCrit cid cr
|
||||||
|
| Flee <- cr^?!crActionPlan.apGoal
|
||||||
|
, NoAction <- cr^?!crActionPlan.apAction = tocr.crActionPlan.apGoal.~SearchForFood
|
||||||
|
| Flee <- cr^?!crActionPlan.apGoal = id
|
||||||
|
| otherwise = updateCalmChaseCrit cid
|
||||||
|
where
|
||||||
|
tocr = cWorld.lWorld.creatures.ix cid
|
||||||
|
|
||||||
|
updateFoodSearchChaseCrit :: Int -> Creature -> World -> World
|
||||||
|
updateFoodSearchChaseCrit cid cr w
|
||||||
|
| (tcr:_) <- sortOn f . IM.elems . IM.filter avoidcr $ crsNearCirc cxy 60 w
|
||||||
|
= let p = fleePoint cr cxy (20 *^ normalize (cxy - tcr^.crPos._xy)) w
|
||||||
|
in w &tocr.crActionPlan.apAction.~PathTo p NoAction
|
||||||
|
&tocr.crActionPlan.apGoal.~Flee
|
||||||
|
| Eat i 0 <- cr^?! crActionPlan.apAction = w
|
||||||
|
& cWorld .lWorld.creatures . at i .~ Nothing
|
||||||
|
& tocr . crActionPlan.apAction.~NoAction
|
||||||
|
& tocr . crActionPlan.apStrategy.~Search
|
||||||
|
| Eat i x <- cr^?! crActionPlan.apAction = w
|
||||||
|
& tocr .crActionPlan.apAction.acTimer-~1
|
||||||
|
| CloseToMelee i<-cr^?!crActionPlan.apStrategy
|
||||||
|
,Nothing <- w ^?cWorld.lWorld.creatures.ix i = w & tocr . crActionPlan.apStrategy .~ Search
|
||||||
|
| CloseToMelee i<-cr^?!crActionPlan.apStrategy
|
||||||
|
,Just tcr <-w^?cWorld.lWorld.creatures.ix i
|
||||||
|
,distance cxy (tcr^.crPos._xy) < 15 = w
|
||||||
|
& tocr.crActionPlan.apAction.~Eat i 5
|
||||||
|
-- & tocr.crActionPlan.apAction.~NoAction
|
||||||
|
-- & tocr.crActionPlan.apStrategy.~Search
|
||||||
|
-- & cWorld.lWorld.creatures.at i.~Nothing
|
||||||
|
| CloseToMelee{}<-cr^?!crActionPlan.apStrategy
|
||||||
|
,PathTo{}<-cr^?!crActionPlan.apAction= w
|
||||||
|
| xs@(_:_) <- IM.elems . IM.filter istarget $ crsNearCirc cxy 100 w
|
||||||
|
, (tcr,g) <- runState (takeOne xs) (w ^. randGen) = w&tocr.crActionPlan.apAction.~DoImpulses[MvForward]
|
||||||
|
&tocr.crActionPlan.apStrategy.~CloseToMelee (tcr^.crID)
|
||||||
|
&tocr.crActionPlan.apAction.~PathTo (tcr^.crPos._xy) NoAction
|
||||||
|
&randGen.~g
|
||||||
|
| otherwise = w
|
||||||
|
where
|
||||||
|
f c = fromMaybe 100 $ do
|
||||||
|
s <- cr^?crType.slimeSlime
|
||||||
|
return $ dist cxy (c^.crPos._xy) - sqrt(0.01*fromIntegral s)
|
||||||
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
|
cxy = cr ^. crPos . _xy
|
||||||
|
avoidcr c | ct@SlimeCrit{} <- c^.crType = distance cxy (c^.crPos._xy)-crRad ct < 10
|
||||||
|
| otherwise = False
|
||||||
|
istarget tcr
|
||||||
|
| BeeCrit{} <- tcr^.crType
|
||||||
|
, CrIsCorpse{} <- tcr^.crHP = True
|
||||||
|
| otherwise = False
|
||||||
|
|
||||||
|
fleePoint :: Creature -> Point2 -> Point2 -> World -> Point2
|
||||||
|
fleePoint c p v w = g . minimum $ f <$> [p+v, p+0.9*^vNormal v, p-0.9*^vNormal v]
|
||||||
|
where
|
||||||
|
f ep = let q = walkablePoint c p ep w
|
||||||
|
in Semi.Arg (-distance q p) q
|
||||||
|
g (Semi.Arg _ x) = x
|
||||||
|
|
||||||
|
|
||||||
|
updateCalmChaseCrit :: Int -> World -> World
|
||||||
|
updateCalmChaseCrit cid w = w
|
||||||
|
& tocr %~ overrideMeleeCloseTarget w
|
||||||
|
& tocr %~ setViewPos w
|
||||||
|
& tocr %~ setMvPosToTargetCr w
|
||||||
|
& tocr %~ chaseCritMv w
|
||||||
|
& tocr %~ perceptionUpdate [0] w
|
||||||
|
& tocr %~ targetYouWhenCognizant w
|
||||||
|
& tocr %~ searchIfDamaged
|
||||||
|
& tocr . crType . meleeCooldown %~ max 0 . subtract 1
|
||||||
|
& tocr . crVocalization %~ updateVocTimer
|
||||||
|
where
|
||||||
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
|
|
||||||
|
|
||||||
hoverCritHoverSound :: Creature -> World -> World
|
hoverCritHoverSound :: Creature -> World -> World
|
||||||
hoverCritHoverSound cr w = fromMaybe w $ do
|
hoverCritHoverSound cr w
|
||||||
guard $ d < 100
|
| d < 100
|
||||||
return $
|
= soundContinueVol (0.5 * (1 - 0.01 * d)) (CrSound cid) cxy buzz1S (Just 2) w
|
||||||
soundContinueVol
|
| otherwise = w
|
||||||
(0.5 * (1 - 0.01 * d))
|
|
||||||
(CrSound cid)
|
|
||||||
cxy
|
|
||||||
buzz1S
|
|
||||||
(Just 2)
|
|
||||||
w
|
|
||||||
where
|
where
|
||||||
cxy = cr ^. crPos . _xy
|
cxy = cr ^. crPos . _xy
|
||||||
d = max 0 (dist (you w ^. crPos . _xy) cxy - 100)
|
d = max 0 (dist (you w ^. crPos . _xy) cxy - 100)
|
||||||
@@ -90,73 +525,85 @@ crUpdate cid =
|
|||||||
checkDeath cid
|
checkDeath cid
|
||||||
. doDamage cid
|
. doDamage cid
|
||||||
. invItemEffs cid
|
. invItemEffs cid
|
||||||
. updateCarriage cid -- stride appears to be updated elsewhere as well
|
. updateCarriage cid -- stride appears to be updated elsewhere as well
|
||||||
|
|
||||||
checkDeath :: Int -> World -> World
|
checkDeath :: Int -> World -> World
|
||||||
checkDeath cid w = maybe id checkDeath' (w ^? cWorld . lWorld . creatures . ix cid) w
|
checkDeath cid w = maybe id checkDeath' (w ^? cWorld . lWorld . creatures . ix cid) w
|
||||||
|
|
||||||
checkDeath' :: Creature -> World -> World
|
checkDeath' :: Creature -> World -> World
|
||||||
checkDeath' cr w = case cr ^. crHP of
|
checkDeath' cr w = case cr ^. crHP of
|
||||||
HP x | x > 0 -> w & tocr . crDamage .~ []
|
HP x | x > 0 -> w
|
||||||
HP x | x > -200 && null (cr ^. crDeathTimer)
|
HP x | x > -200 && null (cr ^. crDeathTimer) -> w & tocr %~ startDeathTimer
|
||||||
-> w & tocr %~ startDeathTimer
|
HP x
|
||||||
HP x | x > -200
|
| x > -200
|
||||||
,Just y <- cr ^. crDeathTimer
|
, Just y <- cr ^. crDeathTimer
|
||||||
, y > 0 ->
|
, y > 0 -> w & tocr . crDeathTimer . _Just -~ 1
|
||||||
w
|
|
||||||
& tocr . crDamage .~ []
|
|
||||||
& tocr . crDeathTimer . _Just -~ 1
|
|
||||||
HP _ ->
|
HP _ ->
|
||||||
w
|
w
|
||||||
& dropAll cr -- the order of these is possibly important
|
& dropAll cr -- the order of these is possibly important
|
||||||
& stopSoundFrom (CrWeaponSound (_crID cr) 0)
|
& stopSoundFrom (CrWeaponSound (_crID cr) 0)
|
||||||
& corpseOrGib cr
|
& corpseOrGib cr
|
||||||
|
& crDeathEffects cr
|
||||||
& tocr . crStance . carriage %~ toDeathCarriage
|
& tocr . crStance . carriage %~ toDeathCarriage
|
||||||
_ -> w
|
_ -> w
|
||||||
where
|
where
|
||||||
tocr = cWorld . lWorld . creatures . ix (_crID cr)
|
tocr = cWorld . lWorld . creatures . ix (_crID cr)
|
||||||
|
|
||||||
|
crDeathEffects :: Creature -> World -> World
|
||||||
|
crDeathEffects cr w = case cr ^. crType of
|
||||||
|
BeeCrit {_beeHive = mhid} -> beepheremone $ fromMaybe w $ do
|
||||||
|
hid <- mhid
|
||||||
|
return $ w & cWorld . lWorld . creatures . ix hid . crType . hiveChildren %~ IS.delete (cr ^. crID)
|
||||||
|
_ -> w
|
||||||
|
where
|
||||||
|
beepheremone
|
||||||
|
| Just x <- cr ^? crType . beeLifespan
|
||||||
|
, x < 1 = id
|
||||||
|
| otherwise = cWorld . lWorld . beePheremones .:~ BPheremone (cr ^. crPos) (cr ^. crPos - cr ^. crOldPos) 200
|
||||||
|
|
||||||
startDeathTimer :: Creature -> Creature
|
startDeathTimer :: Creature -> Creature
|
||||||
startDeathTimer cr = cr
|
startDeathTimer cr = cr & crDeathTimer ?~ case cr ^. crType of
|
||||||
& crDeathTimer ?~ case cr ^. crType of
|
HoverCrit{} -> 0
|
||||||
HoverCrit {} -> 0
|
BeeCrit{} -> 0
|
||||||
_ -> 5
|
_ -> 5
|
||||||
|
|
||||||
toDeathCarriage :: Carriage -> Carriage
|
toDeathCarriage :: Carriage -> Carriage
|
||||||
toDeathCarriage = \case
|
toDeathCarriage = \case
|
||||||
Flying {} -> Falling
|
Flying{} -> Falling Q.qid Q.qid
|
||||||
Walking -> OnGround
|
Walking -> OnGround Q.qid
|
||||||
_ -> Falling
|
_ -> Falling Q.qid Q.qid
|
||||||
|
|
||||||
-- could look at the amount of damage here (given by maxDamage) too
|
-- could look at the amount of damage here (given by maxDamage) too
|
||||||
corpseOrGib :: Creature -> World -> World
|
corpseOrGib :: Creature -> World -> World
|
||||||
corpseOrGib cr = case cr ^? crDamage . to maxDamageType . _Just . _1 of
|
corpseOrGib cr w =
|
||||||
Just CookingDamage ->
|
w & case cr ^? crDamage . to maxDamageType . _Just . _1 of
|
||||||
sethp (CrIsCorpse $ scorchSPic thecorpse)
|
Just CookingDamage ->
|
||||||
. dodeathsound CookDeath
|
sethp (CrIsCorpse $ scorchSPic thecorpse)
|
||||||
Just PoisonDamage ->
|
. dodeathsound CookDeath
|
||||||
sethp (CrIsCorpse $ poisonSPic thecorpse)
|
Just PoisonDamage ->
|
||||||
. dodeathsound PoisonDeath
|
sethp (CrIsCorpse $ poisonSPic thecorpse)
|
||||||
Just PhysicalDamage
|
. dodeathsound PoisonDeath
|
||||||
| _crPain cr > 300 ->
|
Just PhysicalDamage
|
||||||
makeCrGibs cr
|
| _crPain cr > 300 ->
|
||||||
. sethp (CrDestroyed Gibbed)
|
makeCrGibs cr
|
||||||
. dodeathsound GibsDeath
|
. (cWorld . lWorld . creatures . at (cr ^. crID) %~ destroyCreature)
|
||||||
_ ->
|
. dodeathsound GibsDeath
|
||||||
sethp (CrIsCorpse thecorpse)
|
_ ->
|
||||||
. dodeathsound PlainDeath
|
sethp (CrIsCorpse thecorpse)
|
||||||
|
. dodeathsound PlainDeath
|
||||||
where
|
where
|
||||||
dodeathsound dt = f dt . stopSoundFrom (CrMouth cid)
|
dodeathsound dt = f dt . stopSoundFrom (CrMouth cid)
|
||||||
f dt w = fromMaybe w $ do
|
f dt w' = fromMaybe w' $ do
|
||||||
let (msid, g) = runState (maybeTakeOne (crDeathSounds cr dt)) (_randGen w)
|
let (msid, g) = runState (maybeTakeOne (crDeathSounds cr dt)) (_randGen w')
|
||||||
sid <- msid
|
sid <- msid
|
||||||
return $
|
return $
|
||||||
w
|
w'
|
||||||
& soundStart (CrMouth cid) (cr ^. crPos . _xy) sid Nothing
|
& soundStart (CrMouth cid) (cr ^. crPos . _xy) sid Nothing
|
||||||
& randGen .~ g
|
& randGen
|
||||||
|
.~ g
|
||||||
cid = cr ^. crID
|
cid = cr ^. crID
|
||||||
sethp x = cWorld . lWorld . creatures . ix (_crID cr) . crHP .~ x
|
sethp x = cWorld . lWorld . creatures . ix (_crID cr) . crHP .~ x
|
||||||
thecorpse = makeCorpse cr
|
thecorpse = makeCorpse w (w ^. randGen) cr
|
||||||
|
|
||||||
scorchSPic :: SPic -> SPic
|
scorchSPic :: SPic -> SPic
|
||||||
scorchSPic = _1 %~ overColSH (mixColors 0.9 0.1 black . normalizeColor)
|
scorchSPic = _1 %~ overColSH (mixColors 0.9 0.1 black . normalizeColor)
|
||||||
@@ -168,11 +615,6 @@ poisonSPic = _1 %~ overColSH (mixColors 0.5 0.5 green . normalizeColor)
|
|||||||
dropAll :: Creature -> World -> World
|
dropAll :: Creature -> World -> World
|
||||||
dropAll cr w = foldl' (flip (dropItem cr)) w . reverse . IM.keys . _unNIntMap $ _crInv cr
|
dropAll cr w = foldl' (flip (dropItem cr)) w . reverse . IM.keys . _unNIntMap $ _crInv cr
|
||||||
|
|
||||||
--startFalling :: Creature -> Creature
|
|
||||||
--startFalling cr = case cr ^. crStance . carriage of
|
|
||||||
-- Walking -> cr & crStance . carriage .~ Falling
|
|
||||||
-- _ -> cr & crStance . carriage .~ Falling
|
|
||||||
|
|
||||||
updatePulse :: Pulse -> Pulse
|
updatePulse :: Pulse -> Pulse
|
||||||
updatePulse p
|
updatePulse p
|
||||||
| p ^. pulseProgress >= p ^. pulseRate = p & pulseProgress .~ 0
|
| p ^. pulseProgress >= p ^. pulseRate = p & pulseProgress .~ 0
|
||||||
|
|||||||
@@ -26,21 +26,31 @@ crWarningSounds cr = case cr ^. crType of
|
|||||||
, seagullCry1S
|
, seagullCry1S
|
||||||
, seagullCry2S
|
, seagullCry2S
|
||||||
]
|
]
|
||||||
|
SlinkCrit{} -> mempty
|
||||||
|
SlimeCrit{} -> mempty
|
||||||
|
CrabCrit {} -> mempty
|
||||||
HoverCrit {} -> mempty
|
HoverCrit {} -> mempty
|
||||||
SwarmCrit -> mempty
|
SwarmCrit -> mempty
|
||||||
AutoCrit -> mempty
|
AutoCrit -> mempty
|
||||||
BarrelCrit{} -> mempty
|
BarrelCrit{} -> mempty
|
||||||
LampCrit{} -> mempty
|
LampCrit{} -> mempty
|
||||||
|
BeeCrit{} -> mempty
|
||||||
|
HiveCrit{} -> mempty
|
||||||
|
|
||||||
crDeathSounds :: Creature -> DeathType -> [SoundID]
|
crDeathSounds :: Creature -> DeathType -> [SoundID]
|
||||||
crDeathSounds cr dt = case cr ^. crType of
|
crDeathSounds cr dt = case cr ^. crType of
|
||||||
Avatar{} -> mempty
|
Avatar{} -> mempty
|
||||||
ChaseCrit{} -> defaultDeathSounds dt
|
ChaseCrit{} -> defaultDeathSounds dt
|
||||||
|
CrabCrit{} -> defaultDeathSounds dt
|
||||||
HoverCrit{} -> hoverDeathSounds dt
|
HoverCrit{} -> hoverDeathSounds dt
|
||||||
|
SlinkCrit{} -> defaultDeathSounds dt
|
||||||
|
SlimeCrit{} -> defaultDeathSounds dt
|
||||||
SwarmCrit -> mempty
|
SwarmCrit -> mempty
|
||||||
AutoCrit -> mempty
|
AutoCrit -> mempty
|
||||||
BarrelCrit{} -> mempty
|
BarrelCrit{} -> mempty
|
||||||
LampCrit{} -> mempty
|
LampCrit{} -> mempty
|
||||||
|
BeeCrit{} -> defaultDeathSounds dt
|
||||||
|
HiveCrit{} -> defaultDeathSounds dt
|
||||||
|
|
||||||
defaultDeathSounds :: DeathType -> [SoundID]
|
defaultDeathSounds :: DeathType -> [SoundID]
|
||||||
defaultDeathSounds = \case
|
defaultDeathSounds = \case
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
-- | Not a good name, perhaps: internal creature actions.
|
|
||||||
module Dodge.Creature.Volition (
|
|
||||||
holsterWeapon,
|
|
||||||
drawWeapon,
|
|
||||||
shootTillEmpty,
|
|
||||||
shootFirstMiss,
|
|
||||||
) where
|
|
||||||
|
|
||||||
import Dodge.Data.Creature
|
|
||||||
import Dodge.Data.CreatureEffect
|
|
||||||
import Dodge.SoundLogic.LoadSound
|
|
||||||
import Geometry
|
|
||||||
|
|
||||||
holsterWeapon, drawWeapon :: Action
|
|
||||||
holsterWeapon = DoImpulses [ChangePosture AtEase, MakeSound whiteNoiseFadeOutS]
|
|
||||||
drawWeapon = DoImpulses [ChangePosture Aiming, MakeSound whiteNoiseFadeInS]
|
|
||||||
|
|
||||||
shootTillEmpty :: Action
|
|
||||||
--shootTillEmpty = (crCanShoot `DoActionWhile` DoImpulses [UseItem])
|
|
||||||
shootTillEmpty =
|
|
||||||
(WdCrBlfromCrBl CrCanShoot `DoActionWhile` DoImpulses [UseItem])
|
|
||||||
`DoActionThen` 20 `WaitThen` holsterWeapon
|
|
||||||
|
|
||||||
--advanceShoot :: Int -> Action
|
|
||||||
--advanceShoot tcid = lostest `DoActionWhile`
|
|
||||||
-- advanceShoot' `DoActionThen`
|
|
||||||
-- 75 `DoReplicate`
|
|
||||||
-- advanceShoot'
|
|
||||||
-- where
|
|
||||||
-- lostest (w,cr) = canSee (_crID cr) tcid w
|
|
||||||
-- advanceShoot' = ImpulsesList [[UseItem, MoveForward 3]]
|
|
||||||
|
|
||||||
shootFirstMiss :: Action
|
|
||||||
shootFirstMiss =
|
|
||||||
LeadTarget (V2 30 50)
|
|
||||||
`DoActionThen` DoImpulses [UseItem]
|
|
||||||
`DoActionThen` (WdCrBlfromCrBl CrCanShoot `DoActionWhile` DoActions [LeadTarget (V2 0 0), DoImpulses [UseItem]])
|
|
||||||
`DoActionThen` 20 `WaitThen` holsterWeapon
|
|
||||||
@@ -38,8 +38,8 @@ handleHotkeys :: World -> World
|
|||||||
handleHotkeys w
|
handleHotkeys w
|
||||||
| ispressed SDL.ScancodeLShift || ispressed SDL.ScancodeRShift
|
| ispressed SDL.ScancodeLShift || ispressed SDL.ScancodeRShift
|
||||||
, (hk : _) <- mapMaybe scancodeToHotkey . M.keys $ pkeys
|
, (hk : _) <- mapMaybe scancodeToHotkey . M.keys $ pkeys
|
||||||
, Just invid <- lw ^? creatures . ix 0 . crManipulation . manObject . imSelectedItem
|
, Just (Sel 0 invid) <- w ^. hud .diSelection
|
||||||
, Just itid <- lw ^? creatures . ix 0 . crInv . ix invid =
|
, Just itid <- lw ^? creatures . ix 0 . crInv . ix (NInt invid) =
|
||||||
w & cWorld . lWorld %~ assignHotkey (NInt itid) hk
|
w & cWorld . lWorld %~ assignHotkey (NInt itid) hk
|
||||||
| ispressed SDL.ScancodeLCtrl || ispressed SDL.ScancodeRCtrl
|
| ispressed SDL.ScancodeLCtrl || ispressed SDL.ScancodeRCtrl
|
||||||
, (hk : _) <- mapMaybe scancodeToHotkey . M.keys $ pkeys
|
, (hk : _) <- mapMaybe scancodeToHotkey . M.keys $ pkeys
|
||||||
@@ -106,7 +106,7 @@ scancodeToHotkey = \case
|
|||||||
wasdWithAiming :: World -> Creature -> Creature
|
wasdWithAiming :: World -> Creature -> Creature
|
||||||
wasdWithAiming w cr
|
wasdWithAiming w cr
|
||||||
| Walking <- cr ^. crStance . carriage
|
| Walking <- cr ^. crStance . carriage
|
||||||
= wasdAim inp w $ wasdMovement (w ^. cWorld . lWorld) inp cam speed cr
|
= wasdAim inp w $ wasdMovement w inp cam speed cr
|
||||||
| otherwise = cr
|
| otherwise = cr
|
||||||
where
|
where
|
||||||
speed = _mvSpeed $ crMvType cr
|
speed = _mvSpeed $ crMvType cr
|
||||||
@@ -116,17 +116,15 @@ wasdWithAiming w cr
|
|||||||
wasdAim :: Input -> World -> Creature -> Creature
|
wasdAim :: Input -> World -> Creature -> Creature
|
||||||
wasdAim inp w cr
|
wasdAim inp w cr
|
||||||
| SDL.ButtonRight `M.member` _mouseButtons inp
|
| SDL.ButtonRight `M.member` _mouseButtons inp
|
||||||
, AtEase <- cr ^. crStance . posture =
|
, AtEase <- cr ^. crStance . posture = setposture Aiming (-twistAmount)
|
||||||
setposture Aiming (-twoHandTwistAmount)
|
| SDL.ButtonRight `M.member` _mouseButtons inp = aimTurn w mousedir cr
|
||||||
| SDL.ButtonRight `M.member` _mouseButtons inp = aimTurn (w ^. cWorld . lWorld) mousedir cr
|
| Aiming{} <- cr ^. crStance . posture = setposture AtEase twistAmount
|
||||||
| Aiming{} <- cr ^. crStance . posture = setposture AtEase twoHandTwistAmount
|
|
||||||
-- | otherwise = creatureTurnTowardDir (_crMvAim cr) 0.2 cr
|
|
||||||
| otherwise = creatureTurnTowardDir (_crMvDir cr) 0.2 cr
|
| otherwise = creatureTurnTowardDir (_crMvDir cr) 0.2 cr
|
||||||
where
|
where
|
||||||
setposture x r =
|
setposture x r =
|
||||||
cr
|
cr
|
||||||
& crStance . posture .~ x
|
& crStance . posture .~ x
|
||||||
& doAimTwist (cr ^? crManipulation . manObject . imAimStance) r
|
& doAimTwist (w ^? hud . manObject . hiAimStance) r
|
||||||
mousedir = argV $ w ^. cWorld . lWorld . lAimPos - (cr ^. crPos . _xy)
|
mousedir = argV $ w ^. cWorld . lWorld . lAimPos - (cr ^. crPos . _xy)
|
||||||
|
|
||||||
doAimTwist :: Maybe AimStance -> Float -> Creature -> Creature
|
doAimTwist :: Maybe AimStance -> Float -> Creature -> Creature
|
||||||
@@ -134,11 +132,11 @@ doAimTwist as x
|
|||||||
| as == Just TwoHandTwist = crDir +~ x
|
| as == Just TwoHandTwist = crDir +~ x
|
||||||
| otherwise = id
|
| otherwise = id
|
||||||
|
|
||||||
twoHandTwistAmount :: Float
|
twistAmount :: Float
|
||||||
twoHandTwistAmount = 1.6 * pi
|
twistAmount = 1.6 * pi
|
||||||
|
|
||||||
wasdMovement :: LWorld -> Input -> Camera -> Float -> Creature -> Creature
|
wasdMovement :: World -> Input -> Camera -> Float -> Creature -> Creature
|
||||||
wasdMovement lw inp cam speed = theMovement -- . setMvAim
|
wasdMovement w inp cam speed = theMovement -- . setMvAim
|
||||||
where
|
where
|
||||||
-- setMvAim = fromMaybe id $ do
|
-- setMvAim = fromMaybe id $ do
|
||||||
-- dir <- safeArgV movDir
|
-- dir <- safeArgV movDir
|
||||||
@@ -147,14 +145,14 @@ wasdMovement lw inp cam speed = theMovement -- . setMvAim
|
|||||||
movAbs = rotateV (cam ^. camRot) $ normalizeV movDir
|
movAbs = rotateV (cam ^. camRot) $ normalizeV movDir
|
||||||
theMovement
|
theMovement
|
||||||
| movDir == V2 0 0 = id
|
| movDir == V2 0 0 = id
|
||||||
| otherwise = crMvAbsolute lw (speed *^ movAbs)
|
| otherwise = crMvAbsolute w (speed *^ movAbs)
|
||||||
|
|
||||||
aimTurn :: LWorld -> Float -> Creature -> Creature
|
aimTurn :: World -> Float -> Creature -> Creature
|
||||||
aimTurn lw a cr = creatureTurnTowardDir a (x * 0.2) cr
|
aimTurn lw a cr = creatureTurnTowardDir a (x * 0.2) cr
|
||||||
where
|
where
|
||||||
x = fromMaybe 1 $ do
|
x = fromMaybe 1 $ do
|
||||||
itRef <- cr ^? crManipulation . manObject . imRootSelectedItem
|
itRef <- lw ^? hud . manObject . hiRootSelectedItem
|
||||||
fmap itemBulkiness $ cr ^? crInv . ix itRef >>= \k -> lw ^? items . ix k . itType
|
fmap itemBulkiness $ cr ^? crInv . ix itRef >>= \k -> lw ^?cWorld.lWorld. items . ix k . itType
|
||||||
|
|
||||||
itemBulkiness :: ItemType -> Float
|
itemBulkiness :: ItemType -> Float
|
||||||
itemBulkiness = \case
|
itemBulkiness = \case
|
||||||
@@ -209,14 +207,6 @@ tryClickUse pkeys w = fromMaybe w $ do
|
|||||||
ltime <- pkeys ^? ix SDL.ButtonLeft
|
ltime <- pkeys ^? ix SDL.ButtonLeft
|
||||||
rtime <- pkeys ^? ix SDL.ButtonRight
|
rtime <- pkeys ^? ix SDL.ButtonRight
|
||||||
guard $ ltime <= rtime
|
guard $ ltime <= rtime
|
||||||
case w
|
case w ^.hud.diSelection of
|
||||||
^? cWorld
|
Just (Sel 0 invid) -> useItem invid ltime w
|
||||||
. lWorld
|
_ -> interactWithCloseObj <$> getSelectedCloseObj w ?? w
|
||||||
. creatures
|
|
||||||
. ix 0
|
|
||||||
. crManipulation
|
|
||||||
. manObject
|
|
||||||
. imSelectedItem
|
|
||||||
. unNInt of
|
|
||||||
Just invid -> useItem invid ltime w
|
|
||||||
Nothing -> interactWithCloseObj <$> getSelectedCloseObj w ?? w
|
|
||||||
|
|||||||
@@ -36,18 +36,9 @@ doCrBl cb = case cb of
|
|||||||
CrIsAnimate -> isAnimate
|
CrIsAnimate -> isAnimate
|
||||||
CrOpenAutoDoor -> \cr -> isAnimate cr && hasAutoDoorBody cr
|
CrOpenAutoDoor -> \cr -> isAnimate cr && hasAutoDoorBody cr
|
||||||
|
|
||||||
doCrAc :: CrAc -> Creature -> Action
|
--doCrWdAc :: CrWdAc -> Creature -> World -> Action
|
||||||
doCrAc ca = case ca of
|
--doCrWdAc cw = case cw of
|
||||||
CrTurnAround -> \cr -> TurnToPoint
|
-- CrWdBFSThenReturn _ -> const $ const NoAction
|
||||||
(cr ^. crPos . _xy -.- 10 *.* unitVectorAtAngle (_crDir cr))
|
|
||||||
-- CrFleeFromTarget -> fleeFromTarget
|
|
||||||
|
|
||||||
--fleeFromTarget :: Creature -> Action
|
|
||||||
--fleeFromTarget cr = fleeFrom cr (_targetCr (_crIntention cr))
|
|
||||||
|
|
||||||
doCrWdAc :: CrWdAc -> Creature -> World -> Action
|
|
||||||
doCrWdAc cw = case cw of
|
|
||||||
CrWdBFSThenReturn _ -> const $ const NoAction
|
|
||||||
-- CrWdBFSThenReturn t -> \cr w -> fromMaybe NoAction $ do
|
-- CrWdBFSThenReturn t -> \cr w -> fromMaybe NoAction $ do
|
||||||
-- n <- walkableNodeNear w (cr ^. crPos . _xy)
|
-- n <- walkableNodeNear w (cr ^. crPos . _xy)
|
||||||
-- let as = take 20 $ map PathTo $ bfsNodePoints n w
|
-- let as = take 20 $ map PathTo $ bfsNodePoints n w
|
||||||
@@ -56,7 +47,7 @@ doCrWdAc cw = case cw of
|
|||||||
-- DoReplicate t $
|
-- DoReplicate t $
|
||||||
-- foldr DoActionThen NoAction as
|
-- foldr DoActionThen NoAction as
|
||||||
-- ChooseMovementSpreadGun -> chooseMovementSpreadGun
|
-- ChooseMovementSpreadGun -> chooseMovementSpreadGun
|
||||||
ChooseMovementLtAuto -> chooseMovementLtAuto
|
-- ChooseMovementLtAuto -> chooseMovementLtAuto
|
||||||
|
|
||||||
--chooseMovementSpreadGun :: Creature -> World -> Action
|
--chooseMovementSpreadGun :: Creature -> World -> Action
|
||||||
--chooseMovementSpreadGun cr w
|
--chooseMovementSpreadGun cr w
|
||||||
|
|||||||
+1
-1
@@ -66,7 +66,7 @@ damageInCircle f p r w =
|
|||||||
& cWorld . lWorld . creatures %~ docrdams
|
& cWorld . lWorld . creatures %~ docrdams
|
||||||
where
|
where
|
||||||
dowldams wds = foldl' g wds (wlsHitRadial p r w)
|
dowldams wds = foldl' g wds (wlsHitRadial p r w)
|
||||||
docrdams crs = foldl' h crs (crsHitRadial p r w)
|
docrdams crs = foldl' h crs (bodiesHitRadial p r w)
|
||||||
g wds (x, wl) = wds & at (_wlID wl) . non mempty .:~ f x
|
g wds (x, wl) = wds & at (_wlID wl) . non mempty .:~ f x
|
||||||
h crs (x, cr) = crs & ix (_crID cr) . crDamage .:~ f x
|
h crs (x, cr) = crs & ix (_crID cr) . crDamage .:~ f x
|
||||||
|
|
||||||
|
|||||||
@@ -13,17 +13,19 @@ import Sound.Data
|
|||||||
|
|
||||||
data ActionPlan
|
data ActionPlan
|
||||||
= Inanimate
|
= Inanimate
|
||||||
|
| SlimeIntelligence
|
||||||
| ActionPlan
|
| ActionPlan
|
||||||
{ -- _apImpulse :: [Impulse] -- done per frame
|
{ -- _apImpulse :: [Impulse] -- done per frame
|
||||||
_apAction :: [Action] -- updated per frame, likely persist across frames
|
_apAction :: Action -- updated per frame, likely persist across frames
|
||||||
, _apStrategy :: Strategy -- current strategy
|
, _apStrategy :: Strategy
|
||||||
, _apGoal :: [Goal] -- particular ordered goals
|
, _apGoal :: Goal
|
||||||
}
|
}
|
||||||
--deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
--deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
deriving (Eq, Ord, Show) --Generic, Flat)
|
deriving (Eq, Ord, Show) --Generic, Flat)
|
||||||
|
|
||||||
data Impulse
|
data Impulse
|
||||||
= Move Point2
|
= Move Point2
|
||||||
|
| Walk Point2
|
||||||
| MoveForward Float
|
| MoveForward Float
|
||||||
| MoveNoStride Point2
|
| MoveNoStride Point2
|
||||||
| Turn Float
|
| Turn Float
|
||||||
@@ -38,12 +40,16 @@ data Impulse
|
|||||||
| DropItem
|
| DropItem
|
||||||
| Bark SoundID -- placeholder for various communication types
|
| Bark SoundID -- placeholder for various communication types
|
||||||
| Melee Int
|
| Melee Int
|
||||||
|
| MeleeL Int
|
||||||
|
| MeleeR Int
|
||||||
| ChangePosture Posture
|
| ChangePosture Posture
|
||||||
| MakeSound SoundID
|
| MakeSound SoundID
|
||||||
| ChangeStrategy Strategy
|
| ChangeStrategy Strategy
|
||||||
| AddGoal Goal
|
-- | AddGoal Goal
|
||||||
| ImpulseUseTarget { _impulseUseTarget :: CrImp }
|
| ImpulseUseTarget { _impulseUseTarget :: CrImp }
|
||||||
| ImpulseNothing
|
| ImpulseNothing
|
||||||
|
| UpdateRandGen
|
||||||
|
| SetBeeRandomMovement
|
||||||
deriving (Eq, Ord, Show) --Generic, Flat)
|
deriving (Eq, Ord, Show) --Generic, Flat)
|
||||||
|
|
||||||
data RandImpulse
|
data RandImpulse
|
||||||
@@ -56,7 +62,7 @@ infixr 9 `WaitThen`
|
|||||||
|
|
||||||
infixr 9 `DoActionThen`
|
infixr 9 `DoActionThen`
|
||||||
|
|
||||||
infixr 9 `DoActionWhile`
|
--infixr 9 `DoActionWhile`
|
||||||
|
|
||||||
infixr 9 `DoReplicate`
|
infixr 9 `DoReplicate`
|
||||||
|
|
||||||
@@ -68,17 +74,15 @@ data Action
|
|||||||
, _targetSeenAt :: Point2
|
, _targetSeenAt :: Point2
|
||||||
}
|
}
|
||||||
| PathTo { _pathToPoint :: Point2, _pathFailAction :: Action }
|
| PathTo { _pathToPoint :: Point2, _pathFailAction :: Action }
|
||||||
|
| Eat {_targetID :: Int, _acTimer :: Int}
|
||||||
|
| EvadeAim
|
||||||
| TurnToPoint { _turnToPoint :: Point2 }
|
| TurnToPoint { _turnToPoint :: Point2 }
|
||||||
| ImpulsesList { _impulsesListList :: [[Impulse]] }
|
| ImpulsesList { _impulsesListList :: [[Impulse]], _acAction :: Action }
|
||||||
| DoImpulses { _doImpulsesList :: [Impulse] }
|
| DoImpulses { _doImpulsesList :: [Impulse] }
|
||||||
| WaitThen
|
| WaitThen
|
||||||
{ _waitThenTimer :: Int
|
{ _waitThenTimer :: Int
|
||||||
, _waitThenAction :: Action
|
, _waitThenAction :: Action
|
||||||
}
|
}
|
||||||
| DoActionWhile
|
|
||||||
{ _doActionWhileCondition :: WdCrBl
|
|
||||||
, _doActionWhileAction :: Action
|
|
||||||
}
|
|
||||||
| DoActionWhilePartial
|
| DoActionWhilePartial
|
||||||
{ _doActionWhilePartial :: Action
|
{ _doActionWhilePartial :: Action
|
||||||
, _doActionWhileCondition :: WdCrBl
|
, _doActionWhileCondition :: WdCrBl
|
||||||
@@ -98,7 +102,7 @@ data Action
|
|||||||
, _doActionWhileThenCondition :: WdCrBl
|
, _doActionWhileThenCondition :: WdCrBl
|
||||||
, _doActionWhileThenThen :: Action
|
, _doActionWhileThenThen :: Action
|
||||||
}
|
}
|
||||||
| DoActions { _doActionsList :: [Action] }
|
-- | DoActions { _doActionsList :: [Action] }
|
||||||
| DoActionThen
|
| DoActionThen
|
||||||
{ _doActionThenFirst :: Action
|
{ _doActionThenFirst :: Action
|
||||||
, _doActionThenSecond :: Action
|
, _doActionThenSecond :: Action
|
||||||
@@ -114,9 +118,6 @@ data Action
|
|||||||
}
|
}
|
||||||
| LeadTarget { _leadTargetBy :: Point2 }
|
| LeadTarget { _leadTargetBy :: Point2 }
|
||||||
| NoAction
|
| NoAction
|
||||||
| StartSentinelPost
|
|
||||||
| UseSelf { _useSelf :: CrAc }
|
|
||||||
| ArbitraryAction {_arbitraryAction :: CrWdAc}
|
|
||||||
-- | Repeatedly perform impulses alongside a main action until the main action terminates
|
-- | Repeatedly perform impulses alongside a main action until the main action terminates
|
||||||
| DoImpulsesAlongside
|
| DoImpulsesAlongside
|
||||||
{ _sideImpulses :: [Impulse]
|
{ _sideImpulses :: [Impulse]
|
||||||
@@ -131,24 +132,26 @@ data Strategy
|
|||||||
| Lure Int Point2
|
| Lure Int Point2
|
||||||
| Patrol [Point2]
|
| Patrol [Point2]
|
||||||
| ShootAt Int
|
| ShootAt Int
|
||||||
| FollowImpulses
|
-- | FollowImpulses
|
||||||
| WatchAndWait
|
| WatchAndWait
|
||||||
| Investigate
|
| Investigate
|
||||||
| WarningCry
|
| WarningCry
|
||||||
| LookAround
|
| LookAround
|
||||||
| Wander
|
| Wander
|
||||||
| CloseToMelee {_meleeTarget :: Int}
|
| CloseToMelee {_meleeTarget :: Int}
|
||||||
| StrategyActions Strategy [Action]
|
|
||||||
| GetTo Point2
|
| GetTo Point2
|
||||||
| Reload
|
|
||||||
| Flee
|
|
||||||
| MeleeStrike
|
|
||||||
| Search
|
| Search
|
||||||
|
| SearchTimed {_searchTimer :: Int}
|
||||||
|
| ReturnToHive
|
||||||
|
| HarvestFrom {_harvestTarget :: Int}
|
||||||
|
| StrategyInt {_strategyInt :: Int}
|
||||||
deriving (Eq, Ord, Show) --Generic, Flat)
|
deriving (Eq, Ord, Show) --Generic, Flat)
|
||||||
--deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
--deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
data Goal
|
data Goal
|
||||||
= LiveLongAndProsper
|
= LiveLongAndProsper
|
||||||
|
| SearchForFood
|
||||||
|
| Flee
|
||||||
| Kill {_killTarget :: Int}
|
| Kill {_killTarget :: Int}
|
||||||
| SentinelAt {_sentinelPos :: Point2, _sentinelDir :: Float}
|
| SentinelAt {_sentinelPos :: Point2, _sentinelDir :: Float}
|
||||||
deriving (Eq, Ord, Show) --Generic, Flat)
|
deriving (Eq, Ord, Show) --Generic, Flat)
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ data Bullet = Bullet
|
|||||||
, _buDrag :: Float
|
, _buDrag :: Float
|
||||||
, _buPos :: Point2
|
, _buPos :: Point2
|
||||||
, _buOldPos :: Point2
|
, _buOldPos :: Point2
|
||||||
|
, _buOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Show, Eq, Ord, Read) --Generic, Flat)
|
deriving (Show, Eq, Ord, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
{-# LANGUAGE StrictData #-}
|
|
||||||
|
|
||||||
module Dodge.Data.CamouflageStatus where
|
|
||||||
|
|
||||||
data CamouflageStatus
|
|
||||||
= FullyVisible
|
|
||||||
| Invisible
|
|
||||||
deriving (Eq, Ord, Enum, Show, Bounded, Read) --Generic, Flat)
|
|
||||||
|
|
||||||
--deriveJSON defaultOptions ''CamouflageStatus
|
|
||||||
@@ -44,4 +44,9 @@ data CardinalCover
|
|||||||
data XInfinity a = NegInf | NonInf {_nonInf :: a} | PosInf
|
data XInfinity a = NegInf | NonInf {_nonInf :: a} | PosInf
|
||||||
deriving (Eq, Ord, Show)
|
deriving (Eq, Ord, Show)
|
||||||
|
|
||||||
|
instance Functor XInfinity where
|
||||||
|
fmap f (NonInf x) = NonInf (f x)
|
||||||
|
fmap _ NegInf = NegInf
|
||||||
|
fmap _ PosInf = PosInf
|
||||||
|
|
||||||
makeLenses ''XInfinity
|
makeLenses ''XInfinity
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Dodge.Data.Cloud where
|
module Dodge.Data.Cloud where
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import Dodge.Data.Material
|
import Dodge.Data.Material
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
@@ -36,15 +37,24 @@ data Gas = Gas
|
|||||||
, _gsVel :: Point3
|
, _gsVel :: Point3
|
||||||
, _gsTimer :: Int
|
, _gsTimer :: Int
|
||||||
, _gsType :: GasType
|
, _gsType :: GasType
|
||||||
|
, _gsOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
data GasType = PoisonGas
|
data GasType = PoisonGas
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
data BeePheremone = BPheremone
|
||||||
|
{ _bpPos :: Point3
|
||||||
|
, _bpVel :: Point3
|
||||||
|
, _bpTimer :: Int
|
||||||
|
}
|
||||||
|
|
||||||
makeLenses ''Cloud
|
makeLenses ''Cloud
|
||||||
|
makeLenses ''BeePheremone
|
||||||
deriveJSON defaultOptions ''CloudType
|
deriveJSON defaultOptions ''CloudType
|
||||||
deriveJSON defaultOptions ''Cloud
|
deriveJSON defaultOptions ''Cloud
|
||||||
|
deriveJSON defaultOptions ''BeePheremone
|
||||||
makeLenses ''Dust
|
makeLenses ''Dust
|
||||||
deriveJSON defaultOptions ''Dust
|
deriveJSON defaultOptions ''Dust
|
||||||
makeLenses ''Gas
|
makeLenses ''Gas
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Dodge.Data.ComposedItem where
|
module Dodge.Data.ComposedItem where
|
||||||
|
|
||||||
|
import Color.Data
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Dodge.Data.AmmoType
|
import Dodge.Data.AmmoType
|
||||||
import Dodge.Data.Item
|
import Dodge.Data.Item
|
||||||
@@ -26,7 +27,7 @@ data ItemSF -- Structural Function
|
|||||||
| JoystickSF
|
| JoystickSF
|
||||||
| RemoteDetonatorSF
|
| RemoteDetonatorSF
|
||||||
| SmokeReducerSF
|
| SmokeReducerSF
|
||||||
| NoSF
|
| NoSF Color
|
||||||
| AmmoModifierSF AmmoType
|
| AmmoModifierSF AmmoType
|
||||||
| AmmoTargetingSF AmmoType
|
| AmmoTargetingSF AmmoType
|
||||||
| AmmoPayloadSF AmmoType
|
| AmmoPayloadSF AmmoType
|
||||||
|
|||||||
@@ -108,6 +108,8 @@ data DebugBool
|
|||||||
| Show_writable_values
|
| Show_writable_values
|
||||||
| Show_mouse_click_pos
|
| Show_mouse_click_pos
|
||||||
| Muzzle_positions
|
| Muzzle_positions
|
||||||
|
| Show_cr_hitboxes
|
||||||
|
| Clipboard_cr
|
||||||
deriving (Eq, Ord, Bounded, Enum, Show)
|
deriving (Eq, Ord, Bounded, Enum, Show)
|
||||||
|
|
||||||
data ResFactor = DoubleRes | FullRes | HalfRes | QuarterRes | EighthRes | SixteenthRes
|
data ResFactor = DoubleRes | FullRes | HalfRes | QuarterRes | EighthRes | SixteenthRes
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ data Creature = Creature
|
|||||||
, _crID :: Int
|
, _crID :: Int
|
||||||
, _crHP :: CrHP
|
, _crHP :: CrHP
|
||||||
, _crInv :: NewIntMap InvInt Int
|
, _crInv :: NewIntMap InvInt Int
|
||||||
, _crManipulation :: Manipulation
|
-- , _crManipulation :: Manipulation
|
||||||
, _crEquipment :: M.Map EquipSite (NewInt ItmInt)
|
, _crEquipment :: M.Map EquipSite (NewInt ItmInt)
|
||||||
, _crDamage :: [Damage]
|
, _crDamage :: [Damage]
|
||||||
, _crPain :: Int
|
, _crPain :: Int
|
||||||
@@ -63,9 +63,16 @@ data Creature = Creature
|
|||||||
data CrHP
|
data CrHP
|
||||||
= HP Int
|
= HP Int
|
||||||
| CrIsCorpse SPic
|
| CrIsCorpse SPic
|
||||||
| CrDestroyed CrDestructionType
|
| AvatarDestroyed
|
||||||
|
-- | CrDestroyed CrDestructionType
|
||||||
|
|
||||||
data CrDestructionType = Gibbed | Pitted
|
destroyCreature :: Maybe Creature -> Maybe Creature
|
||||||
|
destroyCreature mcr
|
||||||
|
| Just cr <- mcr
|
||||||
|
, _crID cr == 0 = Just cr{_crHP = AvatarDestroyed}
|
||||||
|
| otherwise = Nothing
|
||||||
|
|
||||||
|
data CrDestructionType = Gibbed | Pitted | Swallowed
|
||||||
|
|
||||||
data DeathType = CookDeath | PoisonDeath | PlainDeath | GibsDeath
|
data DeathType = CookDeath | PoisonDeath | PlainDeath | GibsDeath
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,17 @@
|
|||||||
{-# LANGUAGE StrictData #-}
|
{-# LANGUAGE StrictData #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
module Dodge.Data.Creature.Misc (
|
module Dodge.Data.Creature.Misc (module Dodge.Data.Creature.Misc) where
|
||||||
module Dodge.Data.Creature.Misc,
|
|
||||||
module Dodge.Data.CamouflageStatus,
|
|
||||||
) where
|
|
||||||
|
|
||||||
import Dodge.Data.Creature.Stance
|
import Dodge.Data.Creature.Stance
|
||||||
import Color
|
import Color
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
import Dodge.Data.CamouflageStatus
|
|
||||||
import Dodge.Data.FloatFunction
|
import Dodge.Data.FloatFunction
|
||||||
import Dodge.Data.Material
|
import Dodge.Data.Material
|
||||||
import Geometry.Data
|
import Geometry.Data
|
||||||
|
import qualified Data.IntSet as IS
|
||||||
|
|
||||||
data Vocalization
|
data Vocalization
|
||||||
= VocTimer {_vcTime :: Int ,_vcMaxTime :: Int }
|
= VocTimer {_vcTime :: Int ,_vcMaxTime :: Int }
|
||||||
@@ -25,16 +22,21 @@ data CrMvType
|
|||||||
= NoMvType
|
= NoMvType
|
||||||
| MvWalking {_mvSpeed :: Float} -- note this may interact with a friction element
|
| MvWalking {_mvSpeed :: Float} -- note this may interact with a friction element
|
||||||
-- so currently 26.04.03 the actual max speed when walking is twice this
|
-- so currently 26.04.03 the actual max speed when walking is twice this
|
||||||
| CrMvType
|
| JitMvType
|
||||||
{ _mvSpeed :: Float
|
{ _mvSpeed :: Float
|
||||||
, _mvTurnRad :: FloatFloat
|
, _mvTurnRad :: FloatFloat
|
||||||
, _mvTurnJit :: Float
|
, _mvTurnJit :: Float
|
||||||
, _mvAimSpeed :: FloatFloat
|
|
||||||
}
|
}
|
||||||
-- | CrAccMv
|
| StartStopMvType
|
||||||
-- { _mvAcc :: Float
|
{ _mvSpeed :: Float
|
||||||
-- , _mvTopSpeed :: Float
|
, _mvTurnSpeed :: Float
|
||||||
-- }
|
, _mvPulseTime :: Int
|
||||||
|
}
|
||||||
|
| BeeMvType
|
||||||
|
{ _mvSpeed :: Float
|
||||||
|
, _mvTurnSpeed :: Float
|
||||||
|
, _mvPulseTime :: Int
|
||||||
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
data Pulse = PulseStatus
|
data Pulse = PulseStatus
|
||||||
@@ -57,13 +59,72 @@ data CreatureType
|
|||||||
| ChaseCrit {_meleeCooldown :: Int
|
| ChaseCrit {_meleeCooldown :: Int
|
||||||
, _footForward :: FootForward
|
, _footForward :: FootForward
|
||||||
, _strideAmount :: Float
|
, _strideAmount :: Float
|
||||||
|
, _chaseqy0 :: Float
|
||||||
|
, _chaseqy1 :: Float
|
||||||
|
, _chaseqy2 :: Float
|
||||||
|
, _chaseqy3 :: Float
|
||||||
|
, _chaseqz :: Float
|
||||||
|
, _chaseLerp :: Int
|
||||||
|
, _chaseKState :: ChaseKState
|
||||||
|
}
|
||||||
|
| CrabCrit
|
||||||
|
{ _meleeCooldownL :: Int
|
||||||
|
, _meleeCooldownR :: Int
|
||||||
|
, _dodgeCooldown :: Int
|
||||||
|
, _lFootPos :: Point2
|
||||||
|
, _rFootPos :: Point2
|
||||||
}
|
}
|
||||||
| HoverCrit {_meleeCooldown :: Int}
|
| HoverCrit {_meleeCooldown :: Int}
|
||||||
|
| SlinkCrit
|
||||||
|
{ _meleeCooldown :: Int
|
||||||
|
, _slinkSpine :: [Point3Q]
|
||||||
|
, _slinkHeadPos :: Point3Q
|
||||||
|
}
|
||||||
|
| SlimeCrit
|
||||||
|
{ _slimeSlime :: Int -- note multiplied by 100
|
||||||
|
, _slimeSlimeChange :: Int
|
||||||
|
-- , _slimeRadWobble :: Float
|
||||||
|
--, _slimeSplitTimer :: Int
|
||||||
|
, _slimeDistortion :: SlimeShapeDistortion
|
||||||
|
, _slimeCompression :: Float
|
||||||
|
, _slimeIsCompressing :: Bool
|
||||||
|
, _slimeEngulfProgress :: Float
|
||||||
|
}
|
||||||
|
| BeeCrit
|
||||||
|
{ _beeSlime :: Int
|
||||||
|
, _beeHive :: Maybe Int
|
||||||
|
, _startStopMv :: Int
|
||||||
|
, _beeAggro :: Int
|
||||||
|
, _meleeCooldown :: Int
|
||||||
|
, _beeRandomMovement :: Maybe FootForward
|
||||||
|
, _beeLifespan :: Int
|
||||||
|
}
|
||||||
|
| HiveCrit
|
||||||
|
{ _hiveChildren :: IS.IntSet
|
||||||
|
, _hiveGestation :: Int
|
||||||
|
, _hiveSlime :: Int
|
||||||
|
}
|
||||||
| SwarmCrit
|
| SwarmCrit
|
||||||
| AutoCrit
|
| AutoCrit
|
||||||
| BarrelCrit {_barrelType :: BarrelType}
|
| BarrelCrit {_barrelType :: BarrelType}
|
||||||
| LampCrit {_lampHeight :: Float, _lampColor :: Point3, _lampLSID :: Maybe Int}
|
| LampCrit {_lampHeight :: Float, _lampColor :: Point3, _lampLSID :: Maybe Int}
|
||||||
|
|
||||||
|
data ChaseKState
|
||||||
|
= UprightCK
|
||||||
|
| AimingCK Int
|
||||||
|
| PeckingCK Int
|
||||||
|
deriving (Eq)
|
||||||
|
|
||||||
|
data SlimeShapeDistortion = SlimeDistortion
|
||||||
|
{ _sdTime :: Int
|
||||||
|
, _sdShape :: [Point2]
|
||||||
|
, _sdIsSplit :: Bool
|
||||||
|
}
|
||||||
|
| NoSlimeDistortion
|
||||||
|
|
||||||
|
slimeToRad :: Int -> Float
|
||||||
|
slimeToRad x = sqrt $ fromIntegral x * 0.01
|
||||||
|
|
||||||
data AvatarPosture = AvPosture
|
data AvatarPosture = AvPosture
|
||||||
|
|
||||||
data CreatureShape
|
data CreatureShape
|
||||||
@@ -73,7 +134,7 @@ data CreatureShape
|
|||||||
, _skinLower :: Color
|
, _skinLower :: Color
|
||||||
}
|
}
|
||||||
| Barreloid
|
| Barreloid
|
||||||
| NonDrawnCreature
|
| NoCreatureShape
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
data BarrelType
|
data BarrelType
|
||||||
@@ -87,6 +148,9 @@ makeLenses ''Vocalization
|
|||||||
makeLenses ''CrMvType
|
makeLenses ''CrMvType
|
||||||
makeLenses ''CreatureType
|
makeLenses ''CreatureType
|
||||||
makeLenses ''CreatureShape
|
makeLenses ''CreatureShape
|
||||||
|
makeLenses ''SlimeShapeDistortion
|
||||||
|
deriveJSON defaultOptions ''ChaseKState
|
||||||
|
deriveJSON defaultOptions ''SlimeShapeDistortion
|
||||||
deriveJSON defaultOptions ''Pulse
|
deriveJSON defaultOptions ''Pulse
|
||||||
deriveJSON defaultOptions ''Vocalization
|
deriveJSON defaultOptions ''Vocalization
|
||||||
deriveJSON defaultOptions ''BarrelType
|
deriveJSON defaultOptions ''BarrelType
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
{-# OPTIONS_GHC -Wno-orphans #-}
|
||||||
{-# LANGUAGE StrictData #-}
|
{-# LANGUAGE StrictData #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
@@ -11,6 +12,7 @@ import Data.Aeson
|
|||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
import Dodge.Data.AimStance
|
import Dodge.Data.AimStance
|
||||||
import Geometry.Data
|
import Geometry.Data
|
||||||
|
import Linear
|
||||||
|
|
||||||
data Stance = Stance
|
data Stance = Stance
|
||||||
{ _carriage :: Carriage
|
{ _carriage :: Carriage
|
||||||
@@ -20,11 +22,14 @@ data Stance = Stance
|
|||||||
|
|
||||||
data Carriage
|
data Carriage
|
||||||
= Walking
|
= Walking
|
||||||
|
| Crawling
|
||||||
| Floating
|
| Floating
|
||||||
| Flying {_zSpeed :: Float, _flyInertia :: Float}
|
| Flying {_zSpeed :: Float}--, _flyInertia :: Float}
|
||||||
| Boosting Point2
|
| Boosting Point2
|
||||||
| Falling
|
| Falling {_fallRot :: Quaternion Float, _carDir :: Quaternion Float}
|
||||||
| OnGround
|
| OnGround {_carDir :: Quaternion Float}
|
||||||
|
| Rooted
|
||||||
|
| Mounted {_mountID :: Int, _mountPos :: Point3}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
data FootForward = LeftForward | RightForward
|
data FootForward = LeftForward | RightForward
|
||||||
@@ -36,6 +41,7 @@ data Posture = Aiming | AtEase
|
|||||||
makeLenses ''Stance
|
makeLenses ''Stance
|
||||||
makeLenses ''Carriage
|
makeLenses ''Carriage
|
||||||
makeLenses ''Posture
|
makeLenses ''Posture
|
||||||
|
deriveJSON defaultOptions ''Quaternion
|
||||||
deriveJSON defaultOptions ''FootForward
|
deriveJSON defaultOptions ''FootForward
|
||||||
deriveJSON defaultOptions ''Posture
|
deriveJSON defaultOptions ''Posture
|
||||||
deriveJSON defaultOptions ''Carriage
|
deriveJSON defaultOptions ''Carriage
|
||||||
|
|||||||
@@ -24,14 +24,14 @@ data CrBl = CrCanShoot | CrIsAiming | CrIsAnimate
|
|||||||
data CrAc = CrTurnAround
|
data CrAc = CrTurnAround
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
data CrWdAc
|
--data CrWdAc
|
||||||
= CrWdBFSThenReturn Int
|
-- = CrWdBFSThenReturn Int
|
||||||
-- | ChooseMovementSpreadGun
|
---- | ChooseMovementSpreadGun
|
||||||
| ChooseMovementLtAuto
|
---- | ChooseMovementLtAuto
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
-- deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
deriveJSON defaultOptions ''CrImp
|
deriveJSON defaultOptions ''CrImp
|
||||||
deriveJSON defaultOptions ''CrBl
|
deriveJSON defaultOptions ''CrBl
|
||||||
deriveJSON defaultOptions ''WdCrBl
|
deriveJSON defaultOptions ''WdCrBl
|
||||||
deriveJSON defaultOptions ''CrAc
|
deriveJSON defaultOptions ''CrAc
|
||||||
deriveJSON defaultOptions ''CrWdAc
|
--deriveJSON defaultOptions ''CrWdAc
|
||||||
|
|||||||
+25
-13
@@ -13,20 +13,32 @@ import Data.Aeson.TH
|
|||||||
import Geometry.Data
|
import Geometry.Data
|
||||||
|
|
||||||
data Damage
|
data Damage
|
||||||
= Piercing {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2}
|
= Piercing {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2, _dmOrigin :: DamageOrigin}
|
||||||
| Blunt {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2}
|
| Blunt {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2, _dmOrigin :: DamageOrigin}
|
||||||
| Sparking {_dmAmount :: Int}
|
| Sparking {_dmAmount :: Int, _dmOrigin :: DamageOrigin}
|
||||||
| Crushing {_dmAmount :: Int, _dmVector :: Point2}
|
| Crushing {_dmAmount :: Int, _dmVector :: Point2, _dmOrigin :: DamageOrigin}
|
||||||
| Shattering {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2}
|
| Shattering {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2, _dmOrigin :: DamageOrigin}
|
||||||
| Flaming {_dmAmount :: Int}
|
| Flaming {_dmAmount :: Int, _dmOrigin :: DamageOrigin}
|
||||||
| Lasering {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2}
|
| Lasering {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2, _dmOrigin :: DamageOrigin}
|
||||||
| Flashing {_dmAmount :: Int, _dmPos :: Point2}
|
| Flashing {_dmAmount :: Int, _dmPos :: Point2, _dmOrigin :: DamageOrigin}
|
||||||
| Electrical {_dmAmount :: Int}
|
| Electrical {_dmAmount :: Int, _dmOrigin :: DamageOrigin}
|
||||||
| Explosive {_dmAmount :: Int, _dmCenter :: Point2}
|
| Explosive {_dmAmount :: Int, _dmOrigin :: DamageOrigin, _dmCenter :: Point2}
|
||||||
| Poison {_dmAmount :: Int}
|
| Poison {_dmAmount :: Int, _dmOrigin :: DamageOrigin}
|
||||||
| Enterrement {_dmAmount :: Int}
|
| Enterrement {_dmAmount :: Int, _dmOrigin :: DamageOrigin}
|
||||||
| Inertial {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2}
|
| Inertial {_dmAmount :: Int, _dmPos :: Point2, _dmVector :: Point2, _dmOrigin :: DamageOrigin}
|
||||||
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
data DamageOrigin
|
||||||
|
= CrMeleeO { _doCID :: Int}
|
||||||
|
| CrWeaponO { _doCID :: Int}
|
||||||
|
| CrIndirectO {_doCID :: Int}
|
||||||
|
| McMeleeO { _doMID :: Int}
|
||||||
|
| McWeaponO { _doMID :: Int}
|
||||||
|
| McIndirectO {_doMID :: Int}
|
||||||
|
| UnassignedO
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
makeLenses ''Damage
|
makeLenses ''Damage
|
||||||
|
makeLenses ''DamageOrigin
|
||||||
|
deriveJSON defaultOptions ''DamageOrigin
|
||||||
deriveJSON defaultOptions ''Damage
|
deriveJSON defaultOptions ''Damage
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ module Dodge.Data.EnergyBall (
|
|||||||
module Dodge.Data.EnergyBall.Type,
|
module Dodge.Data.EnergyBall.Type,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
@@ -17,6 +18,7 @@ data EnergyBall = EnergyBall
|
|||||||
, _ebPos :: Point3
|
, _ebPos :: Point3
|
||||||
, _ebTimer :: Int
|
, _ebTimer :: Int
|
||||||
, _ebType :: EnergyBallType
|
, _ebType :: EnergyBallType
|
||||||
|
, _ebOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ import Data.Aeson
|
|||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
|
|
||||||
data EnergyBallType
|
data EnergyBallType
|
||||||
= IncendiaryBall
|
= IncendiaryBall{}
|
||||||
| FlameletBall {_fbSize :: Float}
|
| FlameletBall {_fbSize :: Float}
|
||||||
| ElectricalBall {_ebID :: Int}
|
| ElectricalBall {_ebID :: Int}
|
||||||
| ExplosiveBall
|
| ExplosiveBall{}
|
||||||
| FlashBall
|
| FlashBall{}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
makeLenses ''EnergyBallType
|
makeLenses ''EnergyBallType
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Dodge.Data.Flame where
|
module Dodge.Data.Flame where
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
@@ -12,6 +13,7 @@ data Flame = Flame
|
|||||||
{ _flTimer :: Int
|
{ _flTimer :: Int
|
||||||
, _flPos :: Point2
|
, _flPos :: Point2
|
||||||
, _flVel :: Point2
|
, _flVel :: Point2
|
||||||
|
, _flOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,14 @@
|
|||||||
|
|
||||||
module Dodge.Data.HUD where
|
module Dodge.Data.HUD where
|
||||||
|
|
||||||
|
import Dodge.Data.Item.Use.Consumption.LoadAction
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import qualified Data.IntSet as IS
|
|
||||||
import Dodge.Data.Combine
|
import Dodge.Data.Combine
|
||||||
import Dodge.Data.Item.Location
|
import Dodge.Data.Item.Location
|
||||||
import Dodge.Data.SelectionList
|
import Dodge.Data.SelectionList
|
||||||
import Geometry.Data
|
import Geometry.Data
|
||||||
import NewInt
|
import NewInt
|
||||||
|
import qualified Data.IntMap.Strict as IM
|
||||||
|
|
||||||
data SubInventory
|
data SubInventory
|
||||||
= NoSubInventory
|
= NoSubInventory
|
||||||
@@ -32,11 +33,14 @@ data HUD = HUD
|
|||||||
, _diSelection :: Maybe Selection
|
, _diSelection :: Maybe Selection
|
||||||
, _diInvFilter :: Maybe String
|
, _diInvFilter :: Maybe String
|
||||||
, _diCloseFilter :: Maybe String
|
, _diCloseFilter :: Maybe String
|
||||||
, _closeItems :: [NewInt ItmInt]
|
, _closeItems :: [NewInt ItmInt] -- add bool showing whether in ssSet?
|
||||||
, _closeButtons :: [Int]
|
, _closeButtons :: [Int]
|
||||||
|
, _manObject :: ManipulatedObject
|
||||||
|
, _closeItemsInv :: IM.IntMap Int
|
||||||
}
|
}
|
||||||
|
|
||||||
data Selection = Sel {_slSec :: Int, _slInt :: Int, _slSet :: IS.IntSet}
|
data Selection = Sel {_slSec :: Int, _slInt :: Int}
|
||||||
|
deriving (Eq,Show)
|
||||||
|
|
||||||
makeLenses ''HUD
|
makeLenses ''HUD
|
||||||
makeLenses ''Selection
|
makeLenses ''Selection
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Dodge.Data.Input where
|
module Dodge.Data.Input where
|
||||||
|
|
||||||
|
import Dodge.Data.CardinalPoint
|
||||||
import Dodge.Data.Config
|
import Dodge.Data.Config
|
||||||
import Dodge.Data.Terminal.Status
|
import Dodge.Data.Terminal.Status
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
@@ -14,10 +15,9 @@ data MouseContext
|
|||||||
= NoMouseContext
|
= NoMouseContext
|
||||||
| MouseAiming
|
| MouseAiming
|
||||||
| MouseInGame
|
| MouseInGame
|
||||||
| MouseMenuClick {_mcoMenuClick :: Int}
|
| MouseMenu {_mcoMenuClick :: Maybe Int}
|
||||||
| MouseMenuCursor
|
| OverInvDrag {_mcoDragSection :: Int }
|
||||||
| OverInvDrag {_mcoDragSection :: Int , _mcoMaybeSelect :: Maybe (Int,Int) }
|
| OverInvDragSelect { _mcoSecSelStart :: XInfinity (Int,Int) }
|
||||||
| OverInvDragSelect { _mcoSecSelStart :: Maybe (Int,Int), _mcoSelEnd :: Maybe Int }
|
|
||||||
| OverInvSelect { _mcoInvSelect :: (Int,Int)}
|
| OverInvSelect { _mcoInvSelect :: (Int,Int)}
|
||||||
| OverCombFiltInv { _mcoInvFilt :: (Int,Int)}
|
| OverCombFiltInv { _mcoInvFilt :: (Int,Int)}
|
||||||
| OverCombSelect { _mcoCombSelect :: (Int,Int)}
|
| OverCombSelect { _mcoCombSelect :: (Int,Int)}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ data ItemType
|
|||||||
| DETECTOR {_ibtDetector :: Detector}
|
| DETECTOR {_ibtDetector :: Detector}
|
||||||
| ARHUD
|
| ARHUD
|
||||||
| LASER
|
| LASER
|
||||||
|
| COMPASS
|
||||||
deriving (Eq, Ord, Show, Read)
|
deriving (Eq, Ord, Show, Read)
|
||||||
|
|
||||||
data InventoryPathing
|
data InventoryPathing
|
||||||
|
|||||||
@@ -29,25 +29,17 @@ data ItemLocation
|
|||||||
= InInv
|
= InInv
|
||||||
{ _ilCrID :: Int
|
{ _ilCrID :: Int
|
||||||
, _ilInvID :: NewInt InvInt
|
, _ilInvID :: NewInt InvInt
|
||||||
, _ilIsRoot :: Bool -- of any item
|
|
||||||
, _ilIsSelected :: Bool
|
|
||||||
, _ilIsAttached :: Bool -- to selected item. question: downwards and upwards?
|
|
||||||
, _ilEquipSite :: Maybe EquipSite
|
, _ilEquipSite :: Maybe EquipSite
|
||||||
}
|
}
|
||||||
| OnTurret {_ilTuID :: Int}
|
| OnTurret {_ilTuID :: Int}
|
||||||
| OnFloor -- {_ilFlID :: NewInt FloorInt}
|
| OnFloor
|
||||||
| InVoid
|
| InVoid
|
||||||
deriving (Eq, Show, Ord, Read) --Generic, Flat)
|
deriving (Eq, Show, Ord, Read) --Generic, Flat)
|
||||||
|
|
||||||
instance ShortShow ItemLocation where
|
instance ShortShow ItemLocation where
|
||||||
shortShow (InInv cid invid rootb selb attb esite) =
|
shortShow (InInv cid invid esite) =
|
||||||
"InInv:cid" <> shortShow cid <> "invid" <> shortShow (_unNInt invid)
|
"InInv:cid" <> shortShow cid <> "invid" <> shortShow (_unNInt invid)
|
||||||
<> "root"
|
<> "esite"
|
||||||
<> shortShow rootb
|
|
||||||
<> "sel"
|
|
||||||
<> shortShow selb
|
|
||||||
<> "att"
|
|
||||||
<> shortShow attb
|
|
||||||
<> shortShow (fmap (SString . show) esite)
|
<> shortShow (fmap (SString . show) esite)
|
||||||
shortShow x = show x
|
shortShow x = show x
|
||||||
|
|
||||||
|
|||||||
@@ -10,29 +10,14 @@ import qualified Data.IntSet as IS
|
|||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
--import Sound.Data
|
|
||||||
|
|
||||||
data Manipulation -- should be ManipulatedObject?
|
|
||||||
= Manipulator {_manObject :: ManipulatedObject }
|
|
||||||
| Brute
|
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
|
||||||
|
|
||||||
data ManipulatedObject
|
data ManipulatedObject
|
||||||
= SortInventory
|
= HeldItem
|
||||||
| SelectedItem
|
{ _hiRootSelectedItem :: NewInt InvInt
|
||||||
{ _imSelectedItem :: NewInt InvInt
|
, _hiAimStance :: AimStance
|
||||||
, _imRootSelectedItem :: NewInt InvInt
|
, _hiAttachedItems :: IS.IntSet -- this should probably be NewIntSet InvInt also
|
||||||
, _imAimStance :: AimStance
|
|
||||||
, _imAttachedItems :: IS.IntSet -- this should probably be NewIntSet InvInt also
|
|
||||||
}
|
}
|
||||||
| SelNothing
|
| HandsFree
|
||||||
| SortCloseItem
|
|
||||||
| SelCloseItem {_ispCloseItem :: Int}
|
|
||||||
| SortCloseButton
|
|
||||||
| SelCloseButton {_ispCloseButton :: Int}
|
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
|
||||||
|
|
||||||
makeLenses ''ManipulatedObject
|
makeLenses ''ManipulatedObject
|
||||||
makeLenses ''Manipulation
|
|
||||||
deriveJSON defaultOptions ''ManipulatedObject
|
deriveJSON defaultOptions ''ManipulatedObject
|
||||||
deriveJSON defaultOptions ''Manipulation
|
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ data LWorld = LWorld
|
|||||||
, _creatureGroups :: IM.IntMap CrGroupParams
|
, _creatureGroups :: IM.IntMap CrGroupParams
|
||||||
, _items :: IM.IntMap Item
|
, _items :: IM.IntMap Item
|
||||||
, _clouds :: [Cloud]
|
, _clouds :: [Cloud]
|
||||||
|
, _beePheremones :: [BeePheremone]
|
||||||
, _dusts :: [Dust]
|
, _dusts :: [Dust]
|
||||||
, _gasses :: [Gas]
|
, _gasses :: [Gas]
|
||||||
, _gusts :: IM.IntMap Gust
|
, _gusts :: IM.IntMap Gust
|
||||||
@@ -145,7 +146,7 @@ data LWorld = LWorld
|
|||||||
, _hotkeys :: M.Map Hotkey (NewInt ItmInt)
|
, _hotkeys :: M.Map Hotkey (NewInt ItmInt)
|
||||||
, _imHotkeys :: NewIntMap ItmInt Hotkey
|
, _imHotkeys :: NewIntMap ItmInt Hotkey
|
||||||
, _lAimPos :: Point2
|
, _lAimPos :: Point2
|
||||||
, _lInvLock :: Bool
|
, _lInvLock :: Bool -- used eg burstRifle fire
|
||||||
, _respawnPos :: (Point2, Float)
|
, _respawnPos :: (Point2, Float)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Dodge.Data.Laser where
|
module Dodge.Data.Laser where
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import NewInt
|
import NewInt
|
||||||
import Dodge.Data.Item.Location
|
import Dodge.Data.Item.Location
|
||||||
--import Color
|
--import Color
|
||||||
@@ -21,6 +22,7 @@ data Laser = Laser
|
|||||||
, _lpPos :: Point2
|
, _lpPos :: Point2
|
||||||
, _lpDir :: Float
|
, _lpDir :: Float
|
||||||
, _lpType :: LaserType
|
, _lpType :: LaserType
|
||||||
|
, _lpOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
{-# LANGUAGE StrictData #-}
|
{-# LANGUAGE StrictData #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
module Dodge.Data.PlasmaBall (
|
module Dodge.Data.PlasmaBall (module Dodge.Data.PlasmaBall) where
|
||||||
module Dodge.Data.PlasmaBall
|
|
||||||
) where
|
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
@@ -14,6 +13,7 @@ data PlasmaBall = PBall
|
|||||||
{ _pbType :: PlasmaBallType
|
{ _pbType :: PlasmaBallType
|
||||||
, _pbVel :: Point2
|
, _pbVel :: Point2
|
||||||
, _pbPos :: Point2
|
, _pbPos :: Point2
|
||||||
|
, _pbOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Show, Eq, Ord, Read) --Generic, Flat)
|
deriving (Show, Eq, Ord, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Dodge.Data.Projectile where
|
module Dodge.Data.Projectile where
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
@@ -24,6 +25,7 @@ data Projectile = Shell
|
|||||||
, _pjType :: ProjectileType
|
, _pjType :: ProjectileType
|
||||||
, _pjDetonatorID :: Maybe (NewInt ItmInt)
|
, _pjDetonatorID :: Maybe (NewInt ItmInt)
|
||||||
, _pjScreenID :: Maybe (NewInt ItmInt)
|
, _pjScreenID :: Maybe (NewInt ItmInt)
|
||||||
|
, _pjOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Dodge.Data.PulseLaser where
|
module Dodge.Data.PulseLaser where
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
@@ -14,6 +15,7 @@ data PulseLaser = PulseLaser
|
|||||||
, _pzDir :: Float
|
, _pzDir :: Float
|
||||||
, _pzDamage :: Int
|
, _pzDamage :: Int
|
||||||
, _pzTimer :: Int
|
, _pzTimer :: Int
|
||||||
|
, _pzOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
@@ -22,6 +24,7 @@ data PulseBall = PulseBall
|
|||||||
, _pzbPos :: Point2
|
, _pzbPos :: Point2
|
||||||
, _pzbTimer :: Int
|
, _pzbTimer :: Int
|
||||||
, _pzbID :: Int
|
, _pzbID :: Int
|
||||||
|
, _pzbOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import Control.Lens
|
|||||||
-- a spScreenOff of 1 is the full length of the screen
|
-- a spScreenOff of 1 is the full length of the screen
|
||||||
-- for eg see fromTopLeft
|
-- for eg see fromTopLeft
|
||||||
data ScreenPos = ScreenPos
|
data ScreenPos = ScreenPos
|
||||||
{ _spScreenOff :: Point2
|
{ _spScreenOff :: Point2 -- from bottom left
|
||||||
, _spPixelOff :: Point2
|
, _spPixelOff :: Point2
|
||||||
}
|
}
|
||||||
makeLenses ''ScreenPos
|
makeLenses ''ScreenPos
|
||||||
|
|||||||
@@ -9,12 +9,14 @@ import Data.IntMap.Strict (IntMap)
|
|||||||
import Dodge.Data.CardinalPoint
|
import Dodge.Data.CardinalPoint
|
||||||
import Dodge.Data.ScreenPos
|
import Dodge.Data.ScreenPos
|
||||||
import Picture.Data
|
import Picture.Data
|
||||||
|
import Linear
|
||||||
|
import qualified Data.IntSet as IS
|
||||||
|
|
||||||
data LDParams = LDP -- List display parameters
|
data LDParams = LDP -- List display parameters
|
||||||
{ _ldpPos :: ScreenPos
|
{ _ldpPos :: ScreenPos
|
||||||
, _ldpScale :: Float
|
, _ldpScale :: Float
|
||||||
, _ldpVerticalGap :: Float
|
, _ldpVerticalGap :: Float
|
||||||
, _ldpBorder :: Maybe (Int,Int) -- the Ints give height and width for a border
|
, _ldpSize :: Maybe (V2 Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
data CursorDisplay
|
data CursorDisplay
|
||||||
@@ -29,10 +31,11 @@ data SectionCursor = SectionCursor
|
|||||||
|
|
||||||
data SelSection a = SelSection
|
data SelSection a = SelSection
|
||||||
{ _ssItems :: IntMap (SelectionItem a)
|
{ _ssItems :: IntMap (SelectionItem a)
|
||||||
, _ssOffset :: Int
|
, _ssYOffset :: Int
|
||||||
, _ssShownItems :: [Picture]
|
, _ssShownItems :: [Picture]
|
||||||
, _ssShownLength :: Int
|
, _ssShownLength :: Int
|
||||||
, _ssIndent :: Int
|
, _ssIndent :: Int
|
||||||
|
, _ssSet :: IS.IntSet
|
||||||
}
|
}
|
||||||
|
|
||||||
type IMSS a = IntMap (SelSection a)
|
type IMSS a = IntMap (SelSection a)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
module Dodge.Data.Shockwave where
|
module Dodge.Data.Shockwave where
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import Color
|
import Color
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
@@ -22,6 +23,7 @@ data Shockwave = Shockwave
|
|||||||
, _swPush :: Float
|
, _swPush :: Float
|
||||||
, _swMaxTime :: Int
|
, _swMaxTime :: Int
|
||||||
, _swTimer :: Int
|
, _swTimer :: Int
|
||||||
|
, _swOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ data SoundOrigin
|
|||||||
| BackgroundSound
|
| BackgroundSound
|
||||||
| OnceSound
|
| OnceSound
|
||||||
| CrSound Int
|
| CrSound Int
|
||||||
|
| CrFootSound Int Int
|
||||||
| CrMouth Int
|
| CrMouth Int
|
||||||
| CrChasm Int
|
| CrChasm Int
|
||||||
| CrWeaponSound Int Int
|
| CrWeaponSound Int Int
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ module Dodge.Data.TeslaArc (
|
|||||||
module Dodge.Data.ArcStep,
|
module Dodge.Data.ArcStep,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Dodge.Data.Damage
|
||||||
import Color
|
import Color
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
@@ -16,6 +17,7 @@ data TeslaArc = TeslaArc
|
|||||||
{ _taTimer :: Int
|
{ _taTimer :: Int
|
||||||
, _taArcSteps :: [ArcStep]
|
, _taArcSteps :: [ArcStep]
|
||||||
, _taColor :: Color
|
, _taColor :: Color
|
||||||
|
, _taOrigin :: DamageOrigin
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
deriving (Eq, Ord, Show, Read) --Generic, Flat)
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ data World = World
|
|||||||
, _wSoundFilter :: SoundFilter
|
, _wSoundFilter :: SoundFilter
|
||||||
, _input :: Input
|
, _input :: Input
|
||||||
, _testFloat :: Float
|
, _testFloat :: Float
|
||||||
|
, _testString :: String
|
||||||
, _rbState :: RightButtonState
|
, _rbState :: RightButtonState
|
||||||
, _hud :: HUD
|
, _hud :: HUD
|
||||||
, _worldEventFlags :: Set WorldEventFlag
|
, _worldEventFlags :: Set WorldEventFlag
|
||||||
|
|||||||
@@ -60,7 +60,6 @@ data WdBl
|
|||||||
| WdBlNegate WdBl
|
| WdBlNegate WdBl
|
||||||
| WdBlCrFilterNearPoint Float Point2 CrBl
|
| WdBlCrFilterNearPoint Float Point2 CrBl
|
||||||
| WdBlBtOn Int
|
| WdBlBtOn Int
|
||||||
-- | WdBlBtNotOff Int
|
|
||||||
|
|
||||||
data WdP2f
|
data WdP2f
|
||||||
= WdP2f0
|
= WdP2f0
|
||||||
|
|||||||
+30
-2
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
module Dodge.Debug (debugEvents, drawDebug) where
|
module Dodge.Debug (debugEvents, drawDebug) where
|
||||||
|
|
||||||
|
import Dodge.Base.Coordinate
|
||||||
|
import Dodge.Zoning.Creature
|
||||||
|
import Dodge.Creature.Radius
|
||||||
import Geometry.Data
|
import Geometry.Data
|
||||||
import Dodge.Render.Label
|
import Dodge.Render.Label
|
||||||
import Dodge.HeldUse
|
import Dodge.HeldUse
|
||||||
@@ -24,6 +27,7 @@ import Picture.Base
|
|||||||
import qualified SDL
|
import qualified SDL
|
||||||
import System.Hclip
|
import System.Hclip
|
||||||
import Text.Read
|
import Text.Read
|
||||||
|
import Data.List (sortOn)
|
||||||
|
|
||||||
debugEvents :: Universe -> Universe
|
debugEvents :: Universe -> Universe
|
||||||
debugEvents u = case dbools ^. at Display_debug of
|
debugEvents u = case dbools ^. at Display_debug of
|
||||||
@@ -81,6 +85,15 @@ debugEvent' = \case
|
|||||||
Debug_get -> id
|
Debug_get -> id
|
||||||
Debug_put -> id
|
Debug_put -> id
|
||||||
Muzzle_positions -> id
|
Muzzle_positions -> id
|
||||||
|
Show_cr_hitboxes -> id
|
||||||
|
Clipboard_cr -> clipboardCr
|
||||||
|
|
||||||
|
clipboardCr :: Universe -> Universe
|
||||||
|
clipboardCr u = fromMaybe u $ do
|
||||||
|
guard (u ^. uvWorld . input . mouseButtons . at SDL.ButtonLeft == Just 0)
|
||||||
|
return $ u & uvIOEffects %~ (\m u' -> setClipboard s >> m u')
|
||||||
|
where
|
||||||
|
s = unlines . prettyShort $ closestCrToMouse $ u ^. uvWorld
|
||||||
|
|
||||||
debugItem :: DebugBool -> Universe -> Maybe [DebugItem]
|
debugItem :: DebugBool -> Universe -> Maybe [DebugItem]
|
||||||
debugItem = \case
|
debugItem = \case
|
||||||
@@ -117,6 +130,8 @@ debugItem = \case
|
|||||||
Debug_get -> doDebugGet
|
Debug_get -> doDebugGet
|
||||||
Debug_put -> debugPutItems
|
Debug_put -> debugPutItems
|
||||||
Muzzle_positions -> mempty
|
Muzzle_positions -> mempty
|
||||||
|
Show_cr_hitboxes -> mempty
|
||||||
|
Clipboard_cr -> mempty
|
||||||
|
|
||||||
debugGet :: Universe -> [String]
|
debugGet :: Universe -> [String]
|
||||||
debugGet u = foldMap getPretty $ u ^. uvWorld . cWorld . lWorld . shockwaves
|
debugGet u = foldMap getPretty $ u ^. uvWorld . cWorld . lWorld . shockwaves
|
||||||
@@ -287,17 +302,30 @@ drawDebug u = \case
|
|||||||
Show_writable_values -> mempty
|
Show_writable_values -> mempty
|
||||||
Show_mouse_click_pos -> mempty
|
Show_mouse_click_pos -> mempty
|
||||||
Muzzle_positions -> showMuzzlePositions u
|
Muzzle_positions -> showMuzzlePositions u
|
||||||
|
Show_cr_hitboxes -> foldMap drawCreatureRad (u ^. uvWorld . cWorld . lWorld . creatures)
|
||||||
|
Clipboard_cr -> foldMap drawCreatureRad (closestCrToMouse $ u^.uvWorld)
|
||||||
|
|
||||||
|
closestCrToMouse :: World -> Maybe Creature
|
||||||
|
closestCrToMouse w = listToMaybe . sortOn (distance mwp . (^. crPos . _xy))
|
||||||
|
$ crsNearPoint mwp w
|
||||||
|
where
|
||||||
|
mwp = mouseWorldPos (w^.input) (w^.wCam)
|
||||||
|
|
||||||
|
drawCreatureRad :: Creature -> Picture
|
||||||
|
drawCreatureRad cr = setLayer DebugLayer
|
||||||
|
. translate3 (cr ^. crPos)
|
||||||
|
. color orange
|
||||||
|
$ circle (crRad (cr ^. crType))
|
||||||
|
|
||||||
showMuzzlePositions :: Universe -> Picture
|
showMuzzlePositions :: Universe -> Picture
|
||||||
showMuzzlePositions u = fold $ do
|
showMuzzlePositions u = fold $ do
|
||||||
cr <- u ^? uvWorld . cWorld . lWorld . creatures . ix 0
|
cr <- u ^? uvWorld . cWorld . lWorld . creatures . ix 0
|
||||||
invid <- cr ^? crManipulation . manObject . imRootSelectedItem . unNInt
|
invid <- u ^?uvWorld.hud . manObject . hiRootSelectedItem . unNInt
|
||||||
loc <- invIndents ((\k -> u ^?! uvWorld . cWorld . lWorld . items . ix k) <$> _crInv cr)
|
loc <- invIndents ((\k -> u ^?! uvWorld . cWorld . lWorld . items . ix k) <$> _crInv cr)
|
||||||
^? ix invid . _2
|
^? ix invid . _2
|
||||||
return . color red $ setLayer DebugLayer $ reduceLocDT (f cr) loc
|
return . color red $ setLayer DebugLayer $ reduceLocDT (f cr) loc
|
||||||
where
|
where
|
||||||
f cr loc = foldMap (g . muzzlePos loc cr) (itemMuzzles loc)
|
f cr loc = foldMap (g . muzzlePos (u^.uvWorld) loc cr) (itemMuzzles loc)
|
||||||
where
|
where
|
||||||
g :: Point3Q -> Picture
|
g :: Point3Q -> Picture
|
||||||
g pq = translate3 (pq ^. _1) $ crossPic 5
|
g pq = translate3 (pq ^. _1) $ crossPic 5
|
||||||
|
|||||||
@@ -5,9 +5,10 @@ import qualified Data.Map.Strict as M
|
|||||||
import Dodge.Data.Creature
|
import Dodge.Data.Creature
|
||||||
import Dodge.Data.FloatFunction
|
import Dodge.Data.FloatFunction
|
||||||
import Geometry.Data
|
import Geometry.Data
|
||||||
--import qualified IntMapHelp as IM
|
|
||||||
--import Picture
|
-- import qualified IntMapHelp as IM
|
||||||
--import MaybeHelp
|
-- import Picture
|
||||||
|
-- import MaybeHelp
|
||||||
|
|
||||||
defaultCreature :: Creature
|
defaultCreature :: Creature
|
||||||
defaultCreature =
|
defaultCreature =
|
||||||
@@ -15,50 +16,46 @@ defaultCreature =
|
|||||||
{ _crPos = V3 0 0 0
|
{ _crPos = V3 0 0 0
|
||||||
, _crOldPos = V3 0 0 0
|
, _crOldPos = V3 0 0 0
|
||||||
, _crOldOldPos = V3 0 0 0
|
, _crOldOldPos = V3 0 0 0
|
||||||
-- , _crZ = 0
|
|
||||||
-- , _crZVel = 0
|
|
||||||
, _crDir = 0
|
, _crDir = 0
|
||||||
, _crMvDir = 0
|
, _crMvDir = 0
|
||||||
-- , _crMvAim = 0
|
|
||||||
-- , _crTwist = 0
|
|
||||||
, _crID = 1
|
, _crID = 1
|
||||||
, _crType = ChaseCrit 0 LeftForward 0
|
, _crType =
|
||||||
-- , _crRad = 10
|
ChaseCrit
|
||||||
|
{ _meleeCooldown = 0
|
||||||
|
, _footForward = LeftForward
|
||||||
|
, _strideAmount = 0
|
||||||
|
, _chaseqy0 = 0
|
||||||
|
, _chaseqy1 = 0.45 * pi
|
||||||
|
, _chaseqy2 = -0.9*pi
|
||||||
|
, _chaseqy3 = 0.45*pi
|
||||||
|
, _chaseqz = 0
|
||||||
|
, _chaseLerp = 0
|
||||||
|
, _chaseKState = UprightCK
|
||||||
|
}
|
||||||
, _crHP = HP 100
|
, _crHP = HP 100
|
||||||
-- , _crMaxHP = 150
|
|
||||||
, _crInv = mempty
|
, _crInv = mempty
|
||||||
, _crManipulation = Manipulator SelNothing
|
|
||||||
-- , _crInvCapacity = 25
|
|
||||||
, _crDamage = []
|
, _crDamage = []
|
||||||
-- , _crCorpse = MakeDefaultCorpse
|
|
||||||
-- , _crMaterial = Flesh
|
|
||||||
, _crPain = 0
|
, _crPain = 0
|
||||||
-- , _crInvEquipped = mempty
|
|
||||||
, _crEquipment = M.empty
|
, _crEquipment = M.empty
|
||||||
-- , _crInvHotkeys = mempty
|
|
||||||
-- , _crHotkeys = M.empty
|
|
||||||
, _crStance =
|
, _crStance =
|
||||||
Stance
|
Stance
|
||||||
{ _carriage = Walking
|
{ _carriage = Walking
|
||||||
, _posture = AtEase
|
, _posture = AtEase
|
||||||
}
|
}
|
||||||
, _crVocalization = VocReady
|
, _crVocalization = VocReady
|
||||||
, _crActionPlan = ActionPlan [] (StrategyActions WatchAndWait [StartSentinelPost]) [LiveLongAndProsper]
|
, _crActionPlan = ActionPlan NoAction WatchAndWait LiveLongAndProsper
|
||||||
, _crPerception = defaultPerceptionState
|
, _crPerception = defaultPerceptionState
|
||||||
, _crMemory = defaultCreatureMemory
|
, _crMemory = defaultCreatureMemory
|
||||||
, _crFaction = NoFaction
|
, _crFaction = NoFaction
|
||||||
, _crIntention = defaultIntention
|
, _crIntention = defaultIntention
|
||||||
, _crGroup = LoneWolf
|
, _crGroup = LoneWolf
|
||||||
-- , _crMvType = defaultAimMvType
|
|
||||||
-- , _crHammerPosition = HammerUp
|
|
||||||
, _crName = "DEFAULTCRNAME"
|
, _crName = "DEFAULTCRNAME"
|
||||||
-- , _crStatistics = CreatureStatistics 50 50 50
|
|
||||||
, _crDeathTimer = Nothing
|
, _crDeathTimer = Nothing
|
||||||
, _crWallTouch = mempty
|
, _crWallTouch = mempty
|
||||||
}
|
}
|
||||||
|
|
||||||
--defaultCreatureSkin :: CreatureType
|
-- defaultCreatureSkin :: CreatureType
|
||||||
--defaultCreatureSkin = Humanoid (greyN 0.9) (lightx4 green) (greyN 0.3) InanimateAI
|
-- defaultCreatureSkin = Humanoid (greyN 0.9) (lightx4 green) (greyN 0.3) InanimateAI
|
||||||
|
|
||||||
defaultInanimate :: Creature
|
defaultInanimate :: Creature
|
||||||
defaultInanimate = defaultCreature & crActionPlan .~ Inanimate
|
defaultInanimate = defaultCreature & crActionPlan .~ Inanimate
|
||||||
@@ -104,15 +101,14 @@ defaultIntention =
|
|||||||
, _viewPoint = Nothing
|
, _viewPoint = Nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
defaultAimingCrit :: Creature
|
defaultAimingCrit :: Creature
|
||||||
defaultAimingCrit = defaultCreature
|
defaultAimingCrit = defaultCreature
|
||||||
|
|
||||||
yourDefaultStrideLength :: Float
|
yourDefaultStrideLength :: Float
|
||||||
yourDefaultStrideLength = 35
|
yourDefaultStrideLength = 35
|
||||||
|
|
||||||
--defaultState :: CreatureState
|
-- defaultState :: CreatureState
|
||||||
--defaultState =
|
-- defaultState =
|
||||||
-- CrSt
|
-- CrSt
|
||||||
-- { _csDamage = []
|
-- { _csDamage = []
|
||||||
---- , _csSpState = GenCr
|
---- , _csSpState = GenCr
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ defaultWorld =
|
|||||||
, _playingSounds = M.empty
|
, _playingSounds = M.empty
|
||||||
, _randGen = mkStdGen 2
|
, _randGen = mkStdGen 2
|
||||||
, _testFloat = 0
|
, _testFloat = 0
|
||||||
|
, _testString = ""
|
||||||
, _rbState = NoRightButtonState
|
, _rbState = NoRightButtonState
|
||||||
, _hud = defaultHUD
|
, _hud = defaultHUD
|
||||||
, _worldEventFlags = mempty
|
, _worldEventFlags = mempty
|
||||||
@@ -114,6 +115,7 @@ defaultLWorld =
|
|||||||
, _creatures = IM.empty
|
, _creatures = IM.empty
|
||||||
, _creatureGroups = IM.empty
|
, _creatureGroups = IM.empty
|
||||||
, _clouds = mempty
|
, _clouds = mempty
|
||||||
|
, _beePheremones = mempty
|
||||||
, _gasses = mempty
|
, _gasses = mempty
|
||||||
, _dusts = mempty
|
, _dusts = mempty
|
||||||
, _gusts = IM.empty
|
, _gusts = IM.empty
|
||||||
@@ -176,9 +178,11 @@ defaultHUD =
|
|||||||
HUD
|
HUD
|
||||||
{ _subInventory = NoSubInventory
|
{ _subInventory = NoSubInventory
|
||||||
, _diSections = mempty
|
, _diSections = mempty
|
||||||
, _diSelection = Just (Sel 1 0 mempty)
|
, _diSelection = Just (Sel 1 0)
|
||||||
, _diInvFilter = mempty
|
, _diInvFilter = mempty
|
||||||
, _diCloseFilter = mempty
|
, _diCloseFilter = mempty
|
||||||
, _closeItems = mempty
|
, _closeItems = mempty
|
||||||
, _closeButtons = mempty
|
, _closeButtons = mempty
|
||||||
|
, _manObject = HandsFree
|
||||||
|
, _closeItemsInv = mempty
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,10 @@ module Dodge.DisplayInventory (
|
|||||||
updateInventoryPositioning,
|
updateInventoryPositioning,
|
||||||
updateCombinePositioning,
|
updateCombinePositioning,
|
||||||
toggleCombineInv,
|
toggleCombineInv,
|
||||||
|
plainRegex,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import qualified Data.IntSet as IS
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
@@ -95,16 +97,15 @@ checkInventorySelectionExists w
|
|||||||
| isJust $ w ^? hud . diSections . ix i . ssItems . ix j = w
|
| isJust $ w ^? hud . diSections . ix i . ssItems . ix j = w
|
||||||
| otherwise = scrollAugNextInSection w
|
| otherwise = scrollAugNextInSection w
|
||||||
where
|
where
|
||||||
Sel i j _ = fromMaybe (Sel 1 (-1) mempty) $ w ^? hud . diSelection . _Just
|
Sel i j = fromMaybe (Sel 1 (-1)) $ w ^? hud . diSelection . _Just
|
||||||
|
|
||||||
checkCombineSelectionExists :: SubInventory -> SubInventory
|
checkCombineSelectionExists :: SubInventory -> SubInventory
|
||||||
checkCombineSelectionExists si
|
checkCombineSelectionExists si
|
||||||
| Just sss <- si ^? ciSections
|
| Just sss <- si ^? ciSections
|
||||||
, Sel i j _ <- fromMaybe (Sel 0 0 mempty) $ si ^? ciSelection . _Just
|
, Sel i j <- fromMaybe (Sel 0 0) $ si ^? ciSelection . _Just
|
||||||
, isNothing $ si ^? ciSections . ix i . ssItems . ix j =
|
, isNothing $ si ^? ciSections . ix i . ssItems . ix j =
|
||||||
si & ciSelection ?~ Sel 0 (-1) mempty
|
si & ciSelection ?~ Sel 0 (-1)
|
||||||
& ciSelection
|
& ciSelection %~ scrollSelectionSections (-1) sss
|
||||||
%~ scrollSelectionSections (-1) sss
|
|
||||||
| otherwise = si
|
| otherwise = si
|
||||||
|
|
||||||
displayIndents :: Int -> Int
|
displayIndents :: Int -> Int
|
||||||
@@ -246,27 +247,27 @@ updateSectionsPositioning ::
|
|||||||
IM.IntMap (SelSection a) ->
|
IM.IntMap (SelSection a) ->
|
||||||
IM.IntMap (SelSection a)
|
IM.IntMap (SelSection a)
|
||||||
updateSectionsPositioning h mselpos allavailablelines lsss sss =
|
updateSectionsPositioning h mselpos allavailablelines lsss sss =
|
||||||
IM.intersectionWithKey (\k -> updateSection (h k) (m k)) ls ssizes `g` offsets
|
IM.intersectionWithKey (\k -> updateSection (h k) (m k)) lsss ssizes `g` offsets
|
||||||
where
|
where
|
||||||
offsets = fmap _ssOffset sss
|
offsets = fmap (\ss -> (ss^.ssYOffset, ss^.ssSet)) sss
|
||||||
m k = do
|
m k = do
|
||||||
Sel k' i _ <- mselpos
|
Sel k' i <- mselpos
|
||||||
guard $ k == k'
|
guard $ k == k'
|
||||||
return i
|
return i
|
||||||
ls = lsss
|
|
||||||
-- defaults non-existing offsets to 0
|
-- defaults non-existing offsets to 0
|
||||||
g = merge (mapMissing (const ($ 0))) dropMissing (zipWithMatched (const ($)))
|
g = merge (mapMissing (const ($ (0,mempty)))) dropMissing (zipWithMatched (const ($)))
|
||||||
lk = mselpos ^.. _Just . slSec
|
lk = mselpos ^.. _Just . slSec
|
||||||
ssizes = sectionsSizes allavailablelines lk $ sectionsDesiredLines ls
|
ssizes = sectionsSizes allavailablelines lk $ sectionsDesiredLines lsss
|
||||||
|
|
||||||
updateSection :: Int -> Maybe Int -> IMSI a -> Int -> Int -> SelSection a
|
updateSection :: Int -> Maybe Int -> IMSI a -> Int -> (Int,IS.IntSet) -> SelSection a
|
||||||
updateSection indent mcsel sis availablelines oldoffset =
|
updateSection indent mcsel sis availablelines (oldoffset,sset) =
|
||||||
SelSection
|
SelSection
|
||||||
{ _ssItems = sis
|
{ _ssItems = sis
|
||||||
, _ssOffset = offset
|
, _ssYOffset = offset
|
||||||
, _ssShownItems = shownitems
|
, _ssShownItems = shownitems
|
||||||
, _ssShownLength = min aslength availablelines
|
, _ssShownLength = min aslength availablelines
|
||||||
, _ssIndent = indent
|
, _ssIndent = indent
|
||||||
|
, _ssSet = sset
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
shownitems = tweakfirst . tweaklast $ take availablelines shownstrings
|
shownitems = tweakfirst . tweaklast $ take availablelines shownstrings
|
||||||
@@ -323,8 +324,7 @@ enterCombineInv cfig w =
|
|||||||
w & hud . subInventory
|
w & hud . subInventory
|
||||||
.~ CombineInventory
|
.~ CombineInventory
|
||||||
{ _ciSections = updateCombineSections w cfig mempty
|
{ _ciSections = updateCombineSections w cfig mempty
|
||||||
, _ciSelection = Just (Sel 0 0 mempty)
|
, _ciSelection = Just (Sel 0 0)
|
||||||
, _ciFilter = Nothing
|
, _ciFilter = Nothing
|
||||||
}
|
}
|
||||||
& hud . diInvFilter
|
& hud . diInvFilter .~ Nothing
|
||||||
.~ Nothing
|
|
||||||
|
|||||||
+24
-19
@@ -18,33 +18,34 @@ import Linear.V3
|
|||||||
import Picture
|
import Picture
|
||||||
import RandomHelp
|
import RandomHelp
|
||||||
|
|
||||||
makeFlamelet :: Point3 -> Point3 -> Float -> Int -> World -> World
|
makeFlamelet :: DamageOrigin -> Point3 -> Point3 -> Float -> Int -> World -> World
|
||||||
makeFlamelet p v s t =
|
makeFlamelet o p v s t =
|
||||||
cWorld . lWorld . energyBalls
|
cWorld . lWorld . energyBalls
|
||||||
.:~ EnergyBall
|
.:~ EnergyBall
|
||||||
{ _ebVel = v
|
{ _ebVel = v
|
||||||
, _ebPos = p
|
, _ebPos = p
|
||||||
, _ebTimer = t
|
, _ebTimer = t
|
||||||
, _ebType = FlameletBall s
|
, _ebType = FlameletBall s
|
||||||
|
, _ebOrigin = o
|
||||||
}
|
}
|
||||||
|
|
||||||
updateEnergyBall :: World -> EnergyBall -> (World, Maybe EnergyBall)
|
updateEnergyBall :: World -> EnergyBall -> (World, Maybe EnergyBall)
|
||||||
updateEnergyBall w eb
|
updateEnergyBall w eb
|
||||||
| _ebTimer eb <= 0 = (w, Nothing)
|
| _ebTimer eb <= 0 = (w, Nothing)
|
||||||
| otherwise =
|
| otherwise =
|
||||||
( ebEffect eb . ebFlicker eb $ ebDamage (eb ^. ebPos) (_ebType eb) w
|
( ebEffect eb . ebFlicker eb $ ebDamage eb w
|
||||||
, Just $ eb & ebTimer -~ 1 & ebPos . _xy .~ bp & ebVel . _xy .~ drag * bv
|
, Just $ eb & ebTimer -~ 1 & ebPos . _xy .~ bp & ebVel . _xy .~ drag * bv
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
drag = case eb ^. ebType of
|
drag = case eb ^. ebType of
|
||||||
ExplosiveBall -> 0.9
|
ExplosiveBall{} -> 0.9
|
||||||
_ -> 0.85
|
_ -> 0.85
|
||||||
p = (eb ^. ebPos + eb ^. ebVel) ^. _xy
|
p = (eb ^. ebPos + eb ^. ebVel) ^. _xy
|
||||||
(bp, bv) = fromMaybe (p, eb ^. ebVel . _xy) $ bouncePoint (const True) 0 (eb ^. ebPos . _xy) p w
|
(bp, bv) = fromMaybe (p, eb ^. ebVel . _xy) $ bouncePoint (const True) 0 (eb ^. ebPos . _xy) p w
|
||||||
|
|
||||||
ebEffect :: EnergyBall -> World -> World
|
ebEffect :: EnergyBall -> World -> World
|
||||||
ebEffect eb = case _ebType eb of
|
ebEffect eb = case _ebType eb of
|
||||||
ElectricalBall i ->
|
ElectricalBall {_ebID = i} ->
|
||||||
soundContinue (EBSound i) (eb ^. ebPos . _xy) elecCrackleS (Just 2)
|
soundContinue (EBSound i) (eb ^. ebPos . _xy) elecCrackleS (Just 2)
|
||||||
. randSparkExtraVel
|
. randSparkExtraVel
|
||||||
(eb ^. ebVel . _xy)
|
(eb ^. ebVel . _xy)
|
||||||
@@ -57,14 +58,15 @@ ebEffect eb = case _ebType eb of
|
|||||||
soundStart (EBSound (-1)) (eb ^. ebPos . _xy) fireFadeS Nothing
|
soundStart (EBSound (-1)) (eb ^. ebPos . _xy) fireFadeS Nothing
|
||||||
_ -> id
|
_ -> id
|
||||||
|
|
||||||
makeMovingEB :: Point2 -> EnergyBallType -> Point2 -> World -> World
|
makeMovingEB :: Point2 -> EnergyBallType -> DamageOrigin -> Point2 -> World -> World
|
||||||
makeMovingEB v ebt p =
|
makeMovingEB v ebt o p =
|
||||||
cWorld . lWorld . energyBalls
|
cWorld . lWorld . energyBalls
|
||||||
.:~ EnergyBall
|
.:~ EnergyBall
|
||||||
{ _ebVel = v `v2z` 0
|
{ _ebVel = v `v2z` 0
|
||||||
, _ebPos = p `v2z` 20
|
, _ebPos = p `v2z` 20
|
||||||
, _ebTimer = 20
|
, _ebTimer = 20
|
||||||
, _ebType = ebt
|
, _ebType = ebt
|
||||||
|
, _ebOrigin = o
|
||||||
}
|
}
|
||||||
|
|
||||||
ebFlicker :: EnergyBall -> World -> World
|
ebFlicker :: EnergyBall -> World -> World
|
||||||
@@ -79,21 +81,24 @@ ebColor eb = case eb ^. ebType of
|
|||||||
IncendiaryBall{} -> red
|
IncendiaryBall{} -> red
|
||||||
FlameletBall{} -> red
|
FlameletBall{} -> red
|
||||||
ElectricalBall{} -> cyan
|
ElectricalBall{} -> cyan
|
||||||
ExplosiveBall -> white
|
ExplosiveBall{} -> white
|
||||||
FlashBall -> white
|
FlashBall{} -> white
|
||||||
|
|
||||||
ebDamage :: Point3 -> EnergyBallType -> World -> World
|
ebDamage :: EnergyBall -> World -> World
|
||||||
ebDamage sp dt
|
ebDamage eb
|
||||||
| z > 0 && z < 25 = damageInCircle (const $ ebtToDamage (sp ^. _xy) dt) (sp ^. _xy) r
|
| z > 0 && z < 25 = damageInCircle (const $ ebtToDamage (sp ^. _xy) o dt) (sp ^. _xy) r
|
||||||
| otherwise = id
|
| otherwise = id
|
||||||
where
|
where
|
||||||
|
sp = eb ^. ebPos
|
||||||
|
dt = eb ^. ebType
|
||||||
|
o = eb ^. ebOrigin
|
||||||
z = sp ^. _z
|
z = sp ^. _z
|
||||||
r = fromMaybe 5 $ dt ^? fbSize
|
r = fromMaybe 5 $ dt ^? fbSize
|
||||||
|
|
||||||
ebtToDamage :: Point2 -> EnergyBallType -> Damage
|
ebtToDamage :: Point2 -> DamageOrigin -> EnergyBallType -> Damage
|
||||||
ebtToDamage p = \case
|
ebtToDamage p o = \case
|
||||||
FlameletBall{} -> Flaming 1
|
FlameletBall{} -> Flaming 1 o
|
||||||
IncendiaryBall{} -> Flaming 10
|
IncendiaryBall{} -> Flaming 10 o
|
||||||
ElectricalBall{} -> Electrical 10
|
ElectricalBall{} -> Electrical 10 o
|
||||||
ExplosiveBall -> Explosive 10 p
|
ExplosiveBall{} -> Explosive 10 o p
|
||||||
FlashBall -> Flashing 10 p
|
FlashBall{} -> Flashing 10 p o
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ import Picture
|
|||||||
|
|
||||||
drawEnergyBall :: EnergyBall -> Picture
|
drawEnergyBall :: EnergyBall -> Picture
|
||||||
drawEnergyBall eb = case _ebType eb of
|
drawEnergyBall eb = case _ebType eb of
|
||||||
FlameletBall x -> drawFlamelet x eb
|
FlameletBall {_fbSize=x} -> drawFlamelet x eb
|
||||||
IncendiaryBall -> drawFlamelet 5 eb
|
IncendiaryBall{} -> drawFlamelet 5 eb
|
||||||
ElectricalBall{} -> drawStaticBall eb
|
ElectricalBall{} -> drawStaticBall eb
|
||||||
ExplosiveBall -> drawExplosiveBall eb
|
ExplosiveBall{} -> drawExplosiveBall eb
|
||||||
FlashBall -> mempty
|
FlashBall{} -> mempty
|
||||||
|
|
||||||
drawExplosiveBall :: EnergyBall -> Picture
|
drawExplosiveBall :: EnergyBall -> Picture
|
||||||
drawExplosiveBall eb =
|
drawExplosiveBall eb =
|
||||||
|
|||||||
+3
-3
@@ -62,12 +62,12 @@ useMagShield mt _ cr w =
|
|||||||
-- _ -> w
|
-- _ -> w
|
||||||
|
|
||||||
createHeadLamp :: Item -> Creature -> World -> World
|
createHeadLamp :: Item -> Creature -> World -> World
|
||||||
createHeadLamp _ cr =
|
createHeadLamp _ cr w = w &
|
||||||
cWorld
|
cWorld
|
||||||
. lWorld
|
. lWorld
|
||||||
. lights
|
. lights
|
||||||
.:~ LSParam
|
.:~ LSParam
|
||||||
(_crPos cr + rotate3z (_crDir cr) (translateToES cr OnHead (V3 5 0 3)))
|
(_crPos cr + rotate3z (_crDir cr) (translateToES w cr OnHead (V3 5 0 3)))
|
||||||
200
|
200
|
||||||
0.7
|
0.7
|
||||||
|
|
||||||
@@ -122,7 +122,7 @@ setWristShieldPos itm cr esite w = w & moveWallIDUnsafe i wlline
|
|||||||
. itLocation
|
. itLocation
|
||||||
. ilEquipSite
|
. ilEquipSite
|
||||||
. _Just of
|
. _Just of
|
||||||
Just x -> translateToES cr x -- . g
|
Just x -> translateToES w cr x -- . g
|
||||||
_ -> undefined
|
_ -> undefined
|
||||||
-- g
|
-- g
|
||||||
-- | twists cr = (+.+.+ V3 (-5) 10 0)
|
-- | twists cr = (+.+.+ V3 (-5) 10 0)
|
||||||
|
|||||||
+4
-4
@@ -29,7 +29,7 @@ updateFlame w pt
|
|||||||
reflame wl = pt & flTimer -~ 1 & flVel %~ reflVelWallDamp 0.9 wl
|
reflame wl = pt & flTimer -~ 1 & flVel %~ reflVelWallDamp 0.9 wl
|
||||||
doupdate =
|
doupdate =
|
||||||
soundContinue FlameSound sp fireLoudS (Just 2) $
|
soundContinue FlameSound sp fireLoudS (Just 2) $
|
||||||
damageInCircle (const $ Flaming 1) ep r w
|
damageInCircle (const $ Flaming 1 (pt ^. flOrigin)) ep r w
|
||||||
thit = List.safeHead $ thingsHit sp ep w
|
thit = List.safeHead $ thingsHit sp ep w
|
||||||
sp = _flPos pt
|
sp = _flPos pt
|
||||||
ep = sp + _flVel pt
|
ep = sp + _flVel pt
|
||||||
@@ -43,10 +43,10 @@ flFlicker pt
|
|||||||
.:~ LSParam (addZ 10 $ _flPos pt) 70 (0.5 *.*.* xyzV4 red)
|
.:~ LSParam (addZ 10 $ _flPos pt) 70 (0.5 *.*.* xyzV4 red)
|
||||||
| otherwise = id
|
| otherwise = id
|
||||||
|
|
||||||
makeFlame :: Point2 -> Point2 -> World -> World
|
makeFlame :: Point2 -> Point2 -> DamageOrigin -> World -> World
|
||||||
makeFlame pos vel w =
|
makeFlame pos vel d w =
|
||||||
w
|
w
|
||||||
& cWorld . lWorld . flames .:~ Flame t pos vel
|
& cWorld . lWorld . flames .:~ Flame t pos vel d
|
||||||
& randGen .~ g
|
& randGen .~ g
|
||||||
where
|
where
|
||||||
(t, g) = randomR (99, 102) (_randGen w)
|
(t, g) = randomR (99, 102) (_randGen w)
|
||||||
|
|||||||
@@ -14,10 +14,12 @@ import System.Random
|
|||||||
copyItemToFloor :: Point2 -> Item -> World -> World
|
copyItemToFloor :: Point2 -> Item -> World -> World
|
||||||
copyItemToFloor p it w =
|
copyItemToFloor p it w =
|
||||||
w'
|
w'
|
||||||
& cWorld . lWorld . floorItems . at (it ^. itID . unNInt) ?~ FlIt q r
|
& cWorld . lWorld . floorItems . at i ?~ FlIt q r
|
||||||
& cWorld . lWorld . items . at (it ^. itID . unNInt) ?~ (it & itLocation .~ OnFloor)
|
& cWorld . lWorld . items . at i ?~ (it & itLocation .~ OnFloor)
|
||||||
& hud . closeItems .:~ _itID it -- puts item at top of close items
|
& hud . closeItems .:~ _itID it -- puts item at top of close items
|
||||||
|
& cWorld . highlightItems . at i ?~ 20
|
||||||
where
|
where
|
||||||
|
i = it ^. itID . unNInt
|
||||||
(q, w') = findWallFreeDropPoint (_dimRad $ itDim it) p w
|
(q, w') = findWallFreeDropPoint (_dimRad $ itDim it) p w
|
||||||
r = fst . randomR (- pi, pi) $ _randGen w
|
r = fst . randomR (- pi, pi) $ _randGen w
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -14,11 +14,11 @@ createGas gc = case gc of
|
|||||||
|
|
||||||
aGasCloud :: Float -> Point2 -> Float -> Creature -> World -> World
|
aGasCloud :: Float -> Point2 -> Float -> Creature -> World -> World
|
||||||
aGasCloud pressure pos dir cr =
|
aGasCloud pressure pos dir cr =
|
||||||
makeGasCloud pos $
|
makeGasCloud (CrWeaponO (cr ^. crID)) pos $
|
||||||
(cr ^. crPos . _xy - cr ^. crOldPos . _xy) + pressure *^ unitVectorAtAngle dir
|
(cr ^. crPos . _xy - cr ^. crOldPos . _xy) + pressure *^ unitVectorAtAngle dir
|
||||||
|
|
||||||
aFlame :: Float -> Point2 -> Float -> Creature -> World -> World
|
aFlame :: Float -> Point2 -> Float -> Creature -> World -> World
|
||||||
aFlame pressure pos dir cr = makeFlame pos vel
|
aFlame pressure pos dir cr = makeFlame pos vel (CrWeaponO (cr ^. crID))
|
||||||
where
|
where
|
||||||
--w & instantParticles .:~ aFlameParticle t pos vel Nothing -- (Just $ _crID cr)
|
--w & instantParticles .:~ aFlameParticle t pos vel Nothing -- (Just $ _crID cr)
|
||||||
|
|
||||||
|
|||||||
+63
-50
@@ -38,7 +38,7 @@ import Dodge.Tesla
|
|||||||
import Geometry
|
import Geometry
|
||||||
import qualified IntMapHelp as IM
|
import qualified IntMapHelp as IM
|
||||||
import LensHelp
|
import LensHelp
|
||||||
import Linear (_xy,_xyz)
|
import Linear (_xy,_xyz,(*^))
|
||||||
import ListHelp
|
import ListHelp
|
||||||
import NewInt
|
import NewInt
|
||||||
import Picture.Base
|
import Picture.Base
|
||||||
@@ -228,7 +228,7 @@ heldItemMuzzles loc = \case
|
|||||||
BURSTRIFLE -> dbwMuzzles & ix 0 . mzPos .~ V2 25 0 & ix 0 . mzInaccuracy .~ 0.05
|
BURSTRIFLE -> dbwMuzzles & ix 0 . mzPos .~ V2 25 0 & ix 0 . mzInaccuracy .~ 0.05
|
||||||
MINIGUNX i ->
|
MINIGUNX i ->
|
||||||
[ Muzzle
|
[ Muzzle
|
||||||
(V2 (40 * fromIntegral j / fromIntegral i) 0)
|
(V2 (15 + 25 * fromIntegral j / fromIntegral i) 0)
|
||||||
0
|
0
|
||||||
0.05
|
0.05
|
||||||
maguse1
|
maguse1
|
||||||
@@ -454,8 +454,7 @@ itemSidePush = \case
|
|||||||
|
|
||||||
applyInvLock :: Item -> Creature -> World -> World
|
applyInvLock :: Item -> Creature -> World -> World
|
||||||
applyInvLock itm cr = case itemInvLock itm of
|
applyInvLock itm cr = case itemInvLock itm of
|
||||||
i
|
i | i > 0 && cid == 0 ->
|
||||||
| i > 0 && cid == 0 ->
|
|
||||||
(cWorld . lWorld . delayedEvents .:~ (i, UnlockInv)) . lockInv
|
(cWorld . lWorld . delayedEvents .:~ (i, UnlockInv)) . lockInv
|
||||||
_ -> id
|
_ -> id
|
||||||
where
|
where
|
||||||
@@ -470,7 +469,7 @@ heldItemInvLock :: HeldItemType -> Int
|
|||||||
heldItemInvLock = \case
|
heldItemInvLock = \case
|
||||||
FLAMESPITTER -> 10
|
FLAMESPITTER -> 10
|
||||||
VOLLEYGUN i -> i + 1
|
VOLLEYGUN i -> i + 1
|
||||||
BURSTRIFLE -> 70
|
BURSTRIFLE -> 8
|
||||||
_ -> 0
|
_ -> 0
|
||||||
|
|
||||||
applySoundCME :: Item -> Creature -> World -> World
|
applySoundCME :: Item -> Creature -> World -> World
|
||||||
@@ -484,12 +483,12 @@ applySoundCME itm cr = fromMaybe id $ do
|
|||||||
cid = _crID cr
|
cid = _crID cr
|
||||||
|
|
||||||
applyRecoil :: LocationDT OItem -> Creature -> World -> World
|
applyRecoil :: LocationDT OItem -> Creature -> World -> World
|
||||||
applyRecoil loc cr =
|
applyRecoil loc cr w = w &
|
||||||
cWorld . lWorld . creatures . ix (_crID cr) . crPos . _xy
|
cWorld . lWorld . creatures . ix (_crID cr) . crPos . _xy
|
||||||
+~ rotateV (_crDir cr + Q.qToAng q) (V2 ((- recoilAmount itm) / crMass (_crType cr)) 0)
|
+~ rotateV (_crDir cr + Q.qToAng q) (V2 ((- recoilAmount itm) / crMass (_crType cr)) 0)
|
||||||
where
|
where
|
||||||
itm = loc ^. locDT . dtValue . _1
|
itm = loc ^. locDT . dtValue . _1
|
||||||
(_, q) = locOrient loc cr
|
(_, q) = locOrient w loc cr
|
||||||
|
|
||||||
recoilAmount :: Item -> Float
|
recoilAmount :: Item -> Float
|
||||||
recoilAmount itm
|
recoilAmount itm
|
||||||
@@ -743,11 +742,11 @@ useLoadedAmmo
|
|||||||
useLoadedAmmo loc cr mz m w =
|
useLoadedAmmo loc cr mz m w =
|
||||||
makeMuzzleFlare pq loc (mz ^. mzFlareType) $ case _mzEffect mz of
|
makeMuzzleFlare pq loc (mz ^. mzFlareType) $ case _mzEffect mz of
|
||||||
MuzzleShootBullet -> shootBullets loc cr (mz, x, magtree) w
|
MuzzleShootBullet -> shootBullets loc cr (mz, x, magtree) w
|
||||||
MuzzleLaser -> creatureShootLaser pq' loc (w & randGen .~ g)
|
MuzzleLaser -> creatureShootLaser (CrWeaponO (cr ^. crID)) pq' loc (w & randGen .~ g)
|
||||||
MuzzlePulseLaser -> creatureShootPulseLaser pq' cr (w & randGen .~ g)
|
MuzzlePulseLaser -> creatureShootPulseLaser pq' cr (w & randGen .~ g)
|
||||||
MuzzlePulseBall -> shootPulseBall pq' (w & randGen .~ g)
|
MuzzlePulseBall -> shootPulseBall o pq' (w & randGen .~ g)
|
||||||
MuzzlePlasmaBall -> shootPlasmaBall pq' (w & randGen .~ g)
|
MuzzlePlasmaBall -> shootPlasmaBall o pq' (w & randGen .~ g)
|
||||||
MuzzleTesla -> shootTeslaArc pq' loc (w & randGen .~ g)
|
MuzzleTesla -> shootTeslaArc o pq' loc (w & randGen .~ g)
|
||||||
MuzzleTractor -> shootTractorBeam cr w
|
MuzzleTractor -> shootTractorBeam cr w
|
||||||
MuzzleRLauncher -> createProjectileR pq loc magtree cr w
|
MuzzleRLauncher -> createProjectileR pq loc magtree cr w
|
||||||
MuzzleGLauncher ->
|
MuzzleGLauncher ->
|
||||||
@@ -776,29 +775,30 @@ useLoadedAmmo loc cr mz m w =
|
|||||||
MuzzleStopper -> useStopWatch itm cr w
|
MuzzleStopper -> useStopWatch itm cr w
|
||||||
MuzzleScroller -> useTimeScrollGun itm cr w
|
MuzzleScroller -> useTimeScrollGun itm cr w
|
||||||
where
|
where
|
||||||
pq = muzzlePos loc cr mz
|
o = CrWeaponO $ cr ^. crID
|
||||||
(pq', g) = muzzleRandPos loc cr mz `runState` (w ^. randGen)
|
pq = muzzlePos w loc cr mz
|
||||||
|
(pq', g) = muzzleRandPos w loc cr mz `runState` (w ^. randGen)
|
||||||
itmtree = loc ^. locDT
|
itmtree = loc ^. locDT
|
||||||
mitid = magtree ^. dtValue . _1 . itID
|
mitid = magtree ^. dtValue . _1 . itID
|
||||||
itm = itmtree ^. dtValue . _1
|
itm = itmtree ^. dtValue . _1
|
||||||
(x, magtree) = fromJust m
|
(x, magtree) = fromJust m
|
||||||
|
|
||||||
muzzlePos :: LocationDT OItem -> Creature -> Muzzle -> Point3Q
|
muzzlePos :: World -> LocationDT OItem -> Creature -> Muzzle -> Point3Q
|
||||||
muzzlePos m cr muz = (p1, q1) `Q.comp` pq `Q.comp` (p3, q3)
|
muzzlePos w m cr muz = (p1, q1) `Q.comp` pq `Q.comp` (p3, q3)
|
||||||
where
|
where
|
||||||
pq = locOrient m cr
|
pq = locOrient w m cr
|
||||||
p1 = cr ^. crPos
|
p1 = cr ^. crPos
|
||||||
q1 = Q.qz $ cr ^. crDir
|
q1 = Q.qz $ cr ^. crDir
|
||||||
p3 = addZ 0 $ muz ^. mzPos
|
p3 = addZ 0 $ muz ^. mzPos
|
||||||
q3 = Q.qz $ muz ^. mzRot
|
q3 = Q.qz $ muz ^. mzRot
|
||||||
|
|
||||||
muzzleRandPos :: LocationDT OItem -> Creature -> Muzzle -> State StdGen Point3Q
|
muzzleRandPos :: World -> LocationDT OItem -> Creature -> Muzzle -> State StdGen Point3Q
|
||||||
muzzleRandPos m cr muz = do
|
muzzleRandPos w m cr muz = do
|
||||||
a <- state $ randomR (- inacc, inacc)
|
a <- state $ randomR (- inacc, inacc)
|
||||||
y <- case muz ^. mzRandomOffset of
|
y <- case muz ^. mzRandomOffset of
|
||||||
0 -> return 0
|
0 -> return 0
|
||||||
i -> state $ randomR (- i, i)
|
i -> state $ randomR (- i, i)
|
||||||
return $ muzzlePos m cr muz `Q.comp` (V3 0 y 0, Q.qz a)
|
return $ muzzlePos w m cr muz `Q.comp` (V3 0 y 0, Q.qz a)
|
||||||
where
|
where
|
||||||
inacc = _mzInaccuracy muz
|
inacc = _mzInaccuracy muz
|
||||||
|
|
||||||
@@ -856,9 +856,10 @@ tractorBeamAt pos outpos dir power =
|
|||||||
, _tbTime = 10
|
, _tbTime = 10
|
||||||
}
|
}
|
||||||
|
|
||||||
creatureShootLaser :: Point3Q -> LocationDT OItem -> World -> World
|
creatureShootLaser :: DamageOrigin -> Point3Q -> LocationDT OItem -> World -> World
|
||||||
creatureShootLaser (p, q) loc =
|
creatureShootLaser o (p, q) loc =
|
||||||
shootLaser
|
shootLaser
|
||||||
|
o
|
||||||
(ItemSound (loc ^. locDT . dtValue . _1 . itID . unNInt) 0)
|
(ItemSound (loc ^. locDT . dtValue . _1 . itID . unNInt) 0)
|
||||||
(getLaserDamage loc)
|
(getLaserDamage loc)
|
||||||
(getLaserPhaseV loc)
|
(getLaserPhaseV loc)
|
||||||
@@ -866,6 +867,7 @@ creatureShootLaser (p, q) loc =
|
|||||||
(Q.qToAng q)
|
(Q.qToAng q)
|
||||||
|
|
||||||
shootLaser ::
|
shootLaser ::
|
||||||
|
DamageOrigin ->
|
||||||
SoundOrigin ->
|
SoundOrigin ->
|
||||||
LaserType ->
|
LaserType ->
|
||||||
Float ->
|
Float ->
|
||||||
@@ -873,13 +875,14 @@ shootLaser ::
|
|||||||
Float ->
|
Float ->
|
||||||
World ->
|
World ->
|
||||||
World
|
World
|
||||||
shootLaser so lt pv p dir =
|
shootLaser o so lt pv p dir =
|
||||||
( cWorld . lWorld . lasers
|
( cWorld . lWorld . lasers
|
||||||
.:~ Laser
|
.:~ Laser
|
||||||
{ _lpType = lt
|
{ _lpType = lt
|
||||||
, _lpPhaseV = pv
|
, _lpPhaseV = pv
|
||||||
, _lpPos = p
|
, _lpPos = p
|
||||||
, _lpDir = dir
|
, _lpDir = dir
|
||||||
|
, _lpOrigin = o
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
. soundContinue so p tone440sawtoothquietS (Just 2)
|
. soundContinue so p tone440sawtoothquietS (Just 2)
|
||||||
@@ -887,12 +890,13 @@ shootLaser so lt pv p dir =
|
|||||||
creatureShootPulseLaser :: Point3Q -> Creature -> World -> World
|
creatureShootPulseLaser :: Point3Q -> Creature -> World -> World
|
||||||
creatureShootPulseLaser (p, q) cr =
|
creatureShootPulseLaser (p, q) cr =
|
||||||
shootPulseLaser
|
shootPulseLaser
|
||||||
|
(CrWeaponO $ cr ^. crID)
|
||||||
(CrWeaponSound (_crID cr) 0)
|
(CrWeaponSound (_crID cr) 0)
|
||||||
(p ^. _xy)
|
(p ^. _xy)
|
||||||
(Q.qToAng q)
|
(Q.qToAng q)
|
||||||
|
|
||||||
shootPulseLaser :: SoundOrigin -> Point2 -> Float -> World -> World
|
shootPulseLaser :: DamageOrigin -> SoundOrigin -> Point2 -> Float -> World -> World
|
||||||
shootPulseLaser so p dir w =
|
shootPulseLaser o so p dir w =
|
||||||
w
|
w
|
||||||
& cWorld . lWorld . pulseLasers
|
& cWorld . lWorld . pulseLasers
|
||||||
.:~ PulseLaser
|
.:~ PulseLaser
|
||||||
@@ -901,23 +905,25 @@ shootPulseLaser so p dir w =
|
|||||||
, _pzDir = dir
|
, _pzDir = dir
|
||||||
, _pzDamage = 101
|
, _pzDamage = 101
|
||||||
, _pzTimer = 5
|
, _pzTimer = 5
|
||||||
|
, _pzOrigin = o
|
||||||
}
|
}
|
||||||
& soundStart so p lasPulseS Nothing
|
& soundStart so p lasPulseS Nothing
|
||||||
|
|
||||||
shootPlasmaBall :: Point3Q -> World -> World
|
shootPlasmaBall :: DamageOrigin -> Point3Q -> World -> World
|
||||||
shootPlasmaBall (p, q) w =
|
shootPlasmaBall o (p, q) w =
|
||||||
w
|
w
|
||||||
& cWorld . lWorld . plasmaBalls .:~
|
& cWorld . lWorld . plasmaBalls .:~
|
||||||
PBall
|
PBall
|
||||||
{ _pbPos = p ^. _xy
|
{ _pbPos = p ^. _xy
|
||||||
, _pbVel = 6 * unitVectorAtAngle (Q.qToAng q)
|
, _pbVel = 6 * unitVectorAtAngle (Q.qToAng q)
|
||||||
, _pbType = DefaultPlasma
|
, _pbType = DefaultPlasma
|
||||||
|
, _pbOrigin = o
|
||||||
}
|
}
|
||||||
-- & soundStart (PBSound i) (p ^. _xy) energyReleaseS Nothing
|
-- & soundStart (PBSound i) (p ^. _xy) energyReleaseS Nothing
|
||||||
|
|
||||||
|
|
||||||
shootPulseBall :: Point3Q -> World -> World
|
shootPulseBall :: DamageOrigin -> Point3Q -> World -> World
|
||||||
shootPulseBall (p, q) w =
|
shootPulseBall o (p, q) w =
|
||||||
w
|
w
|
||||||
& cWorld . lWorld . pulseBalls . at i
|
& cWorld . lWorld . pulseBalls . at i
|
||||||
?~ PulseBall
|
?~ PulseBall
|
||||||
@@ -925,6 +931,7 @@ shootPulseBall (p, q) w =
|
|||||||
, _pzbVel = 3.5 * unitVectorAtAngle (Q.qToAng q)
|
, _pzbVel = 3.5 * unitVectorAtAngle (Q.qToAng q)
|
||||||
, _pzbTimer = 200
|
, _pzbTimer = 200
|
||||||
, _pzbID = i
|
, _pzbID = i
|
||||||
|
, _pzbOrigin = o
|
||||||
}
|
}
|
||||||
& soundStart (PBSound i) (p ^. _xy) energyReleaseS Nothing
|
& soundStart (PBSound i) (p ^. _xy) energyReleaseS Nothing
|
||||||
where
|
where
|
||||||
@@ -990,12 +997,13 @@ shootBullets
|
|||||||
:: LocationDT OItem -> Creature -> (Muzzle, Int, DTree OItem) -> World -> World
|
:: LocationDT OItem -> Creature -> (Muzzle, Int, DTree OItem) -> World -> World
|
||||||
shootBullets loc cr (mz, x, magtree) w = fromMaybe w $ do
|
shootBullets loc cr (mz, x, magtree) w = fromMaybe w $ do
|
||||||
thebullet <- getBulletType magtree
|
thebullet <- getBulletType magtree
|
||||||
return $ foldl' (&) w (replicate x (shootBullet thebullet loc cr mz))
|
let bu = thebullet & buOrigin .~ CrWeaponO (cr ^. crID)
|
||||||
|
return $ foldl' (&) w (replicate x (shootBullet bu loc cr mz))
|
||||||
|
|
||||||
shootBullet :: Bullet -> LocationDT OItem -> Creature -> Muzzle -> World -> World
|
shootBullet :: Bullet -> LocationDT OItem -> Creature -> Muzzle -> World -> World
|
||||||
shootBullet bu loc cr mz w = makeBullet bu itm pq . (randGen .~ g) $ w
|
shootBullet bu loc cr mz w = makeBullet bu itm pq . (randGen .~ g) $ w
|
||||||
where
|
where
|
||||||
(pq, g) = muzzleRandPos loc cr mz `runState` (w ^. randGen)
|
(pq, g) = muzzleRandPos w loc cr mz `runState` (w ^. randGen)
|
||||||
itm = loc ^. locDT . dtValue . _1
|
itm = loc ^. locDT . dtValue . _1
|
||||||
|
|
||||||
makeBullet :: Bullet -> Item -> Point3Q -> World -> World
|
makeBullet :: Bullet -> Item -> Point3Q -> World -> World
|
||||||
@@ -1005,7 +1013,7 @@ makeBullet thebullet itm (p, q) w =
|
|||||||
.:~ ( thebullet
|
.:~ ( thebullet
|
||||||
& buPos .~ bulpos
|
& buPos .~ bulpos
|
||||||
& buOldPos .~ bulpos
|
& buOldPos .~ bulpos
|
||||||
& buVel %~ (rotateV dir . (muzvel *.*))
|
& buVel %~ (rotateV dir . (muzvel *^))
|
||||||
& buDrag *~ drag
|
& buDrag *~ drag
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
@@ -1180,7 +1188,7 @@ doGenFloat (UniRandFloat x y) g = randomR (x, y) g
|
|||||||
|
|
||||||
mcShootLaser :: Item -> Machine -> World -> World
|
mcShootLaser :: Item -> Machine -> World -> World
|
||||||
mcShootLaser _ mc =
|
mcShootLaser _ mc =
|
||||||
shootLaser (MachinePrimarySound (_mcID mc)) (DamageLaser 11) 1 pos dir
|
shootLaser (McWeaponO (mc ^. mcID)) (MachinePrimarySound (_mcID mc)) (DamageLaser 11) 1 pos dir
|
||||||
where
|
where
|
||||||
pos = _mcPos mc +.+ 20 *.* unitVectorAtAngle dir
|
pos = _mcPos mc +.+ 20 *.* unitVectorAtAngle dir
|
||||||
dir = (mc ^?! mcType . mctTurret . tuDir)
|
dir = (mc ^?! mcType . mctTurret . tuDir)
|
||||||
@@ -1203,14 +1211,14 @@ mcShootAuto itm mc w
|
|||||||
-- dir = mc ^?! mcType . _McTurret . tuDir
|
-- dir = mc ^?! mcType . _McTurret . tuDir
|
||||||
|
|
||||||
-- | assumes that the item is held
|
-- | assumes that the item is held
|
||||||
shootTeslaArc :: Point3Q -> LocationDT OItem -> World -> World
|
shootTeslaArc :: DamageOrigin -> Point3Q -> LocationDT OItem -> World -> World
|
||||||
shootTeslaArc (p, q) loc w =
|
shootTeslaArc o (p, q) loc w =
|
||||||
w' & cWorld . lWorld . items . ix itid . itParams .~ ip
|
w' & cWorld . lWorld . items . ix itid . itParams .~ ip
|
||||||
& soundContinue (ItemSound itid 0) pos elecCrackleS (Just 2)
|
& soundContinue (ItemSound itid 0) pos elecCrackleS (Just 2)
|
||||||
where
|
where
|
||||||
itm = loc ^. locDT . dtValue . _1
|
itm = loc ^. locDT . dtValue . _1
|
||||||
itid = itm ^. itID . unNInt
|
itid = itm ^. itID . unNInt
|
||||||
(w', ip) = makeTeslaArc (itm ^. itParams) pos (Q.qToAng q) w
|
(w', ip) = makeTeslaArc o (itm ^. itParams) pos (Q.qToAng q) w
|
||||||
pos = p ^. _xy
|
pos = p ^. _xy
|
||||||
|
|
||||||
determineProjectileTracking :: DTree OItem -> DTree OItem -> RocketHoming
|
determineProjectileTracking :: DTree OItem -> DTree OItem -> RocketHoming
|
||||||
@@ -1375,10 +1383,10 @@ dropInventoryPath ::
|
|||||||
Creature ->
|
Creature ->
|
||||||
World ->
|
World ->
|
||||||
World
|
World
|
||||||
dropInventoryPath i ip loc cr = fromMaybe id $ do
|
dropInventoryPath i ip loc cr w = fromMaybe w $ do
|
||||||
invid <- loc ^? locDT . dtValue . _1 . itLocation . ilInvID . unNInt
|
invid <- loc ^? locDT . dtValue . _1 . itLocation . ilInvID . unNInt
|
||||||
j <- getInventoryPath i ip invid cr
|
j <- getInventoryPath w i ip invid cr
|
||||||
return $ dropItem cr j
|
return $ dropItem cr j w
|
||||||
|
|
||||||
--dropInventoryPath i ip loc cr w = case ip of
|
--dropInventoryPath i ip loc cr w = case ip of
|
||||||
-- ABSOLUTE -> fromMaybe w $ do
|
-- ABSOLUTE -> fromMaybe w $ do
|
||||||
@@ -1407,18 +1415,23 @@ useInventoryPath ::
|
|||||||
Creature ->
|
Creature ->
|
||||||
World ->
|
World ->
|
||||||
World
|
World
|
||||||
useInventoryPath pt i ip loc cr w = case ip of
|
useInventoryPath pt i ip loc cr w = fromMaybe w $ do
|
||||||
ABSOLUTE -> fromMaybe w $ do
|
invid <- loc ^? locDT . dtValue . _1 . itLocation . ilInvID . unNInt
|
||||||
guard $ i `IM.member` (cr ^. crInv . unNIntMap)
|
j <- getInventoryPath w i ip invid cr
|
||||||
return $ w & cWorld . lWorld . delayedEvents .:~ (1, UseInvItem i pt)
|
return $ w & cWorld . lWorld . delayedEvents .:~ (1,UseInvItem j pt)
|
||||||
RELCURS -> fromMaybe w $ do
|
-- = case ip of
|
||||||
j <- cr ^? crManipulation . manObject . imSelectedItem . unNInt
|
-- ABSOLUTE -> fromMaybe w $ useat i
|
||||||
guard $ (i + j) `IM.member` (cr ^. crInv . unNIntMap)
|
-- RELCURS -> fromMaybe w $ do
|
||||||
return $ w & cWorld . lWorld . delayedEvents .:~ (1, UseInvItem (i + j) pt)
|
-- Sel 0 j <- w ^? hud .diSelection._Just
|
||||||
RELITEM -> fromMaybe w $ do
|
-- useat $ i + j
|
||||||
j <- loc ^? locDT . dtValue . _1 . itLocation . ilInvID . unNInt
|
-- RELITEM -> fromMaybe w $ do
|
||||||
guard $ (i + j) `IM.member` (cr ^. crInv . unNIntMap)
|
-- j <- loc ^? locDT . dtValue . _1 . itLocation . ilInvID . unNInt
|
||||||
return $ w & cWorld . lWorld . delayedEvents .:~ (1, UseInvItem (i + j) pt)
|
-- useat $ i + j
|
||||||
|
-- where
|
||||||
|
-- useat k = do
|
||||||
|
-- guard $ k `IM.member` (cr ^. crInv . unNIntMap)
|
||||||
|
-- return $ w & cWorld . lWorld . delayedEvents .:~ (1, UseInvItem k pt)
|
||||||
|
|
||||||
|
|
||||||
--useRewindGun _ _ w = case w ^. cwTime . rewindWorlds of
|
--useRewindGun _ _ w = case w ^. cwTime . rewindWorlds of
|
||||||
-- [w'] -> w & cwTime . maybeWorld .~ Just' w'
|
-- [w'] -> w & cwTime . maybeWorld .~ Just' w'
|
||||||
|
|||||||
+29
-35
@@ -1,46 +1,40 @@
|
|||||||
module Dodge.Humanoid (
|
module Dodge.Humanoid (
|
||||||
chaseCritInternal,
|
crabCritInternal,
|
||||||
hoverCritInternal,
|
updateHoverCrit,
|
||||||
|
updateVocTimer,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Foldable
|
|
||||||
import Dodge.Creature
|
import Dodge.Creature
|
||||||
import Dodge.Data.World
|
import Dodge.Data.World
|
||||||
import LensHelp
|
import LensHelp
|
||||||
|
|
||||||
chaseCritInternal :: World -> Creature -> Creature
|
crabCritInternal :: Int -> World -> World
|
||||||
chaseCritInternal w cr =
|
crabCritInternal cid w = w
|
||||||
foldl'
|
& tocr %~ setViewPos w
|
||||||
(\c f -> f w c)
|
& tocr %~ setMvPosToTargetCr w
|
||||||
cr
|
& crabActionUpdate cid
|
||||||
[ const doStrategyActions
|
& tocr %~ perceptionUpdate [0] w
|
||||||
, overrideMeleeCloseTarget
|
& tocr %~ targetYouWhenCognizant w
|
||||||
, setViewPos
|
& tocr %~ searchIfDamaged
|
||||||
, setMvPos
|
& tocr . crType . dodgeCooldown %~ max 0 . subtract 1
|
||||||
, chaseCritMv
|
& tocr . crType . meleeCooldownR %~ max 0 . subtract 1
|
||||||
, perceptionUpdate [0]
|
& tocr . crType . meleeCooldownL %~ max 0 . subtract 1
|
||||||
, targetYouWhenCognizant
|
where
|
||||||
, const searchIfDamaged
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
, const (crType . meleeCooldown %~ max 0 . subtract 1)
|
|
||||||
, const (crVocalization %~ updateVocTimer)
|
|
||||||
]
|
|
||||||
|
|
||||||
hoverCritInternal :: World -> Creature -> Creature
|
updateHoverCrit :: Int -> World -> World
|
||||||
hoverCritInternal w cr =
|
updateHoverCrit cid w = w
|
||||||
foldl'
|
& tocr %~ overrideMeleeCloseTarget w
|
||||||
(\c f -> f w c)
|
& tocr %~ setViewPos w
|
||||||
cr
|
& tocr %~ setMvPosToTargetCr w
|
||||||
[ const doStrategyActions
|
& tocr %~ hoverCritMv w
|
||||||
, overrideMeleeCloseTarget
|
& tocr %~ perceptionUpdate [0] w
|
||||||
, setViewPos
|
& tocr %~ targetYouWhenCognizant w
|
||||||
, setMvPos
|
& tocr %~ searchIfDamaged
|
||||||
, hoverCritMv
|
& tocr . crType . meleeCooldown %~ max 0 . subtract 1
|
||||||
, perceptionUpdate [0]
|
& tocr . crVocalization %~ updateVocTimer
|
||||||
, targetYouWhenCognizant
|
where
|
||||||
, const searchIfDamaged
|
tocr = cWorld . lWorld . creatures . ix cid
|
||||||
, const (crType . meleeCooldown %~ max 0 . subtract 1)
|
|
||||||
, const (crVocalization %~ updateVocTimer)
|
|
||||||
]
|
|
||||||
|
|
||||||
updateVocTimer :: Vocalization -> Vocalization
|
updateVocTimer :: Vocalization -> Vocalization
|
||||||
updateVocTimer VocTimer{_vcTime = x, _vcMaxTime = y} | x < y = VocTimer (x + 1) y
|
updateVocTimer VocTimer{_vcTime = x, _vcMaxTime = y} | x < y = VocTimer (x + 1) y
|
||||||
|
|||||||
+26
-56
@@ -12,7 +12,6 @@ module Dodge.Inventory (
|
|||||||
swapInvItems,
|
swapInvItems,
|
||||||
scrollAugNextInSection,
|
scrollAugNextInSection,
|
||||||
swapItemWith,
|
swapItemWith,
|
||||||
destroyItem,
|
|
||||||
destroyAllInvItems,
|
destroyAllInvItems,
|
||||||
multiSelScroll,
|
multiSelScroll,
|
||||||
changeSwapSelSet,
|
changeSwapSelSet,
|
||||||
@@ -68,19 +67,9 @@ destroyAllInvItems cr w =
|
|||||||
. _unNIntMap
|
. _unNIntMap
|
||||||
$ cr ^. crInv
|
$ cr ^. crInv
|
||||||
|
|
||||||
destroyItem :: Int -> World -> World
|
|
||||||
destroyItem itid w = case w ^? cWorld . lWorld . items . ix itid . itLocation of
|
|
||||||
Nothing -> error $ "Tried to destroy item that does not exist; item id: " ++ show itid
|
|
||||||
Just InInv{_ilCrID = cid, _ilInvID = invid} -> destroyInvItem cid invid w
|
|
||||||
Just OnTurret{} -> error "need to write code for destroying items on turrets"
|
|
||||||
Just OnFloor ->
|
|
||||||
w
|
|
||||||
& cWorld . lWorld . items . at itid .~ Nothing
|
|
||||||
& cWorld . lWorld . floorItems . at itid .~ Nothing
|
|
||||||
Just InVoid -> w & cWorld . lWorld . items . at itid .~ Nothing
|
|
||||||
|
|
||||||
-- note rmInvItem does not fully destroy the item, other updates to the item
|
-- note rmInvItem does not fully destroy the item, other updates to the item
|
||||||
-- location are required
|
-- location are required
|
||||||
|
-- note if this gets called ssInvPosFromSS might be necessary elsewhere
|
||||||
rmInvItem :: Int -> NewInt InvInt -> World -> World
|
rmInvItem :: Int -> NewInt InvInt -> World -> World
|
||||||
rmInvItem cid invid w =
|
rmInvItem cid invid w =
|
||||||
w
|
w
|
||||||
@@ -89,39 +78,23 @@ rmInvItem cid invid w =
|
|||||||
& removeAnySlotEquipment
|
& removeAnySlotEquipment
|
||||||
& cWorld . lWorld . items . ix itid . itLocation . ilEquipSite .~ Nothing
|
& cWorld . lWorld . items . ix itid . itLocation . ilEquipSite .~ Nothing
|
||||||
& updateselection
|
& updateselection
|
||||||
& updateselectionextra
|
|
||||||
& pointcid %~ updateRootItemID (w ^. cWorld . lWorld . items)
|
|
||||||
& worldEventFlags . at InventoryChange ?~ ()
|
& worldEventFlags . at InventoryChange ?~ ()
|
||||||
where
|
where
|
||||||
pointcid = cWorld . lWorld . creatures . ix cid
|
pointcid = cWorld . lWorld . creatures . ix cid
|
||||||
updateselectionextra
|
|
||||||
| cid == 0 = hud . diSelection . _Just . slSet %~ const mempty
|
|
||||||
| otherwise = id
|
|
||||||
updateselection
|
updateselection
|
||||||
| cid == 0 && cr ^? crManipulation . manObject . imSelectedItem == Just invid =
|
| cid == 0 && (w ^? hud .diSelection._Just) == Just (Sel 0 (invid^.unNInt)) =
|
||||||
scrollAugInvSel (-1) . scrollAugInvSel 1
|
scrollAugInvSel (-1) . scrollAugInvSel 1
|
||||||
| otherwise =
|
| otherwise = id
|
||||||
pointcid . crManipulation . manObject . imSelectedItem %~ g
|
|
||||||
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
||||||
itid = _crInv cr ^?! ix invid
|
itid = cr ^?! crInv . ix invid
|
||||||
itm = w ^?! cWorld . lWorld . items . ix itid
|
itm = w ^?! cWorld . lWorld . items . ix itid
|
||||||
dounequipfunction = effectOnRemove itm cr
|
dounequipfunction = effectOnRemove itm cr
|
||||||
removeAnySlotEquipment = fromMaybe id $ do
|
removeAnySlotEquipment = fromMaybe id $ do
|
||||||
epos <-
|
epos <- itm ^? itLocation . ilEquipSite . _Just
|
||||||
itm
|
|
||||||
^? itLocation
|
|
||||||
. ilEquipSite
|
|
||||||
. _Just
|
|
||||||
return $ pointcid . crEquipment . at epos .~ Nothing
|
return $ pointcid . crEquipment . at epos .~ Nothing
|
||||||
-- return $ pointcid . crEquipment .~ mempty
|
|
||||||
maxk = fmap fst $ IM.lookupMax $ _unNIntMap $ cr ^. crInv
|
|
||||||
f inv =
|
f inv =
|
||||||
let (xs, ys) = IM.split (_unNInt invid) $ _unNIntMap inv
|
let (xs, ys) = IM.split (_unNInt invid) $ _unNIntMap inv
|
||||||
in NIntMap $ xs `IM.union` IM.mapKeysMonotonic (subtract 1) ys
|
in NIntMap $ xs `IM.union` IM.mapKeysMonotonic (subtract 1) ys
|
||||||
-- the following might not work if a non-player creature drops their last item
|
|
||||||
g x
|
|
||||||
| x > invid || Just x == fmap NInt maxk = max 0 $ x - 1
|
|
||||||
| otherwise = x
|
|
||||||
|
|
||||||
updateCloseObjects :: World -> World
|
updateCloseObjects :: World -> World
|
||||||
updateCloseObjects w =
|
updateCloseObjects w =
|
||||||
@@ -156,7 +129,8 @@ changeSwapSelSet yi w
|
|||||||
|
|
||||||
swapSelSet :: (Int -> IS.IntSet -> World -> World) -> World -> World
|
swapSelSet :: (Int -> IS.IntSet -> World -> World) -> World -> World
|
||||||
swapSelSet f w = fromMaybe w $ do
|
swapSelSet f w = fromMaybe w $ do
|
||||||
Sel j i is' <- w ^. hud . diSelection
|
Sel j i <- w ^. hud . diSelection
|
||||||
|
is' <- w ^? hud . diSections . ix j . ssSet
|
||||||
let is = if IS.null is'
|
let is = if IS.null is'
|
||||||
then IS.singleton i
|
then IS.singleton i
|
||||||
else is'
|
else is'
|
||||||
@@ -204,13 +178,14 @@ concurrentIS = go . IS.minView
|
|||||||
|
|
||||||
collectInvItems :: Int -> IS.IntSet -> World -> World
|
collectInvItems :: Int -> IS.IntSet -> World -> World
|
||||||
collectInvItems secid is w = fromMaybe w $ do
|
collectInvItems secid is w = fromMaybe w $ do
|
||||||
guard $ secid == 0
|
guard $ secid == 0 || secid == 3
|
||||||
(j, js) <- IS.minView is
|
(j, js) <- IS.minView is
|
||||||
return $ h j js w
|
return $ h j js w
|
||||||
where
|
where
|
||||||
h j js w' = fromMaybe w' $ do
|
h j js w' = fromMaybe w' $ do
|
||||||
(k, ks) <- IS.minView js
|
(k, ks) <- IS.minView js
|
||||||
return . h (j + 1) ks $ swapInvItems (\_ _ -> Just (j + 1)) k w'
|
-- return . h (j + 1) ks $ swapInvItems (\_ _ -> Just (j + 1)) k w'
|
||||||
|
return . h (j + 1) ks $ swapItemWith (\_ _ -> Just (j + 1)) (secid,k) w'
|
||||||
|
|
||||||
changeSwapSel :: Int -> World -> World
|
changeSwapSel :: Int -> World -> World
|
||||||
changeSwapSel yi w
|
changeSwapSel yi w
|
||||||
@@ -228,7 +203,8 @@ multiSelScroll yi w
|
|||||||
|
|
||||||
multiSelScroll' :: (Int -> IM.IntMap (SelectionItem ()) -> Maybe Int) -> World -> World
|
multiSelScroll' :: (Int -> IM.IntMap (SelectionItem ()) -> Maybe Int) -> World -> World
|
||||||
multiSelScroll' f w = fromMaybe w $ do
|
multiSelScroll' f w = fromMaybe w $ do
|
||||||
Sel j i is <- w ^. hud . diSelection
|
Sel j i <- w ^. hud . diSelection
|
||||||
|
is <- w ^? hud . diSections . ix j . ssSet
|
||||||
ss <- w ^? hud . diSections . ix j . ssItems
|
ss <- w ^? hud . diSections . ix j . ssItems
|
||||||
k <- f i ss
|
k <- f i ss
|
||||||
let insertordelete
|
let insertordelete
|
||||||
@@ -237,17 +213,16 @@ multiSelScroll' f w = fromMaybe w $ do
|
|||||||
| otherwise = IS.insert i . IS.insert k
|
| otherwise = IS.insert i . IS.insert k
|
||||||
return $
|
return $
|
||||||
w
|
w
|
||||||
& hud . diSelection . _Just . slSet %~ insertordelete
|
& hud . diSections . ix j . ssSet %~ insertordelete
|
||||||
& hud . diSelection . _Just . slInt .~ k
|
& hud . diSelection . _Just . slInt .~ k
|
||||||
|
|
||||||
changeSwapOther ::
|
changeSwapOther ::
|
||||||
((Int -> Identity Int) -> ManipulatedObject -> Identity ManipulatedObject) ->
|
|
||||||
Int ->
|
Int ->
|
||||||
(Int -> IM.IntMap (SelectionItem ()) -> Maybe Int) ->
|
(Int -> IM.IntMap (SelectionItem ()) -> Maybe Int) ->
|
||||||
Int ->
|
Int ->
|
||||||
World ->
|
World ->
|
||||||
World
|
World
|
||||||
changeSwapOther manlens n f i w = fromMaybe w $ do
|
changeSwapOther n f i w = fromMaybe w $ do
|
||||||
ss <- w ^? hud . diSections . ix n . ssItems
|
ss <- w ^? hud . diSections . ix n . ssItems
|
||||||
k <- f i ss
|
k <- f i ss
|
||||||
let doswap j
|
let doswap j
|
||||||
@@ -256,15 +231,7 @@ changeSwapOther manlens n f i w = fromMaybe w $ do
|
|||||||
| otherwise = j
|
| otherwise = j
|
||||||
return $
|
return $
|
||||||
w
|
w
|
||||||
& swapAnyExtraSelection i k
|
& hud . diSections . ix 3 . ssSet %~ swapInIntSet i k
|
||||||
& cWorld
|
|
||||||
. lWorld
|
|
||||||
. creatures
|
|
||||||
. ix 0
|
|
||||||
. crManipulation
|
|
||||||
. manObject
|
|
||||||
. manlens
|
|
||||||
%~ doswap
|
|
||||||
& hud . closeItems %~ swapIndices i k
|
& hud . closeItems %~ swapIndices i k
|
||||||
& hud . diSelection . _Just . slInt %~ doswap
|
& hud . diSelection . _Just . slInt %~ doswap
|
||||||
& worldEventFlags . at InventoryChange ?~ ()
|
& worldEventFlags . at InventoryChange ?~ ()
|
||||||
@@ -276,13 +243,13 @@ swapItemWith ::
|
|||||||
World
|
World
|
||||||
swapItemWith f (j, i) = case j of
|
swapItemWith f (j, i) = case j of
|
||||||
0 -> swapInvItems f i
|
0 -> swapInvItems f i
|
||||||
3 -> changeSwapOther ispCloseItem 3 f i
|
3 -> changeSwapOther 3 f i
|
||||||
5 -> changeSwapOther ispCloseButton 5 f i
|
5 -> changeSwapOther 5 f i
|
||||||
_ -> id
|
_ -> id
|
||||||
|
|
||||||
changeSwapWith :: (Int -> IM.IntMap (SelectionItem ()) -> Maybe Int) -> World -> World
|
changeSwapWith :: (Int -> IM.IntMap (SelectionItem ()) -> Maybe Int) -> World -> World
|
||||||
changeSwapWith f w
|
changeSwapWith f w
|
||||||
| Just (Sel j i _) <- w ^. hud . diSelection = swapItemWith f (j, i) w
|
| Just (Sel j i) <- w ^. hud . diSelection = swapItemWith f (j, i) w
|
||||||
| otherwise = w
|
| otherwise = w
|
||||||
|
|
||||||
invSetSelection :: Selection -> World -> World
|
invSetSelection :: Selection -> World -> World
|
||||||
@@ -290,11 +257,12 @@ invSetSelection sel w =
|
|||||||
w
|
w
|
||||||
& hud . diSelection ?~ sel
|
& hud . diSelection ?~ sel
|
||||||
& worldEventFlags . at InventoryChange ?~ ()
|
& worldEventFlags . at InventoryChange ?~ ()
|
||||||
& setInvPosFromSS
|
-- & crUpdateItemLocations
|
||||||
& cWorld . lWorld %~ crUpdateItemLocations 0
|
& setInvPosFromSS -- is this necessary here?
|
||||||
|
& crUpdateItemLocations
|
||||||
|
|
||||||
invSetSelectionPos :: Int -> Int -> World -> World
|
invSetSelectionPos :: Int -> Int -> World -> World
|
||||||
invSetSelectionPos i j = invSetSelection (Sel i j mempty)
|
invSetSelectionPos i j = invSetSelection (Sel i j)
|
||||||
|
|
||||||
scrollAugInvSel :: Int -> World -> World
|
scrollAugInvSel :: Int -> World -> World
|
||||||
scrollAugInvSel yi w
|
scrollAugInvSel yi w
|
||||||
@@ -303,8 +271,9 @@ scrollAugInvSel yi w
|
|||||||
w
|
w
|
||||||
& hud %~ doscroll
|
& hud %~ doscroll
|
||||||
& worldEventFlags . at InventoryChange ?~ ()
|
& worldEventFlags . at InventoryChange ?~ ()
|
||||||
|
& crUpdateItemLocations
|
||||||
& setInvPosFromSS
|
& setInvPosFromSS
|
||||||
& cWorld . lWorld %~ crUpdateItemLocations 0
|
& crUpdateItemLocations
|
||||||
where
|
where
|
||||||
doscroll he = fromMaybe he $ do
|
doscroll he = fromMaybe he $ do
|
||||||
sss <- he ^? diSections
|
sss <- he ^? diSections
|
||||||
@@ -315,8 +284,9 @@ scrollAugNextInSection w =
|
|||||||
w
|
w
|
||||||
& hud %~ doscroll
|
& hud %~ doscroll
|
||||||
& worldEventFlags . at InventoryChange ?~ ()
|
& worldEventFlags . at InventoryChange ?~ ()
|
||||||
|
& crUpdateItemLocations
|
||||||
& setInvPosFromSS
|
& setInvPosFromSS
|
||||||
& cWorld . lWorld %~ crUpdateItemLocations 0
|
& crUpdateItemLocations
|
||||||
where
|
where
|
||||||
doscroll he = fromMaybe he $ do
|
doscroll he = fromMaybe he $ do
|
||||||
sss <- he ^? diSections
|
sss <- he ^? diSections
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user