diff --git a/src/Dodge/Block/Debris.hs b/src/Dodge/Block/Debris.hs index 4d72b736f..47de46bd3 100644 --- a/src/Dodge/Block/Debris.hs +++ b/src/Dodge/Block/Debris.hs @@ -88,7 +88,7 @@ makeDebrisDirectedZ arcrad dir z dt bm p w = { _dbPos = p `v2z` z , _dbType = dt , _dbVel = v `v2z` 0 - , _dbRot = Q.qID + , _dbRot = Q.qid , _dbSpin = Q.axisAngle (vNormal v `v2z` 0) spinspeed } @@ -109,7 +109,7 @@ makeDebrisDirected arcrad dir dt bm p w = { _dbPos = p `v2z` h , _dbType = dt , _dbVel = v `v2z` 0 - , _dbRot = Q.qID + , _dbRot = Q.qid , _dbSpin = Q.axisAngle (vNormal v `v2z` 0) spinspeed } @@ -118,7 +118,7 @@ makeDebrisDirected arcrad dir dt bm p w = -- & prPos .~ p -- & prVel .~ v -- & prQuatSpin .~ Q.axisAngle (vNormal v `v2z` 0) spinspeed --- & prQuat .~ Q.qID +-- & prQuat .~ Q.qid -- & prVelZ .~ 0 -- & prPosZ .~ h diff --git a/src/Dodge/Creature/HandPos.hs b/src/Dodge/Creature/HandPos.hs index 5aa1555bf..6b381c079 100644 --- a/src/Dodge/Creature/HandPos.hs +++ b/src/Dodge/Creature/HandPos.hs @@ -27,7 +27,7 @@ import qualified Quaternion as Q import ShapePicture translateToES :: Creature -> EquipSite -> Point3 -> Point3 -translateToES cr es p = fst (equipSitePQ es cr `Q.comp` (p, Q.qID)) +translateToES cr es p = fst (equipSitePQ es cr `Q.comp` (p, Q.qid)) equipSitePQ :: EquipSite -> Creature -> Point3Q equipSitePQ = \case @@ -40,7 +40,7 @@ equipSitePQ = \case OnRightLeg -> legPQ RightForward translatePointToRightHand :: Creature -> Point3 -> Point3 -translatePointToRightHand cr p = fst (rightHandPQ cr `Q.comp` (p, Q.qID)) +translatePointToRightHand cr p = fst (rightHandPQ cr `Q.comp` (p, Q.qid)) handWalkingPos :: FootForward -> Float -> Creature -> Point3 handWalkingPos b off cr = case cr ^. crStance . carriage of @@ -65,15 +65,15 @@ zeroOneSmooth x = (1 - cos (pi * x)) / 2 rightHandPQ :: Creature -> Point3Q rightHandPQ cr - | oneH cr = (V3 11 (-3) 20, Q.qID) + | oneH 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) - | twoFlat cr = (V3 8 (-8) 12, Q.qID) + | twoFlat cr = (V3 8 (-8) 12, Q.qid) | Just TwoHandTwist <- cr ^? crManipulation . manObject . imAimStance - = (V3 6 (-6) 10, Q.qID) + = (V3 6 (-6) 10, Q.qid) | Just TwoHandFlat <- cr ^? crManipulation . manObject . imAimStance - = (V3 (8 - twoHandOffY cr) (-8) 12, Q.qID) - | Just p <- crRightHandWall cr = (20 & _xy .~ p, Q.qID) - | otherwise = (handWalkingPos LeftForward (-8) cr, Q.qID) + = (V3 (8 - twoHandOffY cr) (-8) 12, Q.qid) + | Just p <- crRightHandWall cr = (20 & _xy .~ p, Q.qid) + | otherwise = (handWalkingPos LeftForward (-8) cr, Q.qid) crRightHandWall :: Creature -> Maybe Point2 crRightHandWall cr = do @@ -115,19 +115,19 @@ translateToRightHand :: Creature -> SPic -> SPic translateToRightHand = overPosSP . translatePointToRightHand rightWristPQ :: Creature -> Point3Q -rightWristPQ cr = rightHandPQ cr `Q.comp` (V3 0 (-4) (-4), Q.qID) +rightWristPQ cr = rightHandPQ cr `Q.comp` (V3 0 (-4) (-4), Q.qid) leftHandPQ :: Creature -> Point3Q leftHandPQ cr | twists 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 cr = (V3 8 8 12, Q.qid) | Just TwoHandTwist <- cr ^? crManipulation . manObject . imAimStance - = (V3 (10 + twoHandOffY cr) 6 20, Q.qID) + = (V3 (10 + twoHandOffY cr) 6 20, Q.qid) | Just TwoHandFlat <- cr ^? crManipulation . manObject . imAimStance - = (V3 (8 + twoHandOffY cr) 6 12, Q.qID) - | Just p <- crLeftHandWall cr = (20 & _xy .~ p, Q.qID) + = (V3 (8 + twoHandOffY cr) 6 12, Q.qid) + | Just p <- crLeftHandWall cr = (20 & _xy .~ p, Q.qid) | oneH 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 cr = zeroOneSmooth $ case cr ^. crStance . carriage of @@ -146,16 +146,16 @@ twoHandOffY cr = zeroOneSmooth $ case cr ^. crStance . carriage of _ -> 0 translatePointToLeftHand :: Creature -> Point3 -> Point3 -translatePointToLeftHand cr p = fst (leftHandPQ cr `Q.comp` (p, Q.qID)) +translatePointToLeftHand cr p = fst (leftHandPQ cr `Q.comp` (p, Q.qid)) translateToLeftHand :: Creature -> SPic -> SPic translateToLeftHand = overPosSP . translatePointToLeftHand leftWristPQ :: Creature -> Point3Q -leftWristPQ cr = leftHandPQ cr `Q.comp` (V3 0 4 (-4), Q.qID) +leftWristPQ cr = leftHandPQ cr `Q.comp` (V3 0 4 (-4), Q.qid) 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))) legPQ :: FootForward -> Creature -> Point3Q legPQ ff = case ff of @@ -166,7 +166,7 @@ legPQ' :: (Float -> Float) -> Creature -> Point3Q legPQ' g cr = Q.comp (0, Q.qz (_crMvDir cr - _crDir cr)) - (V3 x (g off) 0, Q.qID) + (V3 x (g off) 0, Q.qid) where x = case cr ^? crStance . carriage of Just (Walking sa LeftForward) -> -f sa @@ -179,13 +179,13 @@ legPQ' g cr = f i = g 8 * (sLen - i) / sLen 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 cr | twists 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)) - | otherwise = (V3 2.5 0 20, Q.qID) + | otherwise = (V3 2.5 0 20, Q.qid) chestPQ :: Creature -> Point3Q chestPQ cr = backPQ cr `Q.comp` (0, Q.qz pi) diff --git a/src/Dodge/Creature/MoveType.hs b/src/Dodge/Creature/MoveType.hs index 7704250a9..0623ef732 100644 --- a/src/Dodge/Creature/MoveType.hs +++ b/src/Dodge/Creature/MoveType.hs @@ -26,6 +26,6 @@ defaultChaseMvType = CrMvType { _mvSpeed = 2 , _mvTurnRad = FloatAbsCheckGreaterLess (pi / 4) 0.2 0.05 - , _mvTurnJit = 0.2 + , _mvTurnJit = 0.05 , _mvAimSpeed = FloatAbsCheckGreaterLess (pi / 8) 0.2 0.01 } diff --git a/src/Dodge/Creature/Picture.hs b/src/Dodge/Creature/Picture.hs index c2b718ef9..1e12740e4 100644 --- a/src/Dodge/Creature/Picture.hs +++ b/src/Dodge/Creature/Picture.hs @@ -10,6 +10,7 @@ module Dodge.Creature.Picture ( drawChaseCrit, ) where +import Linear import Dodge.Data.Equipment.Misc import Dodge.Creature.HandPos import qualified Data.IntMap.Strict as IM @@ -50,12 +51,33 @@ basicCrShape cr rotmdir = rotateSH (_crMvDir cr - _crDir cr) drawChaseCrit :: Creature -> Shape -drawChaseCrit cr = rotmdir $ colorSH (_skinLower cskin) $ feet cr +drawChaseCrit cr = mconcat + [ chaseUpperBody cr + , rotmdir $ colorSH (_skinLower cskin) $ feet cr + ] where cskin = crShape $ _crType cr crsize = 0.1 * crRad (cr ^. crType) rotmdir = rotateSH (_crMvDir cr - _crDir cr) +chaseUpperBody :: Creature -> Shape +chaseUpperBody cr = colorSH (_skinUpper cskin) + (overPosSH (Q.apply torsoq) (upperPrismPolyHalfMI tz $ polyCirc 3 12 + & each %~ vNormal + & each . _y *~ 0.6) + <> 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])) + where + tz = 4 + cskin = crShape $ _crType cr + torsoq = (V3 0 0 (10 + tz),Q.qid) + mcool = 1 - min 10 (fromIntegral . _meleeCooldown $ _crType cr) / 10 + neckq = torsoq `Q.comp` (V3 6 0 0,Q.axisAngle (V3 0 1 0) (-1.8*mcool)) + headq = neckq `Q.comp` (V3 16 0 0, Q.axisAngle (V3 0 1 0) (2*mcool)) + + oneSmooth :: Float -> Float oneSmooth x = sin (pi * x * 0.5) diff --git a/src/Dodge/Creature/State.hs b/src/Dodge/Creature/State.hs index ad4f9b299..41bf33a56 100644 --- a/src/Dodge/Creature/State.hs +++ b/src/Dodge/Creature/State.hs @@ -224,7 +224,7 @@ shineTargetLaser cr loc w = fromMaybe (w & pointittarg . itTgPos .~ Nothing) $ d where o = locOrient loc cr 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 isammolink AmmoMagSF{} = True isammolink _ = False diff --git a/src/Dodge/Data/Creature/Misc.hs b/src/Dodge/Data/Creature/Misc.hs index a8f463f78..0ba63f91f 100644 --- a/src/Dodge/Data/Creature/Misc.hs +++ b/src/Dodge/Data/Creature/Misc.hs @@ -96,6 +96,7 @@ makeLenses ''BarrelType makeLenses ''Vocalization makeLenses ''CrMvType makeLenses ''CreatureType +makeLenses ''CreatureShape deriveJSON defaultOptions ''Pulse --deriveJSON defaultOptions ''CreatureStatistics diff --git a/src/Dodge/Item/Draw.hs b/src/Dodge/Item/Draw.hs index 0ddfdc4f5..85c5e6b9e 100644 --- a/src/Dodge/Item/Draw.hs +++ b/src/Dodge/Item/Draw.hs @@ -21,7 +21,7 @@ itemEquipPict cr itmtree , Just attachpos <- equipAttachPos <$> itm ^? itType . ibtEquip = equipPosition esite cr attachpos (itemSPic itm) | itm ^? itLocation . ilInvID == cr ^? crManipulation . manObject . imRootSelectedItem = - overPosSP (Q.prePos $ handHandleOrient loc cr) (itemTreeSPic itmtree) + overPosSP (Q.apply $ handHandleOrient loc cr) (itemTreeSPic itmtree) | otherwise = mempty where itm = itmtree ^. dtValue . _1 @@ -29,13 +29,13 @@ itemEquipPict cr itmtree equipAttachPos :: EquipItemType -> Point3Q equipAttachPos = \case - BATTERYPACK -> (V3 (-8) 0 10, Q.qID) - FUELPACK -> (V3 (-9) 0 10, Q.qID) - BULLETBELTPACK -> (V3 (-9) 0 10, Q.qID) - BULLETBELTBRACER -> (V3 (-9) 0 10, Q.qID) - _ -> (0, Q.qID) + BATTERYPACK -> (V3 (-8) 0 10, Q.qid) + FUELPACK -> (V3 (-9) 0 10, Q.qid) + BULLETBELTPACK -> (V3 (-9) 0 10, Q.qid) + BULLETBELTBRACER -> (V3 (-9) 0 10, Q.qid) + _ -> (0, Q.qid) equipPosition :: EquipSite -> Creature -> Point3Q -> SPic -> SPic equipPosition es cr q = overPosSP - (\x -> fst $ equipSitePQ es cr `Q.comp` q `Q.comp` (x, Q.qID)) + (\x -> fst $ equipSitePQ es cr `Q.comp` q `Q.comp` (x, Q.qid)) diff --git a/src/Dodge/Item/HeldOffset.hs b/src/Dodge/Item/HeldOffset.hs index 4ce800b50..0e43dbe16 100644 --- a/src/Dodge/Item/HeldOffset.hs +++ b/src/Dodge/Item/HeldOffset.hs @@ -31,18 +31,18 @@ transToHandle itm = (-.-.- (0 & _xy .~ handlePos itm)) handleOrient :: LocationDT CItem -> Point3Q handleOrient loc = case loc ^. locDT . dtValue . _1 . itType of - HELD FLAMETHROWER -> (V3 (-1) 0 0, Q.qID) - _ -> (V3 (-3) 0 0, Q.qID) + HELD FLAMETHROWER -> (V3 (-1) 0 0, Q.qid) + _ -> (V3 (-3) 0 0, Q.qid) ---- note this is relative to the creature ---- the aimstance here should match any aimstance in Aiming --handOrient :: Creature -> AimStance -> Point3Q --handOrient cr = case cr ^. crStance . posture of -- Aiming {} -> \case --- TwoHandUnder -> (V3 (-3) 0 shoulderHeight, Q.qID) --- TwoHandOver -> (V3 0 0 shoulderHeight, Q.qID) --- OneHand -> (V3 13 (-2) shoulderHeight, Q.qID) --- TwoHandFlat -> (V3 13 0 shoulderHeight, Q.qID) +-- TwoHandUnder -> (V3 (-3) 0 shoulderHeight, Q.qid) +-- TwoHandOver -> (V3 0 0 shoulderHeight, Q.qid) +-- OneHand -> (V3 13 (-2) shoulderHeight, Q.qid) +-- TwoHandFlat -> (V3 13 0 shoulderHeight, Q.qid) -- AtEase -> \case -- OneHand -> rightHandPQ cr -- TwoHandFlat -> (V3 10 0 15, Q.axisAngle (V3 0 0 1) $ twoFlatHRot cr) diff --git a/src/Dodge/Item/Orientation.hs b/src/Dodge/Item/Orientation.hs index d834b2c02..257cdd479 100644 --- a/src/Dodge/Item/Orientation.hs +++ b/src/Dodge/Item/Orientation.hs @@ -18,31 +18,31 @@ import qualified Quaternion as Q orientChild :: Item -> Point3Q orientChild itm = case _itType itm of - --HELD LED -> (V3 0 5 0, Q.qID) - HELD LED -> (V3 (-x) 0 0, Q.qID) - AMMOMAG BATTERY -> (V3 0 0 1, Q.qID) - AMMOMAG {} -> (V3 0 (2-itemShapeMax _y itm) 0, Q.qID) - --HELD LASER -> (V3 15 (-5) 0, Q.qID) - LASER -> (V3 15 (-5) 0, Q.qID) + --HELD LED -> (V3 0 5 0, Q.qid) + HELD LED -> (V3 (-x) 0 0, Q.qid) + AMMOMAG BATTERY -> (V3 0 0 1, Q.qid) + AMMOMAG {} -> (V3 0 (2-itemShapeMax _y itm) 0, Q.qid) + --HELD LASER -> (V3 15 (-5) 0, Q.qid) + LASER -> (V3 15 (-5) 0, Q.qid) ATTACH UNDERBARRELSLOT -> (V3 10 (-8) 0, r) - _ -> (0, Q.qID) + _ -> (0, Q.qid) where --r = Q.axisAngle (V3 0 0 1) (-pi/4) - r = Q.qID + r = Q.qid -- y = itemShapeMin _y itm x = itemShapeMaxX itm orientByParentChSF :: Item -> ItemSF -> Point3Q orientByParentChSF itm lt = case (_itType itm, lt) of - (HELD FLAMETHROWER, AmmoMagSF{}) -> (V3 4 (-6) 0, Q.qID) + (HELD FLAMETHROWER, AmmoMagSF{}) -> (V3 4 (-6) 0, Q.qid) (HELD (VOLLEYGUN n), AmmoMagSF i _) -> (V3 2 (2.5 + fromIntegral i * 5 - (0.5 * 5 * fromIntegral n)) 3, Q.qz (pi/2)) (HELD ALTERIFLE, AmmoMagSF i _) -> alteRifleAmmoOrient itm i - (HELD _, AmmoMagSF{_amsfType = ElectricalAmmo}) -> (V3 0 0 z, Q.qID) - (HELD _, AmmoMagSF{}) -> (V3 7 (itemShapeMin _y itm) 0, Q.qID) - (HELD _, WeaponScopeSF) -> (V3 5 0 5, Q.qID) - (HELD _, TorchSF) -> (V3 x y 0, Q.qID) - _ -> (0, Q.qID) + (HELD _, AmmoMagSF{_amsfType = ElectricalAmmo}) -> (V3 0 0 z, Q.qid) + (HELD _, AmmoMagSF{}) -> (V3 7 (itemShapeMin _y itm) 0, Q.qid) + (HELD _, WeaponScopeSF) -> (V3 5 0 5, Q.qid) + (HELD _, TorchSF) -> (V3 x y 0, Q.qid) + _ -> (0, Q.qid) where x = itemShapeMaxX itm y = itemShapeMaxY itm @@ -50,7 +50,7 @@ orientByParentChSF itm lt = case (_itType itm, lt) of alteRifleAmmoOrient :: Item -> Int -> Point3Q alteRifleAmmoOrient itm = \case - 1 -> (V3 18 (itemShapeMin _y itm + s + 1) 0, Q.qID) + 1 -> (V3 18 (itemShapeMin _y itm + s + 1) 0, Q.qid) _ -> (V3 18 (itemShapeMax _y itm + s - 1) 0, Q.qz pi) where s | itm ^? itParams . alteRifleSwitch == Just 0 = 1 @@ -79,9 +79,9 @@ itemShapeMin g = f . (^. _1) . itemSPic orientAttachment :: Item -> CItem -> Point3Q orientAttachment par (ch,chsf) = case (_itType par, chsf) of - (ATTACH UNDERBARRELSLOT, _) -> (V3 (-5) (-8) 0, Q.qID) - (_,LaserWeaponXSF {}) -> (V3 2 8 0, Q.qID) --- (_,TorchSF) -> (V3 2 8 0, Q.qID) + (ATTACH UNDERBARRELSLOT, _) -> (V3 (-5) (-8) 0, Q.qid) + (_,LaserWeaponXSF {}) -> (V3 2 8 0, Q.qid) +-- (_,TorchSF) -> (V3 2 8 0, Q.qid) -- (HELD BURSTRIFLE, _, HELD TORCH) -> (V3 20 0 0, Q.axisAngle (V3 0 0 1) (pi/2)) -- (HELD LAUNCHER, _, HELD TORCH) -> (V3 0 20 0, Q.axisAngle (V3 0 0 1) (pi/4)) _ -> (t1 + Q.rotate q1 t2, q1 * q2) @@ -92,5 +92,5 @@ orientAttachment par (ch,chsf) = case (_itType par, chsf) of propagateOrientation :: DTree CItem -> DTree OItem propagateOrientation = dtStartPropagate g f where - g (x,y) = (x,y,(V3 0 0 0,Q.qID)) + g (x,y) = (x,y,(V3 0 0 0,Q.qid)) f (x,_,pq) (y,y1) = (y,y1,Q.comp pq $ orientAttachment x (y,y1)) diff --git a/src/Quaternion.hs b/src/Quaternion.hs index 73567bb91..0a8aa4ba4 100644 --- a/src/Quaternion.hs +++ b/src/Quaternion.hs @@ -6,7 +6,7 @@ WARNING: orphan instances concerning Aeson classes and Linear.Quaternion datatyp The warnings have been disabled. -} module Quaternion ( - qID, + qid, qz, qToV3, qToV2, @@ -14,7 +14,7 @@ module Quaternion ( rotateToZ, vToQuat, comp, - prePos, + apply, module Linear.Quaternion, qNoRoll, ) where @@ -69,14 +69,14 @@ qToV2 = (\(V3 x y _) -> V2 x y) . qToV3 qToAng :: Quaternion Float -> Float qToAng = argV . qToV2 -qID :: Q.Quaternion Float -qID = Q.axisAngle (V3 1 0 0) 0 +qid :: Q.Quaternion Float +qid = Q.axisAngle (V3 1 0 0) 0 comp :: Point3Q -> Point3Q -> Point3Q comp (p,q) (p1,q1) = (p + Q.rotate q p1, q * q1) -prePos :: Point3Q -> Point3 -> Point3 -prePos (p,q) p1 = p + Q.rotate q p1 +apply :: Point3Q -> Point3 -> Point3 +apply (p,q) p1 = p + Q.rotate q p1 qz :: Float -> Q.Quaternion Float qz = Q.axisAngle (V3 0 0 1) diff --git a/tags b/tags index 2d5b300f3..7613a5f28 100644 --- a/tags +++ b/tags @@ -2576,7 +2576,7 @@ advanceScrollAmount src/Dodge/Update.hs 479;" f advanceSmoothScroll src/Dodge/SmoothScroll.hs 33;" f aimDelaySweep src/Dodge/Render/Picture.hs 285;" f aimStanceInfo src/Dodge/Item/Info.hs 243;" f -aimTurn src/Dodge/Creature/YourControl.hs 161;" f +aimTurn src/Dodge/Creature/YourControl.hs 157;" f airlock src/Dodge/Room/Airlock.hs 28;" f airlock0 src/Dodge/Room/Airlock.hs 78;" f airlock90 src/Dodge/Room/Airlock.hs 201;" f @@ -2602,6 +2602,7 @@ angleVV3 src/Geometry/Vector3D.hs 122;" f angleVVTests test/Spec.hs 67;" f anyUnusedSpot src/Dodge/PlacementSpot.hs 68;" f anythingHitCirc src/Dodge/Base/Collide.hs 335;" f +apply src/Quaternion.hs 78;" f applyCME src/Dodge/HeldUse.hs 397;" f applyClip src/Dodge/Debug.hs 176;" f applyCreatureDamage src/Dodge/Creature/Damage.hs 14;" f @@ -2641,7 +2642,7 @@ argV src/Geometry/Vector.hs 83;" f armourChaseCrit src/Dodge/Creature/ArmourChase.hs 34;" f armouredChasers src/Dodge/Room/Boss.hs 58;" f armouredCorridor src/Dodge/Room/RoadBlock.hs 20;" f -arms src/Dodge/Creature/Picture.hs 69;" f +arms src/Dodge/Creature/Picture.hs 100;" f arrow src/Picture/Composite.hs 19;" f arrowPath src/Picture/Composite.hs 8;" f assignHotkey src/Dodge/AssignHotkey.hs 9;" f @@ -2684,7 +2685,7 @@ bangS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 827;" f bangStick src/Dodge/Item/Held/Stick.hs 15;" f barPP src/Dodge/Room/Foreground.hs 231;" f barrel src/Dodge/Creature/Inanimate.hs 17;" f -barrelShape src/Dodge/Render/ShapePicture.hs 120;" f +barrelShape src/Dodge/Render/ShapePicture.hs 121;" f baseAMRShape src/Dodge/Item/Draw/SPic.hs 410;" f baseBlockPane src/Dodge/Placement/Instance/Wall.hs 76;" f baseCI src/Dodge/Item/Grammar.hs 165;" f @@ -2693,14 +2694,14 @@ baseItemTriggerType src/Dodge/BaseTriggerType.hs 21;" f baseRifleShape src/Dodge/Item/Draw/SPic.hs 324;" f baseRodShape src/Dodge/Item/Draw/SPic.hs 407;" f baseSMGShape src/Dodge/Item/Draw/SPic.hs 395;" f -baseShoulder src/Dodge/Creature/Picture.hs 107;" f +baseShoulder src/Dodge/Creature/Picture.hs 138;" f baseStickShape src/Dodge/Item/Draw/SPic.hs 301;" f baseStickShapeX src/Dodge/Item/Draw/SPic.hs 293;" f baseStickSpread src/Dodge/HeldUse.hs 346;" f basicAttentionUpdate src/Dodge/Creature/Perception.hs 127;" f basicAwarenessUpdate src/Dodge/Creature/Perception.hs 39;" f -basicCrPict src/Dodge/Creature/Picture.hs 30;" f -basicCrShape src/Dodge/Creature/Picture.hs 36;" f +basicCrPict src/Dodge/Creature/Picture.hs 32;" f +basicCrShape src/Dodge/Creature/Picture.hs 38;" f basicItemDisplay src/Dodge/Item/Display.hs 23;" f basicMachineApplyDamage src/Dodge/Machine/Damage.hs 6;" f basicMuzFlare src/Dodge/HeldUse.hs 731;" f @@ -2764,7 +2765,7 @@ branchRectWith src/Dodge/Room/Branch.hs 16;" f branchWith src/Dodge/Room/Room.hs 81;" f bright src/Color.hs 147;" f brightX src/Color.hs 143;" f -btSPic src/Dodge/Render/ShapePicture.hs 169;" f +btSPic src/Dodge/Render/ShapePicture.hs 170;" f btText src/Dodge/Inventory/SelectionList.hs 236;" f bufferEBO src/Shader/Bind.hs 28;" f bufferPerspectiveMatrixUBO src/Dodge/Render.hs 431;" f @@ -2818,6 +2819,7 @@ chaseCritInternal src/Dodge/Humanoid.hs 8;" f chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 122;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 32;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 36;" f +chaseUpperBody src/Dodge/Creature/Picture.hs 63;" f chasmRotate src/Dodge/Creature/Update.hs 177;" f chasmSimpleMaze src/Dodge/Room/Tutorial.hs 371;" f chasmSpitTerminal src/Dodge/Room/Tutorial.hs 305;" f @@ -2954,26 +2956,26 @@ corridorBoss src/Dodge/LockAndKey.hs 135;" f corridorN src/Dodge/Room/Corridor.hs 58;" f corridorWallN src/Dodge/Room/Corridor.hs 77;" f crAdd src/Dodge/Room/RezBox.hs 116;" f -crAwayFromPost src/Dodge/Creature/Test.hs 86;" f +crAwayFromPost src/Dodge/Creature/Test.hs 83;" f crBlips src/Dodge/RadarSweep.hs 88;" f -crCamouflage src/Dodge/Creature/Picture.hs 33;" f -crCanSeeCr src/Dodge/Creature/Test.hs 53;" f +crCamouflage src/Dodge/Creature/Picture.hs 35;" f +crCanSeeCr src/Dodge/Creature/Test.hs 50;" f crCrSpring src/Dodge/Update.hs 978;" f crCurrentEquipment src/Dodge/Creature/Statistics.hs 59;" f crDeathSounds src/Dodge/Creature/Vocalization.hs 43;" f crDexterity src/Dodge/Creature/Statistics.hs 19;" f crDisplayAwareness src/Dodge/Creature/Picture/Awareness.hs 39;" f crDisplayVigilance src/Dodge/Creature/Picture/Awareness.hs 53;" f -crHasTarget src/Dodge/Creature/Test.hs 66;" f -crHasTargetLOS src/Dodge/Creature/Test.hs 69;" f +crHasTarget src/Dodge/Creature/Test.hs 63;" f +crHasTargetLOS src/Dodge/Creature/Test.hs 66;" f crHeight src/Dodge/Base/Collide.hs 175;" f crHit src/Dodge/WorldEvent/ThingsHit.hs 136;" f crIXsNearCirc src/Dodge/Zoning/Creature.hs 33;" f crIXsNearPoint src/Dodge/Zoning/Creature.hs 15;" f -crInAimStance src/Dodge/Creature/Test.hs 94;" f +crInAimStance src/Dodge/Creature/Test.hs 91;" f crIntelligence src/Dodge/Creature/Statistics.hs 37;" f -crIsAiming src/Dodge/Creature/Test.hs 61;" f -crIsArmouredFrom src/Dodge/Creature/Test.hs 110;" f +crIsAiming src/Dodge/Creature/Test.hs 58;" f +crIsArmouredFrom src/Dodge/Creature/Test.hs 107;" f crLeftHandWall src/Dodge/Creature/HandPos.hs 96;" f crMass src/Dodge/Creature/Mass.hs 5;" f crMaterial src/Dodge/Creature/Material.hs 8;" f @@ -2984,15 +2986,15 @@ crMvBy src/Dodge/Creature/Impulse/Movement.hs 22;" f crMvByNoStride src/Dodge/Creature/Impulse/Movement.hs 30;" f crMvForward src/Dodge/Creature/Impulse/Movement.hs 57;" f crMvType src/Dodge/Creature/MoveType.hs 6;" f -crNearPoint src/Dodge/Creature/Test.hs 132;" f +crNearPoint src/Dodge/Creature/Test.hs 129;" f crNumFreeSlots src/Dodge/Inventory/CheckSlots.hs 25;" f crRad src/Dodge/Creature/Radius.hs 7;" f crRightHandWall src/Dodge/Creature/HandPos.hs 78;" f -crSafeDistFromTarg src/Dodge/Creature/Test.hs 75;" f +crSafeDistFromTarg src/Dodge/Creature/Test.hs 72;" f crSetRoots src/Dodge/Inventory/Location.hs 56;" f crShape src/Dodge/Creature/Shape.hs 8;" f crSpring src/Dodge/Update.hs 965;" f -crStratConMatches src/Dodge/Creature/Test.hs 81;" f +crStratConMatches src/Dodge/Creature/Test.hs 78;" f crStrength src/Dodge/Creature/Statistics.hs 28;" f crUpdate src/Dodge/Creature/Update.hs 70;" f crUpdateInvidLocations src/Dodge/Inventory/Location.hs 67;" f @@ -3039,7 +3041,7 @@ crsNearRect src/Dodge/Zoning/Creature.hs 40;" f crsNearSeg src/Dodge/Zoning/Creature.hs 24;" f crystalLine src/Dodge/Placement/Instance/Wall.hs 58;" f cubeShape src/Dodge/Block/Debris.hs 156;" f -cullPoint src/Dodge/Render/ShapePicture.hs 136;" f +cullPoint src/Dodge/Render/ShapePicture.hs 137;" f cullPretty src/AesonHelp.hs 14;" f cutPoly src/Dodge/LevelGen/StaticWalls.hs 77;" f cutWall src/Dodge/LevelGen/StaticWalls.hs 124;" f @@ -3097,10 +3099,10 @@ dbwMuzzles src/Dodge/HeldUse.hs 349;" f deZoneIX src/Dodge/Zoning/Base.hs 91;" f deZoneWall src/Dodge/Zoning/Wall.hs 69;" f deadEndRoom src/Dodge/Room/Room.hs 262;" f -deadFeet src/Dodge/Creature/Picture.hs 65;" f -deadRot src/Dodge/Creature/Picture.hs 83;" f -deadScalp src/Dodge/Creature/Picture.hs 78;" f -deadUpperBody src/Dodge/Creature/Picture.hs 104;" f +deadFeet src/Dodge/Creature/Picture.hs 96;" f +deadRot src/Dodge/Creature/Picture.hs 114;" f +deadScalp src/Dodge/Creature/Picture.hs 109;" f +deadUpperBody src/Dodge/Creature/Picture.hs 135;" f debrisS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 725;" f debrisSPic src/Dodge/Prop/Draw.hs 17;" f debrisSize src/Dodge/Block/Debris.hs 125;" f @@ -3230,7 +3232,7 @@ divideLine src/Geometry.hs 248;" f divideLineExact src/Geometry.hs 276;" f divideLineOddNumPoints src/Geometry.hs 261;" f dmType src/Dodge/Damage.hs 38;" f -doAimTwist src/Dodge/Creature/YourControl.hs 135;" f +doAimTwist src/Dodge/Creature/YourControl.hs 131;" f doAnyEquipmentEffect src/Dodge/Creature/State.hs 141;" f doBackspace src/Dodge/Update/Input/Text.hs 31;" f doBarrelSpin src/Dodge/Projectile/Update.hs 168;" f @@ -3320,9 +3322,10 @@ drawBaseMachine src/Dodge/Machine/Draw.hs 74;" f drawBlip src/Dodge/RadarBlip.hs 16;" f drawBlock src/Dodge/Render/ShapePicture.hs 81;" f drawBoundingBox src/Dodge/Debug/Picture.hs 368;" f -drawBullet src/Dodge/Render/ShapePicture.hs 175;" f +drawBullet src/Dodge/Render/ShapePicture.hs 176;" f drawButton src/Dodge/Button/Draw.hs 11;" f drawCPUShadows src/Dodge/Render/Shadow.hs 19;" f +drawChaseCrit src/Dodge/Creature/Picture.hs 53;" f drawCircCollisionTest src/Dodge/Debug/Picture.hs 118;" f drawCliff src/Dodge/Render/ShapePicture.hs 87;" f drawCollisionTest src/Dodge/Debug/Picture.hs 103;" f @@ -3351,7 +3354,7 @@ drawDragSelecting src/Dodge/Render/HUD.hs 162;" f drawDumbSwitch src/Dodge/Button/Draw.hs 31;" f drawEmptySet src/Dodge/Render/Picture.hs 151;" f drawEnergyBall src/Dodge/EnergyBall/Draw.hs 7;" f -drawEquipment src/Dodge/Creature/Picture.hs 116;" f +drawEquipment src/Dodge/Creature/Picture.hs 147;" f drawExamineInventory src/Dodge/Render/HUD.hs 199;" f drawExplosiveBall src/Dodge/EnergyBall/Draw.hs 15;" f drawFarWallDetect src/Dodge/Debug/Picture.hs 271;" f @@ -3522,7 +3525,7 @@ explosionS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 693;" f explosiveBarrel src/Dodge/Creature/Inanimate.hs 25;" f extTrigLitPos src/Dodge/Placement/Instance/Button.hs 79;" f extendConeToScreenEdge src/Dodge/Debug/Picture.hs 82;" f -extraPics src/Dodge/Render/ShapePicture.hs 141;" f +extraPics src/Dodge/Render/ShapePicture.hs 142;" f extraWeaponLinks src/Dodge/Item/Grammar.hs 94;" f extraWeaponLinksBelow src/Dodge/Item/Grammar.hs 103;" f extractRoomPos src/Dodge/RoomPos.hs 6;" f @@ -3530,7 +3533,7 @@ faceEdges src/Polyhedra.hs 62;" f facesToVF src/Polyhedra/Geodesic.hs 70;" f farWallDistDirection src/Dodge/Update/Camera.hs 245;" f fdiv src/ShortShow.hs 41;" f -feet src/Dodge/Creature/Picture.hs 51;" f +feet src/Dodge/Creature/Picture.hs 82;" f filter3 src/FoldableHelp.hs 76;" f filterSectionsPair src/Dodge/DisplayInventory.hs 160;" f findBlips src/Dodge/RadarSweep.hs 63;" f @@ -3574,7 +3577,7 @@ flockArmourChaseCrit src/Dodge/Creature/ArmourChase.hs 14;" f flockChaseTarget src/Dodge/Creature/Boid.hs 188;" f flockPointTarget src/Dodge/Creature/Boid.hs 204;" f floorItemPickupInfo src/Dodge/Render/HUD.hs 233;" f -floorItemSPic src/Dodge/Render/ShapePicture.hs 162;" f +floorItemSPic src/Dodge/Render/ShapePicture.hs 163;" f floorTo src/Geometry/Zone.hs 12;" f floorWire src/Dodge/Wire.hs 13;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 777;" f @@ -3641,8 +3644,8 @@ getCloseObj src/Dodge/Update/Input/InGame.hs 509;" f getCommand src/Dodge/Terminal.hs 61;" f getCommands src/Dodge/Terminal.hs 58;" f getCrMoveSpeed src/Dodge/Creature/Statistics.hs 47;" f -getCrsFromRooms src/Dodge/Room/Tutorial.hs 567;" f -getCrsFromRooms' src/Dodge/Room/Tutorial.hs 554;" f +getCrsFromRooms src/Dodge/Room/Tutorial.hs 570;" f +getCrsFromRooms' src/Dodge/Room/Tutorial.hs 557;" f getDebugMouseOver src/Dodge/Update.hs 449;" f getDistortions src/Dodge/Render.hs 443;" f getEdgesCrossing src/Dodge/Path.hs 37;" f @@ -3659,7 +3662,7 @@ getPJStabiliser src/Dodge/HeldUse.hs 1271;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 3;" f getRoomFromID src/Dodge/Room/Modify.hs 31;" f -getRoomsFromInts src/Dodge/Room/Tutorial.hs 550;" f +getRoomsFromInts src/Dodge/Room/Tutorial.hs 553;" f getRootItemBounds src/Dodge/Render/HUD.hs 106;" f getRootItemInvID src/Dodge/Inventory/Location.hs 36;" f getSelectedCloseObj src/Dodge/SelectedClose.hs 14;" f @@ -3723,7 +3726,7 @@ handHandleOrient src/Dodge/Item/HeldOffset.hs 71;" f handOrient src/Dodge/Item/HeldOffset.hs 52;" f handWalkingPos src/Dodge/Creature/HandPos.hs 45;" f handleEvent src/Dodge/Event.hs 27;" f -handleHotkeys src/Dodge/Creature/YourControl.hs 41;" f +handleHotkeys src/Dodge/Creature/YourControl.hs 37;" f handleKeyboardEvent src/Dodge/Event/Input.hs 23;" f handleMouseButtonEvent src/Dodge/Event/Input.hs 59;" f handleMouseMotionEvent src/Dodge/Event/Input.hs 47;" f @@ -3734,7 +3737,7 @@ handleResizeEvent src/Dodge/Event.hs 53;" f handleTextInput src/Dodge/Event/Input.hs 19;" f handleWindowMoveEvent src/Dodge/Event.hs 44;" f hardQuit src/Dodge/Concurrent.hs 32;" f -hasAutoDoorBody src/Dodge/Creature/Test.hs 141;" f +hasAutoDoorBody src/Dodge/Creature/Test.hs 138;" f hasButtonLOS src/Dodge/Base/Collide.hs 304;" f hasCaneGunDim src/Dodge/Item/InvSize.hs 48;" f hasLOS src/Dodge/Base/Collide.hs 297;" f @@ -3756,7 +3759,7 @@ heldEffectMuzzles src/Dodge/HeldUse.hs 135;" f heldHandlePos src/Dodge/Item/HeldOffset.hs 100;" f heldInfo src/Dodge/Item/Info.hs 92;" f heldItemAmmoSlots src/Dodge/Item/AmmoSlots.hs 20;" f -heldItemBulkiness src/Dodge/Creature/YourControl.hs 174;" f +heldItemBulkiness src/Dodge/Creature/YourControl.hs 170;" f heldItemInvLock src/Dodge/HeldUse.hs 469;" f heldItemMuzVel src/Dodge/HeldUse.hs 1022;" f heldItemMuzzles src/Dodge/HeldUse.hs 198;" f @@ -3779,7 +3782,7 @@ holsterWeapon src/Dodge/Creature/Volition.hs 14;" f homingModule src/Dodge/Item/Scope.hs 50;" f horPipe src/Dodge/Placement/Instance/Pipe.hs 9;" f hotkeyToChar src/Dodge/Inventory/SelectionList.hs 185;" f -hotkeyToScancode src/Dodge/Creature/YourControl.hs 66;" f +hotkeyToScancode src/Dodge/Creature/YourControl.hs 62;" f hotkeyToString src/Dodge/Inventory/SelectionList.hs 182;" f iShape src/Dodge/Placement/Instance/LightSource.hs 58;" f icosahedronPoints src/Polyhedra/Geodesic.hs 12;" f @@ -3874,7 +3877,7 @@ invertInventoryToMap src/Dodge/Combine.hs 57;" f invisibleChaseCrit src/Dodge/Creature/ChaseCrit.hs 21;" f invisibleWall src/Dodge/Placement/Instance/Wall.hs 27;" f isAmmoIntLink src/Dodge/HeldUse.hs 738;" f -isAnimate src/Dodge/Creature/Test.hs 135;" f +isAnimate src/Dodge/Creature/Test.hs 132;" f isCognizant src/Dodge/Creature/Perception.hs 105;" f isConnected src/Dodge/Inventory/Swap.hs 77;" f isCornerLink src/Dodge/RoomLink.hs 66;" f @@ -3915,7 +3918,7 @@ itemBaseName src/Dodge/Item/Display.hs 60;" f itemBaseStance src/Dodge/Item/AimStance.hs 22;" f itemBelowAttachables src/Dodge/Item/Grammar.hs 53;" f itemBlips src/Dodge/RadarSweep.hs 94;" f -itemBulkiness src/Dodge/Creature/YourControl.hs 168;" f +itemBulkiness src/Dodge/Creature/YourControl.hs 164;" f itemCombinations src/Dodge/Combine/Combinations.hs 56;" f itemDetectorEffect src/Dodge/HeldUse.hs 811;" f itemDisplay src/Dodge/Inventory/SelectionList.hs 53;" f @@ -3980,7 +3983,7 @@ lConnectCol src/Dodge/Render/Connectors.hs 46;" f lConnectMulti src/Dodge/Render/Connectors.hs 51;" f lShape src/Dodge/Placement/Instance/LightSource.hs 61;" f lamp src/Dodge/Creature/Lamp.hs 18;" f -lampCrSPic src/Dodge/Render/ShapePicture.hs 125;" f +lampCrSPic src/Dodge/Render/ShapePicture.hs 126;" f lasCenRunClose' src/Dodge/Room/LasTurret.hs 308;" f lasCenRunClose1 src/Dodge/Room/LasTurret.hs 397;" f lasCenRunClose2 src/Dodge/Room/LasTurret.hs 470;" f @@ -4182,7 +4185,7 @@ mcProxSensorTriggerUpdate src/Dodge/Machine/Update.hs 122;" f mcProxSensorUpdate src/Dodge/Machine/Update.hs 165;" f mcProxTest src/Dodge/Machine/Update.hs 246;" f mcProximitySensorUpdate src/Dodge/Machine/Update.hs 207;" f -mcSPic src/Dodge/Render/ShapePicture.hs 172;" f +mcSPic src/Dodge/Render/ShapePicture.hs 173;" f mcShootAuto src/Dodge/HeldUse.hs 1189;" f mcShootLaser src/Dodge/HeldUse.hs 1181;" f mcTypeUpdate src/Dodge/Machine/Update.hs 32;" f @@ -4346,7 +4349,8 @@ obstructPathsCrossing src/Dodge/Path.hs 120;" f oldMachineBootS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 635;" f onEquipWristShield src/Dodge/Euse.hs 89;" f onRemoveWristShield src/Dodge/Euse.hs 79;" f -oneH src/Dodge/Creature/Test.hs 98;" f +oneH src/Dodge/Creature/Test.hs 95;" f +oneSmooth src/Dodge/Creature/Picture.hs 79;" f openConsole src/Dodge/Update.hs 138;" f optionMenu src/Dodge/Menu.hs 110;" f optionScreenDefaultEffect src/Dodge/Update/Input/ScreenLayer.hs 62;" f @@ -4395,7 +4399,7 @@ pairsToSCC src/Dodge/Graph.hs 32;" f paletteToColor src/Color.hs 85;" f parseItem src/Dodge/Debug/Terminal.hs 62;" f parseNum src/Dodge/Debug/Terminal.hs 77;" f -passthroughLockKeyLists src/Dodge/Room/Tutorial.hs 632;" f +passthroughLockKeyLists src/Dodge/Room/Tutorial.hs 635;" f pathConnected src/Dodge/Room/CheckConsistency.hs 13;" f pathEdgeObstructed src/Dodge/Path.hs 66;" f pauseAndFloatCam src/Dodge/Camera.hs 10;" f @@ -4534,7 +4538,6 @@ powlistUpToN src/Multiset.hs 23;" f powlistUpToN' src/Multiset.hs 12;" f powlistUpToN'' src/Multiset.hs 31;" f preCritStart src/Dodge/Room/Start.hs 84;" f -prePos src/Quaternion.hs 78;" f preloadRender src/Preload/Render.hs 29;" f premapMaybe src/FoldlHelp.hs 26;" f prependTwo src/Geometry.hs 177;" f @@ -4592,7 +4595,7 @@ putLitButOnPosExtTrig src/Dodge/Placement/Instance/Button.hs 97;" f putLitButOnPosExtTrig' src/Dodge/Placement/Instance/Button.hs 100;" f putMessageTerminal src/Dodge/Placement/Instance/Terminal.hs 58;" f putShape src/Dodge/Room/Foreground.hs 134;" f -putSingleLight src/Dodge/Room/Tutorial.hs 450;" f +putSingleLight src/Dodge/Room/Tutorial.hs 453;" f putSlideDr src/Dodge/Door/PutSlideDoor.hs 12;" f putStrLnAppend src/Dodge/LevelGen.hs 84;" f putTerminal src/Dodge/Placement/Instance/Terminal.hs 52;" f @@ -4600,13 +4603,13 @@ putTerminalFull src/Dodge/Placement/Instance/Terminal.hs 21;" f putTerminalImediateAccess src/Dodge/Placement/Instance/Terminal.hs 16;" f putWireEnd src/Dodge/Wire.hs 29;" f putWireStart src/Dodge/Wire.hs 32;" f -qID src/Quaternion.hs 72;" f qNoRoll src/Quaternion.hs 52;" f qNoRoll1 src/Quaternion.hs 57;" f qNoRoll2 src/Quaternion.hs 60;" f qToAng src/Quaternion.hs 69;" f qToV2 src/Quaternion.hs 66;" f qToV3 src/Quaternion.hs 63;" f +qid src/Quaternion.hs 72;" f quarterRoomSquare src/Dodge/Room/Procedural.hs 194;" f quarterRoomTri src/Dodge/Room/Procedural.hs 158;" f quitCommand src/Dodge/Terminal.hs 106;" f @@ -4689,7 +4692,7 @@ reloadS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 531;" f rememberSounds src/Dodge/Creature/Perception.hs 176;" f remoteDetonator src/Dodge/Item/Scope.hs 152;" f remoteScreen src/Dodge/Item/Scope.hs 146;" f -removeAimPosture src/Dodge/Creature/YourControl.hs 140;" f +removeAimPosture src/Dodge/Creature/YourControl.hs 136;" f removeAmmoFromMag src/Dodge/HeldUse.hs 933;" f removeDot src/ShortShow.hs 44;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f @@ -4830,8 +4833,8 @@ scale3 src/Picture/Base.hs 137;" f scaleMat src/MatrixHelper.hs 71;" f scaleMatrix src/MatrixHelper.hs 68;" f scaleSH src/Shape.hs 266;" f -scalp src/Dodge/Creature/Picture.hs 92;" f -scancodeToHotkey src/Dodge/Creature/YourControl.hs 86;" f +scalp src/Dodge/Creature/Picture.hs 123;" f +scancodeToHotkey src/Dodge/Creature/YourControl.hs 82;" f scodeToChar src/Dodge/ScodeToChar.hs 6;" f scorchSPic src/Dodge/Creature/Update.hs 126;" f screenBox src/Dodge/Base/Window.hs 54;" f @@ -4877,13 +4880,13 @@ sensorReqToString src/Dodge/Machine/Update.hs 240;" f sensorRoom src/Dodge/Room/SensorDoor.hs 27;" f sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 59;" f sensorSPic src/Dodge/Machine/Draw.hs 97;" f -sensorTut src/Dodge/Room/Tutorial.hs 576;" f +sensorTut src/Dodge/Room/Tutorial.hs 579;" f sensorTypeDamages src/Dodge/Machine/Update.hs 286;" f sensorTypeDamages src/Dodge/Wall/Damage.hs 92;" f sentinelAI src/Dodge/Creature/SentinelAI.hs 20;" f sentinelExtraWatchUpdate src/Dodge/Creature/SentinelAI.hs 82;" f sentinelFireType src/Dodge/Creature/SentinelAI.hs 49;" f -setAimPosture src/Dodge/Creature/YourControl.hs 129;" f +setAimPosture src/Dodge/Creature/YourControl.hs 125;" f setChannelPos src/Sound.hs 152;" f setClickWorldPos src/Dodge/Update.hs 108;" f setClip src/Dodge/Debug.hs 239;" f @@ -4945,7 +4948,7 @@ shellShape src/Dodge/Projectile/Draw.hs 35;" f shieldWall src/Dodge/Item/BackgroundEffect.hs 91;" f shiftByV2 src/Dodge/PlacementSpot.hs 257;" f shiftChildren src/Dodge/Tree/Compose.hs 45;" f -shiftDraw src/Dodge/Render/ShapePicture.hs 130;" f +shiftDraw src/Dodge/Render/ShapePicture.hs 131;" f shiftInBy src/Dodge/PlacementSpot.hs 254;" f shiftInvItems src/Dodge/Update/Input/InGame.hs 294;" f shiftInvItemsDown src/Dodge/Inventory.hs 181;" f @@ -5300,7 +5303,7 @@ topTestPart src/Dodge/TestString.hs 71;" f torchShape src/Dodge/Item/Draw/SPic.hs 277;" f torqueAmount src/Dodge/HeldUse.hs 606;" f torqueCr src/Dodge/WorldEffect.hs 85;" f -torso src/Dodge/Creature/Picture.hs 97;" f +torso src/Dodge/Creature/Picture.hs 128;" f tractCr src/Dodge/TractorBeam/Update.hs 28;" f tractFlIt src/Dodge/TractorBeam/Update.hs 23;" f tractorBeamAt src/Dodge/HeldUse.hs 850;" f @@ -5349,7 +5352,7 @@ truncFaces src/Polyhedra/Geodesic.hs 54;" f truncate src/Polyhedra/Geodesic.hs 39;" f trunkDepth src/TreeHelp.hs 164;" f tryAttachItems src/Dodge/Item/Grammar.hs 34;" f -tryClickUse src/Dodge/Creature/YourControl.hs 216;" f +tryClickUse src/Dodge/Creature/YourControl.hs 212;" f tryCombine src/Dodge/Update/Input/InGame.hs 521;" f tryDrawToCapacitor src/Dodge/Creature/State.hs 151;" f tryDropSelected src/Dodge/Update/Input/InGame.hs 140;" f @@ -5369,19 +5372,19 @@ turnTo src/Dodge/Movement/Turn.hs 8;" f turretItemOffset src/Dodge/Item/HeldOffset.hs 23;" f tutAnoTree src/Dodge/Room/Tutorial.hs 53;" f tutDrop src/Dodge/Room/Tutorial.hs 101;" f -tutHub src/Dodge/Room/Tutorial.hs 474;" f +tutHub src/Dodge/Room/Tutorial.hs 477;" f tutLight src/Dodge/Room/Tutorial.hs 393;" f -tutRezBox src/Dodge/Room/Tutorial.hs 587;" f +tutRezBox src/Dodge/Room/Tutorial.hs 590;" f tutRoomTree src/Dodge/Floor.hs 20;" f -tutorialMessage1 src/Dodge/Room/Tutorial.hs 612;" f +tutorialMessage1 src/Dodge/Room/Tutorial.hs 615;" f tweenAngles src/Geometry/Vector.hs 192;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 83;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 39;" f -twists src/Dodge/Creature/Test.hs 104;" f -twoFlat src/Dodge/Creature/Test.hs 101;" f +twists src/Dodge/Creature/Test.hs 101;" f +twoFlat src/Dodge/Creature/Test.hs 98;" f twoFlatHRot src/Dodge/Item/HeldOffset.hs 91;" f twoHandOffY src/Dodge/Creature/HandPos.hs 132;" f -twoHandTwistAmount src/Dodge/Creature/YourControl.hs 146;" f +twoHandTwistAmount src/Dodge/Creature/YourControl.hs 142;" f twoRoomPoss src/Dodge/PlacementSpot.hs 148;" f twoStep1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 519;" f twoStepS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 567;" f @@ -5530,7 +5533,7 @@ updateWheelEvent src/Dodge/Update/Scroll.hs 21;" f updateWheelEvents src/Dodge/Update.hs 474;" f updateWorldEventFlag src/Dodge/Update.hs 127;" f updateWorldEventFlags src/Dodge/Update.hs 115;" f -upperBody src/Dodge/Creature/Picture.hs 112;" f +upperBody src/Dodge/Creature/Picture.hs 143;" f upperBox src/Shape.hs 153;" f upperBoxHalf src/Shape.hs 219;" f upperBoxMT src/Shape.hs 144;" f @@ -5550,7 +5553,7 @@ upperPrismPolyTS src/Shape.hs 116;" f upperRounded src/Shape.hs 182;" f useBulletPayload src/Dodge/Bullet.hs 117;" f useGasParams src/Dodge/HeldUse.hs 1111;" f -useHotkey src/Dodge/Creature/YourControl.hs 61;" f +useHotkey src/Dodge/Creature/YourControl.hs 57;" f useInventoryPath src/Dodge/HeldUse.hs 1402;" f useItem src/Dodge/Creature/Impulse/UseItem.hs 19;" f useItemLoc src/Dodge/Creature/Impulse/UseItem.hs 26;" f @@ -5609,11 +5612,11 @@ wallsToDraw src/Dodge/Render/Walls.hs 18;" f warmupSound src/Dodge/HeldUse.hs 1396;" f warningRooms src/Dodge/Room/Warning.hs 34;" f warp1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 845;" f -wasdAim src/Dodge/Creature/YourControl.hs 117;" f +wasdAim src/Dodge/Creature/YourControl.hs 113;" f wasdDir src/Dodge/WASD.hs 17;" f wasdM src/Dodge/WASD.hs 9;" f -wasdMovement src/Dodge/Creature/YourControl.hs 149;" f -wasdWithAiming src/Dodge/Creature/YourControl.hs 110;" f +wasdMovement src/Dodge/Creature/YourControl.hs 145;" f +wasdWithAiming src/Dodge/Creature/YourControl.hs 106;" f watchCombinations src/Dodge/Combine/Combinations.hs 16;" f watchUpdateStrat src/Dodge/Creature/ReaderUpdate.hs 186;" f weaponBehindPillar src/Dodge/Room/Room.hs 198;" f