Change raycaster and mapper to procedurally generate variable-height walls

This commit is contained in:
Bill Niblock 2024-10-30 22:28:49 -04:00
parent 70dba7ea56
commit 7418cfeb3f
2 changed files with 24 additions and 18 deletions

View file

@ -5,6 +5,8 @@
(var cell-num 20)
(var (hall-width wall-width) (values 2 4))
(var cell-size (+ hall-width wall-width))
; (fn wall-seg [] (+ 10 (math.random 1 3)))
(fn wall-seg [] (math.random 11 13))
; Helper functions for dealing with the cell list
(fn cell-row [i] (+ 1 (math.floor (/ (- i 1) cell-num))))
(fn map-index [i]
@ -37,9 +39,9 @@
(var cell-index (+ j (* (- i 1) cell-size)))
(if (and (< i (+ col-limit 1)) (< j (+ row-limit 1)))
(tset cell cell-index 0)
(tset cell cell-index 1))
(tset cell cell-index (wall-seg)))
(if (and (> i hall-width) (> j hall-width))
(tset cell cell-index 1))
(tset cell cell-index (wall-seg)))
(if (= k leave-cell)
(tset cell cell-index 0))))
(table.insert cells cell))
@ -113,28 +115,31 @@
(tset cell_map new-map-index (. cells c new-cell-index)))))
cell_map)
(fn generate-north-spawn [spawn-cell]
(var (map map-row) (values [] []))
(for [i 1 cell-size]
(set map-row [])
(for [j 1 (- (* (+ 2 cell-num) cell-size) hall-width)] (table.insert map-row 1))
(for [j 1 (- (* (+ 2 cell-num) cell-size) hall-width)]
(table.insert map-row (wall-seg)))
(table.insert map map-row))
(var spawn (+ (- (* spawn-cell cell-size) (- cell-size 1)) cell-size))
(tset map cell-size spawn 0)
(tset map cell-size (+ spawn 1) 2)
(tset map cell-size (- spawn 1) 2)
(tset map (- cell-size 1) spawn 3)
(tset map cell-size (+ spawn 1) 22)
(tset map cell-size (- spawn 1) 22)
(tset map (- cell-size 1) spawn 33)
map)
(fn generate-south-exit [cells leave-cell]
(var (map map-row) (values [] []))
(for [i 1 (- cell-size hall-width)]
(set map-row [])
(for [j 1 (- (* (+ 2 cell-num) cell-size) hall-width)] (table.insert map-row 1))
(for [j 1 (- (* (+ 2 cell-num) cell-size) hall-width)]
(table.insert map-row (wall-seg)))
(table.insert map map-row))
(var escape (+ (* (- leave-cell (* cell-num (- cell-num 1))) cell-size) 1))
(for [i 1 cell-size]
(tset map 1 (+ escape (- i 1)) 3))
(tset map 1 (+ escape (- i 1)) 33))
map)
(fn generate_map [cells spawn-cell leave-cell]
@ -144,14 +149,14 @@
; Pad the east and west sides of the map
(for [c 1 (* cell-num cell-size)]
(var map-row [])
(for [i 1 cell-size] (table.insert map-row 1))
(for [i 1 cell-size] (table.insert map-row (wall-seg)))
; (table.move cells
; (+ (* (- c 1) (* cell-num cell-size)) 1)
; (* c (* cell-num cell-size))
; (+ cell-size 1) map-row)
(for [i (+ (* (- c 1) (* cell-num cell-size)) 1) (* c (* cell-num cell-size))]
(table.insert map-row (. cells i)))
(for [i 1 (- cell-size hall-width)] (table.insert map-row 1))
(for [i 1 (- cell-size hall-width)] (table.insert map-row (wall-seg)))
(table.insert map map-row))
; Generate the northern feature - spawn point
(each [_ row (ipairs (generate-south-exit cells leave-cell))] (table.insert map row))
@ -176,7 +181,7 @@
(var data-maze (convert-cells meta-maze leave-cell))
(var data-map (generate_cell_map data-maze))
(var map (generate_map data-map spawn-cell leave-cell))
(print_map map)
;(print_map map)
(values map spawn-spot))
; (print (.. "SPAWN: " spawn-cell "(" (. spawn-spot :x) "," (. spawn-spot :y) ")"))

View file

@ -191,7 +191,8 @@
; Draw textured wall
;; Choose texture
(var tex-num (. walls (. map mapx mapy)))
; (var tex-num (. walls (. map mapx mapy)))
(var tex-num (. walls (math.floor (/ (. map mapx mapy) 10))))
;; Calculate exactly where the wall was hit
(var wallx 0)
(if (= side 0)
@ -205,18 +206,18 @@
;; Draw the texture, accounting for "fog"
(var fog-dist (- 1 (/ perp-wall-dist 7)))
(love.graphics.setColor 1 1 1 fog-dist)
(love.graphics.draw (. tex-num :t)
(love.graphics.newQuad tex-x 0 1 (. tex-num :h) (. tex-num :w) (. tex-num :h))
i draw-start 0 1 (/ line-height (. tex-num :h)))
(when (= (. map mapx mapy) 3)
(for [q 1 3]
; (love.graphics.draw (. tex-num :t)
; (love.graphics.newQuad tex-x 0 1 (. tex-num :h) (. tex-num :w) (. tex-num :h))
; i draw-start 0 1 (/ line-height (. tex-num :h)))
; (when (= (. map mapx mapy) 3)
(for [q 0 (% (. map mapx mapy) 10)]
(set fog-dist (- fog-dist 0.1))
(love.graphics.setColor 1 1 1 fog-dist)
(love.graphics.draw (. tex-num :t)
(love.graphics.newQuad tex-x 0 1 (. tex-num :h) (. tex-num :w) (. tex-num :h))
i (- draw-start (* line-height q)) 0 1 (/ line-height (. tex-num :h)))
)
)
; )
)
(overlay.overlay offst-x offst-y)
)