103 lines
3.5 KiB
Haskell
103 lines
3.5 KiB
Haskell
--{-# LANGUAGE TupleSections #-}
|
|
module Dodge.Room.SensorDoor where
|
|
import Dodge.LevelGen.Data
|
|
import Dodge.PlacementSpot
|
|
import Dodge.Placement.Instance.Terminal
|
|
import Dodge.Data
|
|
import Dodge.Tree
|
|
--import Dodge.RoomLink
|
|
import Dodge.Room.Door
|
|
import Dodge.Room.Ngon
|
|
import Dodge.Room.Procedural
|
|
import Dodge.Room.Corridor
|
|
import Dodge.Room.Link
|
|
--import Dodge.Room.Procedural
|
|
import Dodge.Room.Foreground
|
|
--import Dodge.Room.RoadBlock
|
|
import Dodge.Placement.Instance
|
|
--import Dodge.Default.Room
|
|
--import Dodge.Item.Weapon.BulletGuns
|
|
--import Dodge.Item.Weapon.Utility
|
|
--import Dodge.LevelGen.Data
|
|
--import Geometry.Data
|
|
import Geometry
|
|
--import Padding
|
|
import Color
|
|
import Shape
|
|
--import Lorem
|
|
import LensHelp
|
|
import Dodge.RandomHelp
|
|
|
|
import qualified Data.Set as S
|
|
import Data.Maybe
|
|
import Data.Char
|
|
--import Data.Tree
|
|
import Control.Monad.State
|
|
import System.Random
|
|
|
|
-- TODO fix case where the sensor created by sensInsideDoor blocks another door
|
|
-- for roomRectAutoLinks-- make the locked door a center door?
|
|
sensorRoom :: RandomGen g => DamageType -> Int -> State g (SubCompTree Room)
|
|
sensorRoom senseType n = do
|
|
rm <- takeOne [roomNgon 8 200, roomRectAutoLinks 200 200]
|
|
cenroom <- shuffleLinks $ sensInsideDoor senseType n rm
|
|
let doorroom = triggerDoorRoom n
|
|
return $ treeFromPost [PassDown door,PassDown $ cenroom & rmLinkEff .~ f,PassDown doorroom] (UseAll door)
|
|
where
|
|
f _ _ 0 rl rm = rm & rmLinks %~ map (g (_rlPos rl) (_rlDir rl))
|
|
f _ _ _ _ rm = rm
|
|
g p d rl
|
|
| isclose = rl & rlType . at BlockedLink ?~ ()
|
|
| otherwise = rl
|
|
where
|
|
p' = p +.+ rotateV d (V2 0 (negate 100))
|
|
isclose = dist (_rlPos rl) p' < 30
|
|
|
|
sensorRoomRunPast :: RandomGen g => DamageType -> Int -> State g (LabSubCompTree Room)
|
|
sensorRoomRunPast dt n = do
|
|
t <- sensorRoom dt n
|
|
return (applyToSubforest [0] (++
|
|
[treeFromPost
|
|
[PassDown $ door & rmConnectsTo
|
|
.~ (\s -> S.member InLink s && not (S.member BlockedLink s))
|
|
] (UseLabel 0 corridor)
|
|
]
|
|
) t
|
|
,TreeSubLabelling "sensorRoomRunPast" Nothing)
|
|
--[return $ UseLabel 0 $ door & rmConnectsTo .~ S.member InLink]
|
|
|
|
sensAboveDoor :: DamageType -> Float -> PlacementSpot -> Placement
|
|
sensAboveDoor sensetype wth ps = extTrigLitPos
|
|
(atFstLnkOutShiftBy (\(p,a) -> (p +.+ rotateV a (V2 18.5 (-2.5)), a)))
|
|
( \tp -> Just $ damageSensor sensetype wth (upf $ fromJust $ _plMID tp) ps )
|
|
where
|
|
upf trid mc w | _sensAmount (_mcSensor mc) > 900 = w & triggers . ix trid .~ const True
|
|
| otherwise = w
|
|
|
|
sensInsideDoor :: DamageType -> Int -> Room -> Room
|
|
sensInsideDoor senseType outplid rm = rm
|
|
& rmName .++~ take 4 (show senseType)
|
|
& rmPmnts .++~
|
|
[ psPt atFstLnkOut
|
|
(PutShape $ colorSH yellow $
|
|
thinHighBar 0 (V2 20 (-1)) (V2 20 (-100))
|
|
<> thinHighBar 0 (V2 0 (-100)) (V2 20 (-100))
|
|
<> barPP 1.5 (V3 20 (-1) 0) (V3 20 (-1) 80))
|
|
, putTerminal (genTermMessage messagef)
|
|
& plSpot .~ rprBoolShift isUnusedLnk (shiftInBy 10)
|
|
]
|
|
& rmOutPmnt .~ [OutPlacement (sensAboveDoor senseType 10 (atFstLnkOutShiftInward 100)) outplid]
|
|
where
|
|
mtoup = map toUpper
|
|
horline = "-----------------"
|
|
messagef gp =
|
|
let Just (pc,ds) = gp ^? sensorCoding . ix senseType
|
|
in [horline
|
|
,"SENSOR ATTRIBUTES"
|
|
,horline
|
|
,mtoup $ show senseType
|
|
,"COLOR:"++ mtoup (show pc)
|
|
,"SHAPE:"++ mtoup (reverse . drop 10 . reverse $ show ds)
|
|
,horline
|
|
]
|