diff --git a/two_player_cleaning_game/assets/battery_bar.aseprite b/two_player_cleaning_game/assets/battery_bar.aseprite new file mode 100644 index 0000000..ef1f0c4 Binary files /dev/null and b/two_player_cleaning_game/assets/battery_bar.aseprite differ diff --git a/two_player_cleaning_game/assets/battery_bar.png b/two_player_cleaning_game/assets/battery_bar.png new file mode 100644 index 0000000..d4efcc9 Binary files /dev/null and b/two_player_cleaning_game/assets/battery_bar.png differ diff --git a/two_player_cleaning_game/main.fnl b/two_player_cleaning_game/main.fnl index 007bb31..f031ac8 100644 --- a/two_player_cleaning_game/main.fnl +++ b/two_player_cleaning_game/main.fnl @@ -132,34 +132,42 @@ while 1 do love.event.push('stdin', io.read('*line')) end") :start)) (each [_ collider (pairs collider-debug-boxes)] (love.graphics.rectangle "line" collider.x collider.y collider.width collider.height)))) +(local has-true? (fn [lst] + (accumulate [found? false _ v (ipairs lst)] + (or found? v)))) + +; All true +(local all-true? (fn [lst] + (accumulate [result true _ v (ipairs lst)] + (and result v)))) + (fn love.update [dt] ; move / rotate player (let [ - d (love.keyboard.isDown :d) - a (love.keyboard.isDown :a) - e (love.keyboard.isDown :e) - q (love.keyboard.isDown :q)] - - (case [d a e q] - [true false false false] (tset player :rot (+ player.rot (* dt 2))) - [false true false false] (tset player :rot (- player.rot (* dt 2))) - [false false true false] (tset player :rot (- player.rot (* dt 2))) - [false false false true] (tset player :rot (+ player.rot (* dt 2))) - ) - - (if (or d a e q) - (let [ - dir-fn (if (or d a) #(+ $1 $2) #(- $1 $2)) - new-x (dir-fn player.x (* player.speed dt (math.cos player.rot))) - new-y (dir-fn player.y (* player.speed dt (math.sin player.rot))) - (x y) (bump-world:move player new-x new-y)] - (tset player :x x) - (tset player :y y)))) - + d-key (love.keyboard.isDown :d) + a-key (love.keyboard.isDown :a) + e-key (love.keyboard.isDown :e) + q-key (love.keyboard.isDown :q)] + ; (print (fennel.view {: d-key : a-key : e-key : q-key})) + (match {:d-key d-key :a-key a-key :e-key e-key :q-key q-key} + {:d-key true :a-key false :e-key false :q-key false} (tset player :rot (+ player.rot (* dt 2))) + {:d-key false :a-key true :e-key false :q-key false} (tset player :rot (- player.rot (* dt 2))) + {:d-key false :a-key false :e-key true :q-key false} (tset player :rot (- player.rot (* dt 2))) + {:d-key false :a-key false :e-key false :q-key true} (tset player :rot (+ player.rot (* dt 2))) + ) + (when (and (> player.battery 0) (or d-key a-key e-key q-key)) + (let [ + dir-fn (if (or d-key a-key) #(+ $1 $2) #(- $1 $2)) + new-x (dir-fn player.x (* player.speed dt (math.cos player.rot))) + new-y (dir-fn player.y (* player.speed dt (math.sin player.rot))) + (x y) (bump-world:move player new-x new-y)] + (tset player :x x) + (tset player :y y)) + (if (> player.battery 0) + (tset player :battery (- player.battery (* dt 2)))))) ;; Update camera to follow player (keep player centered on screen) (tset camera :x (- player.x (/ screen.canvas-w 2))) - (tset camera :y (- player.y (/ screen.canvas-h 2))) - ) + (tset camera :y (- player.y (/ screen.canvas-h 2)))) (fn draw-ui [] (love.graphics.push) @@ -171,7 +179,7 @@ while 1 do love.event.push('stdin', io.read('*line')) end") :start)) (love.graphics.draw ui-bg 0 0) (set-color :dark-purple) (love.graphics.setFont font) - (love.graphics.print "Battery:" 20 6) + (love.graphics.print (.. "Battery: " (string.format "%d" player.battery) "%") 6 6) (set-color :light-blue) (love.graphics.rectangle "fill" 72 12 (* 152 (/ player.battery 100)) 4) (love.graphics.setFont font-small)