From 2a3c001a5395293f9f39f78ad824d5598b41e9a3 Mon Sep 17 00:00:00 2001 From: justin Date: Thu, 3 Mar 2022 22:13:15 +0000 Subject: [PATCH] Add generic item placement rooms --- src/Dodge/Combine/Combinations.hs | 5 +++ src/Dodge/Combine/Data.hs | 4 ++- src/Dodge/Floor.hs | 2 +- src/Dodge/Item/Weapon/BatteryGuns.hs | 5 +++ src/Dodge/Item/Weapon/BulletGun/Cane.hs | 10 +++--- src/Dodge/Item/Weapon/SprayGuns.hs | 30 +++++------------- src/Dodge/LockAndKey.hs | 22 +++++++++++-- src/Dodge/Room/Procedural.hs | 42 +++++++++++-------------- 8 files changed, 64 insertions(+), 56 deletions(-) diff --git a/src/Dodge/Combine/Combinations.hs b/src/Dodge/Combine/Combinations.hs index 50ee3a3c1..a4a91f233 100644 --- a/src/Dodge/Combine/Combinations.hs +++ b/src/Dodge/Combine/Combinations.hs @@ -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 ] diff --git a/src/Dodge/Combine/Data.hs b/src/Dodge/Combine/Data.hs index cacdf5e99..f208141fb 100644 --- a/src/Dodge/Combine/Data.hs +++ b/src/Dodge/Combine/Data.hs @@ -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 diff --git a/src/Dodge/Floor.hs b/src/Dodge/Floor.hs index e31c0b191..5b8f20570 100644 --- a/src/Dodge/Floor.hs +++ b/src/Dodge/Floor.hs @@ -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. -} diff --git a/src/Dodge/Item/Weapon/BatteryGuns.hs b/src/Dodge/Item/Weapon/BatteryGuns.hs index 91b6b7994..06fed9426 100644 --- a/src/Dodge/Item/Weapon/BatteryGuns.hs +++ b/src/Dodge/Item/Weapon/BatteryGuns.hs @@ -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" diff --git a/src/Dodge/Item/Weapon/BulletGun/Cane.hs b/src/Dodge/Item/Weapon/BulletGun/Cane.hs index 205bd0627..a5ab869ff 100644 --- a/src/Dodge/Item/Weapon/BulletGun/Cane.hs +++ b/src/Dodge/Item/Weapon/BulletGun/Cane.hs @@ -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 diff --git a/src/Dodge/Item/Weapon/SprayGuns.hs b/src/Dodge/Item/Weapon/SprayGuns.hs index ee80cec3a..c4fc75517 100644 --- a/src/Dodge/Item/Weapon/SprayGuns.hs +++ b/src/Dodge/Item/Weapon/SprayGuns.hs @@ -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 diff --git a/src/Dodge/LockAndKey.hs b/src/Dodge/LockAndKey.hs index 4b8d58060..bfac4713b 100644 --- a/src/Dodge/LockAndKey.hs +++ b/src/Dodge/LockAndKey.hs @@ -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 diff --git a/src/Dodge/Room/Procedural.hs b/src/Dodge/Room/Procedural.hs index 7ce0b4ccc..810cf6d2c 100644 --- a/src/Dodge/Room/Procedural.hs +++ b/src/Dodge/Room/Procedural.hs @@ -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