(local lume (require :vendor.lume)) (local proto (require :lib.proto)) (local state (require :lib.state)) (local game (require :lib.game)) (local profi (require :vendor.ProFi)) (local profi? false) ;; i am thinking we could actually do a really hacky thing (modules add themselves ;; to this list) with this later but ;; i'm not sure if it'd be worth it (it'd require those dependency loops maybe) ;; TODO: ^ (local hotswap-modules [:lib.player :lib.cells :lib.game :lib.main]) ;; the ;; oh thats why it doesnt work lmao (fn love.load [] (when profi? (profi:start) (set love.frame 0)) (love.keyboard.setKeyRepeat true) (global the-state (state.init game)) (global messages (or messages {})) (print "a")) (fn love.draw [] (match (pcall #(state.draw the-state)) (true x) nil (false x) (do (love.graphics.reset) (print (.. "draw \n" x)) (love.graphics.print (.. "draw: \n" x)))) (love.graphics.reset) (love.graphics.print (love.timer.getFPS)) (when true ;; debug stuff (love.graphics.print (table.concat (lume.map messages #$.msg) "\n") 0 40) (each [i v (lume.ripairs messages)] (if (= v.ticks 0) (table.remove messages i) (set v.ticks (- v.ticks 1)))))) (fn love.update [] (when profi? (profi:startHooks) (set love.frame (+ love.frame 1)) (when (= (% love.frame 100) 0) (profi:stop) (profi:writeReport) (os.exit))) ;; TODO: make state changes actually possible (match (pcall #(state.update the-state)) (true x) nil (false x) (do (print (.. "update: \n" x)) (table.insert messages {:ticks 1 :msg (.. "update: \n" x)}))) (when profi? (profi:stopHooks))) (fn love.keypressed [key scancode repeat] (match (pcall #(state.keypressed the-state key scancode repeat)) (true x) nil (false x) (do (print (.. "keypressed: \n" x)) (table.insert messages {:ticks 5 :msg (.. "keypressed: \n" x)}))) (when (= key "r") (each [k v (lume.ripairs messages)] (when (= v.type :reload-error) (table.remove messages k))) (print (.. (if (love.keyboard.isDown :lshift) :hard :soft) " reloading...")) (each [_ v (ipairs hotswap-modules)] (match (lume.hotswap v) (nil x) (table.insert messages {:ticks -1 :type :reload-error :msg (.. "can't reload module " v "\n" x)}))) (when (love.keyboard.isDown :lshift) (love.load))))