From 3f773a83eea7115ee5dc72c66a5c72877139540a Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Fri, 10 Jun 2022 23:07:39 +0000 Subject: [PATCH] blades-engine parse terrain and floor height --- .../iso-rpg-engine/source/BladesMapState.hx | 1 + .../iso-rpg-engine/source/BladesMapState.kiss | 85 +++++++++---------- .../source/data/blades/ScenData.hx | 4 + .../source/data/blades/Scenario.hx | 18 +++- .../source/data/blades/TileMap.hx | 6 +- 5 files changed, 62 insertions(+), 52 deletions(-) diff --git a/projects/iso-rpg-engine/source/BladesMapState.hx b/projects/iso-rpg-engine/source/BladesMapState.hx index b79f69fb..ab9e8b2b 100644 --- a/projects/iso-rpg-engine/source/BladesMapState.hx +++ b/projects/iso-rpg-engine/source/BladesMapState.hx @@ -14,6 +14,7 @@ import flash.display.BitmapData; import kiss.Prelude; import data.blades.ScenData; import data.blades.Scenario; +import data.blades.TileMap; @: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 d7f4b31c..95f3a488 100644 --- a/projects/iso-rpg-engine/source/BladesMapState.kiss +++ b/projects/iso-rpg-engine/source/BladesMapState.kiss @@ -12,60 +12,55 @@ (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) - (collect (range 512))) - 32 Keep))) + (addSprites + // 2D nth >:) + (nth valleydy.outdoorSections 0 0)))) (var SELECTED_COLOR FlxColor.LIME) (var NORMAL_COLOR FlxColor.WHITE) +(var CLIFF_HEIGHT 22) -(method :Void addFloorLayer [:Array> tiles] +(method :Void addSprites [:TileMap map] (let [&mut rowStartX 0 &mut rowStartY 0] - (doFor row tiles + (doFor tileY (range map.height) (let [&mut x rowStartX &mut y rowStartY] - (doFor tile row - (let [tileSprite (data.floorSprite tile)] - (set tileSprite.x x) - (set tileSprite.y y) - (FlxMouseEventManager.add tileSprite - // handle click on floor: - ->downTS {} - ->upTS {} - ->overTS (set overTS.color SELECTED_COLOR) - ->outTS (set outTS.color NORMAL_COLOR)) - (add tileSprite)) - (+= x (/ FLOOR_WIDTH 2)) - (+= y (/ FLOOR_HEIGHT 2)))) - (-= rowStartX (/ FLOOR_WIDTH 2)) - (+= rowStartY (/ FLOOR_HEIGHT 2))))) + (doFor tileX (range map.width) + (let [height (nth map.floorHeights tileX tileY) + floor (nth map.floorCodes tileX tileY) + terrain (nth map.terrainCodes tileX tileY) + yOffset (* CLIFF_HEIGHT height)] + // First add the floor + (let [tileSprite (data.floorSprite floor)] + // TODO add cliffs if it's higher than the one in front of it + (set tileSprite.x x) + (set tileSprite.y (- y yOffset)) + (FlxMouseEventManager.add tileSprite + // handle click on floor: + ->downTS {} + ->upTS {} + ->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 -// added, to preserve Z order -(method :Void addTerrainLayer [:Array> tiles] - (let [&mut rowStartX 0 - &mut rowStartY 0] - (doFor row tiles - (let [&mut x rowStartX - &mut y rowStartY] - (doFor tile row - (let [tileSprite (data.terrainSprite tile)] - (set tileSprite.x x) - (set tileSprite.y y) - (when (> tileSprite.height SPRITE_HEIGHT) - (-= tileSprite.y SPRITE_HEIGHT)) - (FlxMouseEventManager.add tileSprite - // Handle click on terrain: - ->downTS {} - ->upTS {} - ->overTS (set overTS.color SELECTED_COLOR) - ->outTS (set outTS.color NORMAL_COLOR)) - (add tileSprite)) + // TODO add any items + + // TODO add any characters + + // TODO the wall sprites will be from different sheets defined by town/outdoor section + (let [tileSprite (data.terrainSprite terrain)] + (set tileSprite.x x) + (set tileSprite.y (- y yOffset)) + (when (> tileSprite.height SPRITE_HEIGHT) + (-= tileSprite.y SPRITE_HEIGHT)) + (FlxMouseEventManager.add tileSprite + // Handle click on terrain: + ->downTS {} + ->upTS {} + ->overTS (set overTS.color SELECTED_COLOR) + ->outTS (set outTS.color NORMAL_COLOR)) + (add tileSprite))) (+= x (/ FLOOR_WIDTH 2)) (+= y (/ FLOOR_HEIGHT 2)))) (-= rowStartX (/ FLOOR_WIDTH 2)) diff --git a/projects/iso-rpg-engine/source/data/blades/ScenData.hx b/projects/iso-rpg-engine/source/data/blades/ScenData.hx index 7e190e88..5a80031d 100644 --- a/projects/iso-rpg-engine/source/data/blades/ScenData.hx +++ b/projects/iso-rpg-engine/source/data/blades/ScenData.hx @@ -61,6 +61,8 @@ class ScenData { } public function floorSprite(floorId:Int) { + if (!(floorId >= 0 && floorId < 256)) + throw 'floor $floorId is out of range'; if (!floorData.exists(floorId)) { return emptySprite(); } @@ -81,6 +83,8 @@ class ScenData { } public function terrainSprite(terrainId:Int) { + if (!(terrainId >= 0 && terrainId < 512)) + throw 'terrain $terrainId is out of range'; if (!terrainData.exists(terrainId)) { var s = new FlxSprite(0, 0); s.makeGraphic(46, 55, FlxColor.TRANSPARENT); diff --git a/projects/iso-rpg-engine/source/data/blades/Scenario.hx b/projects/iso-rpg-engine/source/data/blades/Scenario.hx index ba99c100..6a485d6f 100644 --- a/projects/iso-rpg-engine/source/data/blades/Scenario.hx +++ b/projects/iso-rpg-engine/source/data/blades/Scenario.hx @@ -108,18 +108,28 @@ class Scenario { var sec = new TileMap(outdoorWidth, outdoorHeight, stream.readCString(19)); 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()); } } // 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()); } } + + // 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(); // TODO all the other outdoor section stuff diff --git a/projects/iso-rpg-engine/source/data/blades/TileMap.hx b/projects/iso-rpg-engine/source/data/blades/TileMap.hx index dba630b0..a4ab9887 100644 --- a/projects/iso-rpg-engine/source/data/blades/TileMap.hx +++ b/projects/iso-rpg-engine/source/data/blades/TileMap.hx @@ -6,10 +6,10 @@ class TileMap { // TODO might need encapsulation public var floorCodes:TileArray; public var floorHeights:TileArray; - private var terrainCodes:TileArray; + public var terrainCodes:TileArray; - private var width = 0; - private var height = 0; + public var width = 0; + public var height = 0; public var name = "";