diff --git a/projects/blades-engine/.gitignore b/projects/blades-engine/.gitignore
new file mode 100644
index 00000000..7814e6e6
--- /dev/null
+++ b/projects/blades-engine/.gitignore
@@ -0,0 +1,2 @@
+export/
+Data/
\ No newline at end of file
diff --git a/projects/blades-engine/.vscode/extensions.json b/projects/blades-engine/.vscode/extensions.json
new file mode 100644
index 00000000..89e20eda
--- /dev/null
+++ b/projects/blades-engine/.vscode/extensions.json
@@ -0,0 +1,6 @@
+{
+ "recommendations": [
+ "openfl.lime-vscode-extension",
+ "redhat.vscode-xml"
+ ]
+}
diff --git a/projects/blades-engine/.vscode/launch.json b/projects/blades-engine/.vscode/launch.json
new file mode 100644
index 00000000..5e9a7a19
--- /dev/null
+++ b/projects/blades-engine/.vscode/launch.json
@@ -0,0 +1,21 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Build + Debug",
+ "type": "lime",
+ "request": "launch"
+ },
+ {
+ "name": "Debug",
+ "type": "lime",
+ "request": "launch",
+ "preLaunchTask": null
+ },
+ {
+ "name": "Macro",
+ "type": "haxe-eval",
+ "request": "launch"
+ }
+ ]
+}
diff --git a/projects/blades-engine/.vscode/settings.json b/projects/blades-engine/.vscode/settings.json
new file mode 100644
index 00000000..4c1a0e92
--- /dev/null
+++ b/projects/blades-engine/.vscode/settings.json
@@ -0,0 +1,13 @@
+{
+ "search.exclude": {
+ "export/**/*.hx": true
+ },
+ "[haxe]": {
+ "editor.formatOnSave": true,
+ "editor.formatOnPaste": true,
+ "editor.codeActionsOnSave": {
+ "source.sortImports": true
+ }
+ },
+ "haxe.enableExtendedIndentation": true
+}
\ No newline at end of file
diff --git a/projects/blades-engine/.vscode/tasks.json b/projects/blades-engine/.vscode/tasks.json
new file mode 100644
index 00000000..16a77646
--- /dev/null
+++ b/projects/blades-engine/.vscode/tasks.json
@@ -0,0 +1,13 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "lime",
+ "command": "test",
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
diff --git a/projects/blades-engine/Project.xml b/projects/blades-engine/Project.xml
new file mode 100644
index 00000000..ad3d9d85
--- /dev/null
+++ b/projects/blades-engine/Project.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/blades-engine/assets/images/images-go-here.txt b/projects/blades-engine/assets/images/images-go-here.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/projects/blades-engine/assets/music/music-goes-here.txt b/projects/blades-engine/assets/music/music-goes-here.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/projects/blades-engine/assets/sounds/sounds-go-here.txt b/projects/blades-engine/assets/sounds/sounds-go-here.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/projects/blades-engine/hxformat.json b/projects/blades-engine/hxformat.json
new file mode 100644
index 00000000..66cb3869
--- /dev/null
+++ b/projects/blades-engine/hxformat.json
@@ -0,0 +1,15 @@
+{
+ "lineEnds": {
+ "leftCurly": "both",
+ "rightCurly": "both",
+ "objectLiteralCurly": {
+ "leftCurly": "after"
+ }
+ },
+ "sameLine": {
+ "ifElse": "next",
+ "doWhile": "next",
+ "tryBody": "next",
+ "tryCatch": "next"
+ }
+}
diff --git a/projects/blades-engine/source/AssetPaths.hx b/projects/blades-engine/source/AssetPaths.hx
new file mode 100644
index 00000000..db7ef444
--- /dev/null
+++ b/projects/blades-engine/source/AssetPaths.hx
@@ -0,0 +1,4 @@
+package;
+
+@:build(flixel.system.FlxAssets.buildFileReferences("assets", true))
+class AssetPaths {}
diff --git a/projects/blades-engine/source/IsometricMapState.hx b/projects/blades-engine/source/IsometricMapState.hx
new file mode 100644
index 00000000..52336cd1
--- /dev/null
+++ b/projects/blades-engine/source/IsometricMapState.hx
@@ -0,0 +1,16 @@
+package;
+
+import flixel.FlxState;
+import flixel.FlxSprite;
+import flixel.util.FlxColor;
+import flixel.math.FlxRect;
+import flixel.math.FlxVector;
+import flixel.graphics.FlxGraphic;
+import flixel.FlxG;
+
+import flash.display.BitmapData;
+
+import kiss.Prelude;
+
+@:build(kiss.Kiss.build())
+class IsometricMapState extends FlxState {}
diff --git a/projects/blades-engine/source/IsometricMapState.kiss b/projects/blades-engine/source/IsometricMapState.kiss
new file mode 100644
index 00000000..8e7f2946
--- /dev/null
+++ b/projects/blades-engine/source/IsometricMapState.kiss
@@ -0,0 +1,62 @@
+// TODO make these variables
+(var FLOOR_WIDTH 46)
+(var FLOOR_HEIGHT 32)
+(var SPRITE_HEIGHT 55)
+(var SPRITE_PADDING 1)
+
+(prop :Array floorTiles [])
+
+(method &override :Void create []
+ (super.create)
+ // TODO load from a more accessible path
+ (let [bitmapData (BitmapData.fromFile "Data/Terrain Graphics/G796.png")
+ spriteSheet (.loadGraphic (new FlxSprite) (FlxGraphic.fromBitmapData bitmapData))]
+ (spriteSheet.replaceColor FlxColor.WHITE FlxColor.TRANSPARENT)
+ (let [sheetWidth (/ (- spriteSheet.frameWidth SPRITE_PADDING) (+ SPRITE_PADDING FLOOR_WIDTH))
+ sheetHeight (/ (- spriteSheet.frameHeight SPRITE_PADDING) (+ SPRITE_PADDING SPRITE_HEIGHT))]
+ (doFor row (range sheetHeight)
+ (doFor col (range sheetWidth)
+ (floorTiles.push (let [tile (spriteSheet.clone)]
+ (set tile.clipRect (new FlxRect
+ (+ SPRITE_PADDING (* col (+ SPRITE_PADDING FLOOR_WIDTH)))
+ (+ SPRITE_PADDING (* col (+ SPRITE_PADDING SPRITE_HEIGHT)))
+ FLOOR_WIDTH
+ SPRITE_HEIGHT))
+ tile))))))
+
+ (addSpriteLayer ~(for row (range 5) (collect (range 5)))))
+
+(method :Void addSpriteLayer [:Array> tiles]
+ (let [&mut rowStartX 0
+ &mut rowStartY 0]
+ (doFor row tiles
+ (let [&mut x rowStartX
+ &mut y rowStartY]
+ (doFor tile row
+ (let [tileSprite (.clone ~(nth floorTiles tile))]
+ (set tileSprite.x x)
+ (set tileSprite.y y)
+ (add tileSprite))
+ (+= x (/ FLOOR_WIDTH 2))
+ (+= y (/ FLOOR_HEIGHT 2))))
+
+ (-= rowStartX (/ FLOOR_WIDTH 2))
+ (+= rowStartY (/ FLOOR_HEIGHT 2)))))
+
+(var CAMERA_SPEED 100)
+
+(method &override :Void update [:Float elapsed]
+ (super.update elapsed)
+
+ (let [&mut cameraMovement (new FlxVector 0 0)]
+ (when (= 0 FlxG.mouse.screenX)
+ (set cameraMovement.x -1))
+ (when (= 0 FlxG.mouse.screenY)
+ (set cameraMovement.y -1))
+ (when (= (- FlxG.width 1) FlxG.mouse.screenX)
+ (set cameraMovement.x 1))
+ (when (= (- FlxG.height 1) FlxG.mouse.screenY)
+ (set cameraMovement.y 1))
+ (set cameraMovement (cameraMovement.truncate 1))
+ (set cameraMovement (cameraMovement.scale (* elapsed CAMERA_SPEED)))
+ (set FlxG.camera.scroll (FlxG.camera.scroll.add cameraMovement.x cameraMovement.y))))
\ No newline at end of file
diff --git a/projects/blades-engine/source/Main.hx b/projects/blades-engine/source/Main.hx
new file mode 100644
index 00000000..e35b40ae
--- /dev/null
+++ b/projects/blades-engine/source/Main.hx
@@ -0,0 +1,13 @@
+package;
+
+import flixel.FlxGame;
+import openfl.display.Sprite;
+
+class Main extends Sprite
+{
+ public function new()
+ {
+ super();
+ addChild(new FlxGame(0, 0, IsometricMapState));
+ }
+}