blades-engine parse terrain and floor height

This commit is contained in:
2022-06-10 23:07:39 +00:00
parent b6540e8d18
commit 3f773a83ee
5 changed files with 62 additions and 52 deletions

View File

@@ -14,6 +14,7 @@ import flash.display.BitmapData;
import kiss.Prelude; import kiss.Prelude;
import data.blades.ScenData; import data.blades.ScenData;
import data.blades.Scenario; import data.blades.Scenario;
import data.blades.TileMap;
@:build(kiss.Kiss.build()) @:build(kiss.Kiss.build())
class BladesMapState extends FlxState {} class BladesMapState extends FlxState {}

View File

@@ -12,60 +12,55 @@
(Scenario.test) (Scenario.test)
(let [valleydy (Scenario.fromBasFile "Blades of Avernum Scenarios/Valley of Dying Things/valleydy.bas")] (let [valleydy (Scenario.fromBasFile "Blades of Avernum Scenarios/Valley of Dying Things/valleydy.bas")]
~valleydy) (addSprites
// 2D nth >:)
(addFloorLayer (groups (collect (range 255)) 32 Keep)) (nth valleydy.outdoorSections 0 0))))
(addTerrainLayer (groups (concat
(for _ (range 255) -1)
(collect (range 512)))
32 Keep)))
(var SELECTED_COLOR FlxColor.LIME) (var SELECTED_COLOR FlxColor.LIME)
(var NORMAL_COLOR FlxColor.WHITE) (var NORMAL_COLOR FlxColor.WHITE)
(var CLIFF_HEIGHT 22)
(method :Void addFloorLayer [:Array<Array<Int>> tiles] (method :Void addSprites [:TileMap map]
(let [&mut rowStartX 0 (let [&mut rowStartX 0
&mut rowStartY 0] &mut rowStartY 0]
(doFor row tiles (doFor tileY (range map.height)
(let [&mut x rowStartX (let [&mut x rowStartX
&mut y rowStartY] &mut y rowStartY]
(doFor tile row (doFor tileX (range map.width)
(let [tileSprite (data.floorSprite tile)] (let [height (nth map.floorHeights tileX tileY)
(set tileSprite.x x) floor (nth map.floorCodes tileX tileY)
(set tileSprite.y y) terrain (nth map.terrainCodes tileX tileY)
(FlxMouseEventManager.add tileSprite yOffset (* CLIFF_HEIGHT height)]
// handle click on floor: // First add the floor
->downTS {} (let [tileSprite (data.floorSprite floor)]
->upTS {} // TODO add cliffs if it's higher than the one in front of it
->overTS (set overTS.color SELECTED_COLOR) (set tileSprite.x x)
->outTS (set outTS.color NORMAL_COLOR)) (set tileSprite.y (- y yOffset))
(add tileSprite)) (FlxMouseEventManager.add tileSprite
(+= x (/ FLOOR_WIDTH 2)) // handle click on floor:
(+= y (/ FLOOR_HEIGHT 2)))) ->downTS {}
(-= rowStartX (/ FLOOR_WIDTH 2)) ->upTS {}
(+= rowStartY (/ FLOOR_HEIGHT 2))))) ->overTS (set overTS.color SELECTED_COLOR)
->outTS (set outTS.color NORMAL_COLOR))
(add tileSprite))
// TODO creatures and items need to be added when their floor and terrain tiles are // TODO add any items
// added, to preserve Z order
(method :Void addTerrainLayer [:Array<Array<Int>> tiles] // TODO add any characters
(let [&mut rowStartX 0
&mut rowStartY 0] // TODO the wall sprites will be from different sheets defined by town/outdoor section
(doFor row tiles (let [tileSprite (data.terrainSprite terrain)]
(let [&mut x rowStartX (set tileSprite.x x)
&mut y rowStartY] (set tileSprite.y (- y yOffset))
(doFor tile row (when (> tileSprite.height SPRITE_HEIGHT)
(let [tileSprite (data.terrainSprite tile)] (-= tileSprite.y SPRITE_HEIGHT))
(set tileSprite.x x) (FlxMouseEventManager.add tileSprite
(set tileSprite.y y) // Handle click on terrain:
(when (> tileSprite.height SPRITE_HEIGHT) ->downTS {}
(-= tileSprite.y SPRITE_HEIGHT)) ->upTS {}
(FlxMouseEventManager.add tileSprite ->overTS (set overTS.color SELECTED_COLOR)
// Handle click on terrain: ->outTS (set outTS.color NORMAL_COLOR))
->downTS {} (add tileSprite)))
->upTS {}
->overTS (set overTS.color SELECTED_COLOR)
->outTS (set outTS.color NORMAL_COLOR))
(add tileSprite))
(+= x (/ FLOOR_WIDTH 2)) (+= x (/ FLOOR_WIDTH 2))
(+= y (/ FLOOR_HEIGHT 2)))) (+= y (/ FLOOR_HEIGHT 2))))
(-= rowStartX (/ FLOOR_WIDTH 2)) (-= rowStartX (/ FLOOR_WIDTH 2))

View File

@@ -61,6 +61,8 @@ class ScenData {
} }
public function floorSprite(floorId:Int) { public function floorSprite(floorId:Int) {
if (!(floorId >= 0 && floorId < 256))
throw 'floor $floorId is out of range';
if (!floorData.exists(floorId)) { if (!floorData.exists(floorId)) {
return emptySprite(); return emptySprite();
} }
@@ -81,6 +83,8 @@ class ScenData {
} }
public function terrainSprite(terrainId:Int) { public function terrainSprite(terrainId:Int) {
if (!(terrainId >= 0 && terrainId < 512))
throw 'terrain $terrainId is out of range';
if (!terrainData.exists(terrainId)) { if (!terrainData.exists(terrainId)) {
var s = new FlxSprite(0, 0); var s = new FlxSprite(0, 0);
s.makeGraphic(46, 55, FlxColor.TRANSPARENT); s.makeGraphic(46, 55, FlxColor.TRANSPARENT);

View File

@@ -108,18 +108,28 @@ class Scenario {
var sec = new TileMap(outdoorWidth, outdoorHeight, stream.readCString(19)); var sec = new TileMap(outdoorWidth, outdoorHeight, stream.readCString(19));
trace(sec.name); trace(sec.name);
for (y in 0...outdoorHeight) { for (x in 0...outdoorWidth) {
for (x in 0...outdoorWidth) { for (y in 0...outdoorHeight) {
sec.setFloor(x, y, stream.readByte()); sec.setFloor(x, y, stream.readByte());
} }
} }
// floor heights // floor heights
for (y in 0...outdoorHeight) { for (x in 0...outdoorWidth) {
for (x in 0...outdoorWidth) { for (y in 0...outdoorHeight) {
sec.setFloorHeight(x, y, stream.readByte()); sec.setFloorHeight(x, y, stream.readByte());
} }
} }
// 1 byte of padding to align the int16s
// terrain
for (x in 0...outdoorWidth) {
for (y in 0...outdoorHeight) {
// these are big-endian
sec.setTerrain(x, y, 256 * stream.readByte() + stream.readByte());
}
}
stream.tracePosition(); stream.tracePosition();
// TODO all the other outdoor section stuff // TODO all the other outdoor section stuff

View File

@@ -6,10 +6,10 @@ class TileMap {
// TODO might need encapsulation // TODO might need encapsulation
public var floorCodes:TileArray<Int>; public var floorCodes:TileArray<Int>;
public var floorHeights:TileArray<Int>; public var floorHeights:TileArray<Int>;
private var terrainCodes:TileArray<Int>; public var terrainCodes:TileArray<Int>;
private var width = 0; public var width = 0;
private var height = 0; public var height = 0;
public var name = ""; public var name = "";