Simplify slime compression
This commit is contained in:
@@ -69,7 +69,8 @@ slimeCrit :: Creature
|
||||
slimeCrit = defaultCreature
|
||||
& crName .~ "slimeCrit"
|
||||
& crHP .~ HP 1000
|
||||
& crType .~ SlimeCrit r 0 0 (V2 (slimeToRad r) 0) False 0
|
||||
-- & crType .~ SlimeCrit r 0 0 (V2 (slimeToRad r) 0) False 0
|
||||
& crType .~ SlimeCrit r 0 0 1 False 0
|
||||
& crFaction .~ ColorFaction (light green)
|
||||
& crPerception . cpVision . viFOV .~ FloatFOV pi
|
||||
& crActionPlan .~ SlimeIntelligence
|
||||
|
||||
@@ -59,15 +59,16 @@ drawCreature w m cr = translateSP (_crPos cr) . fallrot . rotateSP (_crDir cr) $
|
||||
drawSlimeCrit :: Creature -> Shape
|
||||
drawSlimeCrit cr = colorSH green
|
||||
$ upperPrismPolyHalf Medium Typical (cr ^?! crType . slimeEngulfProgress + min 15 r) $ polyCirc 6 r
|
||||
& each %~ scaleAlong d s
|
||||
& each %~ scaleAlong (vNormal d) (1 / s)
|
||||
& each %~ rotateV (-cr ^. crDir)
|
||||
& each %~ (((r-cr^?!crType.slimeRadWobble)/r) *^)
|
||||
& each . _x *~ p
|
||||
& each . _y %~ (/p)
|
||||
-- & each %~ scaleAlong d s
|
||||
-- & each %~ scaleAlong (vNormal d) (1 / s)
|
||||
-- & each %~ rotateV (-cr ^. crDir)
|
||||
where
|
||||
r = cr ^?! crType . slimeSlime . to slimeToRad
|
||||
r = slimeToRad $ cr ^?! crType . slimeSlime - cr ^?! crType . slimeSlimeChange
|
||||
p = cr ^?! crType . slimeCompression
|
||||
d = normalize p
|
||||
s = norm p / r
|
||||
-- d = normalize p
|
||||
-- s = norm p / r
|
||||
|
||||
-- assumes d is a unit vector
|
||||
scaleAlong :: Point2 -> Float -> Point2 -> Point2
|
||||
|
||||
@@ -18,4 +18,4 @@ crRad = \case
|
||||
LampCrit {} -> 3
|
||||
SlinkCrit {} -> 10
|
||||
HiveCrit {} -> 20
|
||||
SlimeCrit {_slimeSlime = r,_slimeRadWobble = x} -> slimeToRad r - x
|
||||
SlimeCrit {_slimeSlime = r,_slimeSlimeChange = x} -> slimeToRad (r - x)
|
||||
|
||||
@@ -58,7 +58,8 @@ updateCarriage' cid cr w = \case
|
||||
mp <- mcr ^? crPos
|
||||
d <- mcr ^? crType . slimeCompression
|
||||
r <- mcr ^? crType . slimeSlime . to slimeToRad
|
||||
return $ w & tocr . crPos .~ mp + (p & _xy %~ compressionScale ((1/r) *^ d))
|
||||
--return $ w & tocr . crPos .~ mp + (p & _xy %~ compressionScale ((1/r) *^ d))
|
||||
return $ w & tocr . crPos .~ mp + (p & _x *~ d & _y %~ (/d))
|
||||
where
|
||||
tocr = cWorld . lWorld . creatures . ix cid
|
||||
oop = cr ^. crOldOldPos
|
||||
|
||||
@@ -201,7 +201,8 @@ updateCalmBee cr cid w
|
||||
, Just r <- tcr ^? crType . slimeSlime . to slimeToRad
|
||||
, Just d <- tcr ^? crType . slimeCompression
|
||||
= w
|
||||
& tocr . crStance . carriage .~ Mounted ti (cr ^. crPos - tcr ^. crPos & _xy %~ compressionScale (vNormal ((1/r) *^d)))
|
||||
-- & tocr . crStance . carriage .~ Mounted ti (cr ^. crPos - tcr ^. crPos & _xy %~ compressionScale (vNormal ((1/r) *^d)))
|
||||
& tocr . crStance . carriage .~ Mounted ti (cr ^. crPos - tcr ^. crPos & _x %~ (/d) & _y *~ d)
|
||||
& tocr . crActionPlan . apAction .~ NoAction
|
||||
| Just (tcr,_) <- gettarg = w
|
||||
& tocr . crActionPlan . apAction .~ PathTo (tcr ^. crPos . _xy) NoAction
|
||||
@@ -253,13 +254,8 @@ slimeCritUpdate cid w
|
||||
| r < 5 = w & cWorld . lWorld . creatures . ix cid . crHP .~ CrDestroyed Gibbed
|
||||
| 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 (cr1,cr2) <- splitSlimeCrit hitp hitv cr
|
||||
-- =
|
||||
-- let cid' = IM.newKey $ w ^. cWorld . lWorld . creatures
|
||||
-- in w & cWorld . lWorld . creatures . ix cid .~ cr1
|
||||
-- & cWorld . lWorld . creatures . at cid' ?~ (cr2 & crID .~ cid')
|
||||
, Just w' <- splitSlimeCrit' hitp hitv cid cr w = w'
|
||||
| (cr ^?! crType . slimeIsCompressing) && r > norm p
|
||||
| (cr ^?! crType . slimeIsCompressing) && 1 > p
|
||||
= let (w',g) = runState (setSlimeDir cid (cr & crDamage .~ []) w) (w ^. randGen)
|
||||
in w' & randGen .~ g
|
||||
| otherwise = updateCarriage cid $ w
|
||||
@@ -271,13 +267,14 @@ slimeCritUpdate cid w
|
||||
where
|
||||
tocr = cWorld . lWorld . creatures . ix cid
|
||||
cr = w ^?! cWorld . lWorld . creatures . ix cid
|
||||
v = 0.1 *^ normalize p
|
||||
mvslime = cr & crType . slimeCompression +~ f v
|
||||
-- v = 0.1 *^ normalize p
|
||||
v = 0.1 *^ unitVectorAtAngle (cr ^. crDir)
|
||||
mvslime = cr & crType . slimeCompression +~ f (0.1/r)
|
||||
& crPos . _xy +~ v
|
||||
& crType . slimeIsCompressing %~ f'
|
||||
f | t = negate
|
||||
| otherwise = id
|
||||
f' | norm p > 3*r/2 = const True
|
||||
f' | p > 1.5 = const True
|
||||
| otherwise = id
|
||||
t = cr ^?! crType . slimeIsCompressing
|
||||
r = cr ^?! crType . slimeSlime . to slimeToRad
|
||||
@@ -291,24 +288,20 @@ setSlimeDir cid cr w = do
|
||||
then do
|
||||
x <- randInCirc 1
|
||||
return $ fromMaybe w $ splitSlimeCrit' (x + cxy) (unitVectorAtAngle d) cid cr w
|
||||
-- let (cr1,cr2) = splitSlimeCrit (x + cxy) (unitVectorAtAngle d) cr ^?! _Just
|
||||
-- cid' = IM.newKey $ w ^. cWorld . lWorld . creatures
|
||||
-- return $ w & tocr .~ cr1
|
||||
-- & tocr' cid' ?~ (cr2 & crID .~ cid')
|
||||
else return $ w & tocr . crType . slimeCompression .~ r *^ unitVectorAtAngle d
|
||||
-- else return $ w & tocr . crType . slimeCompression .~ r *^ unitVectorAtAngle d
|
||||
else return $ w & tocr . crDir .~ d
|
||||
& tocr . crType . slimeIsCompressing .~ False
|
||||
where
|
||||
tocr = cWorld . lWorld . creatures . ix cid
|
||||
-- tocr' i = cWorld . lWorld . creatures . at i
|
||||
cxy = cr ^. crPos . _xy
|
||||
r = cr ^?! crType . slimeSlime . to slimeToRad
|
||||
|
||||
|
||||
doSlimeRadChange :: Creature -> Creature
|
||||
doSlimeRadChange = crType . slimeRadWobble %~ f
|
||||
doSlimeRadChange = crType . slimeSlimeChange %~ f
|
||||
where
|
||||
f x | x > 1 = x - 1
|
||||
| x < -1 = x + 1
|
||||
f x | x > 100 = x - 100
|
||||
| x < -100 = x + 100
|
||||
| otherwise = 0
|
||||
|
||||
splitSlimeCrit' :: Point2 -> Point2 -> Int -> Creature -> World -> Maybe World
|
||||
@@ -336,12 +329,14 @@ splitSlimeCrit p v cr = do
|
||||
return (cr' & crPos . _xy .~ mp + (r1 + 0.51) *^ mvdir
|
||||
-- & crType . slimeRad .~ r1
|
||||
& crType . slimeSlime .~ round (r1 ^ (2 :: Int) * 100)
|
||||
& crType . slimeCompression .~ rotateV (argV mvdir) (V2 r1 0)
|
||||
& crType . slimeCompression .~ 1 -- rotateV (argV mvdir) (V2 r1 0)
|
||||
& crType . slimeIsCompressing .~ False
|
||||
& crDir .~ argV mvdir
|
||||
,cr' & crPos . _xy .~ mp - (r2 + 0.51) *^ mvdir
|
||||
-- & crType . slimeRad .~ r2
|
||||
& crType . slimeSlime .~ round (r2^(2::Int) * 100)
|
||||
& crType . slimeCompression .~ rotateV (argV (-mvdir)) (V2 r2 0)
|
||||
& crType . slimeCompression .~ 1 -- rotateV (argV (-mvdir)) (V2 r2 0)
|
||||
& crType . slimeIsCompressing .~ False
|
||||
& crDir .~ argV (-mvdir)
|
||||
& crType . slimeEngulfProgress .~ 0
|
||||
)
|
||||
@@ -349,7 +344,7 @@ splitSlimeCrit p v cr = do
|
||||
cxy = cr ^. crPos . _xy
|
||||
r = cr ^?! crType . slimeSlime . to slimeToRad
|
||||
cr' = cr & crDamage .~ []
|
||||
& crType . slimeRadWobble .~ 0
|
||||
& crType . slimeSlimeChange .~ 0
|
||||
& crType . slimeSplitTimer .~ 10
|
||||
& crType . slimeIsCompressing .~ False
|
||||
|
||||
|
||||
@@ -79,9 +79,10 @@ data CreatureType
|
||||
}
|
||||
| SlimeCrit
|
||||
{ _slimeSlime :: Int -- note multiplied by 100
|
||||
, _slimeRadWobble :: Float
|
||||
, _slimeSlimeChange :: Int
|
||||
-- , _slimeRadWobble :: Float
|
||||
, _slimeSplitTimer :: Int
|
||||
, _slimeCompression :: Point2
|
||||
, _slimeCompression :: Float
|
||||
, _slimeIsCompressing :: Bool
|
||||
, _slimeEngulfProgress :: Float
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ crslime :: Creature -> Int
|
||||
crslime cr = case cr ^. crType of
|
||||
SlimeCrit {_slimeSlime=r} | HP{} <- cr ^. crHP -> r -- r ^ (2::Int)
|
||||
HiveCrit {_hiveSlime=x} -> x
|
||||
BeeCrit {} | CrDestroyed{} <- cr ^. crHP -> 0
|
||||
BeeCrit {_beeSlime=x} -> 400 + x
|
||||
_ -> 0
|
||||
|
||||
|
||||
+10
-6
@@ -1092,9 +1092,11 @@ feedSlime s c w = fromMaybe w $ do
|
||||
& slimeEatSound (s ^. crID) (s ^. crPos . _xy)
|
||||
where
|
||||
f cr = cr -- & crType . slimeRad .~ r
|
||||
& crType . slimeSlime .~ round (r^(2::Int) * 100)
|
||||
& crType . slimeRadWobble +~ r - r1
|
||||
& crType . slimeCompression %~ ((r/r1) *^)
|
||||
-- & crType . slimeSlime .~ round (r^(2::Int) * 100)
|
||||
& crType . slimeSlime +~ round (r2^(2::Int) * 100)
|
||||
& crType . slimeSlimeChange +~ round (r2^(2::Int) * 100)
|
||||
-- & crType . slimeRadWobble +~ r - r1 -- not sure if this is correct
|
||||
-- & crType . slimeCompression %~ ((r/r1) *^)
|
||||
--r1 = s ^?! crType . slimeRad
|
||||
r1 = s ^?! crType . slimeSlime . to slimeToRad
|
||||
r2 = c ^. crType . to crRad
|
||||
@@ -1112,10 +1114,12 @@ fuseSlimes c1 c2 = (cWorld . lWorld . creatures . ix mini .~ c)
|
||||
maxi = max i1 i2
|
||||
i1 = c1 ^. crID
|
||||
i2 = c2 ^. crID
|
||||
c = c' & crType . slimeSlime .~ round (r^(2::Int) * 100)
|
||||
& crType . slimeRadWobble +~ r - max r1 r2
|
||||
& crType . slimeCompression %~ ((r/max r1 r2) *^)
|
||||
c = c' & crType . slimeSlime +~ eslime
|
||||
& crType . slimeSlimeChange +~ eslime
|
||||
-- & crType . slimeRadWobble +~ r - max r1 r2
|
||||
-- & crType . slimeCompression %~ ((r/max r1 r2) *^)
|
||||
& crID .~ mini
|
||||
eslime = min (c1 ^?! crType . slimeSlime) (c2 ^?! crType . slimeSlime)
|
||||
-- r1 = c1 ^?! crType . slimeRad
|
||||
-- r2 = c2 ^?! crType . slimeRad
|
||||
r1 = c1 ^?! crType . slimeSlime . to slimeToRad
|
||||
|
||||
Reference in New Issue
Block a user