Tweak slime wall collisions, all creatures cliff collisions (min 10)

This commit is contained in:
2026-05-02 19:46:12 +01:00
parent b7aea0eb1f
commit b827827951
6 changed files with 29 additions and 12 deletions
+7 -2
View File
@@ -87,7 +87,7 @@ walkCliffPush :: Creature -> [(Point2,Point2)] -> Point2
walkCliffPush cr xs = pushAgainst (cr ^. crOldPos . _xy - cr ^. crOldOldPos . _xy) (-h xs)
where
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 cr xs = x *^ circSegsInside cxy r xs
@@ -138,9 +138,14 @@ chasmTestCliffPush f' cr w
where
cxy = cr ^. crPos . _xy
tocr = cWorld . lWorld . creatures . ix (_crID cr)
g = uncurry $ crOnSeg cr
--g = uncurry $ crOnSeg cr
g = uncurry $ crOnSeg' cr
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 cr v w
| t = rotateTo8 (argV v) w
+1
View File
@@ -108,6 +108,7 @@ data DebugBool
| Show_writable_values
| Show_mouse_click_pos
| Muzzle_positions
| Show_cr_hitboxes
deriving (Eq, Ord, Bounded, Enum, Show)
data ResFactor = DoubleRes | FullRes | HalfRes | QuarterRes | EighthRes | SixteenthRes
+9
View File
@@ -2,6 +2,7 @@
module Dodge.Debug (debugEvents, drawDebug) where
import Dodge.Creature.Radius
import Geometry.Data
import Dodge.Render.Label
import Dodge.HeldUse
@@ -81,6 +82,7 @@ debugEvent' = \case
Debug_get -> id
Debug_put -> id
Muzzle_positions -> id
Show_cr_hitboxes -> id
debugItem :: DebugBool -> Universe -> Maybe [DebugItem]
debugItem = \case
@@ -117,6 +119,7 @@ debugItem = \case
Debug_get -> doDebugGet
Debug_put -> debugPutItems
Muzzle_positions -> mempty
Show_cr_hitboxes -> mempty
debugGet :: Universe -> [String]
debugGet u = foldMap getPretty $ u ^. uvWorld . cWorld . lWorld . shockwaves
@@ -287,7 +290,13 @@ drawDebug u = \case
Show_writable_values -> mempty
Show_mouse_click_pos -> mempty
Muzzle_positions -> showMuzzlePositions u
Show_cr_hitboxes -> foldMap drawCreatureRad (u ^. uvWorld . cWorld . lWorld . creatures)
drawCreatureRad :: Creature -> Picture
drawCreatureRad cr = setLayer DebugLayer
. translate3 (cr ^. crPos)
. color orange
$ circle (crRad (cr ^. crType))
showMuzzlePositions :: Universe -> Picture
showMuzzlePositions u = fold $ do
+3 -1
View File
@@ -377,7 +377,9 @@ chasmSpitTerminal = do
return $
tToBTree "chasmTerm" $
Node
(addDoorToggleTerminal' i1 (PS 150 0) y')
(addDoorToggleTerminal' i1 (PS 150 0) y'
& rmPmnts .:~ (sps0 (PutCrit slimeCrit) & plSpot . psPos .~ V2 150 100)
)
[ treePost [triggerDoorRoom i1, deadEndPSType cr]
, treePost [triggerDoorRoom i1, deadEndPSType cr]
, return $ cleatOnward $ triggerDoorRoom i1
+5 -3
View File
@@ -283,7 +283,7 @@ functionalUpdate =
. over uvWorld updateDistortions
. over uvWorld updateCreatureSoundPositions
. over uvWorld updateCreatureStrides
. over uvWorld pushYouOutFromWalls
. pushYouOutFromWalls
. colCrsWalls
. over uvWorld simpleCrSprings
. over uvWorld updateDoors
@@ -342,8 +342,10 @@ functionalUpdate =
. updateAimPos
. over uvWorld updatePastWorlds -- it might be possible to do this without storing stuff such as the temporary lights/flares etc
pushYouOutFromWalls :: World -> World
pushYouOutFromWalls w = w & cWorld . lWorld . creatures . ix 0 %~ muzzleWallCheck w
pushYouOutFromWalls :: Universe -> Universe
pushYouOutFromWalls u
| debugOn Noclip (u ^. uvConfig) = u
| otherwise = u & uvWorld . cWorld . lWorld . creatures . ix 0 %~ muzzleWallCheck (u ^. uvWorld)
-- rotate creature as well? behaviour on ledges?
muzzleWallCheck :: World -> Creature -> Creature
+4 -6
View File
@@ -30,7 +30,8 @@ colCrWall w c = cornpush . wallpush $ pushthrough c
cornpush = crPos . _xy %~ pushOutFromCorners r ls'
wallpush = pushCr (w ^. cWorld . lWorld) wls
pushthrough = crPos . _xy %~ fst . flip (collidePoint p1) wls -- check push throughs
r = crRad (c ^. crType) + wallBuffer
r | SlimeCrit {} <- c ^. crType = min 10 . crRad $ c ^. crType
| otherwise = crRad $ c ^. crType
p1 = c ^. crOldPos . _xy
p2 = c ^. crPos . _xy
ls = _wlLine <$> IM.elems wls
@@ -60,7 +61,8 @@ pushCr w wls cr
ap = cr ^. crOldPos . _xy
-- sp = cr ^. crPos . _xy
ecr = foldl' f (cr & crWallTouch .~ mempty) wls
r = crRad (cr ^. crType)
r | SlimeCrit {} <- cr ^. crType = min 10 . crRad $ cr ^. crType
| otherwise = crRad $ cr ^. crType
f acr wl = case pushOutFromWall' r (acr ^. crPos . _xy) (wl ^. wlLine) of
Just (p,hitp) -> acr & crPos . _xy .~ p & crWallTouch . at (wl ^. wlID) ?~ hitp
Nothing -> acr
@@ -95,10 +97,6 @@ wlWlCrush' w p w1 w2 = (t w1 w2 || t w2 w1) -- test either wall is moving toward
(wallMovement w p x - wallMovement w p y) > 0
f = normalizeV . uncurry (-) . (^. wlLine)
-- the amount to push creatures out from walls, extra to their radius
wallBuffer :: Float
wallBuffer = 0
---- assumes that the wall is orientated
---- assumes wall points are different
--pushOutFromWall :: Float -> Point2 -> (Point2, Point2) -> Maybe Point2