about summary refs log tree commit diff
path: root/src/Xanthous/Generators
diff options
context:
space:
mode:
Diffstat (limited to 'src/Xanthous/Generators')
-rw-r--r--src/Xanthous/Generators/LevelContents.hs40
1 files changed, 32 insertions, 8 deletions
diff --git a/src/Xanthous/Generators/LevelContents.hs b/src/Xanthous/Generators/LevelContents.hs
index f8d9b8a2045a..9192674ba7a9 100644
--- a/src/Xanthous/Generators/LevelContents.hs
+++ b/src/Xanthous/Generators/LevelContents.hs
@@ -1,21 +1,45 @@
 --------------------------------------------------------------------------------
 module Xanthous.Generators.LevelContents
   ( chooseCharacterPosition
+  , randomItems
   ) where
 --------------------------------------------------------------------------------
-import Xanthous.Prelude
+import           Xanthous.Prelude
 --------------------------------------------------------------------------------
-import Control.Monad.Random
-import Data.Array.IArray (amap)
+import           Control.Monad.Random
+import           Data.Array.IArray (amap, bounds, rangeSize)
 --------------------------------------------------------------------------------
-import Xanthous.Generators.Util
-import Xanthous.Random
+import           Xanthous.Generators.Util
+import           Xanthous.Random
+import           Xanthous.Data (Position, positionFromPair)
+import           Xanthous.Data.EntityMap (EntityMap, _EntityMap)
+import           Xanthous.Entities.Item (Item(..))
+import           Xanthous.Entities.Raws
+import           Xanthous.Entities.RawTypes
+import qualified Xanthous.Entities.Item as Item
 --------------------------------------------------------------------------------
 
-chooseCharacterPosition :: MonadRandom m => Cells -> m (Word, Word)
-chooseCharacterPosition cells = choose $ impureNonNull candidates
+chooseCharacterPosition :: MonadRandom m => Cells -> m Position
+chooseCharacterPosition = randomPosition
+
+randomItems :: MonadRandom m => Cells -> m (EntityMap Item)
+randomItems cells = do
+  let len = rangeSize $ bounds cells
+  (numItems :: Int) <- floor . (* fromIntegral len)
+                     <$> getRandomR @_ @Float (0.0004, 0.001)
+  items <- for [0..numItems] $ const do
+    pos <- randomPosition cells
+    itemType <- fmap (fromMaybe (error "no item raws!"))
+               . choose . ChooseElement
+               $ rawsWithType @ItemType
+    let item = Item.newWithType itemType
+    pure (pos, item)
+  pure $ _EntityMap # items
+
+randomPosition :: MonadRandom m => Cells -> m Position
+randomPosition cells = fmap positionFromPair . choose $ impureNonNull candidates
   where
-    -- cells ends up with true = wall, we want true = can put a character here
+    -- cells ends up with true = wall, we want true = can put an item here
     placeableCells = amap not cells
 
     -- find the largest contiguous region of cells in the cave.