From 477bb8b4b293323e0249e0f09103fc4a27a2dccf Mon Sep 17 00:00:00 2001 From: justin Date: Tue, 7 Oct 2025 14:21:40 +0100 Subject: [PATCH] Tweak led attachment orientation --- src/Dodge/Item/Draw.hs | 1 + src/Dodge/Item/Draw/SPic.hs | 18 +--- src/Dodge/Item/Orientation.hs | 24 +++++- tags | 154 +++++++++++++++++----------------- 4 files changed, 102 insertions(+), 95 deletions(-) diff --git a/src/Dodge/Item/Draw.hs b/src/Dodge/Item/Draw.hs index cd374412e..0ddfdc4f5 100644 --- a/src/Dodge/Item/Draw.hs +++ b/src/Dodge/Item/Draw.hs @@ -2,6 +2,7 @@ module Dodge.Item.Draw (itemEquipPict) where +import Dodge.Item.Draw.SPicTree import Control.Lens import Dodge.Creature.HandPos import Dodge.Data.ComposedItem diff --git a/src/Dodge/Item/Draw/SPic.hs b/src/Dodge/Item/Draw/SPic.hs index f3b7bb65a..c4a1e75d9 100644 --- a/src/Dodge/Item/Draw/SPic.hs +++ b/src/Dodge/Item/Draw/SPic.hs @@ -1,34 +1,18 @@ {-# LANGUAGE LambdaCase #-} -module Dodge.Item.Draw.SPic ( - itemSPic, - itemTreeSPic, -) where +module Dodge.Item.Draw.SPic (itemSPic) where import Color import Data.Maybe import Data.Strict.Tuple -import Dodge.Data.ComposedItem -import Dodge.Data.DoubleTree import Dodge.Data.Item import Dodge.Item.MaxAmmo -import Dodge.Item.Orientation import Geometry import LensHelp -import qualified Linear.Quaternion as Q ---import qualified Linear.Quaternion as Q import Picture import Shape import ShapePicture -itemTreeSPic :: DTree CItem -> SPic -itemTreeSPic (DT (itm, _) l r) = itemSPic itm <> foldMap (itemRotTreeSPic itm) (l <> r) - -itemRotTreeSPic :: Item -> DTree CItem -> SPic -itemRotTreeSPic par t = translateSP p . overPosSP (Q.rotate q) $ itemTreeSPic t - where - (p, q) = orientAttachment par itm - itm = t ^. dtValue itemSPic :: Item -> SPic itemSPic it = case it ^. itType of diff --git a/src/Dodge/Item/Orientation.hs b/src/Dodge/Item/Orientation.hs index 168ee1252..4d02f3e2a 100644 --- a/src/Dodge/Item/Orientation.hs +++ b/src/Dodge/Item/Orientation.hs @@ -3,6 +3,10 @@ module Dodge.Item.Orientation ( propagateOrientation, ) where +import Shape.Data +import Control.Lens +import Linear +import Dodge.Item.Draw.SPic import Dodge.Data.ComposedItem import Dodge.Data.DoubleTree import Dodge.Data.Item @@ -12,7 +16,8 @@ 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 0 5 0, Q.qID) + HELD LED -> (V3 (-x) (y-1) 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) @@ -20,18 +25,35 @@ orientChild itm = case _itType itm of where --r = Q.axisAngle (V3 0 0 1) (-pi/4) r = Q.qID + y = itemShapeY itm + x = itemShapeX itm orientByParentChSF :: Item -> ItemSF -> Point3Q orientByParentChSF itm lt = case (_itType itm, lt) of (HELD FLAMETHROWER, AmmoMagSF{}) -> (V3 4 (-6) 0, Q.qID) (HELD _, AmmoMagSF{}) -> (V3 7 (-4) 0, Q.qID) (HELD _, WeaponScopeSF) -> (V3 5 0 5, Q.qID) + (HELD _, TorchSF) -> (V3 x y 5, Q.qID) _ -> (0, Q.qID) + where + x = itemShapeX itm + y = itemShapeY itm + +itemShapeX :: Item -> Float +itemShapeX = f . (^. _1) . itemSPic + where + f = maximum . fmap (\sf -> maximum $ fmap (^. _1) (sf ^. sfVs)) + +itemShapeY :: Item -> Float +itemShapeY = f . (^. _1) . itemSPic + where + f = maximum . fmap (\sf -> maximum $ fmap (^. _2) (sf ^. sfVs)) orientAttachment :: Item -> CItem -> Point3Q orientAttachment par (ch,chsf) = case (_itType par, chsf) of (ATTACH UNDERBARRELSLOT, _) -> (V3 (-5) (-8) 0, Q.qID) (_,LaserWeaponSF) -> (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) diff --git a/tags b/tags index ad6efdff5..79a1615b4 100644 --- a/tags +++ b/tags @@ -2617,7 +2617,7 @@ allVisibleWalls src/Dodge/Base/Collide.hs 215;" f alongSegBy src/Geometry.hs 41;" f alteRifle src/Dodge/Item/Held/Cane.hs 22;" f ammoMagInfo src/Dodge/Item/Info.hs 49;" f -ammoMagSPic src/Dodge/Item/Draw/SPic.hs 144;" f +ammoMagSPic src/Dodge/Item/Draw/SPic.hs 128;" f amr src/Dodge/Item/Held/Rod.hs 34;" f anRoom src/Dodge/Floor.hs 117;" f analyser src/Dodge/Placement/Instance/Analyser.hs 12;" f @@ -2702,10 +2702,10 @@ bQuadToF src/Geometry/Bezier.hs 37;" f bQuadToLine src/Geometry/Bezier.hs 30;" f backPQ src/Dodge/Creature/HandPos.hs 127;" f backpackCombinations src/Dodge/Combine/Combinations.hs 27;" f -backpackShape src/Dodge/Item/Draw/SPic.hs 202;" f +backpackShape src/Dodge/Item/Draw/SPic.hs 186;" f backspaceInputted src/Dodge/Update/Input/Text.hs 25;" f bangCone src/Dodge/Item/Held/Cone.hs 11;" f -bangConeShape src/Dodge/Item/Draw/SPic.hs 319;" f +bangConeShape src/Dodge/Item/Draw/SPic.hs 303;" f bangEchoS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 516;" f bangRod src/Dodge/Item/Held/Rod.hs 18;" f bangS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 668;" f @@ -2713,18 +2713,18 @@ bangStick src/Dodge/Item/Held/Stick.hs 15;" f barPP src/Dodge/Room/Foreground.hs 236;" f barrel src/Dodge/Creature/Inanimate.hs 17;" f barrelShape src/Dodge/Render/ShapePicture.hs 70;" f -baseAMRShape src/Dodge/Item/Draw/SPic.hs 422;" f +baseAMRShape src/Dodge/Item/Draw/SPic.hs 406;" f baseBlockPane src/Dodge/Placement/Instance/Wall.hs 86;" f baseCI src/Dodge/Item/Grammar.hs 158;" f -baseCaneShape src/Dodge/Item/Draw/SPic.hs 339;" f +baseCaneShape src/Dodge/Item/Draw/SPic.hs 323;" f baseFloorTileSize src/Tile.hs 45;" f baseItemTriggerType src/Dodge/BaseTriggerType.hs 21;" f -baseRifleShape src/Dodge/Item/Draw/SPic.hs 342;" f -baseRodShape src/Dodge/Item/Draw/SPic.hs 419;" f -baseSMGShape src/Dodge/Item/Draw/SPic.hs 407;" f +baseRifleShape src/Dodge/Item/Draw/SPic.hs 326;" f +baseRodShape src/Dodge/Item/Draw/SPic.hs 403;" f +baseSMGShape src/Dodge/Item/Draw/SPic.hs 391;" f baseShoulder src/Dodge/Creature/Picture.hs 116;" f -baseStickShape src/Dodge/Item/Draw/SPic.hs 316;" f -baseStickShapeX src/Dodge/Item/Draw/SPic.hs 308;" f +baseStickShape src/Dodge/Item/Draw/SPic.hs 300;" f +baseStickShapeX src/Dodge/Item/Draw/SPic.hs 292;" f baseStickSpread src/Dodge/HeldUse.hs 311;" f basicAttentionUpdate src/Dodge/Creature/Perception.hs 128;" f basicAwarenessUpdate src/Dodge/Creature/Perception.hs 38;" f @@ -2809,7 +2809,7 @@ bulletWeapons src/Dodge/Combine/Combinations.hs 248;" f burstRifle src/Dodge/Item/Held/Cane.hs 30;" f buttonFlip src/Dodge/Button/Event.hs 17;" f buzzS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 702;" f -cChasm src/Dodge/Room/Tutorial.hs 124;" f +cChasm src/Dodge/Room/Tutorial.hs 108;" f cFilledRect src/Dodge/CharacterEnums.hs 6;" f cWireRect src/Dodge/CharacterEnums.hs 10;" f calcSmoothScroll src/Dodge/SmoothScroll.hs 11;" f @@ -2843,7 +2843,7 @@ chaseCritAwarenessUpdate src/Dodge/Creature/Perception.hs 70;" f chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 114;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 31;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 37;" f -chasmSimpleMaze src/Dodge/Room/Tutorial.hs 191;" f +chasmSimpleMaze src/Dodge/Room/Tutorial.hs 175;" f chasmTest src/Dodge/Creature/Update.hs 131;" f chasmWallToSurface src/Dodge/Base/Collide.hs 110;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f @@ -3028,7 +3028,7 @@ crWarningSounds src/Dodge/Creature/Vocalization.hs 23;" f crWlPbHit src/Dodge/WorldEvent/ThingsHit.hs 41;" f crZoneSize src/Dodge/Zoning/Creature.hs 41;" f craftInfo src/Dodge/Item/Info.hs 169;" f -craftItemSPic src/Dodge/Item/Draw/SPic.hs 56;" f +craftItemSPic src/Dodge/Item/Draw/SPic.hs 40;" f crankSlowS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 590;" f createForceField src/Dodge/ForceField.hs 7;" f createGas src/Dodge/Gas.hs 8;" f @@ -3143,7 +3143,7 @@ dededumS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 628;" f dedumS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 444;" f defDamageMaterial src/Dodge/Material/Damage.hs 22;" f defLSPic src/Dodge/LightSource/Draw.hs 10;" f -defSPic src/Dodge/Item/Draw/SPic.hs 325;" f +defSPic src/Dodge/Item/Draw/SPic.hs 309;" f defaultAimMvType src/Dodge/Creature/MoveType.hs 16;" f defaultAimingCrit src/Dodge/Default/Creature.hs 107;" f defaultAudition src/Dodge/Default/Creature.hs 92;" f @@ -3214,7 +3214,7 @@ destroyMounts src/Dodge/Block.hs 97;" f destroyProjectile src/Dodge/Projectile/Update.hs 160;" f detV src/Geometry/Vector.hs 93;" f detector src/Dodge/Item/Held/Utility.hs 27;" f -detectorColor src/Dodge/Item/Draw/SPic.hs 469;" f +detectorColor src/Dodge/Item/Draw/SPic.hs 453;" f detectorInfo src/Dodge/Item/Info.hs 224;" f determineProjectileTracking src/Dodge/HeldUse.hs 1228;" f diagonalLinesRect src/Dodge/Room/Foreground.hs 52;" f @@ -3279,8 +3279,8 @@ doFloatFloat src/Dodge/FloatFunction.hs 5;" f doGenFloat src/Dodge/HeldUse.hs 1184;" f doGravityPU src/Dodge/Projectile/Update.hs 36;" f doHeldUseEffect src/Dodge/HeldUse.hs 343;" f -doInPlacements src/Dodge/Layout.hs 81;" f -doIndividualPlacements src/Dodge/Layout.hs 95;" f +doInPlacements src/Dodge/Layout.hs 82;" f +doIndividualPlacements src/Dodge/Layout.hs 96;" f doInputScreenInput src/Dodge/Update/Input/ScreenLayer.hs 28;" f doIntImp src/Dodge/CreatureEffect.hs 24;" f doItemTimeScroll src/Dodge/Update.hs 191;" f @@ -3299,7 +3299,7 @@ doQuickload src/Dodge/Save.hs 82;" f doQuicksave src/Dodge/Save.hs 77;" f doRandImpulse src/Dodge/RandImpulse.hs 7;" f doRegexInput src/Dodge/Update/Input/InGame.hs 447;" f -doRoomPlacements src/Dodge/Layout.hs 98;" f +doRoomPlacements src/Dodge/Layout.hs 99;" f doRoomShift src/Dodge/Room/Link.hs 33;" f doScopeZoom src/Dodge/Update/Scroll.hs 91;" f doSectionSize src/Dodge/DisplayInventory.hs 211;" f @@ -3519,11 +3519,11 @@ eqConstr src/SameConstr.hs 17;" f eqPosText src/Dodge/Equipment/Text.hs 5;" f eqTypeToSites src/Dodge/Inventory/RBList.hs 77;" f equipAllocString src/Dodge/Render/HUD.hs 310;" f -equipAttachPos src/Dodge/Item/Draw.hs 29;" f +equipAttachPos src/Dodge/Item/Draw.hs 30;" f equipBackgroundEffect src/Dodge/Euse.hs 15;" f equipInfo src/Dodge/Item/Info.hs 141;" f -equipItemSPic src/Dodge/Item/Draw/SPic.hs 173;" f -equipPosition src/Dodge/Item/Draw.hs 37;" f +equipItemSPic src/Dodge/Item/Draw/SPic.hs 157;" f +equipPosition src/Dodge/Item/Draw.hs 38;" f equipSiteInfo src/Dodge/Item/Info.hs 253;" f equipSitePQ src/Dodge/Creature/HandPos.hs 26;" f equipType src/Dodge/Data/EquipType.hs 10;" f @@ -3587,12 +3587,12 @@ flameSpitter src/Dodge/Item/Held/SprayGuns.hs 23;" f flameThrower src/Dodge/Item/Held/SprayGuns.hs 64;" f flameTorrent src/Dodge/Item/Held/SprayGuns.hs 32;" f flameWall src/Dodge/Item/Held/SprayGuns.hs 48;" f -flamerPic src/Dodge/Item/Draw/SPic.hs 410;" f +flamerPic src/Dodge/Item/Draw/SPic.hs 394;" f flareCircleAt src/Dodge/HeldUse.hs 687;" f flatItemCombinations src/Dodge/Combine/Combinations.hs 51;" f flatLookupItems src/Dodge/Combine.hs 38;" f flatShield src/Dodge/Item/Held/Utility.hs 17;" f -flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 456;" f +flatShieldEquipSPic src/Dodge/Item/Draw/SPic.hs 440;" f fleeFrom src/Dodge/CreatureEffect.hs 120;" f fleeFromTarget src/Dodge/CreatureEffect.hs 66;" f flickerMod src/Dodge/Placement/Instance/LightSource/Flicker.hs 10;" f @@ -3612,7 +3612,7 @@ floorItemSPic src/Dodge/Render/ShapePicture.hs 117;" f floorWire src/Dodge/Wire.hs 13;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 558;" f foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 554;" f -foldMTRS src/Dodge/Room/Tutorial.hs 69;" f +foldMTRS src/Dodge/Room/Tutorial.hs 53;" f foldPairs src/ListHelp.hs 37;" f foldrWhileArb src/ListHelp.hs 110;" f followImpulse src/Dodge/Creature/Impulse.hs 39;" f @@ -3627,7 +3627,7 @@ 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 53;" f -fractionLoadedAmmo src/Dodge/Item/Draw/SPic.hs 161;" f +fractionLoadedAmmo src/Dodge/Item/Draw/SPic.hs 145;" f frag src/Shader/Data.hs 102;" f freeShaderPointers' src/Shader.hs 37;" f fridgeHumS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 500;" f @@ -3650,16 +3650,16 @@ gLauncher src/Dodge/Item/Held/Launcher.hs 24;" f gRandify src/Dodge/Randify.hs 11;" f gadgetEffect src/Dodge/HeldUse.hs 46;" f gameOverMenu src/Dodge/Menu.hs 208;" f -gameRoomFromRoom src/Dodge/Layout.hs 146;" f +gameRoomFromRoom src/Dodge/Layout.hs 147;" f gameRoomViewpoints src/Dodge/Viewpoints.hs 35;" f -gameRoomsFromRooms src/Dodge/Layout.hs 143;" f +gameRoomsFromRooms src/Dodge/Layout.hs 144;" f gameplayMenu src/Dodge/Menu.hs 155;" f gameplayMenuOptions src/Dodge/Menu.hs 158;" f gasType src/Dodge/HeldUse.hs 1141;" f generateGenParams src/Dodge/LevelGen/LevelStructure.hs 23;" f generateGraphs src/Dodge/Menu.hs 149;" f generateLayout src/Dodge/Layout/Generate.hs 10;" f -generateLevelFromRoomList src/Dodge/Layout.hs 33;" f +generateLevelFromRoomList src/Dodge/Layout.hs 34;" f generateWorldFromSeed src/Dodge/LevelGen.hs 17;" f geom src/Shader/Data.hs 102;" f geometryQuickCheckTests test/Spec.hs 55;" f @@ -3677,8 +3677,8 @@ getCloseObj src/Dodge/Update/Input/InGame.hs 533;" f getCommand src/Dodge/Terminal.hs 52;" f getCommands src/Dodge/Terminal.hs 49;" f getCrMoveSpeed src/Dodge/Creature/Statistics.hs 50;" f -getCrsFromRooms src/Dodge/Room/Tutorial.hs 335;" f -getCrsFromRooms' src/Dodge/Room/Tutorial.hs 322;" f +getCrsFromRooms src/Dodge/Room/Tutorial.hs 321;" f +getCrsFromRooms' src/Dodge/Room/Tutorial.hs 308;" f getDistortions src/Dodge/Render.hs 435;" f getGrenadeHitEffect src/Dodge/HeldUse.hs 1296;" f getInventoryPath src/Dodge/Inventory/Path.hs 9;" f @@ -3693,13 +3693,13 @@ getNodePos src/Dodge/Path.hs 31;" f getPJStabiliser src/Dodge/HeldUse.hs 1283;" f getPretty src/AesonHelp.hs 8;" f getPromptTM src/Dodge/Terminal/Type.hs 3;" f -getRoomsFromInts src/Dodge/Room/Tutorial.hs 318;" f +getRoomsFromInts src/Dodge/Room/Tutorial.hs 304;" f getRootItemBounds src/Dodge/Render/HUD.hs 100;" f getRootItemInvID src/Dodge/Inventory/Location.hs 35;" f getSelectedCloseObj src/Dodge/SelectedClose.hs 14;" f getSmoothScrollValue src/Dodge/SmoothScroll.hs 21;" f getSplitString src/Dodge/Debug/Terminal.hs 129;" f -getTiles src/Dodge/Layout.hs 193;" f +getTiles src/Dodge/Layout.hs 194;" f getViewpoints src/Dodge/Viewpoints.hs 29;" f getVolleyBurst src/Dodge/HeldUse.hs 125;" f getWallSPic src/Dodge/Render/Walls.hs 51;" f @@ -3718,7 +3718,7 @@ glassShat3S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 458;" f glassShat4S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 612;" f glassSwitchBack src/Dodge/Room/Room.hs 72;" f glassSwitchBackCrits src/Dodge/Room/Room.hs 106;" f -glauncherPic src/Dodge/Item/Draw/SPic.hs 416;" f +glauncherPic src/Dodge/Item/Draw/SPic.hs 400;" f glushortSize src/Shader/Parameters.hs 25;" f goToPostStrat src/Dodge/Creature/Strategy.hs 10;" f goToTarget src/Dodge/Creature/ReaderUpdate.hs 138;" f @@ -3771,7 +3771,7 @@ hasLOSIndirect src/Dodge/Base/Collide.hs 310;" f hat src/Dodge/Item/Equipment.hs 76;" f head src/DoubleStack.hs 14;" f headLamp src/Dodge/Item/Equipment.hs 79;" f -headLampShape src/Dodge/Item/Draw/SPic.hs 459;" f +headLampShape src/Dodge/Item/Draw/SPic.hs 443;" f headMap src/Dodge/DoubleTree.hs 249;" f headPQ src/Dodge/Creature/HandPos.hs 115;" f healS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 492;" f @@ -3790,7 +3790,7 @@ heldItemInvLock src/Dodge/HeldUse.hs 434;" f heldItemMuzVel src/Dodge/HeldUse.hs 1021;" f heldItemMuzzles src/Dodge/HeldUse.hs 175;" f heldItemRifling src/Dodge/HeldUse.hs 1064;" f -heldItemSPic src/Dodge/Item/Draw/SPic.hs 249;" f +heldItemSPic src/Dodge/Item/Draw/SPic.hs 233;" f heldItemWeight src/Dodge/Creature/Statistics.hs 80;" f heldPositionInfo src/Dodge/Item/Info.hs 240;" f heldTorqueAmount src/Dodge/HeldUse.hs 578;" f @@ -3949,7 +3949,7 @@ itemCombinations src/Dodge/Combine/Combinations.hs 56;" f itemCombinationsEdges src/Dodge/Combine/Graph.hs 61;" f itemDetectorEffect src/Dodge/HeldUse.hs 767;" f itemDisplay src/Dodge/Inventory/SelectionList.hs 50;" f -itemEquipPict src/Dodge/Item/Draw.hs 17;" f +itemEquipPict src/Dodge/Item/Draw.hs 18;" f itemExternalValue src/Dodge/Inventory/SelectionList.hs 85;" f itemFromAmmoMag src/Dodge/Item.hs 42;" f itemFromAttachType src/Dodge/Item.hs 51;" f @@ -3962,16 +3962,17 @@ itemInvColor src/Dodge/Item/InventoryColor.hs 9;" f itemInvLock src/Dodge/HeldUse.hs 429;" f itemMuzzles src/Dodge/HeldUse.hs 161;" f itemRooms src/Dodge/LockAndKey.hs 39;" f -itemRotTreeSPic src/Dodge/Item/Draw/SPic.hs 27;" f -itemSPic src/Dodge/Item/Draw/SPic.hs 33;" f +itemRotTreeSPic src/Dodge/Item/Draw/SPicTree.hs 16;" f +itemSPic src/Dodge/Item/Draw/SPic.hs 17;" f itemScan src/Dodge/Item/Scope.hs 63;" f itemScroll src/Dodge/Update/Scroll.hs 57;" f itemScrollDisplay src/Dodge/Inventory/SelectionList.hs 124;" f itemScrollValue src/Dodge/Inventory/SelectionList.hs 151;" f +itemShapeX src/Dodge/Item/Orientation.hs 39;" f itemSidePush src/Dodge/HeldUse.hs 377;" f itemString src/Dodge/Item/Display.hs 56;" f itemToFunction src/Dodge/Item/Grammar.hs 107;" f -itemTreeSPic src/Dodge/Item/Draw/SPic.hs 24;" f +itemTreeSPic src/Dodge/Item/Draw/SPicTree.hs 13;" f itemTriggerType src/Dodge/BaseTriggerType.hs 16;" f itemWeight src/Dodge/Creature/Statistics.hs 74;" f iterateUntil src/MonadHelp.hs 23;" f @@ -3997,10 +3998,10 @@ keyCard src/Dodge/Item/Held/Utility.hs 20;" f keyCardAnalyserByDoor src/Dodge/Room/LasTurret.hs 78;" f keyCardRoomRunPast src/Dodge/Room/LasTurret.hs 66;" f keyCardRunPastRand src/Dodge/LockAndKey.hs 36;" f -keyPic src/Dodge/Item/Draw/SPic.hs 475;" f +keyPic src/Dodge/Item/Draw/SPic.hs 459;" f keyholeCorridor src/Dodge/Room/Corridor.hs 39;" f knifeS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 638;" f -lChasm src/Dodge/Room/Tutorial.hs 133;" f +lChasm src/Dodge/Room/Tutorial.hs 117;" f lConnect src/Dodge/Render/Connectors.hs 42;" f lConnectMulti src/Dodge/Render/Connectors.hs 46;" f lShape src/Dodge/Placement/Instance/LightSource.hs 90;" f @@ -4009,7 +4010,7 @@ lampCover src/Dodge/Placement/Instance/LightSource/Cover.hs 8;" f lampCoverWhen src/Dodge/Placement/Instance/LightSource/Cover.hs 19;" f lampCrSPic src/Dodge/Render/ShapePicture.hs 75;" f lasCenSensEdge src/Dodge/Room/LasTurret.hs 141;" f -lasGunPic src/Dodge/Item/Draw/SPic.hs 428;" f +lasGunPic src/Dodge/Item/Draw/SPic.hs 412;" f lasPulseS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 526;" f lasSensorTurretTest src/Dodge/Room/LasTurret.hs 134;" f lasTunnel src/Dodge/Room/LasTurret.hs 153;" f @@ -4041,7 +4042,7 @@ leftLegPQ src/Dodge/Creature/HandPos.hs 84;" f leftPad src/Padding.hs 15;" f leftRightCombine src/Dodge/Item/Grammar.hs 197;" f leftWristPQ src/Dodge/Creature/HandPos.hs 81;" f -legsSPic src/Dodge/Item/Draw/SPic.hs 484;" f +legsSPic src/Dodge/Item/Draw/SPic.hs 468;" f liShape src/Dodge/Placement/Instance/LightSource.hs 112;" f light src/Color.hs 104;" f lightSensByDoor src/Dodge/Room/LasTurret.hs 51;" f @@ -4251,7 +4252,7 @@ mglCreate src/GLHelp.hs 8;" f mglDelete src/GLHelp.hs 14;" f midBarDecoration src/Dodge/Placement/TopDecoration.hs 16;" f midBounds src/Dodge/Room/Foreground.hs 151;" f -midChasm src/Dodge/Room/Tutorial.hs 154;" f +midChasm src/Dodge/Room/Tutorial.hs 138;" f midPad src/Padding.hs 27;" f midPadL src/Padding.hs 33;" f midPoint src/Geometry.hs 84;" f @@ -4262,8 +4263,8 @@ minOn src/FoldableHelp.hs 35;" f mini1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 452;" f miniGunCrit src/Dodge/Creature.hs 63;" f miniGunX src/Dodge/Item/Held/Cane.hs 33;" f -miniGunXPict src/Dodge/Item/Draw/SPic.hs 388;" f -miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 385;" f +miniGunXPict src/Dodge/Item/Draw/SPic.hs 372;" f +miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 369;" f miniS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 716;" f miniTree2 src/Dodge/Room/Room.hs 113;" f minimumOn src/FoldlHelp.hs 14;" f @@ -4387,9 +4388,9 @@ orderAroundFirst src/Geometry/Polygon.hs 119;" f orderAroundFirstReverse src/Geometry/Polygon.hs 115;" f orderPolygon src/Geometry/Polygon.hs 124;" f orderPolygonAround src/Geometry/Polygon.hs 107;" f -orientAttachment src/Dodge/Item/Orientation.hs 31;" f -orientByParentChSF src/Dodge/Item/Orientation.hs 24;" f -orientChild src/Dodge/Item/Orientation.hs 13;" f +orientAttachment src/Dodge/Item/Orientation.hs 44;" f +orientByParentChSF src/Dodge/Item/Orientation.hs 29;" f +orientChild src/Dodge/Item/Orientation.hs 17;" f orthogonalPointOnSeg src/Geometry/Intersect.hs 326;" f outLink src/Dodge/RoomLink.hs 120;" f outsideScreenPolygon src/Dodge/Debug/Picture.hs 43;" f @@ -4552,8 +4553,8 @@ pokeWall src/Shader/Poke.hs 78;" f pokeWallsWindows src/Shader/Poke.hs 50;" f poly3 src/Picture/Base.hs 84;" f poly3Col src/Picture/Base.hs 88;" f -polyChasm src/Dodge/Room/Tutorial.hs 175;" f -polyChasmC src/Dodge/Room/Tutorial.hs 184;" f +polyChasm src/Dodge/Room/Tutorial.hs 159;" f +polyChasmC src/Dodge/Room/Tutorial.hs 168;" f polyCirc src/Shape.hs 46;" f polyCircx src/Shape.hs 51;" f polyCornerDist src/Geometry/Polygon.hs 60;" f @@ -4613,7 +4614,7 @@ propSPic src/Dodge/Prop/Draw.hs 17;" f propSetToggleAnd src/Dodge/Prop/Update.hs 39;" f propUpdateIf src/Dodge/Prop/Update.hs 23;" f propUpdatePosition src/Dodge/Prop/Update.hs 28;" f -propagateOrientation src/Dodge/Item/Orientation.hs 42;" f +propagateOrientation src/Dodge/Item/Orientation.hs 56;" f ps0 src/Dodge/LevelGen/PlacementHelper.hs 51;" f ps0PushPS src/Dodge/LevelGen/PlacementHelper.hs 79;" f ps0PushPSw src/Dodge/LevelGen/PlacementHelper.hs 83;" f @@ -4696,7 +4697,7 @@ randSpark src/Dodge/Spark.hs 69;" f randSparkExtraVel src/Dodge/Spark.hs 92;" f randWallReflect src/Dodge/Update.hs 626;" f randomChallenges src/Dodge/Room/Start.hs 63;" f -randomCompass src/Dodge/Layout.hs 57;" f +randomCompass src/Dodge/Layout.hs 58;" f randomFourCornerRoom src/Dodge/Room/Procedural.hs 268;" f randomFourCornerRoomCrsIts src/Dodge/Room/Procedural.hs 280;" f randomLightPositions src/Dodge/Room/Modify/Girder.hs 152;" f @@ -4744,7 +4745,7 @@ removeAimPosture src/Dodge/Creature/YourControl.hs 158;" f removeAmmoFromMag src/Dodge/HeldUse.hs 920;" f removeDot src/ShortShow.hs 40;" f removeInverseWalls src/Dodge/LevelGen/StaticWalls.hs 25;" f -removeLights src/Dodge/Room/Tutorial.hs 236;" f +removeLights src/Dodge/Room/Tutorial.hs 222;" f removeShieldWall src/Dodge/Item/BackgroundEffect.hs 57;" f removeWallsInPolygon src/Dodge/LevelGen/StaticWalls.hs 182;" f renderDataResizeUpdate src/Preload/Update.hs 26;" f @@ -4796,7 +4797,7 @@ rightPad src/Padding.hs 19;" f rightPadNoSquash src/Padding.hs 23;" f rightWristPQ src/Dodge/Creature/HandPos.hs 57;" f rlPosDir src/Dodge/RoomLink.hs 112;" f -rlauncherPic src/Dodge/Item/Draw/SPic.hs 413;" f +rlauncherPic src/Dodge/Item/Draw/SPic.hs 397;" f rmInLinks src/Dodge/RoomLink.hs 153;" f rmInvItem src/Dodge/Inventory.hs 73;" f rmLinksOfType src/Dodge/RoomLink.hs 150;" f @@ -4928,7 +4929,7 @@ sensorReqToString src/Dodge/Machine/Update.hs 196;" f sensorRoom src/Dodge/Room/SensorDoor.hs 26;" f sensorRoomRunPast src/Dodge/Room/SensorDoor.hs 46;" f sensorSPic src/Dodge/Machine/Draw.hs 81;" f -sensorTut src/Dodge/Room/Tutorial.hs 344;" f +sensorTut src/Dodge/Room/Tutorial.hs 330;" f sensorTypeDamages src/Dodge/Machine/Update.hs 233;" f sentinelAI src/Dodge/Creature/SentinelAI.hs 20;" f sentinelExtraWatchUpdate src/Dodge/Creature/SentinelAI.hs 83;" f @@ -4954,17 +4955,17 @@ setOutLinks src/Dodge/RoomLink.hs 50;" f setOutLinksByType src/Dodge/RoomLink.hs 75;" f setOutLinksPD src/Dodge/RoomLink.hs 95;" f setRBCreatureTargeting src/Dodge/Creature/State.hs 288;" f -setRoomInt src/Dodge/Room/Tutorial.hs 76;" f +setRoomInt src/Dodge/Room/Tutorial.hs 60;" f setSelWhileDragging src/Dodge/Update/Input/InGame.hs 337;" f setSelectionListRestriction src/Dodge/Update/Input/ScreenLayer.hs 87;" f setShaderSource src/Shader/Compile.hs 290;" f setShadowLimits src/Dodge/Shadows.hs 11;" f setSoundVolume src/Sound.hs 157;" f setTargetMv src/Dodge/Creature/ReaderUpdate.hs 76;" f -setTile src/Dodge/Layout.hs 66;" f -setTiles src/Dodge/Layout.hs 63;" f +setTile src/Dodge/Layout.hs 67;" f +setTiles src/Dodge/Layout.hs 64;" f setToggle src/Dodge/Prop/Update.hs 44;" f -setTreeInts src/Dodge/Room/Tutorial.hs 83;" f +setTreeInts src/Dodge/Room/Tutorial.hs 67;" f setViewDistance src/Dodge/Update/Camera.hs 236;" f setViewPos src/Dodge/Creature/ReaderUpdate.hs 63;" f setViewport src/Dodge/Render.hs 440;" f @@ -4986,7 +4987,7 @@ setupVBOStatic src/Shader/Compile.hs 116;" f setupVBOVAO src/Shader/Compile.hs 200;" f setupVertexAttribPointer src/Shader/Compile.hs 224;" f setupVertexAttribs src/Shader/Compile.hs 218;" f -setupWorldBounds src/Dodge/Layout.hs 110;" f +setupWorldBounds src/Dodge/Layout.hs 111;" f sfInvColor src/Dodge/Item/InventoryColor.hs 12;" f shadVBOptr src/Shader.hs 40;" f shaderTypeExt src/Shader/Compile.hs 172;" f @@ -4995,7 +4996,7 @@ shapePoints src/Dodge/Room/Foreground.hs 145;" f shapeVerxAttributes src/Shape/Parameters.hs 13;" f shapeVerxSize src/Shape/Parameters.hs 10;" f shatterGun src/Dodge/Item/Held/Weapons.hs 8;" f -shatterGunSPic src/Dodge/Item/Draw/SPic.hs 328;" f +shatterGunSPic src/Dodge/Item/Draw/SPic.hs 312;" f shatterWall src/Dodge/Item/Weapon/Shatter.hs 26;" f shellExplosionCheck src/Dodge/Projectile/Update.hs 56;" f shellHitCreature src/Dodge/Projectile/Update.hs 84;" f @@ -5058,7 +5059,7 @@ shrinkPolyOnEdges src/Geometry/Polygon.hs 173;" f shrinkVert src/Geometry/Polygon.hs 177;" f shuffle src/RandomHelp.hs 49;" f shuffleLinks src/Dodge/Room/Link.hs 30;" f -shuffleRoomPos src/Dodge/Layout.hs 76;" f +shuffleRoomPos src/Dodge/Layout.hs 77;" f shuffleTail src/RandomHelp.hs 59;" f sigmoid src/Dodge/Base.hs 151;" f simpleCrSprings src/Dodge/Update.hs 847;" f @@ -5247,13 +5248,12 @@ terminalScreenGlow src/Dodge/Machine/Update.hs 39;" f terminalShape src/Dodge/Machine/Draw.hs 43;" f terminalWheelEvent src/Dodge/Update/Scroll.hs 131;" f teslaGun src/Dodge/Item/Held/BatteryGuns.hs 19;" f -teslaGunPic src/Dodge/Item/Draw/SPic.hs 425;" f +teslaGunPic src/Dodge/Item/Draw/SPic.hs 409;" f teslaParams src/Dodge/Item/Held/BatteryGuns.hs 25;" f testCrossWalls src/Dodge/Room/Path.hs 41;" f testEvent src/Dodge/Event/Test.hs 9;" f testInventory src/Dodge/Creature.hs 292;" f testStringInit src/Dodge/TestString.hs 33;" f -testf src/Dodge/Room/Tutorial.hs 41;" f text src/Picture/Base.hs 193;" f textGrad src/Picture/Text.hs 5;" f textInputBlurb src/Dodge/Terminal.hs 37;" f @@ -5282,7 +5282,7 @@ thingsHitExceptCr src/Dodge/WorldEvent/ThingsHit.hs 92;" f threeLineDecoration src/Dodge/Placement/TopDecoration.hs 61;" f throwItem src/Dodge/Creature/Action.hs 211;" f tileTexCoords src/Tile.hs 11;" f -tilesFromRooms src/Dodge/Layout.hs 190;" f +tilesFromRooms src/Dodge/Layout.hs 191;" f tilesToLine src/Shader/AuxAddition.hs 66;" f timeFlowUpdate src/Dodge/Update.hs 167;" f timeScroller src/Dodge/Item/Held/Utility.hs 42;" f @@ -5326,7 +5326,7 @@ topInvW src/Dodge/ListDisplayParams.hs 49;" f topPrismEdgeIndices src/Shader/Poke.hs 335;" f topPrismIndices src/Shader/Poke.hs 410;" f topTestPart src/Dodge/TestString.hs 41;" f -torchShape src/Dodge/Item/Draw/SPic.hs 292;" f +torchShape src/Dodge/Item/Draw/SPic.hs 276;" f torqueAmount src/Dodge/HeldUse.hs 573;" f torqueCr src/Dodge/WorldEffect.hs 72;" f torso src/Dodge/Creature/Picture.hs 102;" f @@ -5334,7 +5334,7 @@ tractCr src/Dodge/TractorBeam/Update.hs 27;" f tractFlIt src/Dodge/TractorBeam/Update.hs 22;" f tractorBeamAt src/Dodge/HeldUse.hs 806;" f tractorGun src/Dodge/Item/Held/BatteryGuns.hs 53;" f -tractorGunPic src/Dodge/Item/Draw/SPic.hs 453;" f +tractorGunPic src/Dodge/Item/Draw/SPic.hs 437;" f tractorPullPos src/Dodge/TractorBeam/Update.hs 32;" f tractorSPic src/Dodge/TractorBeam/Draw.hs 10;" f tranRot src/Picture/Base.hs 124;" f @@ -5399,13 +5399,13 @@ tryUseParent src/Dodge/Creature/State.hs 144;" f turnTo src/Dodge/Movement/Turn.hs 8;" f turret src/Dodge/Placement/Instance/Turret.hs 37;" f turretItemOffset src/Dodge/Item/HeldOffset.hs 21;" f -tutAnoTree src/Dodge/Room/Tutorial.hs 47;" f -tutDrop src/Dodge/Room/Tutorial.hs 88;" f -tutHub src/Dodge/Room/Tutorial.hs 243;" f -tutLight src/Dodge/Room/Tutorial.hs 212;" f -tutRezBox src/Dodge/Room/Tutorial.hs 355;" f +tutAnoTree src/Dodge/Room/Tutorial.hs 40;" f +tutDrop src/Dodge/Room/Tutorial.hs 72;" f +tutHub src/Dodge/Room/Tutorial.hs 229;" f +tutLight src/Dodge/Room/Tutorial.hs 196;" f +tutRezBox src/Dodge/Room/Tutorial.hs 341;" f tutRoomTree src/Dodge/Floor.hs 21;" f -tutorialMessage1 src/Dodge/Room/Tutorial.hs 379;" f +tutorialMessage1 src/Dodge/Room/Tutorial.hs 365;" f tweenAngles src/Geometry/Vector.hs 195;" f twinSlowDoorChasers src/Dodge/Room/LongDoor.hs 81;" f twinSlowDoorRoom src/Dodge/Room/LongDoor.hs 29;" f @@ -5619,7 +5619,7 @@ visibleWalls src/Dodge/Base/Collide.hs 207;" f visionCheck src/Dodge/Creature/Perception.hs 153;" f vocalizationTest src/Dodge/Creature/Vocalization.hs 42;" f volleyGun src/Dodge/Item/Held/Cane.hs 15;" f -volleyGunShape src/Dodge/Item/Draw/SPic.hs 373;" f +volleyGunShape src/Dodge/Item/Draw/SPic.hs 357;" f walkNozzle src/Dodge/HeldUse.hs 782;" f walkableNodeNear src/Dodge/Path.hs 48;" f wallBlips src/Dodge/RadarSweep.hs 98;" f @@ -5627,7 +5627,7 @@ wallBuffer src/Dodge/WallCreatureCollisions.hs 52;" f wallIsZeroLength src/Dodge/LevelGen/StaticWalls.hs 179;" f wallLine src/Dodge/Placement/Instance/Wall.hs 71;" f wallToSurface src/Dodge/Base/Collide.hs 172;" f -wallsFromRooms src/Dodge/Layout.hs 131;" f +wallsFromRooms src/Dodge/Layout.hs 132;" f wallsToDraw src/Dodge/Render/Walls.hs 17;" f warmupSound src/Dodge/HeldUse.hs 1421;" f warningRooms src/Dodge/Room/Warning.hs 30;" f @@ -5716,7 +5716,7 @@ yourInv src/Dodge/Base/You.hs 28;" f yourRootItem src/Dodge/Base/You.hs 22;" f yourSelectedItem src/Dodge/Base/You.hs 16;" f yourStatsInfo src/Dodge/Creature/Info.hs 27;" f -zChasm src/Dodge/Room/Tutorial.hs 142;" f +zChasm src/Dodge/Room/Tutorial.hs 126;" f zConnect src/Dodge/Render/Connectors.hs 17;" f zConnectCol src/Dodge/Render/Connectors.hs 28;" f zConnectColMidX src/Dodge/Render/Connectors.hs 31;" f