blades-engine parse terrain and floor height
This commit is contained in:
@@ -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 {}
|
||||||
|
@@ -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))
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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 = "";
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user