diff options
author | Gene Pasquet <dev@etenil.net> | 2025-05-16 21:32:23 +0100 |
---|---|---|
committer | Gene Pasquet <dev@etenil.net> | 2025-05-16 21:32:23 +0100 |
commit | 5af7de084933444951dfb140c084ea07cf3346a8 (patch) | |
tree | 3c1c68672f0ef632e56652694ef269257e536f9e | |
parent | c44bcbe373f70a5a82da1117cc5239e323f104f3 (diff) |
Working macro cooldown and level goal
-rw-r--r-- | assets/level-0.tmx | 52 | ||||
-rw-r--r-- | assets/level-1.tmx | 4 | ||||
-rw-r--r-- | macroknight.tiled-session | 8 | ||||
-rw-r--r-- | src/macroknight/entities.hy | 9 | ||||
-rw-r--r-- | src/macroknight/game.hy | 73 | ||||
-rw-r--r-- | src/macroknight/systems.hy | 22 |
6 files changed, 98 insertions, 70 deletions
diff --git a/assets/level-0.tmx b/assets/level-0.tmx index 3655221..11405a2 100644 --- a/assets/level-0.tmx +++ b/assets/level-0.tmx @@ -1,47 +1,47 @@ <?xml version="1.0" encoding="UTF-8"?> <map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="40" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="8" nextobjectid="5"> - <tileset firstgid="1025" source="monochrome_transparent.tsx"/> + <tileset firstgid="1" source="monochrome_transparent.tsx"/> <layer id="3" name="ground" width="40" height="30"> <data encoding="csv"> -0,0,0,0,1192,1240,0,0,0,0,1239,1193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1192,1240,0,0,1239,1193,0,0,0,0, -0,0,0,1192,1240,0,0,0,0,0,0,1239,1193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1192,1240,0,0,0,0,1239,1193,0,0,1192, -0,0,1192,1240,0,0,0,0,0,0,0,0,1239,1193,0,0,0,0,0,0,0,0,1192,1193,0,0,0,0,1192,1240,0,0,0,0,0,0,1239,1193,1192,1240, -0,1192,1240,0,0,0,0,0,0,0,0,0,0,1239,1193,0,0,1192,1193,0,0,1192,1240,1239,1193,0,0,1192,1240,0,0,0,0,0,0,0,0,1239,1193,0, -1192,1240,0,0,0,0,0,0,0,0,0,0,0,0,1239,1193,1192,1240,1239,1193,1192,1240,0,0,1239,1193,1192,1240,0,0,0,0,0,0,0,0,0,0,1239,1193, -1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,1193,0,0,1192,1240,0,0,0,0,1239,1240,0,0,0,0,0,0,0,0,0,0,0,0,1239, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,1193,1192,1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,168,216,0,0,0,0,215,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,216,0,0,215,169,0,0,0,0, +0,0,0,168,216,0,0,0,0,0,0,215,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,216,0,0,0,0,215,169,0,0,168, +0,0,168,216,0,0,0,0,0,0,0,0,215,169,0,0,0,0,0,0,0,0,168,169,0,0,0,0,168,216,0,0,0,0,0,0,215,169,168,216, +0,168,216,0,0,0,0,0,0,0,0,0,0,215,169,0,0,168,169,0,0,168,216,215,169,0,0,168,216,0,0,0,0,0,0,0,0,215,169,0, +168,216,0,0,0,0,0,0,0,0,0,0,0,0,215,169,168,216,215,169,168,216,0,0,215,169,168,216,0,0,0,0,0,0,0,0,0,0,215,169, +216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,169,0,0,168,216,0,0,0,0,215,216,0,0,0,0,0,0,0,0,0,0,0,0,215, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,169,168,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1963,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1917,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1712,0,0,0, -1870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1868,0,0,0, -1868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1869,1570,1570,1570, -1870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1868,1868,1868,1868, -1868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1468,1868,1868,1868, -1572,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,1044,1044,1043,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044, -1044,1044,1044,1044,1045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1766,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1239,1045,0,0,0,0,0,0,0,0,0,0,0,0,0,1668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1093,0,1239,1045,0,0,0,0,0,0,0,0,0,0,0,0,1662,0,0,0,0,0,0,0,0,0,0,0,1093,0,0,0,0,0,0,1093,0, -0,0,0,0,0,0,1239,1045,0,0,0,0,0,0,0,0,1043,1044,1044,1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,1239,1045,0,0,0,0,0,0,0,1092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1239,1044,1044,1044,1044,1044,1044,1044,1240,0,0,0,0,0,0,1093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +893,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,688,0,0,0, +846,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,844,0,0,0, +844,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,845,546,546,546, +846,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,844,844,844,844, +844,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,444,844,844,844, +548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,20,20,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,215,21,0,0,0,0,0,0,0,0,0,0,0,0,0,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,69,0,215,21,0,0,0,0,0,0,0,0,0,0,0,0,638,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,69,0, +0,0,0,0,0,0,215,21,0,0,0,0,0,0,0,0,19,20,20,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,215,21,0,0,0,0,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,215,20,20,20,20,20,20,20,216,0,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 </data> </layer> <objectgroup id="7" name="entities"> - <object id="2" name="player" type="Player" gid="1053" x="182" y="350.5" width="16" height="16"/> + <object id="2" name="player" type="Player" gid="29" x="182" y="350.5" width="16" height="16"/> <object id="3" name="hint" type="Text" x="98.5" y="432.5" width="197" height="78"> <properties> <property name="text" value="hit space to start a macro"/> </properties> </object> - <object id="4" name="goal" type="Goal" x="560.48" y="287.914" width="16" height="16"/> + <object id="4" name="goal" type="Goal" x="560.935" y="288.641" width="16" height="16"/> </objectgroup> </map> diff --git a/assets/level-1.tmx b/assets/level-1.tmx index 9ec19ce..9a1dda0 100644 --- a/assets/level-1.tmx +++ b/assets/level-1.tmx @@ -35,8 +35,8 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0,0 </data> </layer> - <objectgroup id="5" name="objects" offsetx="0" offsety="0"> - <object id="1" name="goal" type="Goal" x="560.182" y="287.636" width="16" height="16"/> + <objectgroup id="5" name="objects"> + <object id="1" name="goal" type="Goal" x="560.356" y="288.288" width="16" height="16"/> <object id="2" name="player" type="Player" gid="29" x="209.182" y="289.697" width="16" height="16"/> </objectgroup> </map> diff --git a/macroknight.tiled-session b/macroknight.tiled-session index 95f22d5..7b13834 100644 --- a/macroknight.tiled-session +++ b/macroknight.tiled-session @@ -6,11 +6,11 @@ ], "fileStates": { "assets/level-0.tmx": { - "scale": 1.939583333333333, - "selectedLayer": 0, + "scale": 3, + "selectedLayer": 1, "viewCenter": { - "x": 320.4296455424276, - "y": 314.7583243823846 + "x": 245.16666666666669, + "y": 330.16666666666663 } }, "assets/level-1.tmx": { diff --git a/src/macroknight/entities.hy b/src/macroknight/entities.hy index 50d774c..666b06b 100644 --- a/src/macroknight/entities.hy +++ b/src/macroknight/entities.hy @@ -6,6 +6,7 @@ (defclass Entity [Sprite] ;;; Game entity (setv _fixed False) + (setv _type "none") (defn __init__ [self id tile tile-size x y] (.__init__ (super)) @@ -23,10 +24,14 @@ self._rect) (defn [property] surf [self] - self._surf)) + self._surf) + + (defn [property] type [self] + self._type)) (defclass LevelTile [Entity] (setv _fixed True) + (setv _type "level") (defn __init__ [self id tile tile-size x y scaling] (let [tile-width (* (.get_width tile) scaling) @@ -37,9 +42,11 @@ (.__init__ (super) id tile_ tile-size x y)))) (defclass Goal [Entity] + (setv _type "goal") (setv _fixed True)) (defclass Player [Entity] + (setv _type "player") (setv SPEED 3) (setv JUMP_IMPULSE 10) (setv MAX_JUMPING 100) diff --git a/src/macroknight/game.hy b/src/macroknight/game.hy index a8f6c62..1676e5a 100644 --- a/src/macroknight/game.hy +++ b/src/macroknight/game.hy @@ -1,13 +1,12 @@ (require hy) (require hyrule *) (import pygame - pprint [pprint] pytmx.util_pygame [load_pygame] entities [Player LevelTile Goal] tiles [TileSet draw-tile] utils [neg] text [render-text] - systems [apply-gravity apply-collisions] + systems [apply-gravity apply-collisions GoalHit] math [floor]) (pygame.init) @@ -15,11 +14,10 @@ (setv TILE_SCALING 1) (setv TILE_SIZE (* TILE_SCALING 16)) (setv MACRO_STEP_WAIT 300) -(setv MACRO_COOLDOWN 5000) +(setv MACRO_COOLDOWN 2000) (setv screen (pygame.display.set_mode #((* TILE_SCALING 640) (* TILE_SCALING 480)))) (setv clock (pygame.time.Clock)) -(setv running True) (setv tileset (TileSet "assets/monochrome-transparent.png" TILE_SCALING TILE_SIZE TILE_SIZE 1)) (setv levels [(load_pygame "assets/level-0.tmx") (load_pygame "assets/level-1.tmx")]) @@ -29,10 +27,10 @@ (setv game-running True) - (while game-running ;; Load the level + (setv running True) (setv level (get levels level-id)) (setv entities []) (setv player-pos #(5 5)) @@ -60,16 +58,15 @@ (setv macro-input-mode False) (setv macro-wait-time 0) (setv macro-commands [None None None]) - (for [#(id tiledef) (enumerate (.tiles (get level.layers 0)))] - (let [x (get tiledef 0) - y (get tiledef 1) - tile (get tiledef 2)] - (.append entities (LevelTile id tile TILE_SIZE x y TILE_SCALING)))) + (let [id-offset (len entities)] + (for [#(id tiledef) (enumerate (.tiles (get level.layers 0)))] + (let [x (get tiledef 0) + y (get tiledef 1) + tile (get tiledef 2)] + (.append entities (LevelTile (+ id id-offset) tile TILE_SIZE x y TILE_SCALING))))) (setv ongoing_inputs []) - (pprint (get entities 0)) - (while running (for [event (pygame.event.get)] (case event.type @@ -112,9 +109,10 @@ pygame.K_w (.move player #(0 (neg (/ player.MAX_JUMPING 2)))) pygame.K_d (.move player #((* 2 TILE_SIZE) 0))) (if (= command-id (- (len macro-commands) 1)) - (do (setv macro-commands [None None None]) - (setv macro-input-mode False) - (setv macro-wait-time (+ (pygame.time.get_ticks) MACRO_COOLDOWN))) + (do + (setv macro-commands [None None None]) + (setv macro-input-mode False) + (setv macro-wait-time (+ (pygame.time.get_ticks) MACRO_COOLDOWN))) (setv (get macro-commands command-id) None))) (pygame.time.wait MACRO_STEP_WAIT)) @@ -131,10 +129,9 @@ ;; Not in macro mode (do (when (> macro-wait-time 0) - (let [progress (round (* 3 (/ (- (pygame.time.get_ticks) macro-wait-time) MACRO_COOLDOWN)))] - (for [indicator (range 3)] - (draw-tile - screen tileset 725 )))) + (let [progress (round (* 3 (/ (- macro-wait-time (pygame.time.get_ticks)) MACRO_COOLDOWN)))] + (for [indicator (range progress)] + (draw-tile screen tileset 725 (+ 4 indicator) 5)))) (for [inp ongoing_inputs] (case inp pygame.K_a (.move player #((neg player.SPEED) 0)) @@ -142,16 +139,22 @@ pygame.K_w (.jump player) pygame.K_d (.move player #(player.SPEED 0)))) - (when (any ongoing_inputs) - (for [entity entities] - (apply-collisions entity entities))) + (try + (when (any ongoing_inputs) + (for [entity entities] + (apply-collisions entity entities))) - (.flush player) + (.flush player) - ;; Apply systems - (for [entity entities] - (apply-gravity entity entities) - (apply-collisions entity entities)) + ;; Apply systems + (for [entity entities] + (apply-gravity entity entities) + (apply-collisions entity entities)) + + (except [GoalHit] + (setv level-id (+ level-id 1)) + (setv running False) + (setv game-running (< level-id (len levels))))) (.flush player))) @@ -161,10 +164,22 @@ (pygame.display.flip) - (when (or (= 0 macro-wait-time) - (< (- (pygame.time.get_ticks) macro-wait-time) 0)) + (when (and (!= 0 macro-wait-time) + (> (pygame.time.get_ticks) macro-wait-time)) (setv macro-wait-time 0)) (.tick clock 60))) +(do + (.fill screen "#000000") + + (render-text screen + tileset + "YOU WIN" + 10 + 10) + + (pygame.display.flip) + (pygame.time.wait 1000)) + (pygame.quit) diff --git a/src/macroknight/systems.hy b/src/macroknight/systems.hy index b02bc50..fccccd0 100644 --- a/src/macroknight/systems.hy +++ b/src/macroknight/systems.hy @@ -1,19 +1,25 @@ ;; Define systems here (setv GRAVITY 5) +(defclass GoalHit [Exception]) + (defn apply-gravity [entity entities] (when (not entity.fixed) (.move entity #(0 GRAVITY)))) (defn apply-collisions [entity entities] (when (not entity.fixed) - (for [ent (gfor enti entities :if (!= enti.id entity.id) enti)] + (for [ent (gfor enti entities + :if (!= enti.id entity.id) + enti)] (when (.colliderect entity.rect ent.rect) - (let [collision-rect (.clip entity.rect ent.rect) - move-x (get entity.total-move 0) - move-y (get entity.total-move 1)] - (when (!= move-x 0) - (.move entity #((* (if (> move-x 0) -1 1) collision-rect.width) 0))) - (when (!= move-y 0) - (.move entity #(0 (* (if (> move-y 0) -1 1) collision-rect.height))))) + (if (= ent.type "goal") + (raise (GoalHit)) + (let [collision-rect (.clip entity.rect ent.rect) + move-x (get entity.total-move 0) + move-y (get entity.total-move 1)] + (when (!= move-x 0) + (.move entity #((* (if (> move-x 0) -1 1) collision-rect.width) 0))) + (when (!= move-y 0) + (.move entity #(0 (* (if (> move-y 0) -1 1) collision-rect.height)))))) (.ground entity))))) |