Add generic item placement rooms

This commit is contained in:
2022-03-03 22:13:15 +00:00
parent fd622b4b80
commit 2a3c001a53
8 changed files with 64 additions and 56 deletions
+5
View File
@@ -68,9 +68,14 @@ itemCombinations =
, p [o PRISM,p 2 PIPE,o HARDWARE] lasGun , p [o PRISM,p 2 PIPE,o HARDWARE] lasGun
, p [o TRANSFORMER,p 2 CAN] sparkGun
, p [o SPARKGUN,p 2 PIPE] teslaGun
, po [MAGNET,TIN] magShield , po [MAGNET,TIN] magShield
, p [p 4 CAN] plateCraft , p [p 4 CAN] plateCraft
, p [p 3 TIN] plateCraft
, p [p 2 DRUM] plateCraft
, p [p 2 PLATE] flatShield , p [p 2 PLATE] flatShield
] ]
+3 -1
View File
@@ -47,6 +47,7 @@ data CombineType
| SPREADGUN | SPREADGUN
| MULTGUN | MULTGUN
| LONGGUN | LONGGUN
| SPARKGUN
| TESLAGUN | TESLAGUN
| LASGUN | LASGUN
| SONICGUN | SONICGUN
@@ -84,6 +85,7 @@ data CombineType
| SHARDGLASS | SHARDGLASS
| PUMP | PUMP
| MOTOR | MOTOR
| TRANSFORMER
| PRISM | PRISM
| LIGHTER | LIGHTER
| MAGNET | MAGNET
@@ -101,7 +103,7 @@ data CombineType
| SOUNDSENSOR | SOUNDSENSOR
| HEATSENSOR | HEATSENSOR
| CREATURESENSOR | CREATURESENSOR
| COPPERWIRE | WIRE
| BATTERY | BATTERY
| FUELCELL | FUELCELL
| PORTABLEFUSION | PORTABLEFUSION
+1 -1
View File
@@ -89,7 +89,7 @@ initialAnoTree = padSucWithCorridors $ treeFromTrunk
-- ,[Corridor] -- ,[Corridor]
-- ,[TreasureAno [addArmour autoCrit,addArmour autoCrit] [launcher]] -- ,[TreasureAno [addArmour autoCrit,addArmour autoCrit] [launcher]]
] ]
$ treeFromPost [[Corridor,SpecificRoom $ fmap (pure . UseAll) randomFourCornerRoom]] $ treeFromPost [[Corridor,SpecificRoom $ pure . UseAll <$> randomFourCornerRoom []]]
[EndRoom] [EndRoom]
{- | A test level tree. -} {- | A test level tree. -}
+5
View File
@@ -1,5 +1,6 @@
module Dodge.Item.Weapon.BatteryGuns module Dodge.Item.Weapon.BatteryGuns
( lasGun ( lasGun
, sparkGun
, teslaGun , teslaGun
, tractorGun , tractorGun
, lasRayAt , lasRayAt
@@ -31,6 +32,10 @@ import LensHelp
import System.Random import System.Random
--import Data.Tuple --import Data.Tuple
import qualified Data.IntMap.Strict as IM import qualified Data.IntMap.Strict as IM
sparkGun :: Item
sparkGun = teslaGun
& itName .~ "SPARKGUN"
& itType .~ SPARKGUN
teslaGun :: Item teslaGun :: Item
teslaGun = defaultGun teslaGun = defaultGun
{ _itName = "TESLA" { _itName = "TESLA"
+4 -6
View File
@@ -80,10 +80,7 @@ bangCane = defaultGun
, _dimSPic = \it -> noPic $ baseCaneShape , _dimSPic = \it -> noPic $ baseCaneShape
<> makeSingleClipAt (V3 5 0 3) it <> makeSingleClipAt (V3 5 0 3) it
} }
} & itUse . useAim . aimSpeed .~ 0.4 } & itUse . useAim . aimStance .~ OneHand
& itUse . useAim . aimRange .~ 1
& itUse . useAim . aimStance .~ OneHand
& itUse . useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
bangCaneX :: Int -> Item bangCaneX :: Int -> Item
bangCaneX i = bangCane bangCaneX i = bangCane
{ _itName = "BANGCANEx"++show i { _itName = "BANGCANEx"++show i
@@ -133,7 +130,6 @@ caneClipX i it = case it ^? itConsumption . ammoLoaded of
. (\k -> fromIntegral k * 5 - ((fromIntegral i - 1) * 2.5))) . (\k -> fromIntegral k * 5 - ((fromIntegral i - 1) * 2.5)))
[0..la-1] [0..la-1]
_ -> mempty _ -> mempty
rifle :: Item rifle :: Item
rifle = bangCane rifle = bangCane
{ _itDimension = ItemDimension { _itDimension = ItemDimension
@@ -151,7 +147,9 @@ rifle = bangCane
& itName .~ "RIFLE" & itName .~ "RIFLE"
& itType .~ RIFLE & itType .~ RIFLE
& itConsumption . ammoBaseMax .~ 1 & itConsumption . ammoBaseMax .~ 1
& itUse . useAim . aimSpeed .~ 0.4
& itUse . useAim . aimRange .~ 1
& itUse . useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5}
repeater :: Item repeater :: Item
repeater = rifle repeater = rifle
& itModules . at ModRifleMag ?~ DefaultModule & itModules . at ModRifleMag ?~ DefaultModule
+7 -23
View File
@@ -92,32 +92,16 @@ flameWall :: Item
flameWall = flameThrower flameWall = flameThrower
& itName .~ "FLAMEWALL" & itName .~ "FLAMEWALL"
& itType .~ FLAMEWALL & itType .~ FLAMEWALL
& itParams . sprayNozzles .~ & itParams . sprayNozzles .~ zipWith makeNozzle [0,0.6,-0.6] [2,2.5,2.5]
[ Nozzle where
{ _nzPressure = 2.5 makeNozzle dir pres = Nozzle
, _nzDir = 0 { _nzPressure = pres
, _nzMaxWalkAngle = 0.2 , _nzDir = dir
, _nzWalkSpeed = 0.01 , _nzMaxWalkAngle = 0
, _nzWalkSpeed = 0
, _nzCurrentWalkAngle = 0 , _nzCurrentWalkAngle = 0
, _nzLength = 20 , _nzLength = 20
} }
, Nozzle
{ _nzPressure = 3
, _nzDir = 0.5
, _nzMaxWalkAngle = 0.2
, _nzWalkSpeed = 0.01
, _nzCurrentWalkAngle = 0
, _nzLength = 20
}
, Nozzle
{ _nzPressure = 3
, _nzDir = -0.5
, _nzMaxWalkAngle = 0.2
, _nzWalkSpeed = 0.01
, _nzCurrentWalkAngle = 0
, _nzLength = 20
}
]
flameThrower :: Item flameThrower :: Item
flameThrower = defaultAutoGun flameThrower = defaultAutoGun
+20 -2
View File
@@ -5,6 +5,7 @@ import Dodge.LevelGen.Data
import Dodge.Room import Dodge.Room
import Dodge.RandomHelp import Dodge.RandomHelp
import Dodge.Creature import Dodge.Creature
import Dodge.Item.Craftable
--import Dodge.Item.Equipment --import Dodge.Item.Equipment
import System.Random import System.Random
@@ -15,16 +16,33 @@ import Control.Monad.State
lockRoomKeyItems :: RandomGen g => [ (Int -> State g (SubCompTree Room) , State g CombineType ) ] lockRoomKeyItems :: RandomGen g => [ (Int -> State g (SubCompTree Room) , State g CombineType ) ]
lockRoomKeyItems = lockRoomKeyItems =
[(lasCenSensEdge, takeOne [LAUNCHER] ) [(lasCenSensEdge, takeOne [LAUNCHER,LASGUN,SPARKGUN] )
,(const slowDoorRoomRunPast, return MINIGUN) ,(const slowDoorRoomRunPast, return MINIGUN)
] ]
itemRooms :: RandomGen g => [(CombineType, State g (SubCompTree Room))] itemRooms :: RandomGen g => [(CombineType, State g (SubCompTree Room))]
itemRooms = itemRooms =
[ (LAUNCHER , corridorBoss launcherCrit ) [ (LAUNCHER , join $ takeOne
[corridorBoss launcherCrit
,roomsContaining $ map makeTypeCraft [TUBE,TUBE,HARDWARE]
]
)
, (MINIGUN , join $ takeOne [roomMiniIntro, minigunFakeout] ) , (MINIGUN , join $ takeOne [roomMiniIntro, minigunFakeout] )
, (LASGUN , join $ takeOne
[roomsContaining $ map makeTypeCraft [PRISM,PIPE,PIPE,HARDWARE]
]
)
, (SPARKGUN , join $ takeOne
[roomsContaining $ map makeTypeCraft [TRANSFORMER,CAN,CAN]
]
)
] ]
roomsContaining :: RandomGen g => [Item] -> State g (SubCompTree Room)
roomsContaining its = do
endroom <- randomFourCornerRoom its
return $ treeFromPost [] $ PassDown endroom
corridorBoss :: RandomGen g => Creature -> State g (SubCompTree Room) corridorBoss :: RandomGen g => Creature -> State g (SubCompTree Room)
corridorBoss cr = do corridorBoss cr = do
endroom <- bossRoom cr endroom <- bossRoom cr
+19 -23
View File
@@ -15,14 +15,14 @@ import Dodge.Default.Wall
import Dodge.PlacementSpot import Dodge.PlacementSpot
import Dodge.Placement.Instance import Dodge.Placement.Instance
import Dodge.RoomLink import Dodge.RoomLink
import Dodge.Item.Weapon.Utility --import Dodge.Item.Weapon.Utility
import Dodge.Room.Link import Dodge.Room.Link
import Dodge.Room.Path import Dodge.Room.Path
import Dodge.Default.Room import Dodge.Default.Room
import Dodge.Item.Consumable --import Dodge.Item.Consumable
import Dodge.Item.Equipment --import Dodge.Item.Equipment
import Dodge.Room.Foreground import Dodge.Room.Foreground
import Dodge.Item.Weapon --import Dodge.Item.Weapon
import Dodge.RandomHelp import Dodge.RandomHelp
import Dodge.LevelGen.Data import Dodge.LevelGen.Data
import Dodge.LevelGen.Switch import Dodge.LevelGen.Switch
@@ -108,21 +108,20 @@ combineFloors f _ = f
Add a light and a 'PutNothing' placement. -} Add a light and a 'PutNothing' placement. -}
quarterRoomFlat :: RandomGen g => Float -> State g Room quarterRoomFlat :: RandomGen g => Float -> State g Room
quarterRoomFlat w = do quarterRoomFlat w = do
let commonPlacements =
[ mntLS iShape (V2 (w-20) w) (V3 (w-20) (w-20) 70)
, sPS (V2 (w-20) (w-20)) pi PutNothing
, sPS (V2 (w-15) (w-25)) pi PutNothing
]
b <- takeOne b <- takeOne
[ [ mntLS vShape (V2 0 w) (V3 0 (w-20) 70) [ [ mntLS vShape (V2 0 w) (V3 0 (w-20) 70)
, mntLS iShape (V2 (w-20) w) (V3 (w-20) (w-20) 70)
, sPS (V2 (w-20) (w-20)) pi PutNothing
, blockLine (V2 (w/2) (w/2)) (V2 (w/2) w) , blockLine (V2 (w/2) (w/2)) (V2 (w/2) w)
] ] ++ commonPlacements
, [ mntLS iShape (V2 (w-20) w) (V3 (w-20) (w-20) 70) , blockLine (V2 (w/2) (w/2)) (V2 (negate $ w/2) (w/2))
, sPS (V2 (w-20) (w-20)) pi PutNothing : commonPlacements
, blockLine (V2 (w/2) (w/2)) (V2 (negate $ w/2) (w/2)) , [ blockLine (V2 (w/2) (w/2)) (V2 0 (w/2))
]
, [ mntLS iShape (V2 (w-20) w) (V3 (w-20) (w-20) 70)
, sPS (V2 (w-20) (w-20)) pi PutNothing
, blockLine (V2 (w/2) (w/2)) (V2 0 (w/2))
, blockLine (V2 (-29) w) (V2 0 (w/2)) , blockLine (V2 (-29) w) (V2 0 (w/2))
] ] ++ commonPlacements
] ]
pure $ defaultRoom pure $ defaultRoom
{ _rmPolys = [ [V2 0 0,V2 w w,V2 (-w) w] ] { _rmPolys = [ [V2 0 0,V2 w w,V2 (-w) w] ]
@@ -138,7 +137,6 @@ quarterRoomFlat w = do
, _rmPmnts = b , _rmPmnts = b
, _rmBound = [[V2 0 0,V2 w w,V2 (-w) w]] , _rmBound = [[V2 0 0,V2 w w,V2 (-w) w]]
} }
fourthCornerWall :: RandomGen g => Float -> State g Room fourthCornerWall :: RandomGen g => Float -> State g Room
fourthCornerWall w = do fourthCornerWall w = do
b <- takeOne b <- takeOne
@@ -199,16 +197,14 @@ shufflePlacements r = do
return $ r & rmPmnts .~ newPSs return $ r & rmPmnts .~ newPSs
{- | A randomly generate room based on four randomly generated corners. {- | A randomly generate room based on four randomly generated corners.
Tight corridors, random placements. -} Tight corridors, random placements. -}
randomFourCornerRoom :: RandomGen g => State g Room randomFourCornerRoom :: RandomGen g => [Item] -> State g Room
randomFourCornerRoom = do randomFourCornerRoom its = do
corners <- replicateM 4 . join $ takeOne [quarterRoomFlat 100, fourthCornerWall 100] corners <- replicateM 4 . join $ takeOne [quarterRoomFlat 100, fourthCornerWall 100]
nItms <- state $ randomR (1,2) itms <- shuffle its
itms <- takeN nItms $ fmap PutFlIt $ [autoRadar,autoSonar,remoteLauncher,jetPack,blinkGun]
++ replicate 5 (medkit 500)
nCrits <- state $ randomR (1,3) nCrits <- state $ randomR (1,3)
crits <- takeN nCrits $ fmap PutCrit $ [spreadGunCrit,pistolCrit,autoCrit,armourChaseCrit] crits <- takeN nCrits <=< shuffle $ fmap PutCrit $ [spreadGunCrit,pistolCrit,autoCrit,armourChaseCrit]
++ replicate 20 chaseCrit ++ replicate 20 chaseCrit
randomiseAllLinks . fillNothingPlacements (crits ++ itms) =<< randomiseAllLinks . fillNothingPlacements (crits ++ map PutFlIt itms) =<<
( shufflePlacements ( shufflePlacements
. over rmPmnts ( sps0 putLamp :) . over rmPmnts ( sps0 putLamp :)
. foldr1 combineRooms . foldr1 combineRooms