diff --git a/projects/iso-rpg-engine/.gitignore b/projects/iso-rpg-engine/.gitignore
index 7814e6e6..080e0b7b 100644
--- a/projects/iso-rpg-engine/.gitignore
+++ b/projects/iso-rpg-engine/.gitignore
@@ -1,2 +1,3 @@
export/
-Data/
\ No newline at end of file
+Data/
+Blades of Avernum Scenarios/
diff --git a/projects/iso-rpg-engine/Project.xml b/projects/iso-rpg-engine/Project.xml
index 0d446a9c..11b59c0b 100644
--- a/projects/iso-rpg-engine/Project.xml
+++ b/projects/iso-rpg-engine/Project.xml
@@ -30,7 +30,8 @@
-
+
+
diff --git a/projects/iso-rpg-engine/source/BladesMapState.hx b/projects/iso-rpg-engine/source/BladesMapState.hx
index 9d1a6dba..b79f69fb 100644
--- a/projects/iso-rpg-engine/source/BladesMapState.hx
+++ b/projects/iso-rpg-engine/source/BladesMapState.hx
@@ -13,6 +13,7 @@ import flash.display.BitmapData;
import kiss.Prelude;
import data.blades.ScenData;
+import data.blades.Scenario;
@:build(kiss.Kiss.build())
class BladesMapState extends FlxState {}
diff --git a/projects/iso-rpg-engine/source/BladesMapState.kiss b/projects/iso-rpg-engine/source/BladesMapState.kiss
index 485129d0..d7f4b31c 100644
--- a/projects/iso-rpg-engine/source/BladesMapState.kiss
+++ b/projects/iso-rpg-engine/source/BladesMapState.kiss
@@ -8,6 +8,12 @@
(method &override :Void create []
(super.create)
(set data (ScenData.coreData))
+
+ (Scenario.test)
+
+ (let [valleydy (Scenario.fromBasFile "Blades of Avernum Scenarios/Valley of Dying Things/valleydy.bas")]
+ ~valleydy)
+
(addFloorLayer (groups (collect (range 255)) 32 Keep))
(addTerrainLayer (groups (concat
(for _ (range 255) -1)
diff --git a/projects/iso-rpg-engine/source/data/blades/Scenario.hx b/projects/iso-rpg-engine/source/data/blades/Scenario.hx
new file mode 100644
index 00000000..cc45200a
--- /dev/null
+++ b/projects/iso-rpg-engine/source/data/blades/Scenario.hx
@@ -0,0 +1,69 @@
+package data.blades;
+
+import kiss.ByteStream;
+
+import data.blades.TileMap;
+
+class Scenario {
+ private var outdoorSections:TileArray;
+ private var towns:Array;
+ private var name = "";
+ private var decription = "";
+
+ function new() {
+
+ }
+
+ static var failed:Array = [];
+ static var passed = 0;
+ static function assert(e:Bool, msg="") {
+ if (!e) {
+ failed.push(msg);
+ } else {
+ passed++;
+ };
+ }
+
+ public static function test() {
+ var scen = fromBasFile("Blades of Avernum Scenarios/Valley of Dying Things/valleydy.bas");
+
+ assert(scen.name == "Valley of Dying Things", '${scen.name} is the wrong title');
+
+ trace('$passed assertions passed');
+ if (failed.length > 0) {
+ trace('${failed.length} assertions failed: $failed');
+ Sys.exit(1);
+ }
+ }
+
+ public static function fromBasFile(file) {
+ var scen = new Scenario();
+ var stream = ByteStream.fromFile(file);
+
+ function unknownBytes(num:Int) {
+ trace('Warning: ignoring $num unknown bytes');
+ for (_ in 0...num) stream.readByte();
+ }
+
+ function paddingBytes(num) {
+ for (_ in 0...num) stream.readByte();
+ }
+
+ // TODO
+ unknownBytes(11);
+
+ var numTowns = stream.readUInt16();
+ var outdoorWidth = stream.readUInt16();
+ var outdoorHeight = stream.readUInt16();
+ trace(outdoorWidth);
+ trace(outdoorHeight);
+
+ // TODO
+ unknownBytes(5);
+ // TODO scenario title 49 bytes 0-terminated
+ scen.name = stream.readCString();
+ paddingBytes(49 - scen.name.length);
+
+ return scen;
+ }
+}
diff --git a/projects/iso-rpg-engine/source/data/blades/TileMap.hx b/projects/iso-rpg-engine/source/data/blades/TileMap.hx
new file mode 100644
index 00000000..36b3c675
--- /dev/null
+++ b/projects/iso-rpg-engine/source/data/blades/TileMap.hx
@@ -0,0 +1,23 @@
+package data.blades;
+
+typedef TileArray = Array>;
+
+class TileMap {
+ private var floorCodes:TileArray;
+ private var terrainCodes:TileArray;
+
+ private var width = 0;
+ private var height = 0;
+
+ private function tileArray(defaultValue:T) {
+ return [for (x in 0...width) [for (y in 0...height) defaultValue]];
+ }
+
+ public function new(width, height) {
+ this.width = width;
+ this.height = height;
+
+ floorCodes = tileArray(255);
+ terrainCodes = tileArray(0);
+ }
+}
\ No newline at end of file