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