diff --git a/two_player_cleaning_game/main.fnl b/two_player_cleaning_game/main.fnl index 7bf0156..e97c89a 100644 --- a/two_player_cleaning_game/main.fnl +++ b/two_player_cleaning_game/main.fnl @@ -1,33 +1,14 @@ ;; deps -(local levels (. (require "levels.fnl") :levels)) -(local bump (require "libs/bump")) -(local tiny (require "libs/tiny")) -(local assets (require "src/assets.fnl")) +; (local levels (. (require "levels.fnl") :levels)) +; (local bump (require "libs/bump")) +; (local tiny (require "libs/tiny")) +; (local assets (require "src/assets.fnl")) (local utils (require "src/utils.fnl")) -(local colors (require "src/colors.fnl")) +; (local colors (require "src/colors.fnl")) (local tutorial (require "src/levels/tutorial.fnl")) -; (utils.debug-print assets) -; (local network (require "network.fnl")) - (var pool nil) -;; global vars -; (var level-key "tutorial") -; (var player-art nil) ; 25x50 pixels each player is 25x25 -; (var dust-sprite nil) ; 35x35 pixels -; (var battery-bar-sprite nil) -; (local walls { -; :sprite nil -; :quads [] -; :batch nil -; }) -; (local objects { -; :sprite nil -; :quads {} -; :list [] -; }) - (local screen (let [scale 2 canvas-w 800 canvas-h 450] { :screen-w (* canvas-w scale) @@ -44,43 +25,6 @@ ; (var bump-world nil) ; (local player { :x 50 :y 50 :w 25 :h 25 :speed 80 :battery 100 :rot 0 }) -; (lambda mirror-collider [collider] -; "Mirror a collider box horizontally within a 25-unit tile (center is at 12.5) -; Transforms collider positions so they're reflected across the vertical center line." -; { -; :x (- 25 collider.x collider.width) -; :y collider.y -; :width collider.width -; :height collider.height -; }) - -; (fn load-walls [] -; (set walls.batch (love.graphics.newSpriteBatch walls.sprite 2500)) -; ;; load quads -; (let [(w h) (walls.sprite:getDimensions)] -; (for [i 0 19 1] -; (table.insert walls.quads (love.graphics.newQuad (* i 25) 0 25 25 w h)))) -; ;; fill batch -; (each [_ row (pairs (. levels :levels level-key :tiles))] -; (each [_ tile (pairs row)] -; (let [ -; x tile.x -; y tile.y -; id tile.tile-id -; colliders tile.colliders] -; (if (and (> id 0) (< id 21)) ;; 1-20 are wall tiles -; (do -; ; (print (fennel.view {:quad (. walls.quads id) : x : y : id})) -; (walls.batch:add (. walls.quads id) (if tile.h-flip (+ x 25) x) y 0 (if tile.h-flip -1 1) 1) -; (each [_ collider (pairs colliders)] -; (let [ -; mirrored-collider (if tile.h-flip (mirror-collider collider) collider) -; collider-x (+ x mirrored-collider.x) -; collider-y (+ y mirrored-collider.y)] -; (bump-world:add {: x : y :name :wall :behavior :block} collider-x collider-y mirrored-collider.width mirrored-collider.height) -; (table.insert -; collider-debug-boxes -; {:x collider-x :y collider-y :width mirrored-collider.width :height mirrored-collider.height}))))))))) ; (lambda create-charging-station [x y] ; (let [ @@ -282,24 +226,6 @@ while 1 do love.event.push('stdin', io.read('*line')) end") :start)) ; ) -; (lambda angle-to-direction [angle] -; "Convert angle (radians) to compass direction keyword" -; (local tau (* 2 math.pi)) -; ; Normalize angle to 0-2π range -; (local normalized (% (+ angle tau) tau)) -; ; Offset by 22.5° (π/8) so section boundaries align with directions -; (local offset (+ normalized (/ math.pi 8))) -; ; Find which 45° section (π/4) it falls into -; (local section (math.floor (/ offset (/ math.pi 4)))) -; ; Map to compass directions -; (local directions [:e :se :s :sw :w :nw :n :ne]) -; (. directions (+ (% section 8) 1))) - -; (fn draw-objects [] -; (each [_ obj (pairs objects.list)] -; ; (print (fennel.view obj)) -; (obj:draw))) - (fn love.draw [] (for [i 1 99 1] (let [draw-trigger (.. "draw" i)] diff --git a/two_player_cleaning_game/src/levels/tutorial.fnl b/two_player_cleaning_game/src/levels/tutorial.fnl index 53aea32..71627cc 100644 --- a/two_player_cleaning_game/src/levels/tutorial.fnl +++ b/two_player_cleaning_game/src/levels/tutorial.fnl @@ -1,9 +1,11 @@ +(local bump (require "libs/bump")) (local color (require "src/colors.fnl")) (local nata (require "libs/nata")) (local utils (require "src/utils.fnl")) (local camera (require "src/systems/camera.fnl")) (local beholder (require "libs/beholder")) (local player (require "src/entities/player.fnl")) +(local walls (require "src/systems/walls.fnl")) (fn load [screen] (let [ @@ -12,6 +14,8 @@ :data { : screen : canvas + :bump-world (bump.newWorld 25) + :level-key :tutorial } ; :groups { ; gravity = {filter = {'gravity'}}, @@ -20,6 +24,7 @@ :systems [ (nata:oop) camera + walls ] })] (pool:queue player) diff --git a/two_player_cleaning_game/src/systems/walls.fnl b/two_player_cleaning_game/src/systems/walls.fnl new file mode 100644 index 0000000..efcfd7f --- /dev/null +++ b/two_player_cleaning_game/src/systems/walls.fnl @@ -0,0 +1,58 @@ +(local assets (require "src/assets.fnl")) +(local levels (require "levels.fnl")) +(local color (require "src/colors.fnl")) + +(local walls { + :quads [] + :batch nil + :collider-debug-boxes [] +}) + +(lambda mirror-collider [collider] + "Mirror a collider box horizontally within a 25-unit tile (center is at 12.5) + Transforms collider positions so they're reflected across the vertical center line." + { + :x (- 25 collider.x collider.width) + :y collider.y + :width collider.width + :height collider.height + }) + +(fn walls.load [self] + (set self.batch (love.graphics.newSpriteBatch assets.walls-sprite 2500)) + ;; load quads + (let [(w h) (assets.walls-sprite:getDimensions)] + (for [i 0 19 1] + (table.insert self.quads (love.graphics.newQuad (* i 25) 0 25 25 w h)))) + ;; fill batch + (each [_ row (pairs (. levels :levels self.pool.data.level-key :tiles))] + (each [_ tile (pairs row)] + (let [ + x tile.x + y tile.y + id tile.tile-id + colliders tile.colliders] + (if (and (> id 0) (< id 21)) ;; 1-20 are wall tiles + (do + (self.batch:add (. self.quads id) (if tile.h-flip (+ x 25) x) y 0 (if tile.h-flip -1 1) 1) + (each [_ collider (pairs colliders)] + (let [ + mirrored-collider (if tile.h-flip (mirror-collider collider) collider) + collider-x (+ x mirrored-collider.x) + collider-y (+ y mirrored-collider.y)] + (self.pool.data.bump-world:add {: x : y :name :wall :behavior :block} collider-x collider-y mirrored-collider.width mirrored-collider.height) + (table.insert + self.collider-debug-boxes + {:x collider-x :y collider-y :width mirrored-collider.width :height mirrored-collider.height}))))))))) + +(fn walls.draw49 [self] + (color.reset-color) + (love.graphics.draw self.batch)) + +(fn walls.draw-debug [self] + "draw collider debug boxes" + (color.set-color :black) + (each [_ collider (pairs self.collider-debug-boxes)] + (love.graphics.rectangle "line" collider.x collider.y collider.width collider.height))) + +walls