Allow for random choice between placements in different rooms

This commit is contained in:
2021-11-26 12:20:20 +00:00
parent aad79bdf25
commit 123bcd2c94
27 changed files with 260 additions and 191 deletions
+21 -56
View File
@@ -1,36 +1,35 @@
{-# OPTIONS_GHC -Wno-unused-imports #-}
--{-# OPTIONS_GHC -Wno-unused-imports #-}
{- | The tree of rooms that make up a level. -}
module Dodge.Floor
( layoutLevelFromSeed
( initialRoomTree
) where
import Geometry.Data
import Dodge.Data
--import Geometry.Data
--import Dodge.Data
import Dodge.LockAndKey
import Dodge.Creature.State.Data
--import Dodge.Creature.State.Data
import Dodge.Room
import Dodge.Placement.Instance.Button
--import Dodge.Placement.Instance.Button
import Dodge.Tree
import Dodge.Annotation
import Dodge.Creature
import Dodge.LevelGen.Data
import Dodge.LevelGen.Switch
import Dodge.Item.Weapon.Launcher
import Dodge.PlacementSpot
import Dodge.RoomPos
import Dodge.Room.RunPast
import MonadHelp
--import Dodge.Creature
--import Dodge.LevelGen.Data
--import Dodge.LevelGen.Switch
--import Dodge.Item.Weapon.Launcher
--import Dodge.PlacementSpot
--import Dodge.RoomPos
--import Dodge.Room.RunPast
--import MonadHelp
import Data.Tree
import Color
import Dodge.Wire
--import Color
--import Dodge.Wire
import Control.Lens
--import Control.Lens
import Control.Monad.State
import Control.Monad.Loops
--import Control.Monad.Loops
import System.Random
import Data.Sequence hiding (zipWith)
import Data.Maybe
import qualified Data.IntMap.Strict as IM
--import Data.Sequence hiding (zipWith)
--import Data.Maybe
--import qualified Data.IntMap.Strict as IM
initialAnoTree :: RandomGen g => Tree [Annotation g]
initialAnoTree = padSucWithCorridors $ treeFromTrunk
@@ -98,38 +97,4 @@ initialRoomTree :: RandomGen g => State g (Tree Room)
initialRoomTree = do
expandTree <$> mapM anoToRoomTree initialAnoTree
layoutLevelFromSeed :: Int -> Int -> IO [Room]
layoutLevelFromSeed i seed = do
let i' = i + 1
putStrLn $ "Generating level with seed " ++ show seed
let g = mkStdGen seed
let rmtree = inorderNumberTree $ evalState initialRoomTree g
putStrLn "Abstract layout: "
putStrLn $ compactDrawTree $ fmap (show . snd) rmtree
mrs <- positionRoomsFromTree rmtree
case mrs of
Just rs -> do
putStrLn $ "After " ++ show i'
++ " attempt(s), Successful generation of level with seed "
++ show seed
--return (fmap setLastLinkToUsed rs)
putStrLn $ show (Prelude.length rs) ++ " rooms in total"
return rs
Nothing -> do
putStr $ "Level generation with seed " ++ show seed ++ " failed: "
let (seed',_) = random g
layoutLevelFromSeed i' seed'
compactDrawTree :: Tree String -> String
compactDrawTree = unlines . compactDraw
compactDraw :: Tree String -> [String]
compactDraw (Node x [Node y ts]) = compactDraw (Node (x++","++y) ts)
compactDraw (Node x ts0) = lines x ++ drawSubTrees ts0
where
drawSubTrees [] = []
drawSubTrees [t] =
"|" : compactDraw t
drawSubTrees (t:ts) =
"|" : shift "+- " "| " (compactDraw t) ++ drawSubTrees ts
shift first other = zipWith (++) (first : repeat other)