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

View file

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