Abstract out block placement

This commit is contained in:
2022-06-27 13:38:46 +01:00
parent c8710fe92a
commit fec72cdf48
14 changed files with 105 additions and 55 deletions
+17
View File
@@ -0,0 +1,17 @@
module Bound where
import Geometry
import Control.Lens
import Streaming
import qualified Streaming.Prelude as S
import qualified Control.Foldl as L
boundPoints :: Stream (Of Point2) Identity () -> Maybe (Float,Float,Float,Float)
boundPoints = f . runIdentity . L.purely S.fold_ ((,,,)
<$> L.premap (^?! _2) L.maximum
<*> L.premap (^?! _2) L.minimum
<*> L.premap (^?! _1) L.maximum
<*> L.premap (^?! _1) L.minimum
)
where
f (mn,ms,me,mw) = (,,,) <$> mn <*> ms <*> me <*> mw
+1
View File
@@ -96,6 +96,7 @@ collidePointWallsFilterStream t sp ep = collidePoint sp ep
. S.filter t . S.filter t
. wallsAlongLine sp ep . wallsAlongLine sp ep
-- this hopefully also nub the stream in most cases
--orderStreamOn :: Ord b => (a -> b) -> Stream (Of a) Identity () -> Identity (Of (M.Map b a) ()) --orderStreamOn :: Ord b => (a -> b) -> Stream (Of a) Identity () -> Identity (Of (M.Map b a) ())
sortStreamOn :: Ord a => (b -> a) -> Stream (Of b) Identity () -> Stream (Of b) Identity () sortStreamOn :: Ord a => (b -> a) -> Stream (Of b) Identity () -> Stream (Of b) Identity ()
{-# INLINE sortStreamOn #-} {-# INLINE sortStreamOn #-}
+2 -1
View File
@@ -13,6 +13,7 @@ module Dodge.Data
, module Dodge.Data.LoadAction , module Dodge.Data.LoadAction
, module Dodge.Data.ForegroundShape , module Dodge.Data.ForegroundShape
, module Dodge.Data.Wall , module Dodge.Data.Wall
, module Dodge.Data.Bounds
, module Dodge.Combine.Data , module Dodge.Combine.Data
, module Dodge.Distortion.Data , module Dodge.Distortion.Data
, module Dodge.Data.DamageType , module Dodge.Data.DamageType
@@ -35,6 +36,7 @@ import Dodge.Data.ForegroundShape
import Dodge.Data.LoadAction import Dodge.Data.LoadAction
import Dodge.Data.Material import Dodge.Data.Material
import Dodge.Data.Wall import Dodge.Data.Wall
import Dodge.Data.Bounds
import Dodge.RoomCluster.Data import Dodge.RoomCluster.Data
import Dodge.Data.ItemAmount import Dodge.Data.ItemAmount
import Dodge.ShortShow import Dodge.ShortShow
@@ -51,7 +53,6 @@ import Dodge.Config.Data
import Dodge.Config.KeyConfig import Dodge.Config.KeyConfig
import Dodge.Item.Attachment.Data import Dodge.Item.Attachment.Data
import Dodge.Item.Data import Dodge.Item.Data
import Dodge.Bounds
import Data.Preload import Data.Preload
import Picture.Data import Picture.Data
import ShapePicture import ShapePicture
@@ -1,6 +1,6 @@
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE StrictData #-} {-# LANGUAGE StrictData #-}
module Dodge.Bounds module Dodge.Data.Bounds
where where
import Control.Lens import Control.Lens
-1
View File
@@ -2,7 +2,6 @@ module Dodge.Default.World where
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
--import Dodge.Config.KeyConfig --import Dodge.Config.KeyConfig
import Dodge.Bounds
--import Dodge.Menu --import Dodge.Menu
--import Picture --import Picture
import Geometry.Data import Geometry.Data
+1
View File
@@ -41,6 +41,7 @@ initialAnoTree :: Annotation
initialAnoTree = OnwardList initialAnoTree = OnwardList
$ intersperse (AnTree corDoor) $ intersperse (AnTree corDoor)
[ IntAnno $ AnTree . startRoom [ IntAnno $ AnTree . startRoom
, AnRoom $ return airlock0
-- , AnRoom slowDoorRoom -- , AnRoom slowDoorRoom
-- , AnRoom $ roomCCrits 10 -- , AnRoom $ roomCCrits 10
-- , AnTree firstBreather -- , AnTree firstBreather
-1
View File
@@ -13,7 +13,6 @@ import Dodge.LevelGen.LevelStructure
import Dodge.Room.Foreground import Dodge.Room.Foreground
import Dodge.Wall.Zone import Dodge.Wall.Zone
import Dodge.GameRoom import Dodge.GameRoom
import Dodge.Bounds
import Dodge.Default.Wall import Dodge.Default.Wall
import Dodge.Room.Link import Dodge.Room.Link
import Dodge.Randify import Dodge.Randify
+23
View File
@@ -0,0 +1,23 @@
module Dodge.Placement.Instance.Block where
import Dodge.Data
import Geometry
import Color
import LensHelp
import ShapePicture
import Shape
import Dodge.Default.Wall
import Dodge.Default.Block
lowBlock :: Material -> Color -> Float -> [Point2] -> PSType
lowBlock mat col h ps = PutBlock bl wl $ reverse ps
where
bl = defaultBlock
& blDraw .~ const (noPic $ colorSH col (upperPrismPoly h $ reverse ps))
& blDeath .~ const id
wl = defaultWall
& wlDraw .~ False
& wlColor .~ col
& wlRotateTo .~ False
& wlOpacity .~ SeeAbove
& wlMaterial .~ mat
& wlHeight .~ h
+2 -20
View File
@@ -1,6 +1,7 @@
module Dodge.Placement.Instance.Wall module Dodge.Placement.Instance.Wall
where where
import Dodge.Data import Dodge.Data
import Dodge.Placement.Instance.Block
import Dodge.Default.Block import Dodge.Default.Block
--import Dodge.Block.Debris --import Dodge.Block.Debris
import Dodge.LevelGen.Data import Dodge.LevelGen.Data
@@ -14,26 +15,7 @@ import Data.List
import Control.Lens import Control.Lens
heightWallPS :: PlacementSpot -> Float -> [Point2] -> Placement heightWallPS :: PlacementSpot -> Float -> [Point2] -> Placement
heightWallPS spot h ps = psj spot (PutShape . colorSH col $ upperPrismPoly h ps) heightWallPS spot h ps = spNoID spot $ lowBlock Stone (_wlColor defaultWall) h ps
$ sps spot $ PutWall ps theWall
where
col = _wlColor defaultWall
theWall = defaultWall
{ _wlOpacity = SeeAbove
, _wlDraw = False
, _wlHeight = h
}
heightWall :: Float -> [Point2] -> Placement
heightWall h ps = ps0j (PutShape . colorSH col $ upperPrismPoly h ps)
$ sps0 $ PutWall ps theWall
where
col = _wlColor defaultWall
theWall = defaultWall
{ _wlOpacity = SeeAbove
, _wlDraw = False
, _wlHeight = h
}
invisibleWall :: [Point2] -> Placement invisibleWall :: [Point2] -> Placement
invisibleWall ps = sps0 $ PutWall ps $ defaultWall invisibleWall ps = sps0 $ PutWall ps $ defaultWall
+1 -1
View File
@@ -31,7 +31,7 @@ airlock0 = defaultRoom
$ \_ _ -> Just $ putDoubleDoor thewall (cond' btid) (V2 0 80) (V2 40 80) 2 $ \_ _ -> Just $ putDoubleDoor thewall (cond' btid) (V2 0 80) (V2 40 80) 2
, invisibleWall $ rectNSWE 60 40 (-40) (-30) , invisibleWall $ rectNSWE 60 40 (-40) (-30)
,spanLightI (V2 (-2) 30) (V2 (-2) 70) ,spanLightI (V2 (-2) 30) (V2 (-2) 70)
,sps0 $ PutShape $ thinHighBar 75 (V2 40 50) (V2 (-1) 50) ,sps0 $ putShape $ thinHighBar 75 (V2 40 50) (V2 (-1) 50)
] ]
, _rmBound = [rectNSWE 75 15 0 40,switchcut] , _rmBound = [rectNSWE 75 15 0 40,switchcut]
} }
+21 -2
View File
@@ -1,11 +1,12 @@
--{-# LANGUAGE TupleSections #-} --{-# LANGUAGE TupleSections #-}
module Dodge.Room.Foreground where module Dodge.Room.Foreground where
import Dodge.Data
import Picture import Picture
import Geometry import Geometry
import Shape import Shape
import Quaternion import Quaternion
import Dodge.Data.ForegroundShape --import Dodge.Data.ForegroundShape
import Dodge.Default.Foreground import Dodge.Default.Foreground
import Data.List import Data.List
import Data.Maybe import Data.Maybe
@@ -115,6 +116,24 @@ girderVCapLR csize h d w x y = thinHighBar h (x -.- n) (x +.+ n)
where where
n = csize *.* vNormal (normalizeV (x -.- y)) n = csize *.* vNormal (normalizeV (x -.- y))
putShape :: Shape -> PSType
putShape sh = PutForeground $ defaultForeground
& fsPos .~ m
& fsRad .~ radBounds bnds
& fsSPic .~ noPic (uncurryV translateSHf (-m) $ sh)
where
bnds = shapeBounds sh
m = midBounds bnds
shapeBounds :: Shape -> (Float,Float,Float,Float)
shapeBounds sh = undefined
midBounds :: (Float,Float,Float,Float) -> Point2
midBounds (n,s,e,w) = V2 ((n + s)/2) ((e + w)/2)
radBounds :: (Float, Float,Float,Float) -> Float
radBounds (n,s,e,w) = max (n-s) (e-w) / 2
girderV' girderV'
:: Float -- ^ "cap" size :: Float -- ^ "cap" size
-> Float -- ^ height -> Float -- ^ height
@@ -123,7 +142,7 @@ girderV'
-> Point2 -> Point2 -> ForegroundShape -> Point2 -> Point2 -> ForegroundShape
girderV' csize h d w x y = defaultForeground girderV' csize h d w x y = defaultForeground
& fsPos .~ m & fsPos .~ m
& fsRad .~ dist m x' & fsRad .~ dist m x
& fsSPic .~ noPic sh & fsSPic .~ noPic sh
where where
m = midPoint x y m = midPoint x y
+11 -22
View File
@@ -10,24 +10,15 @@ import Dodge.Room.Door
import Dodge.Room.Corridor import Dodge.Room.Corridor
import Dodge.Room.Link import Dodge.Room.Link
import Dodge.Room.Ngon import Dodge.Room.Ngon
--import Dodge.Room.Procedural --import Dodge.Room.Foreground
import Dodge.Room.Foreground import Dodge.Wire
--import Dodge.Room.RoadBlock
import Dodge.Placement.Instance import Dodge.Placement.Instance
import Dodge.Placement.Instance.Analyser import Dodge.Placement.Instance.Analyser
import Dodge.Default.Room import Dodge.Default.Room
import Dodge.Item.Consumable import Dodge.Item.Consumable
--import Dodge.Machine
--import Dodge.Item.Weapon.Utility
--import Dodge.LevelGen.Data
--import Geometry.Data
import Geometry import Geometry
--import Padding
import Color
import Shape
import LensHelp import LensHelp
import RandomHelp import RandomHelp
--import Dodge.SoundLogic
import qualified Data.Set as S import qualified Data.Set as S
import Data.Maybe import Data.Maybe
@@ -39,15 +30,15 @@ cenLasTur = roomNgon 8 200 & rmPmnts .~
, mntLightLnkCond $ rprBool $ const . isInLnk , mntLightLnkCond $ rprBool $ const . isInLnk
] ]
where where
covershape = reverse $ rectNSWE 10 (-10) (-20) 20 covershape = rectNSWE 10 (-10) (-20) 20
lightSensInsideDoor :: Int -> Room -> Room lightSensInsideDoor :: Int -> Room -> Room
lightSensInsideDoor outplid rm = rm lightSensInsideDoor outplid rm = rm
& rmPmnts .:~ psPt atFstLnkOut & rmPmnts .++~
(PutShape $ colorSH yellow $ [ psPt atFstLnkOut (PutForeground $ floorWire (V2 20 0) (V2 20 (-100)))
thinHighBar 0 (V2 20 (-1)) (V2 20 (-100)) , psPt atFstLnkOut (PutForeground $ floorWire (V2 0 (-100)) (V2 20 (-100)))
<> thinHighBar 0 (V2 0 (-100)) (V2 20 (-100)) , psPt atFstLnkOut (PutForeground $ verticalWire (V2 20 0) 0 80)
<> barPP 1.5 (V3 20 (-1) 0) (V3 20 (-1) 80)) ]
& rmOutPmnt .~ [OutPlacement (lasSensLightAboveDoor 10 (atFstLnkOutShiftInward 100)) outplid] & rmOutPmnt .~ [OutPlacement (lasSensLightAboveDoor 10 (atFstLnkOutShiftInward 100)) outplid]
lasSensLightAboveDoor :: Float -> PlacementSpot -> Placement lasSensLightAboveDoor :: Float -> PlacementSpot -> Placement
@@ -61,14 +52,13 @@ lasSensLightAboveDoor wth ps = extTrigLitPos
lightSensByDoor :: Int -> Room -> Room lightSensByDoor :: Int -> Room -> Room
lightSensByDoor outplid rm = rm lightSensByDoor outplid rm = rm
& rmPmnts .++~ & rmPmnts .++~
[ psPt atFstLnkOut $ PutShape $ colorSH yellow [ psPt atFstLnkOut $ PutForeground $ verticalWire (V2 20 0) 0 80
$ barPP 1.5 (V3 20 (-1) 0) (V3 20 (-1) 80)
, heightWallPS (atNthLnkOutShiftInward 1 100) 30 covershape , heightWallPS (atNthLnkOutShiftInward 1 100) 30 covershape
, heightWallPS (atFstLnkOutShiftInward 100) 30 covershape , heightWallPS (atFstLnkOutShiftInward 100) 30 covershape
] ]
& rmOutPmnt .~ [OutPlacement (lasSensLightAboveDoor 20 (atFstLnkOutShiftBy sensorshift)) outplid] & rmOutPmnt .~ [OutPlacement (lasSensLightAboveDoor 20 (atFstLnkOutShiftBy sensorshift)) outplid]
where where
covershape = reverse $ rectNSWE 10 (-10) (-20) 20 covershape = rectNSWE 10 (-10) (-20) 20
sensorshift (p,a) = (p +.+ rotateV a (V2 60 (-20)), a) sensorshift (p,a) = (p +.+ rotateV a (V2 60 (-20)), a)
keyCardRoomRunPast :: RandomGen g => Int -> Int -> State g (MetaTree Room String) keyCardRoomRunPast :: RandomGen g => Int -> Int -> State g (MetaTree Room String)
@@ -90,8 +80,7 @@ healthAnalyserByDoor = analyserByDoor (RequireHealth 1100)
analyserByDoor :: ProximityRequirement -> Int -> Room -> Room analyserByDoor :: ProximityRequirement -> Int -> Room -> Room
analyserByDoor proxreq outplid rm = rm analyserByDoor proxreq outplid rm = rm
& rmPmnts .++~ & rmPmnts .++~
[ psPt atFstLnkOut $ PutShape $ colorSH yellow [ psPt atFstLnkOut $ PutForeground $ verticalWire (V2 20 0) 0 80
$ barPP 1.5 (V3 20 (-1) 0) (V3 20 (-1) 80)
] ]
& rmOutPmnt .~ & rmOutPmnt .~
[OutPlacement [OutPlacement
+4 -5
View File
@@ -8,6 +8,7 @@ import Dodge.Placement.Instance.Terminal
import Dodge.Terminal import Dodge.Terminal
import Dodge.Data import Dodge.Data
import Dodge.Tree import Dodge.Tree
import Dodge.Wire
--import Dodge.RoomLink --import Dodge.RoomLink
import Dodge.Room.Door import Dodge.Room.Door
import Dodge.Room.Ngon import Dodge.Room.Ngon
@@ -80,11 +81,9 @@ sensInsideDoor :: DamageType -> Int -> Room -> Room
sensInsideDoor senseType outplid rm = rm sensInsideDoor senseType outplid rm = rm
& rmName .++~ take 4 (show senseType) & rmName .++~ take 4 (show senseType)
& rmPmnts .++~ & rmPmnts .++~
[ psPt atFstLnkOut [ psPt atFstLnkOut . PutForeground $ floorWire (V2 20 0) (V2 20 (-100))
(PutShape $ colorSH yellow $ , psPt atFstLnkOut . PutForeground $ floorWire (V2 0 (-100)) (V2 20 (-100))
thinHighBar 0 (V2 20 (-1)) (V2 20 (-100)) , psPt atFstLnkOut . PutForeground $ verticalWire (V2 20 0) 0 80
<> thinHighBar 0 (V2 0 (-100)) (V2 20 (-100))
<> barPP 1.5 (V3 20 (-1) 0) (V3 20 (-1) 80))
, putTerminal terminalColor (basicTerminal & tmScrollCommands .:~ damageCodeCommand) , putTerminal terminalColor (basicTerminal & tmScrollCommands .:~ damageCodeCommand)
& plSpot .~ rprBoolShift isUnusedLnk (shiftInBy 10) & plSpot .~ rprBoolShift isUnusedLnk (shiftInBy 10)
] ]
+21 -1
View File
@@ -1,10 +1,30 @@
module Dodge.Wire where module Dodge.Wire where
--import Dodge.LevelGen.Data --import Dodge.LevelGen.Data
import Dodge.Default.Foreground
import Dodge.Data import Dodge.Data
import Geometry import Geometry
import LensHelp
import ShapePicture
import Shape
import Color
import Dodge.Room.Foreground
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
import Control.Lens
floorWire :: Point2 -> Point2 -> ForegroundShape
floorWire a b = defaultForeground
& fsPos .~ m
& fsRad .~ dist m a
& fsSPic .~ noPic (colorSH yellow $ thinHighBar 0 a' b')
where
m = midPoint a b
a' = a - m
b' = b - m
verticalWire :: Point2 -> Float -> Float -> ForegroundShape
verticalWire p h1 h2 = defaultForeground
& fsPos .~ p
& fsRad .~ 2
& fsSPic .~ noPic (colorSH yellow $ barPP 1.5 (V3 0 0 h1) (V3 0 0 h2))
putWireEnd :: Int -> (Point2,Float) -> Float -> Room -> Room putWireEnd :: Int -> (Point2,Float) -> Float -> Room -> Room
putWireEnd i (p,a) h = rmEndWires %~ IM.insert i (WallWire p a h) putWireEnd i (p,a) h = rmEndWires %~ IM.insert i (WallWire p a h)