melee-roguelite/wrap.fnl

56 lines
1.7 KiB
Fennel

(local fennel (require :lib.fennel))
(local repl (require :lib.stdio))
(local canvas (let [(w h) (love.window.getMode)]
(love.graphics.newCanvas w h)))
(var scale 1)
(var Joystick {})
;; set the first mode
(var (mode mode-name) nil)
(fn set-mode [new-mode-name ...]
(set (mode mode-name) (values (require new-mode-name) new-mode-name))
(when mode.activate
(match (pcall mode.activate ...)
(false msg) (print mode-name "activate error" msg))))
(fn love.joystickadded [joystick]
(tset Joystick :name (joystick:getName))
(tset Joystick :axesNum (joystick:getAxisCount))
(tset Joystick :buttonsNum (joystick:getButtonCount))
(tset Joystick :hatsNum (joystick:getHatCount))
(tset Joystick :guid (joystick:getGUID))
(tset Joystick :id (joystick:getID))
(print (. Joystick :id))
(tset Joystick :obj joystick))
(fn love.load [args]
(set-mode :mode-intro)
(canvas:setFilter "nearest" "nearest")
(when (~= :web (. args 1)) (repl.start)))
(fn safely [f]
(xpcall f #(set-mode :error-mode mode-name $ (fennel.traceback))))
(fn love.draw []
;; the canvas allows you to get sharp pixel-art style scaling; if you
;; don't want that, just skip that and call mode.draw directly.
(love.graphics.setCanvas canvas)
(love.graphics.clear)
(love.graphics.setColor 1 1 1)
(safely mode.draw)
(love.graphics.setCanvas)
(love.graphics.setColor 1 1 1)
(love.graphics.draw canvas 0 0 0 scale scale))
(fn love.update [dt]
(when mode.update
(safely #(mode.update dt Joystick set-mode))))
(fn love.keypressed [key]
(if (and (love.keyboard.isDown "lctrl" "rctrl" "capslock") (= key "q"))
(love.event.quit)
;; add what each keypress should do in each mode
(safely #(mode.keypressed key set-mode))))