lispjam-autumn-2024/overlay.fnl

132 lines
5.4 KiB
Fennel

; Draw the overlay
; Relies on information about the player and the display
(local player (require :state))
(var (screen-width screen-height) (love.window.getMode))
; This draws the oxygen ui
; Sequential blocks, up to 10; each block 10%
(fn oxygen-ui [x y]
(local (bx by bb o) (values 10 10 15 (player.getO)))
(local bn (math.floor (/ o 10)))
(var (dx dy) (values 0 50))
(local bp (* 5 (% o 10)))
(love.graphics.setColor 0 1 0 0.25)
(for [i 1 10]
(love.graphics.polygon "line" (+ x dx 1) (+ y by 1)
(+ x dx bx 1) (+ y by 1)
(+ x dx bx 1) (+ y by dy 1)
(+ x dx 1) (+ y by dy 1))
(if (<= i bn)
(love.graphics.polygon "fill" (+ x dx) (+ y by)
(+ x dx bx) (+ y by)
(+ x dx bx) (+ y by dy)
(+ x dx) (+ y by dy)))
(if (= i (+ bn 1))
(love.graphics.polygon "fill" (+ x dx) (+ y (- (+ dy by) bp))
(+ x dx bx) (+ y (- (+ dy by) bp))
(+ x dx bx) (+ y by dy)
(+ x dx) (+ y by dy)))
(set dx (+ dx bb))))
; This draws the power ui
; Inverse-sequential blocks, up to 10; each block 10%
(fn power-ui [x y]
(local (bx by bb p) (values 10 10 15 (player.getP)))
(local bn (math.floor (/ p 10)))
(var (dx dy) (values 0 50))
(local bp (* 5 (% p 10)))
(love.graphics.setColor 1 1 0 0.25)
(for [i 1 10]
(love.graphics.polygon "line" (- x dx 1) (+ y by 1)
(- x dx bx 1) (+ y by 1)
(- x dx bx 1) (+ y by dy 1)
(- x dx 1) (+ y by dy 1))
(if (<= i bn)
(love.graphics.polygon "fill" (- x dx) (+ y by)
(- x dx bx) (+ y by)
(- x dx bx) (+ y by dy)
(- x dx) (+ y by dy)))
(if (= i (+ bn 1))
(love.graphics.polygon "fill" (- x dx) (+ y (- (+ dy by) bp))
(- x dx bx) (+ y (- (+ dy by) bp))
(- x dx bx) (+ y by dy)
(- x dx) (+ y by dy)))
(set dx (+ dx bb))))
; This draws barriers around the screen
; Eventually to be improved into a helmet
(fn helmet-hud []
(love.graphics.setColor 0 1 1 0.25)
(love.graphics.line 0 0
(+ (/ screen-width 6) 0) 35
(+ (/ screen-width 3) 0) 30
(- screen-width (/ screen-width 3)) 30
(- screen-width (/ screen-width 6)) 35
screen-width 0)
; (love.graphics.polygon "fill" (- screen-width 20) 0
; screen-width 0
; screen-width (- screen-height 20)
; (- screen-width 20) (- screen-height 20))
; (love.graphics.polygon "fill" 0 0
; 20 0
; 20 screen-height
; 0 screen-height)
; (love.graphics.polygon "fill" 0 (- screen-height 50)
; (/ screen-width 6) (- screen-height 35)
; (/ screen-width 3) (- screen-height 30)
; 0 screen-height)
; (love.graphics.polygon "fill" screen-width (- screen-height 50)
; (- screen-width (/ screen-width 6)) (- screen-height 35)
; (- screen-width (/ screen-width 3)) (- screen-height 30)
; screen-width screen-height)
)
; This draws a compass bar at the top of the HUD
(var compass-font (love.graphics.newFont 20))
(var hc-bar-east ["-" "-" "|" "N" "|"
"-" "-" "|" "NE" "|"
"-" "-" "|" "E" "|"
"-" "-" "|" "SE" "|"
"-" "|" "S" "|" "-" ])
(var hc-bar-west ["-" "-" "|" "N" "|"
"-" "-" "|" "NW" "|"
"-" "-" "|" "W" "|"
"-" "-" "|" "SW" "|"
"-" "|" "S" "|" "-" ])
(var hc-bar-limit 6)
(fn circular-compass [l c n]
(if (< (+ c n) 1) (length l)
(> (+ c n) (length l)) 1
(+ c n)))
(fn compass-bar []
(love.graphics.setColor 0 1 1 0.25)
(var (hc-output hc-padding) (values "" " "))
(var hc-idx (math.floor (+ 10 (* 10 (player.getDirX)))))
(var hc-idx-mod 1)
(for [i 1 (+ 1 hc-bar-limit)]
(if (> (player.getDirY) 0)
(do
(set hc-idx-mod 1)
(set hc-idx (circular-compass hc-bar-east hc-idx hc-idx-mod))
(set hc-output (.. hc-output (. hc-bar-east hc-idx) hc-padding)))
(do
(set hc-idx-mod 1)
(set hc-idx (circular-compass hc-bar-west hc-idx hc-idx-mod))
(set hc-output (.. (. hc-bar-west hc-idx) hc-padding hc-output)))))
hc-output)
(fn hud-compass []
(love.graphics.setColor 0.5 1 1 0.5)
(var compass-bar-output (compass-bar))
(love.graphics.printf compass-bar-output compass-font 0 50 screen-width :center))
(fn overlay [dx dy pos-x]
(love.graphics.translate dx (- dy))
(oxygen-ui (+ (/ screen-width 2) 100) (- screen-height 100))
; (power-ui (- (/ screen-width 2) 100) (- screen-height 100))
(helmet-hud)
(hud-compass)
(love.graphics.setColor 1 1 1)
)
{: overlay}