From 73beeacf3c6ed44c58c9dd0161d27eef5bf2e731 Mon Sep 17 00:00:00 2001 From: justin Date: Sat, 11 Sep 2021 12:17:16 +0100 Subject: [PATCH] Commit before putting walls into vector zones --- src/Dodge/Base/Zone.hs | 21 +++++++++++++++++++++ src/Dodge/Data.hs | 2 ++ src/Dodge/Default/World.hs | 2 ++ src/Dodge/Initialisation.hs | 6 ++++++ src/Dodge/Layout.hs | 20 ++++++++++++++++++++ 5 files changed, 51 insertions(+) diff --git a/src/Dodge/Base/Zone.hs b/src/Dodge/Base/Zone.hs index 94dbd3d79..91a6dff54 100644 --- a/src/Dodge/Base/Zone.hs +++ b/src/Dodge/Base/Zone.hs @@ -4,6 +4,7 @@ module Dodge.Base.Zone where import Dodge.Data import Dodge.Base.Window +import Dodge.Bounds import Geometry import Geometry.Zone @@ -12,10 +13,30 @@ import Data.List import Data.Bifunctor import qualified Data.IntMap.Strict as IM import qualified Data.IntSet as IS +import qualified Data.Vector as V zoneSize :: Float zoneSize = 50 --zoneSize = 100 +data Zoning a = Zoning + { _znObjects :: V.Vector (V.Vector a) + , _znSize :: Int + , _znBounds :: Bounds + } + +setupZoning :: Int -> Bounds -> a -> Zoning a +setupZoning size bounds x = Zoning + { _znObjects = V.replicate xsize (V.replicate ysize x) + , _znSize = size + , _znBounds = bounds + } + where + toInt y = (ceiling y `div` size) + 1 + xFloatSize = _bdMaxX bounds - _bdMinX bounds + yFloatSize = _bdMaxX bounds - _bdMinX bounds + xsize = toInt xFloatSize + ysize = toInt yFloatSize + floorHun :: Float -> Int floorHun x = floor $ x / zoneSize diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index c1abf0a80..15c889470 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -27,6 +27,7 @@ import Dodge.Config.KeyConfig import Dodge.Item.Attachment.Data import Dodge.Item.Data import Dodge.World.Trigger.Data +import Dodge.Bounds import Data.Preload import Picture.Data import Geometry.Data @@ -109,6 +110,7 @@ data World = World , _gameRooms :: [GameRoom] , _preloadData :: PreloadData , _frameClock :: Int + , _worldBounds :: Bounds } data OptionScreenFlag = NormalOptions | GameOverOptions data ScreenLayer diff --git a/src/Dodge/Default/World.hs b/src/Dodge/Default/World.hs index bcd347977..b7350c2ea 100644 --- a/src/Dodge/Default/World.hs +++ b/src/Dodge/Default/World.hs @@ -6,6 +6,7 @@ import Dodge.Debug.Flag.Data import Dodge.Config.Data import Dodge.Config.KeyConfig import Dodge.Item.Data +import Dodge.Bounds --import Dodge.Menu --import Picture import Geometry.Data @@ -85,6 +86,7 @@ defaultWorld = World , _gameRooms = [] , _preloadData = DummyPdata -- hack TODO remove this , _frameClock = 0 + , _worldBounds = defaultBounds } defaultDebugFlags :: DebugFlags defaultDebugFlags = DebugFlags diff --git a/src/Dodge/Initialisation.hs b/src/Dodge/Initialisation.hs index 4198843fd..3e4ba2c94 100644 --- a/src/Dodge/Initialisation.hs +++ b/src/Dodge/Initialisation.hs @@ -67,6 +67,12 @@ wallsAndWindows w (wins,wls) = partition _wlIsSeeThrough . IM.elems $ wallsDoubleScreen w testStringInit :: World -> [String] testStringInit _ = [] +--testStringInit w = +-- [show $ _worldMinX w +-- ,show $ _worldMaxX w +-- ,show $ _worldMinY w +-- ,show $ _worldMaxY w +-- ] --testStringInit = mapMaybe f . IM.elems . wallsDoubleScreen -- where -- f (dr@Door{}) = Just . show $ _wlLine dr diff --git a/src/Dodge/Layout.hs b/src/Dodge/Layout.hs index 9777193e8..428d2ab84 100644 --- a/src/Dodge/Layout.hs +++ b/src/Dodge/Layout.hs @@ -7,6 +7,7 @@ import Dodge.LevelGen.StaticWalls import Dodge.Base import Dodge.Base.Zone import Dodge.GameRoom +import Dodge.Bounds --import Dodge.RandomHelp import Dodge.Graph import Dodge.Layout.Tree.Polymorphic (applyToRoot) @@ -32,9 +33,12 @@ import Data.Tree import Data.Graph.Inductive.Graph (labNodes) import qualified Data.Map as M import Data.Foldable +import qualified Control.Foldl as L +import Data.Maybe generateLevelFromRoomList :: State StdGen [Room] -> World -> World generateLevelFromRoomList gr w = updateWallZoning + . setupWorldBounds -- . initializeStaticWalls . setupForegroundEdgeVerxs . placeSpots plmnts @@ -54,6 +58,22 @@ generateLevelFromRoomList gr w = updateWallZoning zs = map fromIntegral $ randomRs (0,63::Int) $ _randGen w rs' = evalState gr $ _randGen w +setupWorldBounds :: World -> World +setupWorldBounds w = w + & worldBounds . bdMinX .~ f minx + & worldBounds . bdMaxX .~ f maxx + & worldBounds . bdMinY .~ f miny + & worldBounds . bdMaxY .~ f maxy + where + f = fromMaybe 0 + ps = IM.map (fst . _wlLine) $ _walls w + (minx,maxx,miny,maxy) = L.fold ((,,,) + <$> L.premap fstV2 L.minimum + <*> L.premap fstV2 L.maximum + <*> L.premap sndV2 L.minimum + <*> L.premap sndV2 L.maximum + ) ps + setupForegroundEdgeVerxs :: World -> World setupForegroundEdgeVerxs w = w & foregroundEdgeVerx .~ polyhedrasToEdges (_foregroundDecorations w)