{-
Connecting rooms designed with a pass-through technique in mind.
-}
module Dodge.Room.RoadBlock
    where
import Geometry
import Dodge.Default.Room
import Dodge.Room.Data
import Dodge.Room.Link
import Dodge.Room.Placement
import Dodge.Room.Corridor
import Dodge.LevelGen.Data
--import Dodge.RandomHelp
import Dodge.Creature
import Dodge.Layout.Tree.Polymorphic

import Data.Tree
import Control.Monad.State
import Control.Lens
import System.Random

armouredCorridor :: RandomGen g => State g Room
armouredCorridor = fmap (replacePutID 0 [PutCrit $ addArmour autoCrit]) litCorridor90

{-
A corridor of random length with a 90 degree link at the end.
-}
litCorridor90 :: RandomGen g => State g Room
litCorridor90 = do
    h <- state $ randomR (500,800)
    let poly = rectNSWE h 0 0 40
        poly2 = rectNSWE (h-60) (h-100) (-60) 5
    pure $ defaultRoom
        { _rmPolys = [poly,poly2]
        , _rmLinks = [ (V2 40 (h - 80), -pi/2)
                     , (V2 20       0 , pi   )
                     ]
        , _rmPath  = concatMap doublePair 
            [( V2  20   0     , V2 20 (h-40) )
            ,( V2   0  (h-40) , V2 20 (h-40) )
            ,( V2  40  (h-40) , V2 20 (h-40) )
            ]
        , _rmPS    = 
            [ sPS (V2 20 (h-5)) 0     putLamp
            , windowLine (V2 0 (h-20)) (V2 40 (h-20))
            , sPS (V2 (-50) (h-85)) 0   putLamp
            , windowLine (V2 (-40) (h-60)) (V2 (-40) (h-100))
            , sPS (V2   20  (h-40)) 0   $ PutID 0
            , sPS (V2 (-20) (h-80)) 0   $ PutID 2
            ]
        , _rmBound = [poly]
        }

noWeaponTest :: State g (Tree (Either Room Room))
noWeaponTest = do
    undefined

-- | A random length corridor with a descrutible block blocking it.
longBlockedCorridor :: RandomGen g => State g (Tree (Either Room Room))
longBlockedCorridor = do
    r <- state $ randomR (0,pi)
    n <- state $ randomR (0,3)
    let plmnts = [sPS (V2 20 40) r $ PutBlock [5,5,5] (V4 (150/256) (75/256) 0 (250/256))
                                          $ reverse $ rectNSWE 10 (-10) (-10) 10
                 ,sPS (V2 20 15) 0 putLamp
                 ]
    sequence $ treeFromPost (replicate n $ Left <$> randomiseOutLinks corridor) 
                        $ return $ Right $ set rmPS plmnts corridor

-- | A single corridor with a descrutible block blocking it.
blockedCorridor :: RandomGen g => State g (Tree (Either Room Room))
blockedCorridor = do
    r <- state $ randomR (0,pi)
    let plmnts = [sPS (V2 20 40) r $ PutBlock [5,5,5] (V4 (150/256) ( 75/256)  0 ( 250/256)) 
                                          $ reverse $ rectNSWE 10 (-10) (-10) 10
                 ,sPS (V2 20 15) 0 putLamp
                 ]
    sequence $ treeFromPost [] $ return $ Right $ set rmPS plmnts corridor
