From bbb7ca45ee221c70bddaeeefee92554a49a37e3f Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Thu, 9 Jun 2022 19:32:16 +0000 Subject: [PATCH] Start parsing blades scenario files --- projects/iso-rpg-engine/.gitignore | 3 +- projects/iso-rpg-engine/Project.xml | 3 +- .../iso-rpg-engine/source/BladesMapState.hx | 1 + .../iso-rpg-engine/source/BladesMapState.kiss | 6 ++ .../source/data/blades/Scenario.hx | 69 +++++++++++++++++++ .../source/data/blades/TileMap.hx | 23 +++++++ 6 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 projects/iso-rpg-engine/source/data/blades/Scenario.hx create mode 100644 projects/iso-rpg-engine/source/data/blades/TileMap.hx 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