Rework annotations

This commit is contained in:
2022-06-12 13:38:23 +01:00
parent 8b4b6de0c0
commit 2ccb26b289
16 changed files with 161 additions and 154 deletions
+61 -52
View File
@@ -10,70 +10,79 @@ import Dodge.Tree
import Dodge.Room import Dodge.Room
import Dodge.Data import Dodge.Data
import Dodge.Annotation.Data import Dodge.Annotation.Data
--import LensHelp import LensHelp
--import Control.Lens --import Control.Lens
import Data.Maybe --import Data.Maybe
addLock :: Int -> Tree [Annotation] -> State StdGen (Tree [Annotation])
addLock i t = do
(beforeLock, afterLock) <- splitTrunk t
newBefore <- applyToRandomNode (Key i :) beforeLock
return $ addToTrunk newBefore [Node [Lock i] afterLock]
{- | Add one corridor between each parent-child link of a tree of annotations. -} {- | Add one corridor between each parent-child link of a tree of annotations. -}
padWithCorridors :: Tree [Annotation] -> Tree [Annotation] --padWithCorridors :: Annotation -> Annotation
padWithCorridors = padWithAno [Corridor] --padWithCorridors = padWithAno [Corridor]
--
--padWithAno :: [Annotation] -> Tree [Annotation] -> Tree [Annotation]
--padWithAno ano (Node x xs) = Node ano [Node x (map (padWithAno ano) xs)]
--
--padSucWithCorridors :: Tree [Annotation] -> Tree [Annotation]
--padSucWithCorridors (Node x xs) = Node x (map padWithCorridors xs)
--
--padSucWithDoors :: Tree [Annotation] -> Tree [Annotation]
--padSucWithDoors (Node x xs) = Node x (map (padWithAno [SpecificRoom thetree]) xs)
-- where
-- thetree = do
-- thecor <- shuffleLinks corridor
-- takeOne
-- [ (toOnward "door", return (cleatOnward door))
-- , (toOnward "twoDoors" ,treePost [ door, thecor, cleatOnward door])
-- ]
--
--{- Add one to three corridors between each parent-child link of a tree of annotations. -}
--randomPadCorridors :: Tree [Annotation] -> State StdGen (Tree [Annotation])
--randomPadCorridors (Node x xs) = do
-- n <- state $ randomR (1, 3)
-- xs' <- mapM randomPadCorridors xs
-- return $ treeFromTrunk (replicate n [Corridor]) (Node x xs')
padWithAno :: [Annotation] -> Tree [Annotation] -> Tree [Annotation] annoToRoomTree :: Annotation -> State StdGen (MetaTree Room)
padWithAno ano (Node x xs) = Node ano [Node x (map (padWithAno ano) xs)] annoToRoomTree an = case an of
OnwardList ans -> do
mts <- mapM annoToRoomTree ans
return $ foldr1 attachOnward mts
SpecificRoom r -> r
PadWith r an -> annoToRoomTree an
IntAnno i f -> annoToRoomTree $ f i
padSucWithCorridors :: Tree [Annotation] -> Tree [Annotation] attachOnward :: MetaTree Room -> MetaTree Room -> MetaTree Room
padSucWithCorridors (Node x xs) = Node x (map padWithCorridors xs) attachOnward t1 t2 = case t1 of
MTree {} -> t1 & mtBranches .:~ MBranch "Onward" toOnward' t2
padSucWithDoors :: Tree [Annotation] -> Tree [Annotation] BTree {} -> t2 & btBranches .:~ t2
padSucWithDoors (Node x xs) = Node x (map (padWithAno [SpecificRoom thetree]) xs)
where
thetree = do
thecor <- shuffleLinks corridor
takeOne
[ (toOnward "door", return (cleatOnward door))
, (toOnward "twoDoors" ,treePost [ door, thecor, cleatOnward door])
]
{- Add one to three corridors between each parent-child link of a tree of annotations. -}
randomPadCorridors :: Tree [Annotation] -> State StdGen (Tree [Annotation])
randomPadCorridors (Node x xs) = do
n <- state $ randomR (1, 3)
xs' <- mapM randomPadCorridors xs
return $ treeFromTrunk (replicate n [Corridor]) (Node x xs')
{- | Create a random room tree structure from a list of annotations. -} {- | Create a random room tree structure from a list of annotations. -}
anoToRoomTree :: [Annotation] -> State StdGen (Room -> Maybe ([String],Room), Tree Room) --anoToRoomTree :: [Annotation] -> State StdGen (Room -> Maybe ([String],Room), Tree Room)
anoToRoomTree anos = case anos of --anoToRoomTree anos = case anos of
[AnoApplyInt i f] -> f i -- [AnoApplyInt i f] -> f i
-- [AnoApplyInt' i f str] -> f i <&> (,TreeSubLabelling str Nothing) ---- [AnoApplyInt' i f str] -> f i <&> (,TreeSubLabelling str Nothing)
(SpecificRoom rt:_) -> rt -- (SpecificRoom rt:_) -> rt
[PassthroughLockKeyLists i ls ks] -> do -- [PassthroughLockKeyLists i ls ks] -> do
(functionlockroom,randomitemidentity) <- takeOne ls -- (functionlockroom,randomitemidentity) <- takeOne ls
lr' <- functionlockroom i -- lr' <- functionlockroom i
ii <- randomitemidentity -- ii <- randomitemidentity
let lr = snd lr' -- let lr = snd lr'
keyroom' <- fromJust $ lookup ii ks -- keyroom' <- fromJust $ lookup ii ks
let keyroom = snd keyroom' -- let keyroom = snd keyroom'
rToOnward ("PassthroughLockKeyLists-"++show ii) $ overwriteLabel i lr [keyroom] -- rToOnward ("PassthroughLockKeyLists-"++show ii) $ overwriteLabel i lr [keyroom]
_ -> rToOnward "no label" =<< anoToRoomTree' anos -- _ -> rToOnward "no label" =<< anoToRoomTree' anos
{- | Create a random room tree structure from a list of annotations. -} {- | Create a random room tree structure from a list of annotations. -}
anoToRoomTree' :: [Annotation] -> State StdGen (Tree Room) anoToRoomTree' :: [Annotation] -> State StdGen (Tree Room)
anoToRoomTree' anos = case anos of anoToRoomTree' anos = case anos of
[OrAno as] -> do -- [OrAno as] -> do
a <- takeOne as -- a <- takeOne as
anoToRoomTree' a -- anoToRoomTree' a
[Corridor] -> pure . cleatOnward <$> shuffleLinks corridor -- [Corridor] -> pure . cleatOnward <$> shuffleLinks corridor
(BossAno cr : _) -> do -- (BossAno cr : _) -> do
br <- bossRoom cr -- br <- bossRoom cr
branchRectWith . pure $ treeFromPost [corridor,corridor] br -- branchRectWith . pure $ treeFromPost [corridor,corridor] br
(TreasureAno crs loot : _) -> branchRectWith . fmap pure $ lootRoom crs loot -- (TreasureAno crs loot : _) -> branchRectWith . fmap pure $ lootRoom crs loot
_ -> do _ -> do
w <- state $ randomR (100,400) w <- state $ randomR (100,400)
h <- state $ randomR (200,400) h <- state $ randomR (200,400)
+7 -11
View File
@@ -10,20 +10,16 @@ import Control.Monad.State
import Control.Lens import Control.Lens
import System.Random import System.Random
data Annotation data Annotation
= Lock Int = -- Corridor
| Key Int -- | AirlockAno
| Corridor PadWith Room Annotation
| AirlockAno | OnwardList [Annotation]
| OrAno [[Annotation]] | IntAnno Int (Int -> Annotation)
| SpecificRoom (State StdGen (LabTree Room)) -- | OrAno [[Annotation]]
| BossAno Creature | SpecificRoom (State StdGen (MetaTree Room))
| TreasureAno [Creature] [Item]
| AnoApplyInt Int (Int -> State StdGen (LabTree Room)) | AnoApplyInt Int (Int -> State StdGen (LabTree Room))
| AnoNewInt (Int -> State StdGen (Tree Room))
| PassthroughLockKeyLists Int | PassthroughLockKeyLists Int
[(Int -> State StdGen (LabTree Room), State StdGen ItemBaseType)] [(Int -> State StdGen (LabTree Room), State StdGen ItemBaseType)]
[(ItemBaseType, State StdGen (LabTree Room))] [(ItemBaseType, State StdGen (LabTree Room))]
-- | SetLabel Int (State g Room)
-- | useLabel Int (State g Room)
makeLenses ''Annotation makeLenses ''Annotation
+57 -58
View File
@@ -35,68 +35,67 @@ import RandomHelp
--import Data.Maybe --import Data.Maybe
--import qualified Data.IntMap.Strict as IM --import qualified Data.IntMap.Strict as IM
initialAnoTree :: Tree [Annotation] initialAnoTree :: Annotation
initialAnoTree = padSucWithDoors $ treePost initialAnoTree = PadWith door $ OnwardList
[[AnoApplyInt 110 startRoom] [ IntAnno 0 $ SpecificRoom . startRoom
, [PassthroughLockKeyLists 2 keyCardRunPastRand itemRooms] -- , PassthroughLockKeyLists 2 keyCardRunPastRand itemRooms
, [SpecificRoom $ warningRooms 777777] , SpecificRoom $ warningRooms 1
, [SpecificRoom $ rToOnward "chaseCrit+armourChaseCrit rectRoom" , SpecificRoom $ rToOnward "chaseCrit+armourChaseCrit rectRoom"
$ return . cleatOnward $ roomRectAutoLinks 400 400 & rmPmnts .++~ $ return . cleatOnward $ roomRectAutoLinks 400 400 & rmPmnts .++~
[ spNoID anyUnusedSpot (PutCrit invisibleChaseCrit) [ spNoID anyUnusedSpot (PutCrit invisibleChaseCrit)
, spNoID anyUnusedSpot (PutCrit armourChaseCrit) , spNoID anyUnusedSpot (PutCrit armourChaseCrit)
] ]
] --"-- , [AnoApplyInt 100 healthTest]
-- , [AnoApplyInt 100 healthTest] --" , PassthroughLockKeyLists 23
, [PassthroughLockKeyLists 23 --" [(sensorRoomRunPast ELECTRICAL, takeOne [STATICMODULE,SPARKGUN] )] itemRooms
[(sensorRoomRunPast ELECTRICAL, takeOne [STATICMODULE,SPARKGUN] )] itemRooms] --" , SpecificRoom (tanksRoom [] [] >>= rToOnward "empty tanksRoom" . pure . cleatOnward)
, [SpecificRoom (tanksRoom [] [] >>= rToOnward "empty tanksRoom" . pure . cleatOnward)] --" , PassthroughLockKeyLists 222 lockRoomKeyItems itemRooms
, [PassthroughLockKeyLists 222 lockRoomKeyItems itemRooms] --" , SpecificRoom randomChallenges
, [SpecificRoom randomChallenges] --" , AnoApplyInt 1 lasSensorTurretTest
, [AnoApplyInt 1 lasSensorTurretTest] --"-- ,[SpecificRoom $ fmap pure roomCCrits]
-- ,[SpecificRoom $ fmap pure roomCCrits] --"-- ,[AirlockAno]
-- ,[AirlockAno] --"-- ,[Corridor]
-- ,[Corridor] --"------ ,[SpecificRoom roomCCrits]
------ ,[SpecificRoom roomCCrits] --"------ ,[Corridor]
------ ,[Corridor] --"------ ,[SpecificRoom . pure . pure . useAll $ roomGlassOctogon 400
------ ,[SpecificRoom . pure . pure . useAll $ roomGlassOctogon 400 --"------ & rmPS %~ ([sPS (V2 0 50) 0 $ PutCrit armourChaseCrit
------ & rmPS %~ ([sPS (V2 0 50) 0 $ PutCrit armourChaseCrit --"------ ,sPS (V2 50 25) 0 $ PutCrit armourChaseCrit
------ ,sPS (V2 50 25) 0 $ PutCrit armourChaseCrit --"------ ,sPS (V2 50 0) 0 $ PutCrit armourChaseCrit
------ ,sPS (V2 50 0) 0 $ PutCrit armourChaseCrit --"------ ]++)
------ ]++) --"------ ]
------ ] --"------ --,[SpecificRoom . pure . pure . useAll $ roomGlassOctogon 400
------ --,[SpecificRoom . pure . pure . useAll $ roomGlassOctogon 400 --"------ -- & rmPS %~ ([swarmPS 0 (x,y) 0 swarmCrit | x <- [-20,-19.5.. 20] , y <- [200,202] ]++)
------ -- & rmPS %~ ([swarmPS 0 (x,y) 0 swarmCrit | x <- [-20,-19.5.. 20] , y <- [200,202] ]++) --"------ -- ]
------ -- ] --"------ ,[SpecificRoom . pure . pure . useAll $ roomGlassOctogon 400
------ ,[SpecificRoom . pure . pure . useAll $ roomGlassOctogon 400 --"------ & rmPS %~ ([sPS (V2 0 50) 0 $ PutCrit pistolCrit ]++)
------ & rmPS %~ ([sPS (V2 0 50) 0 $ PutCrit pistolCrit ]++) --"------ ]
------ ] --"------ ,[Corridor]
------ ,[Corridor] --"---- --,[SpecificRoom $ pure . useAll <$> twinSlowDoorChasers]
---- --,[SpecificRoom $ pure . useAll <$> twinSlowDoorChasers] --"----- ,[SpecificRoom $ pure $ (pure . useAll) (twinSlowDoorRoom 80 200 40)]
----- ,[SpecificRoom $ pure $ (pure . useAll) (twinSlowDoorRoom 80 200 40)] --"----- ,[DoorAno]
----- ,[DoorAno] --"----- ,[SpecificRoom $ pure . useAll <$> centerVaultExplosiveExit]
----- ,[SpecificRoom $ pure . useAll <$> centerVaultExplosiveExit] --"----- ,[SpecificRoom blockedCorridor]
----- ,[SpecificRoom blockedCorridor] --"----- ,[OrAno [[DoorAno]
----- ,[OrAno [[DoorAno] --"----- ,[Corridor]
----- ,[Corridor] --"----- ,[DoorNumAno 0,AirlockAno]]
----- ,[DoorNumAno 0,AirlockAno]] --"----- ]
----- ] --"----- ,[FirstWeapon]
----- ,[FirstWeapon] --"----- ,[CorridorDebug]
----- ,[CorridorDebug] --"----- ,[SpecificRoom $ fmap (pure . useAll) randomFourCornerRoom]
----- ,[SpecificRoom $ fmap (pure . useAll) randomFourCornerRoom] --"-- ,[OrAno
-- ,[OrAno --"-- [[SpecificRoom $ branchRectWith $ fmap (fmap ) armouredChasers]
-- [[SpecificRoom $ branchRectWith $ fmap (fmap ) armouredChasers] --"-- ,[BossAno $ addArmour launcherCrit & crHP +~ 800
-- ,[BossAno $ addArmour launcherCrit & crHP +~ 800 --"-- & crState . crDropsOnDeath .~ DropSpecific [0] ]
-- & crState . crDropsOnDeath .~ DropSpecific [0] ] --"-- ]
-- ] --"-- ]
-- ] --"---- ,[SpecificRoom $ fmap (pure . useAll) armouredCorridor]
---- ,[SpecificRoom $ fmap (pure . useAll) armouredCorridor] --"-- ,[Corridor]
-- ,[Corridor] --"-- ,[TreasureAno [addArmour autoCrit,addArmour autoCrit] [launcher]]
-- ,[TreasureAno [addArmour autoCrit,addArmour autoCrit] [launcher]] --"-- ,[Corridor]
-- ,[Corridor] --" ,SpecificRoom $ randomFourCornerRoom [] >>= rToOnward "randomFourCornerRoom" . pure . cleatOnward
,[SpecificRoom $ randomFourCornerRoom [] >>= rToOnward "randomFourCornerRoom" . pure . cleatOnward ] --" ,SpecificRoom $ telRoomLev 1 >>= rToOnward "telRoomLev" . pure . cleatOnward
,[SpecificRoom $ telRoomLev 1 >>= rToOnward "telRoomLev" . pure . cleatOnward]
] ]
{- | A test level tree. -} {- | A test level tree. -}
initialRoomTree :: State StdGen (Tree (Room -> Maybe ([String],Room), Tree Room)) initialRoomTree :: State StdGen (MetaTree Room)
initialRoomTree = mapM anoToRoomTree initialAnoTree initialRoomTree = annoToRoomTree initialAnoTree
+1 -1
View File
@@ -36,7 +36,7 @@ layoutLevelFromSeed i seed = do
appendFile "log/attemptedSeeds" $ show seed ++ "\n" appendFile "log/attemptedSeeds" $ show seed ++ "\n"
let g = mkStdGen seed let g = mkStdGen seed
let treecluster = evalState initialRoomTree g let treecluster = evalState initialRoomTree g
tc <- composeAndLog $ cmpToMT treecluster tc <- composeAndLog $ treecluster
---- (strs,tc) = composeTree' treecluster ---- (strs,tc) = composeTree' treecluster
----appendFile "log/TreeCluster" ("Seed: "++ show seed) ----appendFile "log/TreeCluster" ("Seed: "++ show seed)
----mapM_ (appendFile "log/treeCluster" . ('\n':)) strs ----mapM_ (appendFile "log/treeCluster" . ('\n':)) strs
+5 -5
View File
@@ -17,7 +17,7 @@ import Dodge.Item
bossKeyItems :: RandomGen g => [ (State g (Tree Room), State g ItemBaseType) ] bossKeyItems :: RandomGen g => [ (State g (Tree Room), State g ItemBaseType) ]
bossKeyItems = [(return . cleatOnward <$> bossRoom autoCrit, takeOne [PISTOL]) ] bossKeyItems = [(return . cleatOnward <$> bossRoom autoCrit, takeOne [PISTOL]) ]
lockRoomMultiItems :: RandomGen g => [ ( State g (LabTree Room) , State g [ItemBaseType] ) ] lockRoomMultiItems :: RandomGen g => [ ( State g (MetaTree Room) , State g [ItemBaseType] ) ]
lockRoomMultiItems = lockRoomMultiItems =
[ (blinkAcrossChallenge, takeOne [[BLINKERUNSAFE,AUTODETECTOR WALLDETECTOR] [ (blinkAcrossChallenge, takeOne [[BLINKERUNSAFE,AUTODETECTOR WALLDETECTOR]
,[BLINKERUNSAFE,CLICKDETECTOR WALLDETECTOR] ,[BLINKERUNSAFE,CLICKDETECTOR WALLDETECTOR]
@@ -25,7 +25,7 @@ lockRoomMultiItems =
) )
] ]
lockRoomKeyItems :: RandomGen g => [ (Int -> State g (LabTree Room) , State g ItemBaseType ) ] lockRoomKeyItems :: RandomGen g => [ (Int -> State g (MetaTree Room) , State g ItemBaseType ) ]
lockRoomKeyItems = lockRoomKeyItems =
[(lasCenSensEdge, takeOne [LAUNCHER,LASGUN,SPARKGUN,FLATSHIELD,FORCEFIELDGUN] ) [(lasCenSensEdge, takeOne [LAUNCHER,LASGUN,SPARKGUN,FLATSHIELD,FORCEFIELDGUN] )
,(sensorRoomRunPast ELECTRICAL, takeOne [STATICMODULE,SPARKGUN] ) ,(sensorRoomRunPast ELECTRICAL, takeOne [STATICMODULE,SPARKGUN] )
@@ -37,10 +37,10 @@ lockRoomKeyItems =
,(const $ lasTunnelRunPast 400, takeOne [FLATSHIELD,FORCEFIELDGUN]) ,(const $ lasTunnelRunPast 400, takeOne [FLATSHIELD,FORCEFIELDGUN])
,(keyCardRoomRunPast 0, return (KEYCARD 0)) ,(keyCardRoomRunPast 0, return (KEYCARD 0))
] ]
keyCardRunPastRand :: RandomGen g => [ (Int -> State g (LabTree Room) , State g ItemBaseType ) ] keyCardRunPastRand :: RandomGen g => [ (Int -> State g (MetaTree Room) , State g ItemBaseType ) ]
keyCardRunPastRand = [(keyCardRoomRunPast 0, return (KEYCARD 0)) ] keyCardRunPastRand = [(keyCardRoomRunPast 0, return (KEYCARD 0)) ]
itemRooms :: RandomGen g => [(ItemBaseType, State g (LabTree Room))] itemRooms :: RandomGen g => [(ItemBaseType, State g (MetaTree Room))]
itemRooms = itemRooms =
[ (LAUNCHER , join $ takeOne [ (LAUNCHER , join $ takeOne
[corridorBoss launcherCrit [corridorBoss launcherCrit
@@ -108,7 +108,7 @@ someCrits = do
-- return $ roomsContaining crits its -- return $ roomsContaining crits its
corridorBoss :: RandomGen g => Creature -> State g (LabTree Room) corridorBoss :: RandomGen g => Creature -> State g (MetaTree Room)
corridorBoss cr = do corridorBoss cr = do
endroom <- bossRoom cr endroom <- bossRoom cr
rToOnward ("corridorBoss-"++_crName cr) rToOnward ("corridorBoss-"++_crName cr)
+1 -1
View File
@@ -34,7 +34,7 @@ import LensHelp
import Control.Monad.State import Control.Monad.State
import System.Random import System.Random
blinkAcrossChallenge :: RandomGen g => State g (LabTree Room) blinkAcrossChallenge :: RandomGen g => State g (MetaTree Room)
blinkAcrossChallenge = do blinkAcrossChallenge = do
teleFromRoom <- shuffleLinks $ roomRectAutoLinks 200 200 teleFromRoom <- shuffleLinks $ roomRectAutoLinks 200 200
teleToRoom <- shuffleLinks $ roomRectAutoLinks 200 200 teleToRoom <- shuffleLinks $ roomRectAutoLinks 200 200
+1 -1
View File
@@ -15,7 +15,7 @@ import Geometry
import Data.List import Data.List
roomsContaining :: RandomGen g => [Creature] -> [Item] -> State g (LabTree Room) roomsContaining :: RandomGen g => [Creature] -> [Item] -> State g (MetaTree Room)
roomsContaining crs its = do roomsContaining crs its = do
endroom <- join $ takeOne endroom <- join $ takeOne
[ randomFourCornerRoomCrsIts crs its [ randomFourCornerRoomCrsIts crs its
+2 -2
View File
@@ -53,7 +53,7 @@ glassLesson = do
, mntLS vShape (V2 180 200) (V3 160 180 50) , mntLS vShape (V2 180 200) (V3 160 180 50)
] ]
] ]
glassLessonRunPast :: RandomGen g => State g (LabTree Room) glassLessonRunPast :: RandomGen g => State g (MetaTree Room)
glassLessonRunPast = (f <$> glassLesson) <&> (toOnward "glassLessonRunPast",) glassLessonRunPast = (f <$> glassLesson) >>= rToOnward "glassLessonRunPast"
where where
f (Node r rs) = Node r $ return (cleatLabel 0 $ door & rmConnectsTo .~ S.member (OnEdge West)) : rs f (Node r rs) = Node r $ return (cleatLabel 0 $ door & rmConnectsTo .~ S.member (OnEdge West)) : rs
+6 -6
View File
@@ -71,15 +71,15 @@ lightSensByDoor outplid rm = rm
covershape = rectNSEW 10 (-10) 20 (-20) covershape = rectNSEW 10 (-10) 20 (-20)
sensorshift (p,a) = (p +.+ rotateV a (V2 60 (-20)), a) sensorshift (p,a) = (p +.+ rotateV a (V2 60 (-20)), a)
keyCardRoomRunPast :: RandomGen g => Int -> Int -> State g (LabTree Room) keyCardRoomRunPast :: RandomGen g => Int -> Int -> State g (MetaTree Room)
keyCardRoomRunPast keyid rmid = do keyCardRoomRunPast keyid rmid = do
cenroom <- shuffleLinks $ keyCardAnalyserByDoor keyid rmid $ roomNgon 6 200 cenroom <- shuffleLinks $ keyCardAnalyserByDoor keyid rmid $ roomNgon 6 200
let doorroom = triggerDoorRoom rmid let doorroom = triggerDoorRoom rmid
return (toOnward "keyCardRoomRunPast", rToOnward "keyCardRoomRunPast" $
treeFromTrunk [door] $ Node cenroom treeFromTrunk [door] $ Node cenroom
[ treeFromPost [doorroom] (cleatOnward door) [ treeFromPost [doorroom] (cleatOnward door)
, treeFromPost [door] (cleatLabel rmid corridor) , treeFromPost [door] (cleatLabel rmid corridor)
]) ]
keyCardAnalyserByDoor :: Int -> Int -> Room -> Room keyCardAnalyserByDoor :: Int -> Int -> Room -> Room
keyCardAnalyserByDoor keyid = analyserByDoor (RequireEquipment (KEYCARD keyid)) keyCardAnalyserByDoor keyid = analyserByDoor (RequireEquipment (KEYCARD keyid))
@@ -114,13 +114,13 @@ healthTest n = do
, cleatOnward door , cleatOnward door
] ]
lasSensorTurretTest :: RandomGen g => Int -> State g (LabTree Room) lasSensorTurretTest :: RandomGen g => Int -> State g (MetaTree Room)
lasSensorTurretTest n = do lasSensorTurretTest n = do
cenroom <- shuffleLinks $ lightSensInsideDoor n cenLasTur cenroom <- shuffleLinks $ lightSensInsideDoor n cenLasTur
rToOnward "lasSensorTurretTest" $ treePost rToOnward "lasSensorTurretTest" $ treePost
[ door, cenroom, triggerDoorRoom n, cleatOnward door] [ door, cenroom, triggerDoorRoom n, cleatOnward door]
lasCenSensEdge :: RandomGen g => Int -> State g (LabTree Room) lasCenSensEdge :: RandomGen g => Int -> State g (MetaTree Room)
lasCenSensEdge n = do lasCenSensEdge n = do
cenroom <- shuffleLinks $ lightSensByDoor n cenLasTur cenroom <- shuffleLinks $ lightSensByDoor n cenLasTur
let doorroom = triggerDoorRoom n let doorroom = triggerDoorRoom n
@@ -165,7 +165,7 @@ lasTunnel y = do
] ]
-- a y value of 400 is probably "unrunnable" -- a y value of 400 is probably "unrunnable"
lasTunnelRunPast :: RandomGen g => Float -> State g (LabTree Room) lasTunnelRunPast :: RandomGen g => Float -> State g (MetaTree Room)
lasTunnelRunPast y = do lasTunnelRunPast y = do
r <- lasTunnel y r <- lasTunnel y
r1 <- takeOne [door,corridor] r1 <- takeOne [door,corridor]
+1 -1
View File
@@ -140,7 +140,7 @@ slowDoorRoom = do
proom <- southPillarsRoom x y h proom <- southPillarsRoom x y h
addButtonSlowDoor x h (proom & rmPmnts %~ (++ (crits ++ barrels))) addButtonSlowDoor x h (proom & rmPmnts %~ (++ (crits ++ barrels)))
slowDoorRoomRunPast :: RandomGen g => State g (LabTree Room) slowDoorRoomRunPast :: RandomGen g => State g (MetaTree Room)
slowDoorRoomRunPast = do slowDoorRoomRunPast = do
r <- slowDoorRoom r <- slowDoorRoom
rToOnward "slowDoorRoomRunPast" $ treeFromTrunk [ door] $ Node r rToOnward "slowDoorRoomRunPast" $ treeFromTrunk [ door] $ Node r
+1 -1
View File
@@ -47,7 +47,7 @@ longRoom = do
| crx <- [12.5,37.5,62.5] ] ++ | crx <- [12.5,37.5,62.5] ] ++
[sPS (V2 25 lampy ) 0 putLamp | lampy <- [20,h-10] ] [sPS (V2 25 lampy ) 0 putLamp | lampy <- [20,h-10] ]
longRoomRunPast :: RandomGen g => State g (LabTree Room) longRoomRunPast :: RandomGen g => State g (MetaTree Room)
longRoomRunPast = do longRoomRunPast = do
r <- longRoom r <- longRoom
rToOnward "longRoomRunPast" rToOnward "longRoomRunPast"
+4 -4
View File
@@ -123,11 +123,11 @@ rot90Around cen p = cen +.+ vNormal (p -.- cen)
-- So, the idea is to attach outer children to the bottommost right nodes -- So, the idea is to attach outer children to the bottommost right nodes
-- inside an inner tree -- inside an inner tree
-- no idea what was going on here... -- no idea what was going on here...
roomMiniIntro :: RandomGen g => State g (LabTree Room) roomMiniIntro :: RandomGen g => State g (MetaTree Room)
roomMiniIntro = do roomMiniIntro = do
midroom <- join $ takeOne [miniTree2] --,glassLesson] midroom <- join $ takeOne [miniTree2] --,glassLesson]
return ( toOnward "roomMiniIntro" rToOnward "roomMiniIntro"
, midroom ) midroom
roomCenterPillar :: RandomGen g => State g Room roomCenterPillar :: RandomGen g => State g Room
roomCenterPillar = shuffleLinks . restrictInLinks ((\p -> dist p (V2 120 0) < 10) . fst) roomCenterPillar = shuffleLinks . restrictInLinks ((\p -> dist p (V2 120 0) < 10) . fst)
@@ -396,7 +396,7 @@ pistolerRoom = pillarGrid
] ]
++) ++)
shootingRange :: RandomGen g => State g (LabTree Room) shootingRange :: RandomGen g => State g (MetaTree Room)
shootingRange = do shootingRange = do
rm1 <- shootersRoom1 >>= shuffleLinks . restrictInLinks (\(V2 _ y,_) -> y < 40) rm1 <- shootersRoom1 >>= shuffleLinks . restrictInLinks (\(V2 _ y,_) -> y < 40)
. restrictOutLinks (\(V2 _ y,r) -> y > 200 && r /= 0) . restrictOutLinks (\(V2 _ y,r) -> y > 200 && r /= 0)
+1 -1
View File
@@ -56,7 +56,7 @@ sensorRoom senseType n = do
p' = p +.+ rotateV d (V2 0 (negate 100)) p' = p +.+ rotateV d (V2 0 (negate 100))
isclose = dist (_rlPos rl) p' < 30 isclose = dist (_rlPos rl) p' < 30
sensorRoomRunPast :: RandomGen g => DamageType -> Int -> State g (LabTree Room) sensorRoomRunPast :: RandomGen g => DamageType -> Int -> State g (MetaTree Room)
sensorRoomRunPast dt n = do sensorRoomRunPast dt n = do
t <- sensorRoom dt n t <- sensorRoom dt n
rToOnward "sensorRoomRunPast" $ t & applyToSubforest [0] rToOnward "sensorRoomRunPast" $ t & applyToSubforest [0]
+6 -7
View File
@@ -48,7 +48,7 @@ powerFakeout = do
, keyholeCorridor, corridor]) , keyholeCorridor, corridor])
`treeFromPost` cleatOnward door `treeFromPost` cleatOnward door
startRoom :: RandomGen g => Int -> State g (LabTree Room) startRoom :: RandomGen g => Int -> State g (MetaTree Room)
startRoom i = join (takeOne startRoom i = join (takeOne
[-- (,) (0.5::Float) ((chainUses <$> sequence [powerFakeout,fmap fst $weaponRoom i]) [-- (,) (0.5::Float) ((chainUses <$> sequence [powerFakeout,fmap fst $weaponRoom i])
-- <&> (,TreeSubLabelling "chainUses <$> sequence [powerFakeout,weaponRoom i]" Nothing)) -- <&> (,TreeSubLabelling "chainUses <$> sequence [powerFakeout,weaponRoom i]" Nothing))
@@ -56,11 +56,11 @@ startRoom i = join (takeOne
-- rezBoxesWp >>= rToOnward "rezBoxesWp" -- rezBoxesWp >>= rToOnward "rezBoxesWp"
-- , rezBoxThenWeaponRoom i -- , rezBoxThenWeaponRoom i
-- , rezBoxesWpCrit >>= rToOnward "rezBoxesWpCrit" -- , rezBoxesWpCrit >>= rToOnward "rezBoxesWpCrit"
runPastStart i >>= rToOnward ("runPastStart " ++ show i) runPastStart i >>= rToOnward ("runPastStart " ++ show i)
-- , startCrafts >>= roomsContaining' [] >>= rezBoxThenRooms -- , startCrafts >>= roomsContaining' [] >>= rezBoxThenRooms
-- >>= rToOnward "startCrafts >>= roomsContaining [] >>= rezBoxThenRooms" -- >>= rToOnward "startCrafts >>= roomsContaining [] >>= rezBoxThenRooms"
]) ])
randomChallenges :: RandomGen g => State g (LabTree Room) randomChallenges :: RandomGen g => State g (MetaTree Room)
randomChallenges = shootingRange randomChallenges = shootingRange
-- join (takeOne -- join (takeOne
-- [fmap (return . useAll) doubleCorridorBarrels <&> (,TreeSubLabelling "doubleCorridorBarrels" Nothing) -- [fmap (return . useAll) doubleCorridorBarrels <&> (,TreeSubLabelling "doubleCorridorBarrels" Nothing)
@@ -88,13 +88,12 @@ rezBoxesThenWeaponRoom i = do
wroom <- snd <$> weaponRoom i wroom <- snd <$> weaponRoom i
return (rboxes `passUntiluseAll` [wroom] , "rezBoxesThenWeaponRoom " ++ show i) return (rboxes `passUntiluseAll` [wroom] , "rezBoxesThenWeaponRoom " ++ show i)
rezBoxThenWeaponRoom :: RandomGen g => Int -> State g (LabTree Room) rezBoxThenWeaponRoom :: RandomGen g => Int -> State g (MetaTree Room)
rezBoxThenWeaponRoom i = do rezBoxThenWeaponRoom i = do
rcol <- rezColor rcol <- rezColor
(_,wroom) <- weaponRoom i (_,wroom) <- weaponRoom i
return (toOnward ("rezBoxThenWeaponRoom "++ show i) rToOnward ("rezBoxThenWeaponRoom "++ show i)
, treeFromTrunk [ rezBox rcol, door] wroom $ treeFromTrunk [ rezBox rcol, door] wroom
)
rezBoxThenRoom :: RandomGen g => Room -> State g (Tree Room) rezBoxThenRoom :: RandomGen g => Room -> State g (Tree Room)
rezBoxThenRoom r = do rezBoxThenRoom r = do
+1 -1
View File
@@ -37,7 +37,7 @@ import qualified Data.Map.Strict as M
--import qualified Data.Text as T --import qualified Data.Text as T
warningRooms :: RandomGen g => Int -> State g (LabTree Room) warningRooms :: RandomGen g => Int -> State g (MetaTree Room)
warningRooms n = do warningRooms n = do
rm <- takeOne [roomNgon 8 200, roomRectAutoLinks 200 200] rm <- takeOne [roomNgon 8 200, roomRectAutoLinks 200 200]
cenroom <- shuffleLinks $ addWarningTerminal n rm cenroom <- shuffleLinks $ addWarningTerminal n rm
+6 -2
View File
@@ -1,6 +1,7 @@
{-# LANGUAGE TupleSections #-} {-# LANGUAGE TupleSections #-}
module Dodge.UseAll where module Dodge.UseAll where
import Dodge.Data import Dodge.Data
import Dodge.Tree.Compose.Data
import Data.Tree import Data.Tree
import Control.Lens import Control.Lens
@@ -15,8 +16,11 @@ toOnward s rm
toOnward' :: Room -> Maybe Room toOnward' :: Room -> Maybe Room
toOnward' = fmap snd . toOnward "" toOnward' = fmap snd . toOnward ""
rToOnward :: Monad m => String -> Tree Room -> m (Room -> Maybe ([String],Room), Tree Room) rToOnward :: Monad m => String -> Tree Room -> m (MetaTree Room)
rToOnward s = return . (toOnward s ,) rToOnward s t = return $ MTree s (tToBTree t) []
tToBTree :: Tree Room -> MetaTree Room
tToBTree (Node r ts) = BTree (_rmName r) r $ map tToBTree ts
toClusterLabel :: Int -> String -> Room -> Maybe ([String],Room) toClusterLabel :: Int -> String -> Room -> Maybe ([String],Room)
toClusterLabel i s rm toClusterLabel i s rm