diff --git a/src/Dodge/Data/Universe.hs b/src/Dodge/Data/Universe.hs index 995443e54..dabef57c1 100644 --- a/src/Dodge/Data/Universe.hs +++ b/src/Dodge/Data/Universe.hs @@ -41,7 +41,7 @@ data Universe = Universe , _uvLastFrameTicks :: Word32 , _uvFrameTicks :: Word32 , _uvRAMSave :: Maybe World - , _uvDebug :: M.Map DebugBool DebugItem + , _uvDebug :: M.Map DebugBool [DebugItem] , _uvDebugFloat1 :: Float , _uvDebugFloat2 :: Float , _uvDebugMessageOffset :: Int diff --git a/src/Dodge/Debug.hs b/src/Dodge/Debug.hs index 5d578c13b..6e828d7d7 100644 --- a/src/Dodge/Debug.hs +++ b/src/Dodge/Debug.hs @@ -1,28 +1,31 @@ {-# LANGUAGE LambdaCase #-} + module Dodge.Debug (debugEvents) where -import Padding -import Dodge.Base.Window -import ShortShow -import Linear -import Dodge.Render.InfoBox -import Picture.Base -import Geometry.Data -import qualified Data.IntMap.Strict as IM -import Data.Aeson.Types +--import Dodge.Render.InfoBox + import AesonHelp import Control.Lens +import Control.Monad +import Data.Aeson.Types +import qualified Data.IntMap.Strict as IM import Data.List (sortOn) import qualified Data.Map.Strict as M import Data.Maybe +import Data.Ord import qualified Data.Set as S import Dodge.Base.Coordinate +import Dodge.Base.Window import Dodge.Data.Universe import Dodge.Debug.Picture import Dodge.WorldEvent.ThingsHit import Geometry.Vector +import Linear +import Padding +import Picture.Base import qualified SDL -import Data.Ord +import ShortShow + --import Data.Foldable (fold) debugEvents :: Universe -> Universe @@ -35,11 +38,11 @@ debugEvents u = case dbools ^. at Enable_debug of debugEvent :: DebugBool -> Universe -> Universe debugEvent db u = u & uvDebug . at db .~ debugItem db u -debugItem :: DebugBool -> Universe -> Maybe DebugItem +debugItem :: DebugBool -> Universe -> Maybe [DebugItem] debugItem = \case Collision_test -> constDPic (drawCollisionTest . _uvWorld) Circ_collision_test -> constDPic (drawCircCollisionTest . _uvWorld) - Select_creature -> Just . selectCreatureDebugItem + Select_creature -> Just . return . selectCreatureDebugItem Show_walls_near_point_cursor -> constDPic (drawWallsNearCursor . _uvWorld) Show_walls_near_segment -> constDPic (drawWallsNearSegment . _uvWorld) Enable_debug -> const Nothing @@ -59,27 +62,47 @@ debugItem = \case Show_zone_circ -> constDPic $ drawZoneCirc . _uvWorld Inspect_wall -> constDPic $ drawInspectWalls . _uvWorld Cr_awareness -> constDPic $ drawCreatureDisplayTexts . _uvWorld - Show_sound -> constDPic $ \u -> + Show_sound -> constDPic $ \u -> fold (M.map (soundPic (u ^. uvConfig) (u ^. uvWorld)) $ u ^. uvWorld . playingSounds) - Cr_status -> constDPic $ \u -> drawCrInfo (u ^. uvConfig) (u ^. uvWorld) + Cr_status -> Just . drawCrInfo Mouse_position -> constDPic $ drawMousePosition . _uvWorld Walls_info -> constDPic $ drawWlIDs . _uvWorld - Pathing -> constDPic $ \u -> drawPathing (u ^. uvConfig) (u ^. uvWorld) + Pathing -> constDPic $ \u -> drawPathing (u ^. uvConfig) (u ^. uvWorld) Show_path_between -> constDPic $ drawPathBetween . _uvWorld -constDPic :: (Universe -> Picture) -> Universe -> Maybe DebugItem -constDPic p u = Just $ DebugItem (p u) mempty NoDebugInfo +constDPic :: (Universe -> Picture) -> Universe -> Maybe [DebugItem] +constDPic p u = Just [DebugItem (p u) mempty NoDebugInfo] -drawCrInfo' :: Universe -> Maybe DebugItem -drawCrInfo' u = do - undefined --- +drawCrInfo :: Universe -> [DebugItem] +drawCrInfo u = mapMaybe f . IM.elems $ w ^. cWorld . lWorld . creatures + where + w = u ^. uvWorld + g h str = fmap $ ((rightPad 7 '.' str ++ "...") ++) . h + f cr = do + guard $ + pointIsOnScreen (u ^. uvConfig) (w ^. wCam) (cr ^. crPos . _xy) + && cr ^. crID /= 0 + Just $ + DebugItem + mempty + ( catMaybes + [ g show "crID" $ cr ^? crID + , g show "crHP" $ cr ^? crHP . _HP + , g show "crStrategy" $ cr ^? crActionPlan . apStrategy + , g shortShow "crPos" $ cr ^? crPos . _xy + , g show "cpVigilance" $ cr ^? crPerception . cpVigilance + , g show "crAction" $ cr ^? crActionPlan . apAction + , g show "crImpulse" $ cr ^? crActionPlan . apImpulse + ] + ) + (DebugV2 $ cr ^. crPos . _xy) + +--drawCrInfo :: Config -> World -> Picture +--drawCrInfo cfig w = -- setLayer FixedCoordLayer $ -- renderInfoListsAt (2 * hw - 400) 0 cfig cam $ -- mapMaybe crDisplayInfo $ IM.elems $ w ^. cWorld . lWorld . creatures -- where --- w = u ^. uvWorld --- cfig = u ^. uvConfig -- cam = w ^. wCam -- crDisplayInfo :: Creature -> Maybe (Point2, [String]) -- crDisplayInfo cr @@ -106,39 +129,6 @@ drawCrInfo' u = do -- fpreShow str = fmap (((rightPad 7 '.' str ++ "...") ++) . show) -- hw = halfWidth cfig -drawCrInfo :: Config -> World -> Picture -drawCrInfo cfig w = - setLayer FixedCoordLayer $ - renderInfoListsAt (2 * hw - 400) 0 cfig cam $ - mapMaybe crDisplayInfo $ IM.elems $ w ^. cWorld . lWorld . creatures - where - cam = w ^. wCam - crDisplayInfo :: Creature -> Maybe (Point2, [String]) - crDisplayInfo cr - | _crID cr == 0 = Nothing - | crOnScreen = - Just - ( cr ^. crPos . _xy - , catMaybes - -- [fmap show $ ap ^? crGoal - [ fpreShow "crHP" $ cr ^? crHP . _HP - , fpreShow "crStrategy" $ ap ^? apStrategy - , fmap (("crPos....." ++) . shortShow) $ cr ^? crPos . _xy - , fpreShow "cpVigilance" $ cr ^? crPerception . cpVigilance - , fpreShow "crAction" $ ap ^? apAction - , fpreShow "crImpulse" $ ap ^? apImpulse - ] - ) - | otherwise = Nothing - where - ap = _crActionPlan cr - crOnScreen = pointIsOnScreen cfig cam $ cr ^. crPos . _xy - - fpreShow :: (Show a, Functor f) => String -> f a -> f String - fpreShow str = fmap (((rightPad 7 '.' str ++ "...") ++) . show) - hw = halfWidth cfig - - selectCreatureDebugItem :: Universe -> DebugItem selectCreatureDebugItem u = DebugItem @@ -155,33 +145,37 @@ scrollDebugInfoInt i u debugSelectCreatureMessage :: Universe -> [String] debugSelectCreatureMessage u = fromMaybe - [show (u ^? uvDebug . ix Select_creature . debugInfo . debugInt)] + [show (u ^? uvDebug . ix Select_creature . ix 0 . debugInfo . debugInt)] $ do - cid <- u ^? uvDebug . ix Select_creature . debugInfo . debugMInt . _Just - i <- u ^? uvDebug . ix Select_creature . debugInfo . debugInt + cid <- u ^? uvDebug . ix Select_creature . ix 0 . debugInfo . debugMInt . _Just + i <- u ^? uvDebug . ix Select_creature . ix 0 . debugInfo . debugInt cap <- debugSelectCreatureList cid u !! i return $ show cid : cap debugSelectCreatureList :: Int -> Universe -> [Maybe [String]] debugSelectCreatureList cid u = - [ debugList "ActionPlan" + [ debugList + "ActionPlan" (u ^? uvWorld . cWorld . lWorld . creatures . ix cid . crActionPlan) - , debugList "Perception" + , debugList + "Perception" (u ^? uvWorld . cWorld . lWorld . creatures . ix cid . crPerception) - , debugList "Intention" + , debugList + "Intention" (u ^? uvWorld . cWorld . lWorld . creatures . ix cid . crIntention) - , debugList "Memory" + , debugList + "Memory" (u ^? uvWorld . cWorld . lWorld . creatures . ix cid . crMemory) - , debugList "Strategy" + , debugList + "Strategy" (u ^? uvWorld . cWorld . lWorld . creatures . ix cid . crActionPlan . apStrategy) - , debugList "Vocalization" + , debugList + "Vocalization" (u ^? uvWorld . cWorld . lWorld . creatures . ix cid . crVocalization) ] - debugList :: (Functor f, ToJSON a) => String -> f a -> f [String] -debugList str = fmap (([str] ++) . prettyShort ) - +debugList str = fmap (([str] ++) . prettyShort) clickGetCreature :: Universe -> DebugInfo clickGetCreature u @@ -190,7 +184,7 @@ clickGetCreature u DebugIntMInt 0 (closestCreatureID u) | otherwise = fromMaybe (DebugIntMInt 0 Nothing) $ - u ^? uvDebug . ix Select_creature . debugInfo + u ^? uvDebug . ix Select_creature . ix 0 . debugInfo closestCreatureID :: Universe -> Maybe Int closestCreatureID u = diff --git a/src/Dodge/Debug/Picture.hs b/src/Dodge/Debug/Picture.hs index 3f6a4397d..cd9b1e86b 100644 --- a/src/Dodge/Debug/Picture.hs +++ b/src/Dodge/Debug/Picture.hs @@ -16,7 +16,7 @@ import Dodge.Path import Dodge.Picture.SizeInvariant --import Dodge.Render.InfoBox import Dodge.Render.Label -import Dodge.Render.List +--import Dodge.Render.List import Dodge.ShortShow import Dodge.SoundLogic.LoadSound import Dodge.Viewpoints @@ -153,15 +153,15 @@ drawZoneCol col s (V2 x y) = setLayer DebugLayer . color col $ thickLine 2 (p : zipWith (+.+) (square 1) $ map ((s *.*) . (each %~ fromIntegral)) [V2 x y, V2 (x + 1) y, V2 (x + 1) (y + 1), V2 x (y + 1)] -showEnabledDebugs :: Config -> Picture -{-# INLINE showEnabledDebugs #-} -showEnabledDebugs cfig - | Enable_debug `S.member` _debug_booleans cfig = - setLayer FixedCoordLayer (toTopLeft cfig (translate (0.5 * halfWidth cfig) 0 $ drawList $ map text ts)) - | otherwise = mempty - where - -- pic = foldMap (debugDraw' cfig w) (_debug_booleans cfig) - ts = map show (S.toList $ _debug_booleans cfig) +--showEnabledDebugs :: Config -> Picture +--{-# INLINE showEnabledDebugs #-} +--showEnabledDebugs cfig +-- | Enable_debug `S.member` _debug_booleans cfig = +-- setLayer FixedCoordLayer (toTopLeft cfig (translate (0.5 * halfWidth cfig) 0 $ drawList $ map text ts)) +-- | otherwise = mempty +-- where +-- -- pic = foldMap (debugDraw' cfig w) (_debug_booleans cfig) +-- ts = map show (S.toList $ _debug_booleans cfig) --debugDraw' :: Config -> World -> DebugBool -> Picture --{-# INLINE debugDraw' #-} diff --git a/src/Dodge/Render/List.hs b/src/Dodge/Render/List.hs index 31c40b2be..ac5b67e08 100644 --- a/src/Dodge/Render/List.hs +++ b/src/Dodge/Render/List.hs @@ -16,6 +16,7 @@ module Dodge.Render.List ( selSecDrawCursorAt, drawTitleBackground, -- should be renamed, made sensible drawCursorAt, + drawLabelledList, ) where import qualified Data.IntMap.Strict as IM @@ -208,6 +209,13 @@ renderListAt tx ty = translate tx (- ty) drawList :: [Picture] -> Picture drawList = drawListYgapScaleYoff 0 1 0 +drawLabelledList :: [(String,[String])] -> Picture +drawLabelledList ((s,ss):xs) + = translate (-10) 0 (drawListYgapScaleYoff 0 1 0 [ textJustifyRight s]) + <> drawListYgapScaleYoff 0 1 0 (text <$> ss) + <> translate 0 (negate $ fromIntegral (max 1 $ length ss) * 20) (drawLabelledList xs) +drawLabelledList [] = mempty + --TODO put the following functions in an appropriate place -- | Colour picture and add black drop shadow. diff --git a/src/Dodge/Render/Picture.hs b/src/Dodge/Render/Picture.hs index 60726bd90..107c45f92 100644 --- a/src/Dodge/Render/Picture.hs +++ b/src/Dodge/Render/Picture.hs @@ -2,8 +2,8 @@ module Dodge.Render.Picture (fixedCoordPictures) where -import Linear (_xy) import Control.Lens +import qualified Data.Map.Strict as M import Data.Maybe import Dodge.Base.Coordinate import Dodge.Base.Window @@ -13,6 +13,7 @@ import Dodge.Render.List import Dodge.Render.MenuScreen import Geometry import HelpNum +import Linear (_xy) import Picture fixedCoordPictures :: Universe -> Picture @@ -30,18 +31,20 @@ fixedCoordPictures u = ) <> displayFrameTicks u <> drawMouseCursor u - <> ( toTopLeft cfig . translate (1.3 * halfWidth cfig) 0 - . drawList - . take 50 - . drop (u ^. uvDebugMessageOffset) - . map text - $ foldMap _debugMessage (_uvDebug u) -- other debug pics in extraPics - ) + <> toTopLeft + cfig + ( translate (halfWidth cfig) (10 * fromIntegral (u ^. uvDebugMessageOffset)) + . drawLabelledList + . fmap f + . M.toList + $ u ^. uvDebug + ) where cfig = _uvConfig u hw = halfWidth cfig hh = halfHeight cfig ttl = toTopLeft cfig + f (k, l) = (show k, foldMap _debugMessage l) displayFrameTicks :: Universe -> Picture displayFrameTicks u diff --git a/src/Dodge/Render/ShapePicture.hs b/src/Dodge/Render/ShapePicture.hs index dbaf9f252..32be35492 100644 --- a/src/Dodge/Render/ShapePicture.hs +++ b/src/Dodge/Render/ShapePicture.hs @@ -110,8 +110,8 @@ extraPics cfig u = <> _flares lw <> foldMap drawLightSource (_lightSources lw) <> viewClipBounds cfig w - <> showEnabledDebugs cfig - <> foldMap _debugPic (_uvDebug u) -- debug messages are in fixed coord pics +-- <> showEnabledDebugs cfig + <> foldMap (foldMap _debugPic) (_uvDebug u) -- debug messages are in fixed coord pics where w = u ^. uvWorld lw = w ^. cWorld . lWorld diff --git a/tags b/tags index ae1501981..0f5060aa8 100644 --- a/tags +++ b/tags @@ -2591,7 +2591,7 @@ adjustIMZone src/Dodge/Base.hs 81;" f advanceScrollAmount src/Dodge/Update.hs 404;" f advanceSmoothScroll src/Dodge/SmoothScroll.hs 33;" f advanceStepCounter src/Dodge/Creature/Impulse/Movement.hs 46;" f -aimDelaySweep src/Dodge/Render/Picture.hs 273;" f +aimDelaySweep src/Dodge/Render/Picture.hs 275;" f aimStanceInfo src/Dodge/Item/Info.hs 243;" f aimTurn src/Dodge/Creature/YourControl.hs 181;" f airlock src/Dodge/Room/Airlock.hs 23;" f @@ -2852,7 +2852,7 @@ checkWallRight src/Dodge/LevelGen/StaticWalls.hs 54;" f checkWallRight src/Dodge/LevelGen/StaticWalls/Deprecated.hs 59;" f chemFuelPouch src/Dodge/Item/Ammo.hs 75;" f chestPQ src/Dodge/Creature/HandPos.hs 124;" f -chooseCursorBorders src/Dodge/Render/List.hs 155;" f +chooseCursorBorders src/Dodge/Render/List.hs 156;" f chooseEquipPosition src/Dodge/Inventory/RBList.hs 41;" f chooseFootSound src/Dodge/Creature/State/WalkCycle.hs 35;" f chooseFreeSite src/Dodge/Inventory/RBList.hs 47;" f @@ -2887,7 +2887,7 @@ cleatLabel src/Dodge/Cleat.hs 30;" f cleatOnward src/Dodge/Cleat.hs 24;" f cleatSide src/Dodge/Cleat.hs 27;" f click1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 582;" f -clickGetCreature src/Dodge/Debug.hs 150;" f +clickGetCreature src/Dodge/Debug.hs 189;" f clicker src/Dodge/Item/Scope.hs 82;" f clipV src/Geometry/Vector.hs 48;" f clipZoom src/Dodge/Update/Camera.hs 230;" f @@ -2896,7 +2896,7 @@ closeButtonToSelectionItem src/Dodge/Inventory/SelectionList.hs 223;" f closeItemToSelectionItem src/Dodge/Inventory/SelectionList.hs 208;" f closeItemToTextPictures src/Dodge/Inventory/SelectionList.hs 243;" f closeObjectInfo src/Dodge/Render/HUD.hs 226;" f -closestCreatureID src/Dodge/Debug.hs 159;" f +closestCreatureID src/Dodge/Debug.hs 198;" f closestPointOnLine src/Geometry/Intersect.hs 272;" f closestPointOnLineParam src/Geometry/Intersect.hs 288;" f closestPointOnSeg src/Geometry/Intersect.hs 303;" f @@ -2954,7 +2954,7 @@ conEffects src/Dodge/Concurrent.hs 12;" f conLDTToConDT src/Dodge/DoubleTree.hs 22;" f concurrentIS src/Dodge/Update/Input/InGame.hs 287;" f connectItemS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 722;" f -constDPic src/Dodge/Debug.hs 70;" f +constDPic src/Dodge/Debug.hs 71;" f constructEdges src/Polyhedra.hs 34;" f constructEdgesList src/Polyhedra.hs 43;" f contToIDCont src/Dodge/LevelGen/PlacementHelper.hs 57;" f @@ -3076,7 +3076,7 @@ cylinderIndices src/Shader/Poke.hs 382;" f cylinderOnSeg src/Geometry.hs 122;" f cylinderPoly src/Shape.hs 87;" f cylinderRoundIndices src/Shader/Poke.hs 389;" f -dShadCol src/Dodge/Render/List.hs 214;" f +dShadCol src/Dodge/Render/List.hs 222;" f damMatSideEffect src/Dodge/Material/Damage.hs 14;" f damThingHitWith src/Dodge/Damage.hs 72;" f damToExpBarrel src/Dodge/Barreloid.hs 53;" f @@ -3113,12 +3113,12 @@ debrisSize src/Dodge/Block/Debris.hs 77;" f debugEvent src/Dodge/Debug.hs 35;" f debugEvents src/Dodge/Debug.hs 28;" f debugItem src/Dodge/Debug.hs 38;" f -debugList src/Dodge/Debug.hs 146;" f +debugList src/Dodge/Debug.hs 185;" f debugMenu src/Dodge/Menu.hs 125;" f debugMenuOptions src/Dodge/Menu.hs 131;" f debugOn src/Dodge/Data/Config.hs 151;" f -debugSelectCreatureList src/Dodge/Debug.hs 129;" f -debugSelectCreatureMessage src/Dodge/Debug.hs 120;" f +debugSelectCreatureList src/Dodge/Debug.hs 168;" f +debugSelectCreatureMessage src/Dodge/Debug.hs 159;" f decodeSensorType src/Dodge/Terminal.hs 72;" f decomposeSelfTree src/Dodge/Tree/Compose.hs 61;" f decomposeTree src/Dodge/Tree/Compose.hs 58;" f @@ -3218,7 +3218,7 @@ dirtPoly src/Dodge/Room/RoadBlock.hs 74;" f disconnectItemS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 650;" f displayConfig src/Dodge/Menu.hs 231;" f displayControls src/Dodge/Menu.hs 242;" f -displayFrameTicks src/Dodge/Render/Picture.hs 46;" f +displayFrameTicks src/Dodge/Render/Picture.hs 48;" f displayFreeSlots src/Dodge/DisplayInventory.hs 192;" f displayIndents src/Dodge/DisplayInventory.hs 110;" f displayPulse src/Dodge/Inventory/SelectionList.hs 179;" f @@ -3324,9 +3324,9 @@ doublePairSet src/Geometry.hs 166;" f doubleTreeToIndentList src/Dodge/DoubleTree.hs 129;" f doubleV2 src/Geometry.hs 169;" f drawARHUD src/Dodge/Creature/State.hs 193;" f -drawAimSweep src/Dodge/Render/Picture.hs 280;" f +drawAimSweep src/Dodge/Render/Picture.hs 282;" f drawAllShadows src/Dodge/Shadows.hs 5;" f -drawArrowDown src/Dodge/Render/Picture.hs 207;" f +drawArrowDown src/Dodge/Render/Picture.hs 209;" f drawBaseMachine src/Dodge/Machine/Draw.hs 68;" f drawBeam src/Dodge/Beam/Draw.hs 6;" f drawBlip src/Dodge/RadarBlip.hs 16;" f @@ -3339,28 +3339,29 @@ drawChasm src/Dodge/Render/ShapePicture.hs 48;" f drawCircCollisionTest src/Dodge/Debug/Picture.hs 118;" f drawCliff src/Dodge/Render/ShapePicture.hs 51;" f drawCollisionTest src/Dodge/Debug/Picture.hs 103;" f -drawCombFilter src/Dodge/Render/Picture.hs 255;" f +drawCombFilter src/Dodge/Render/Picture.hs 257;" f drawCombineInventory src/Dodge/Render/HUD.hs 182;" f -drawConcurrentMessage src/Dodge/Render/Picture.hs 69;" f +drawConcurrentMessage src/Dodge/Render/Picture.hs 71;" f drawCoord src/Dodge/Debug/Picture.hs 376;" f -drawCrInfo src/Dodge/Debug.hs 73;" f +drawCrInfo src/Dodge/Debug.hs 112;" f +drawCrInfo' src/Dodge/Debug.hs 74;" f drawCreature src/Dodge/Render/ShapePicture.hs 67;" f drawCreatureDisplayTexts src/Dodge/Debug/Picture.hs 198;" f drawCross src/Dodge/Render/Label.hs 24;" f drawCrossCol src/Dodge/Render/Label.hs 21;" f -drawCursorAt src/Dodge/Render/List.hs 71;" f -drawCursorByTerminalStatus src/Dodge/Render/Picture.hs 125;" f +drawCursorAt src/Dodge/Render/List.hs 72;" f +drawCursorByTerminalStatus src/Dodge/Render/Picture.hs 127;" f drawDDATest src/Dodge/Debug/Picture.hs 303;" f drawDamSensor src/Dodge/Machine/Draw.hs 27;" f drawDoorPaths src/Dodge/Debug/Picture.hs 253;" f drawDoubleLampCover src/Dodge/Prop/Draw.hs 95;" f -drawDrag src/Dodge/Render/Picture.hs 186;" f -drawDragDrop src/Dodge/Render/Picture.hs 215;" f -drawDragPickup src/Dodge/Render/Picture.hs 224;" f -drawDragSelect src/Dodge/Render/Picture.hs 183;" f +drawDrag src/Dodge/Render/Picture.hs 188;" f +drawDragDrop src/Dodge/Render/Picture.hs 217;" f +drawDragPickup src/Dodge/Render/Picture.hs 226;" f +drawDragSelect src/Dodge/Render/Picture.hs 185;" f drawDragSelected src/Dodge/Render/HUD.hs 136;" f drawDragSelecting src/Dodge/Render/HUD.hs 153;" f -drawEmptySet src/Dodge/Render/Picture.hs 139;" f +drawEmptySet src/Dodge/Render/Picture.hs 141;" f drawEnergyBall src/Dodge/EnergyBall/Draw.hs 7;" f drawEquipment src/Dodge/Creature/Picture.hs 127;" f drawExamineInventory src/Dodge/Render/HUD.hs 198;" f @@ -3369,7 +3370,7 @@ drawFarWallDetect src/Dodge/Debug/Picture.hs 270;" f drawFlame src/Dodge/Flame/Draw.hs 8;" f drawFlamelet src/Dodge/EnergyBall/Draw.hs 37;" f drawForceField src/Dodge/Wall/Draw.hs 11;" f -drawGapPlus src/Dodge/Render/Picture.hs 266;" f +drawGapPlus src/Dodge/Render/Picture.hs 268;" f drawGib src/Dodge/Prop/Draw.hs 39;" f drawHUD src/Dodge/Render/HUD.hs 51;" f drawInputMenu src/Dodge/Render/MenuScreen.hs 19;" f @@ -3378,24 +3379,25 @@ drawInspectWalls src/Dodge/Debug/Picture.hs 233;" f drawInventory src/Dodge/Render/HUD.hs 58;" f drawItemChildrenConnect src/Dodge/Render/HUD.hs 329;" f drawItemConnections src/Dodge/Render/HUD.hs 319;" f -drawJumpDown src/Dodge/Render/Picture.hs 178;" f +drawJumpDown src/Dodge/Render/Picture.hs 180;" f drawLabCrossCol src/Dodge/Render/Label.hs 8;" f +drawLabelledList src/Dodge/Render/List.hs 212;" f drawLampCover src/Dodge/Prop/Draw.hs 55;" f drawLaser src/Dodge/Laser/Update.hs 29;" f drawLightSource src/Dodge/LightSource/Draw.hs 7;" f drawLinearShockwave src/Dodge/LinearShockwave/Draw.hs 10;" f -drawList src/Dodge/Render/List.hs 208;" f -drawListElement src/Dodge/Render/List.hs 186;" f -drawListYgapScaleYoff src/Dodge/Render/List.hs 95;" f -drawListYoff src/Dodge/Render/List.hs 92;" f +drawList src/Dodge/Render/List.hs 209;" f +drawListElement src/Dodge/Render/List.hs 187;" f +drawListYgapScaleYoff src/Dodge/Render/List.hs 96;" f +drawListYoff src/Dodge/Render/List.hs 93;" f drawMachine src/Dodge/Machine/Draw.hs 16;" f drawMapperAR src/Dodge/Targeting/Draw.hs 12;" f drawMapperInventory src/Dodge/Render/HUD.hs 173;" f -drawMenuClick src/Dodge/Render/Picture.hs 154;" f -drawMenuCursor src/Dodge/Render/Picture.hs 166;" f -drawMenuOrHUD src/Dodge/Render/Picture.hs 64;" f +drawMenuClick src/Dodge/Render/Picture.hs 156;" f +drawMenuCursor src/Dodge/Render/Picture.hs 168;" f +drawMenuOrHUD src/Dodge/Render/Picture.hs 66;" f drawMenuScreen src/Dodge/Render/MenuScreen.hs 14;" f -drawMouseCursor src/Dodge/Render/Picture.hs 80;" f +drawMouseCursor src/Dodge/Render/Picture.hs 82;" f drawMouseOver src/Dodge/Render/HUD.hs 109;" f drawMousePosition src/Dodge/Debug/Picture.hs 366;" f drawMovingShape src/Dodge/Prop/Draw.hs 81;" f @@ -3404,23 +3406,23 @@ drawOptions src/Dodge/Render/MenuScreen.hs 22;" f drawPathBetween src/Dodge/Debug/Picture.hs 201;" f drawPathEdge src/Dodge/Debug/Picture.hs 258;" f drawPathing src/Dodge/Debug/Picture.hs 398;" f -drawPlus src/Dodge/Render/Picture.hs 151;" f +drawPlus src/Dodge/Render/Picture.hs 153;" f drawPointLabel src/Dodge/Render/Label.hs 13;" f drawProjectile src/Dodge/Projectile/Draw.hs 13;" f drawProp src/Dodge/Prop/Draw.hs 26;" f drawProxSensor src/Dodge/Machine/Draw.hs 37;" f drawPulseBall src/Dodge/Render/ShapePicture.hs 59;" f -drawQuitTerminal src/Dodge/Render/Picture.hs 133;" f +drawQuitTerminal src/Dodge/Render/Picture.hs 135;" f drawRBOptions src/Dodge/Render/HUD.hs 251;" f drawRadarSweep src/Dodge/RadarSweep/Draw.hs 14;" f drawRemoteShell src/Dodge/Projectile/Draw.hs 38;" f -drawReturn src/Dodge/Render/Picture.hs 142;" f +drawReturn src/Dodge/Render/Picture.hs 144;" f drawRootCursor src/Dodge/Render/HUD.hs 76;" f drawSSCursor src/Dodge/SelectionSections/Draw.hs 35;" f drawSSMultiCursor src/Dodge/SelectionSections/Draw.hs 46;" f -drawSelect src/Dodge/Render/Picture.hs 243;" f -drawSelectionList src/Dodge/Render/List.hs 35;" f -drawSelectionListBackground src/Dodge/Render/List.hs 51;" f +drawSelect src/Dodge/Render/Picture.hs 245;" f +drawSelectionList src/Dodge/Render/List.hs 36;" f +drawSelectionListBackground src/Dodge/Render/List.hs 52;" f drawSelectionSections src/Dodge/SelectionSections/Draw.hs 16;" f drawShader src/Shader.hs 27;" f drawShaderLay src/Shader.hs 16;" f @@ -3437,10 +3439,10 @@ drawTerminalDisplay src/Dodge/Render/HUD.hs 360;" f drawTeslaArc src/Dodge/Tesla/Draw.hs 9;" f drawText src/Picture/Base.hs 220;" f drawTitle src/Dodge/Render/MenuScreen.hs 35;" f -drawTitleBackground src/Dodge/Render/List.hs 44;" f +drawTitleBackground src/Dodge/Render/List.hs 45;" f drawTractorBeam src/Dodge/TractorBeam/Draw.hs 7;" f drawTurret src/Dodge/Machine/Draw.hs 76;" f -drawVerticalDoubleArrow src/Dodge/Render/Picture.hs 198;" f +drawVerticalDoubleArrow src/Dodge/Render/Picture.hs 200;" f drawVerticalLampCover src/Dodge/Prop/Draw.hs 71;" f drawWall src/Dodge/Wall/Draw.hs 7;" f drawWallFace src/Dodge/Debug/Picture.hs 73;" f @@ -3565,7 +3567,7 @@ fireS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 464;" f firstBreather src/Dodge/Room/Breather.hs 9;" f firstTrie src/SimpleTrie.hs 51;" f firstWorldLoad appDodge/Main.hs 77;" f -fixedCoordPictures src/Dodge/Render/Picture.hs 18;" f +fixedCoordPictures src/Dodge/Render/Picture.hs 20;" f fixedSizePicClampArrow src/Dodge/Picture/SizeInvariant.hs 57;" f flFlicker src/Dodge/Flame.hs 38;" f flameMuzzles src/Dodge/HeldUse.hs 325;" f @@ -3614,7 +3616,7 @@ forceField src/Dodge/Wall/ForceField.hs 7;" f forceFoldable src/StrictHelp.hs 7;" f forceSpine src/StrictHelp.hs 4;" f fourEmbossDecoration src/Dodge/Placement/TopDecoration.hs 29;" f -fpsText src/Dodge/Render/Picture.hs 54;" f +fpsText src/Dodge/Render/Picture.hs 56;" f fractionLoadedAmmo src/Dodge/Item/Draw/SPic.hs 145;" f frag src/Shader/Data.hs 102;" f freeShaderPointers' src/Shader.hs 37;" f @@ -4056,7 +4058,7 @@ linksGridToPath src/Dodge/Room/Path.hs 36;" f linksOnPath src/Dodge/Room/CheckConsistency.hs 6;" f listConfig src/Dodge/Menu.hs 235;" f listControls src/Dodge/Menu.hs 247;" f -listCursorChooseBorderScale src/Dodge/Render/List.hs 134;" f +listCursorChooseBorderScale src/Dodge/Render/List.hs 135;" f listGuard src/Dodge/Creature/ReaderUpdate.hs 191;" f listSelectionColorPicture src/Dodge/DisplayInventory.hs 302;" f litCorridor90 src/Dodge/Room/RoadBlock.hs 26;" f @@ -4161,7 +4163,7 @@ makePathBetweenPs src/Dodge/Path.hs 54;" f makePathUsing src/Dodge/Path.hs 33;" f makePoisonExplosionAt src/Dodge/WorldEvent/Explosion.hs 25;" f makeRect src/Grid.hs 82;" f -makeSelectionListPictures src/Dodge/Render/List.hs 65;" f +makeSelectionListPictures src/Dodge/Render/List.hs 66;" f makeShaderEBO src/Shader/Compile.hs 53;" f makeShaderProgram src/Shader/Compile.hs 241;" f makeShaderUsingVAO src/Shader/Compile.hs 146;" f @@ -4278,7 +4280,7 @@ mntLightLnkCond src/Dodge/Placement/Instance/LightSource.hs 177;" f mntLightLnkCond' src/Dodge/Placement/Instance/LightSource.hs 182;" f modTo src/Geometry/Zone.hs 10;" f mouseClickOptionsList src/Dodge/Update/Input/ScreenLayer.hs 60;" f -mouseCursorType src/Dodge/Render/Picture.hs 87;" f +mouseCursorType src/Dodge/Render/Picture.hs 89;" f mouseWorldPos src/Dodge/Base/Coordinate.hs 25;" f moveBullet src/Dodge/Bullet.hs 196;" f moveCombineSel src/Dodge/Update/Scroll.hs 121;" f @@ -4745,7 +4747,7 @@ renderInfoListAt src/Dodge/Render/InfoBox.hs 17;" f renderInfoListsAt src/Dodge/Render/InfoBox.hs 44;" f renderLayer src/Render.hs 234;" f renderLightingNoShadows src/Render.hs 48;" f -renderListAt src/Dodge/Render/List.hs 191;" f +renderListAt src/Dodge/Render/List.hs 192;" f renderShadows src/Render.hs 117;" f replaceNullWith src/Dodge/Creature/ReaderUpdate.hs 163;" f replacePutID src/Dodge/Placement/Instance/Wall.hs 102;" f @@ -4882,7 +4884,7 @@ screenPosAbs src/Dodge/ScreenPos.hs 15;" f screenToWorldPos src/Dodge/Base/Coordinate.hs 28;" f scrollAugInvSel src/Dodge/Inventory.hs 191;" f scrollAugNextInSection src/Dodge/Inventory.hs 204;" f -scrollDebugInfoInt src/Dodge/Debug.hs 114;" f +scrollDebugInfoInt src/Dodge/Debug.hs 153;" f scrollRBOption src/Dodge/Update/Scroll.hs 202;" f scrollSelectionSections src/Dodge/SelectionSections.hs 28;" f scrollTimeBack src/Dodge/Update.hs 206;" f @@ -4905,12 +4907,12 @@ seedStartOptions src/Dodge/Menu.hs 90;" f segOnCirc src/Geometry.hs 113;" f selNumPos src/Dodge/Render/HUD.hs 447;" f selNumPosCardinal src/Dodge/Render/HUD.hs 470;" f -selSecDrawCursor src/Dodge/Render/List.hs 125;" f -selSecDrawCursorAt src/Dodge/Render/List.hs 104;" f +selSecDrawCursor src/Dodge/Render/List.hs 126;" f +selSecDrawCursorAt src/Dodge/Render/List.hs 105;" f selSecSelCol src/Dodge/Render/HUD.hs 501;" f selSecSelSize src/Dodge/SelectionSections.hs 143;" f selSecYint src/Dodge/SelectionSections.hs 152;" f -selectCreatureDebugItem src/Dodge/Debug.hs 106;" f +selectCreatureDebugItem src/Dodge/Debug.hs 145;" f selectedItemScroll src/Dodge/Update/Scroll.hs 51;" f sensAboveDoor src/Dodge/Room/SensorDoor.hs 53;" f sensInsideDoor src/Dodge/Room/SensorDoor.hs 59;" f @@ -5153,8 +5155,8 @@ ssScrollMinOnFail src/Dodge/SelectionSections.hs 44;" f ssScrollUsing src/Dodge/SelectionSections.hs 37;" f ssSetCursor src/Dodge/SelectionSections.hs 59;" f ssfold src/FoldableHelp.hs 105;" f -stackPicturesAt src/Dodge/Render/List.hs 98;" f -stackPicturesAtOff src/Dodge/Render/List.hs 101;" f +stackPicturesAt src/Dodge/Render/List.hs 99;" f +stackPicturesAtOff src/Dodge/Render/List.hs 102;" f stackText src/Picture/Base.hs 188;" f stackedInventory src/Dodge/Creature.hs 311;" f startCr src/Dodge/Creature.hs 92;" f @@ -5300,7 +5302,7 @@ toFloatVAs src/Shader/Compile.hs 211;" f toLabel src/Dodge/Cleat.hs 16;" f toMultiset src/Multiset.hs 64;" f toOnward src/Dodge/Tree/Compose.hs 101;" f -toTopLeft src/Dodge/Render/List.hs 218;" f +toTopLeft src/Dodge/Render/List.hs 226;" f toV2 src/Geometry/Data.hs 54;" f toV3 src/Geometry/Data.hs 57;" f toV4 src/Geometry/Data.hs 60;" f