52 lines
1.7 KiB
Haskell
52 lines
1.7 KiB
Haskell
module Dodge.Room.Tanks where
|
|
import Dodge.Data
|
|
import Dodge.LevelGen.Data
|
|
import Dodge.RandomHelp
|
|
import Dodge.Room.Procedural
|
|
import Dodge.Room.Foreground
|
|
--import Dodge.Room.RoadBlock
|
|
import Dodge.Placement.Instance
|
|
import Dodge.PlacementSpot
|
|
--import Padding
|
|
import Color
|
|
--import Shape
|
|
import LensHelp
|
|
|
|
--import Data.Maybe
|
|
--import Data.Tree
|
|
import Control.Monad.State
|
|
import System.Random
|
|
import qualified Data.Set as S
|
|
|
|
randomTank :: RandomGen g => State g Placement
|
|
randomTank = takeOne $ map (\f -> f (dim orange) orange)
|
|
[ tankSquareEmboss4
|
|
, tankSquareEmboss
|
|
, tankSquare
|
|
, roundTank
|
|
, roundTankCross
|
|
, tankSquareCross
|
|
]
|
|
|
|
tanksRoom :: RandomGen g => [Creature] -> [Item] -> State g Room
|
|
tanksRoom crs its = do
|
|
w <- state $ randomR (100,400)
|
|
h <- state $ randomR (200,400)
|
|
ntanks <- state $ randomR (3,6)
|
|
thetank <- randomTank <&> plSpot .~ unusedOffPathAwayFromLink 50
|
|
let room = roomRectAutoLinks w h
|
|
nwestlnks = length $ filter ((OnEdge West `S.member`) . _rlType) $ _rmLinks room
|
|
girderPosOrder <- shuffle [1 .. nwestlnks - 2]
|
|
let plmnts =
|
|
--ok, this has become complicated
|
|
foldr1 setFallback [ twoRoomPoss (isUnusedLinkType (FromSouth i))
|
|
(isUnusedLinkType (FromSouth i)) $ \ps1 ps2 ->
|
|
sps0 $ PutShape $ girderV 96 20 10 (_psPos ps1) (_psPos ps2)
|
|
| i <- girderPosOrder]
|
|
: map (\it -> sps0 (PutFlIt it) & plSpot .~ anyUnusedSpot) its
|
|
++ map (\cr -> sps0 (PutCrit cr) & plSpot .~ unusedSpotAwayFromLink 50) crs
|
|
++ replicate ntanks thetank
|
|
-- , sps0 $ PutShape $ colorSH orange $ pipePP 2 (V3 50 50 25) (V3 50 120 25)
|
|
return $ room & rmPmnts .++~ plmnts
|
|
& rmName .~ "tanksRoom"
|