Start parsing blades scenario files

This commit is contained in:
2022-06-09 19:32:16 +00:00
parent f93ec68029
commit bbb7ca45ee
6 changed files with 103 additions and 2 deletions

View File

@@ -1,2 +1,3 @@
export/
Data/
Data/
Blades of Avernum Scenarios/

View File

@@ -30,7 +30,8 @@
<set value="export" name="BUILD_DIR"/>
<source path="source"/>
<assets path="assets"/>
<assets path="Data"/>
<assets path="Data" if="debug"/>
<assets path="Blades of Avernum Scenarios" if="debug"/>
<!-- _______________________________ Libraries ______________________________ -->

View File

@@ -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 {}

View File

@@ -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)

View File

@@ -0,0 +1,69 @@
package data.blades;
import kiss.ByteStream;
import data.blades.TileMap;
class Scenario {
private var outdoorSections:TileArray<TileMap>;
private var towns:Array<TileMap>;
private var name = "";
private var decription = "";
function new() {
}
static var failed:Array<String> = [];
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;
}
}

View File

@@ -0,0 +1,23 @@
package data.blades;
typedef TileArray<T> = Array<Array<Int>>;
class TileMap {
private var floorCodes:TileArray<Int>;
private var terrainCodes:TileArray<Int>;
private var width = 0;
private var height = 0;
private function tileArray<T>(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);
}
}