aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2025-05-16 22:31:16 +0100
committerGene Pasquet <dev@etenil.net>2025-05-16 22:31:16 +0100
commitbe71ead1e21d55049a18747f2d0d2159b11868f3 (patch)
treee3c548cb9feedd13d4f6f095d50d2b5c2720c2f4
parent984d55db9fd77f6b53f1f0495e616d5cfb6bc828 (diff)
Support displaying enemies
-rw-r--r--TODO.org4
-rw-r--r--assets/level-3.tmx40
-rw-r--r--macroknight.tiled-session34
-rw-r--r--src/macroknight/entities.hy20
-rw-r--r--src/macroknight/game.hy18
5 files changed, 63 insertions, 53 deletions
diff --git a/TODO.org b/TODO.org
index 2773fe9..4298ab7 100644
--- a/TODO.org
+++ b/TODO.org
@@ -6,9 +6,7 @@
* Improvements
** DONE Display each stage of macro execution with a timer
-
-* To do
-** TODO Add enemies
+** DONE Add enemies
** TODO Create enemy classes and behaviour
** DONE Flip player sprite when moving the other way
** TODO Animate player sprite
diff --git a/assets/level-3.tmx b/assets/level-3.tmx
index ab1ea48..1c2b04a 100644
--- a/assets/level-3.tmx
+++ b/assets/level-3.tmx
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<map version="1.8" tiledversion="1.8.2" orientation="orthogonal" renderorder="right-down" width="40" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="3" nextobjectid="7">
+<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="40" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="3" nextobjectid="7">
<tileset firstgid="1" source="monochrome_transparent.tsx"/>
<layer id="1" name="Tile Layer 1" width="40" height="30">
<data encoding="csv">
@@ -7,37 +7,37 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,162,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,978,918,978,880,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,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,0,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,0,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,215,20,216,0,0,0,0,0,0,0,0,846,
13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,217,644,644,644,644,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,844,
12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,217,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,444,
-12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,644,0,0,0,0,0,644,0,0,0,0,0,0,0,0,0,0,0,215,20,0,20,20,20,
+12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,644,0,0,0,0,0,743,0,0,0,0,0,0,0,0,0,0,0,215,20,0,20,20,20,
12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,644,0,0,644,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
-12,0,0,0,0,0,0,0,0,0,0,0,0,0,644,0,0,0,0,0,0,0,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
+12,0,0,0,0,0,0,0,0,0,0,0,0,0,644,0,0,0,0,0,0,0,743,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
-20,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
-612,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
-217,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
-0,217,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
-0,0,217,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
-0,0,0,217,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
-0,0,0,0,217,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,
-0,0,0,0,0,217,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+20,0,20,743,743,743,638,743,638,743,638,743,743,743,638,743,638,743,638,743,638,743,743,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
+612,0,0,0,0,0,0,0,0,0,0,0,0,603,0,0,0,0,0,603,0,0,601,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
+0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,650,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
+0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
+0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
+0,69,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,638,
+0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,
+0,0,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
+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,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,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,69,0,0,
+0,0,69,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
</data>
</layer>
<objectgroup id="2" name="Object Layer 1">
- <object id="1" gid="129" x="191.333" y="207.333" width="16" height="16"/>
+ <object id="1" name="enemy" type="Enemy1" gid="129" x="191.333" y="207.333" width="16" height="16"/>
<object id="5" x="619.333" y="170.667"/>
- <object id="6" gid="29" x="49.3333" y="206" width="16" height="16"/>
+ <object id="6" name="player" type="Player" gid="29" x="48.8661" y="206" width="16" height="16"/>
</objectgroup>
</map>
diff --git a/macroknight.tiled-session b/macroknight.tiled-session
index 7d1d922..20c0f18 100644
--- a/macroknight.tiled-session
+++ b/macroknight.tiled-session
@@ -3,15 +3,12 @@
"height": 4300,
"width": 2
},
- "activeFile": "assets/level-1.tmx",
+ "activeFile": "assets/level-0.tmx",
"expandedProjectPaths": [
".",
"assets"
],
"fileStates": {
- "": {
- "scaleInDock": 1
- },
"assets/level-0.tmx": {
"scale": 3,
"selectedLayer": 1,
@@ -21,33 +18,23 @@
}
},
"assets/level-1.tmx": {
- "scale": 2,
- "selectedLayer": 0,
- "viewCenter": {
- "x": 201.75,
- "y": 281.25
- }
- },
- "assets/level-2.tmx": {
- "scale": 1.5,
+ "scale": 4,
"selectedLayer": 0,
"viewCenter": {
- "x": 252.3333333333333,
- "y": 168.33333333333337
+ "x": 553.625,
+ "y": 290.375
}
},
"assets/level-3.tmx": {
- "scale": 1.5,
+ "scale": 2.1404687499999997,
"selectedLayer": 0,
"viewCenter": {
- "x": 315,
- "y": 252.33333333333337
+ "x": 320.25695306226737,
+ "y": 240.3679100664282
}
},
"assets/monochrome_transparent.tsx": {
- "dynamicWrapping": false,
- "scaleInDock": 2,
- "scaleInEditor": 2
+ "scaleInDock": 1
},
"assets/tileset_colored.tsx": {
"scaleInDock": 1
@@ -59,14 +46,11 @@
"map.tileWidth": 16,
"map.width": 40,
"openFiles": [
- "assets/monochrome_transparent.tsx",
- "assets/level-0.tmx",
- "assets/level-1.tmx"
+ "assets/level-0.tmx"
],
"project": "macroknight.tiled-project",
"recentFiles": [
"assets/level-1.tmx",
- "assets/monochrome_transparent.tsx",
"assets/level-0.tmx"
]
}
diff --git a/src/macroknight/entities.hy b/src/macroknight/entities.hy
index 812193e..c490b25 100644
--- a/src/macroknight/entities.hy
+++ b/src/macroknight/entities.hy
@@ -87,3 +87,23 @@
(defn [property] surf [self]
self._disp_surf))
+
+(defclass Enemy [Entity]
+ (setv _type "enemy"))
+
+(defclass Enemy2Swords [Enemy]
+ (defn __init__ [self id tile tile-size x y]
+ (.__init__ (super) id tile tile-size x y)
+ (.flush self))
+
+ (defn move [self move]
+ (.append self.moves move)
+ (.move_ip self._rect (get move 0) (get move 1)))
+
+ (defn flush [self]
+ (setv self.moves []))
+
+ (defn ground [self])
+
+ (defn [property] total-move [self]
+ (merge-moves self.moves)))
diff --git a/src/macroknight/game.hy b/src/macroknight/game.hy
index 005f356..4e1ce7e 100644
--- a/src/macroknight/game.hy
+++ b/src/macroknight/game.hy
@@ -2,7 +2,7 @@
(require hyrule *)
(import pygame
pytmx.util_pygame [load_pygame]
- entities [Player LevelTile Goal]
+ entities [Player LevelTile Goal Enemy2Swords]
tiles [TileSet draw-tile]
utils [neg]
text [render-text]
@@ -19,8 +19,10 @@
(setv screen (pygame.display.set_mode #((* TILE_SCALING 640) (* TILE_SCALING 480))))
(setv clock (pygame.time.Clock))
(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")])
+(setv levels [(load_pygame "assets/level-3.tmx")
+ (load_pygame "assets/level-0.tmx")
+ (load_pygame "assets/level-1.tmx")
+ (load_pygame "assets/level-2.tmx")])
(setv level-id 0)
(defn abs-to-tile-index [abs-id]
(int (floor (/ abs-id TILE_SIZE))))
@@ -43,8 +45,14 @@
(Goal (len entities)
(get tileset.tiles 0)
TILE_SIZE
- (abs-to-tile-index item.x)
- (abs-to-tile-index item.y))))))
+ tile-x
+ tile-y))
+ "Enemy1" (.append entities
+ (Enemy2Swords (len entities)
+ (get tileset.tiles 128)
+ TILE_SIZE
+ tile-x
+ tile-y)))))
(setv player-pos
(let [player-objects (lfor ent (get level.layers 1) :if (= ent.type "Player") ent)]