Add generic item placement rooms
This commit is contained in:
@@ -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
|
||||
]
|
||||
|
||||
@@ -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
@@ -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. -}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user