aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2025-05-16 21:32:23 +0100
committerGene Pasquet <dev@etenil.net>2025-05-16 21:32:23 +0100
commit5af7de084933444951dfb140c084ea07cf3346a8 (patch)
tree3c1c68672f0ef632e56652694ef269257e536f9e
parentc44bcbe373f70a5a82da1117cc5239e323f104f3 (diff)
Working macro cooldown and level goal
-rw-r--r--assets/level-0.tmx52
-rw-r--r--assets/level-1.tmx4
-rw-r--r--macroknight.tiled-session8
-rw-r--r--src/macroknight/entities.hy9
-rw-r--r--src/macroknight/game.hy73
-rw-r--r--src/macroknight/systems.hy22
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)))))