diff --git a/src/Dodge/Creature/ChaseCrit.hs b/src/Dodge/Creature/ChaseCrit.hs index 4b6db8117..f66e1c4ca 100644 --- a/src/Dodge/Creature/ChaseCrit.hs +++ b/src/Dodge/Creature/ChaseCrit.hs @@ -44,6 +44,8 @@ crabCrit = defaultCreature , _footForward = LeftForward , _strideAmount = 0 , _dodgeCooldown = 0 + , _lFootPos = 0 + , _rFootPos = 0 } & crFaction .~ ColorFaction red & crPerception . cpVision . viFOV .~ FloatFOV pi diff --git a/src/Dodge/Creature/Impulse.hs b/src/Dodge/Creature/Impulse.hs index 1be661f49..ccfd0ea08 100644 --- a/src/Dodge/Creature/Impulse.hs +++ b/src/Dodge/Creature/Impulse.hs @@ -46,14 +46,14 @@ followImpulse cid w = \case ( crMvAbsolute (w ^. cWorld . lWorld) (10 *.* normalizeV (posFromID cid' -.- cpos)) . (crType . meleeCooldown .~ 20) ) MeleeL cid' -> - hitCrl cid' $ + hitCrd (-pi/2) cid' $ crup -- ( crMvAbsolute (w ^. cWorld . lWorld) (vNormal $ 10 *.* normalizeV (posFromID cid' -.- cpos)) -- . (crType . meleeCooldownL .~ 20) -- ) MeleeR cid' -> - hitCrr cid' $ + hitCrd (pi/2) cid' $ crup --( crMvAbsolute (w ^. cWorld . lWorld) (vNormal $ (-10) *.* normalizeV (posFromID cid' -.- cpos)) . (crType . meleeCooldownR .~ 20) @@ -87,13 +87,8 @@ followImpulse cid w = \case hitCr i = cWorld . lWorld . creatures . ix i . crDamage .:~ Blunt 100 (posFromID i) (posFromID i - cpos) - hitCrl i = + hitCrd a i = cWorld . lWorld . creatures . ix i . crDamage <>~ [Blunt 100 (posFromID i) (posFromID i - cpos) - , Inertial 0 (posFromID i) (50 * unitVectorAtAngle (cr ^. crDir - pi/2)) - ] - hitCrr i = - cWorld . lWorld . creatures . ix i . crDamage - <>~ [Blunt 100 (posFromID i) (posFromID i - cpos) - , Inertial 0 (posFromID i) (50 * unitVectorAtAngle (cr ^. crDir + pi/2)) + , Inertial 0 (posFromID i) (50 * unitVectorAtAngle (cr ^. crDir + a)) ] diff --git a/src/Dodge/Creature/Picture.hs b/src/Dodge/Creature/Picture.hs index 4e00341be..47a048cf9 100644 --- a/src/Dodge/Creature/Picture.hs +++ b/src/Dodge/Creature/Picture.hs @@ -160,17 +160,30 @@ feet cr = case (cr ^? crType . strideAmount,cr ^? crType . footForward) of crabFeet :: Creature -> Shape {-# INLINE crabFeet #-} -crabFeet cr = case (cr ^? crType . strideAmount,cr ^? crType . footForward) of - (Just sa,Just LeftForward) -> sh (f sa) - (Just sa,Just RightForward) -> sh (-f sa) - _ -> sh 0 +crabFeet cr = + uncurryV translateSHxy rpos afoot + <> uncurryV translateSHxy (f (V2 0 10) rpos) afoot + <> uncurryV translateSHxy lpos afoot + <> uncurryV translateSHxy (f (V2 0 (-10)) lpos) afoot +-- <> uncurryV translateSHxy (rotateV cdir $ cr ^?! crType . lFootPos - cxy) afoot +-- <> uncurryV translateSHxy (rotateV cdir $ cxy - cr ^?! crType . lFootPos) afoot +-- case (cr ^? crType . strideAmount,cr ^? crType . footForward) of +-- (Just sa,Just LeftForward) -> sh (f sa) +-- (Just sa,Just RightForward) -> sh (-f sa) +-- _ -> sh 0 where - sh x = translateSHxy x off aFoot <> translateSHxy (- x) (- off) aFoot - aFoot = upperPrismPolyST 10 $ polyCirc 3 2 + 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 +-- sh x = translateSHxy x off aFoot <> translateSHxy (- x) (- off) aFoot + afoot = upperPrismPolyST 10 $ polyCirc 3 2 off = 10 sLen = strideLength cr -- f i = 8 * (sLen - 2*i) / sLen - f i = 8 * oneSmooth ((sLen - 2*i) / sLen) +-- f i = 8 * oneSmooth ((sLen - 2*i) / sLen) deadFeet :: Creature -> Shape {-# INLINE deadFeet #-} diff --git a/src/Dodge/Data/Creature/Misc.hs b/src/Dodge/Data/Creature/Misc.hs index 2dd6c5e2a..9a1173399 100644 --- a/src/Dodge/Data/Creature/Misc.hs +++ b/src/Dodge/Data/Creature/Misc.hs @@ -64,6 +64,8 @@ data CreatureType , _footForward :: FootForward , _strideAmount :: Float , _dodgeCooldown :: Int + , _lFootPos :: Point2 + , _rFootPos :: Point2 } | HoverCrit {_meleeCooldown :: Int} | SwarmCrit diff --git a/src/Dodge/Room/Tutorial.hs b/src/Dodge/Room/Tutorial.hs index ad41b06b2..60da2bdd0 100644 --- a/src/Dodge/Room/Tutorial.hs +++ b/src/Dodge/Room/Tutorial.hs @@ -57,8 +57,8 @@ tutAnoTree = do foldMTRS [ tToBTree "TutStartRez" . return . cleatOnward <$> tutRezBox , corDoor - , chasmSpitTerminal - , corDoor +-- , chasmSpitTerminal +-- , corDoor , loadAmmoTut , corDoor , chasmSpitTerminal diff --git a/src/Dodge/TestString.hs b/src/Dodge/TestString.hs index 7471c6b68..2b8ddc36c 100644 --- a/src/Dodge/TestString.hs +++ b/src/Dodge/TestString.hs @@ -41,8 +41,9 @@ tocrs :: (IM.IntMap Creature tocrs = uvWorld . cWorld . lWorld . creatures testStringInit :: Universe -> [String] -testStringInit u = u ^.. tocrs . ix 1 . crActionPlan . apStrategy . to show - <> u ^.. tocrs . ix 1 . crActionPlan . apAction . to show +testStringInit u = u ^.. tocrs . ix 3 . crPos . _xy . to show + <> u ^.. tocrs . ix 3 . crType . lFootPos . to show + <> u ^.. tocrs . ix 3 . crType . rFootPos . to show -- where -- tocr = uvWorld . cWorld . lWorld . creatures . ix 0 -- f = fromMaybe 0 diff --git a/src/Dodge/Update.hs b/src/Dodge/Update.hs index 66c3e3241..d3359b6ea 100644 --- a/src/Dodge/Update.hs +++ b/src/Dodge/Update.hs @@ -375,9 +375,17 @@ updateCreatureStrides = cWorld . lWorld . creatures . each %~ updateCreatureStri updateCreatureStride :: Creature -> Creature updateCreatureStride cr - | Walking <- cr ^. crStance . carriage = cr & crType . strideAmount +~ d + | Walking <- cr ^. crStance . carriage + , CrabCrit {} <- cr ^. crType + = cr & crType . lFootPos %~ f (g 10) + & crType . rFootPos %~ f (g (-10)) + | Walking <- cr ^. crStance . carriage + , isJust $ cr ^? crType . strideAmount = cr & crType . strideAmount +~ d | otherwise = cr where + f p q | distance p q > 10 = p - 9 *^ signorm (q - p) + | otherwise = q + g x = cr ^. crPos . _xy + x *^ vNormal (unitVectorAtAngle (cr ^. crDir)) s = 2 * fromMaybe 1 (crMvType cr ^? mvSpeed) -- d = min s . norm $ cr ^. crPos - cr ^. crOldPos d = max 0 . min s $ dotV (cr ^. crPos . _xy - cr ^. crOldPos . _xy) (unitVectorAtAngle (cr ^. crMvDir))