[game] Big actor refactor, spawn actors from world
This commit is contained in:
parent
4042cd28a4
commit
3af0bb4002
4 changed files with 281 additions and 107 deletions
128
game/level.ts
128
game/level.ts
|
|
@ -23,14 +23,26 @@ export type TileLayer = {
|
|||
tiles: Tile[];
|
||||
};
|
||||
|
||||
export type Layer = TileLayer;
|
||||
export type Entity = {
|
||||
type: string;
|
||||
id: string;
|
||||
px: [number, number];
|
||||
bounds: [number, number];
|
||||
// TODO: More props here.
|
||||
};
|
||||
|
||||
export type EntityLayer = {
|
||||
type: "entity";
|
||||
entities: Entity[];
|
||||
};
|
||||
|
||||
export type Level = {
|
||||
world_x: number;
|
||||
world_y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
layers: Layer[];
|
||||
tile_layers: TileLayer[];
|
||||
entity_layers: EntityLayer[];
|
||||
};
|
||||
|
||||
export type TileSet = { id: number; texture: Texture };
|
||||
|
|
@ -52,6 +64,74 @@ async function load_tileset(def: {
|
|||
return { id: def.uid, texture };
|
||||
}
|
||||
|
||||
type TileLayerInstance = {
|
||||
__type: "Tiles";
|
||||
__gridSize: number;
|
||||
__pxTotalOffsetX: number;
|
||||
__pxTotalOffsetY: number;
|
||||
__tilesetDefUid: number;
|
||||
gridTiles: {
|
||||
px: [number, number];
|
||||
src: [number, number];
|
||||
f: number;
|
||||
t: number;
|
||||
a: number;
|
||||
}[];
|
||||
};
|
||||
|
||||
function load_tile_layer_instance(
|
||||
tile_sets: Map<number, TileSet>,
|
||||
li: TileLayerInstance
|
||||
): TileLayer {
|
||||
const tileset = tile_sets.get(li.__tilesetDefUid);
|
||||
if (!tileset) {
|
||||
throw new Error("Unable to find texture!!! " + li.__tilesetDefUid);
|
||||
}
|
||||
|
||||
return {
|
||||
type: "tile",
|
||||
texture: tileset.texture,
|
||||
grid_size: li.__gridSize,
|
||||
offset: [li.__pxTotalOffsetX, li.__pxTotalOffsetY],
|
||||
tiles: li.gridTiles,
|
||||
};
|
||||
}
|
||||
|
||||
type EntityLayerInstance = {
|
||||
__type: "Entities";
|
||||
entityInstances: {
|
||||
__identifier: string;
|
||||
iid: string;
|
||||
width: number;
|
||||
height: number;
|
||||
px: [number, number];
|
||||
}[];
|
||||
};
|
||||
|
||||
function load_entity_layer_instance(li: EntityLayerInstance): EntityLayer {
|
||||
return {
|
||||
type: "entity",
|
||||
entities: li.entityInstances.map((ei) => {
|
||||
return {
|
||||
type: ei.__identifier,
|
||||
id: ei.iid,
|
||||
px: ei.px,
|
||||
bounds: [ei.width, ei.height],
|
||||
};
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
type LayerInstance = TileLayerInstance | EntityLayerInstance;
|
||||
|
||||
function is_tile_layer_instance(x: LayerInstance): x is TileLayerInstance {
|
||||
return x.__type == "Tiles";
|
||||
}
|
||||
|
||||
function is_entity_layer_instance(x: LayerInstance): x is EntityLayerInstance {
|
||||
return x.__type == "Entities";
|
||||
}
|
||||
|
||||
function load_level(
|
||||
tile_sets: Map<number, TileSet>,
|
||||
def: {
|
||||
|
|
@ -59,41 +139,27 @@ function load_level(
|
|||
worldY: number;
|
||||
pxWid: number;
|
||||
pxHei: number;
|
||||
layerInstances: {
|
||||
__gridSize: number;
|
||||
__pxTotalOffsetX: number;
|
||||
__pxTotalOffsetY: number;
|
||||
__tilesetDefUid: number;
|
||||
gridTiles: {
|
||||
px: [number, number];
|
||||
src: [number, number];
|
||||
f: number;
|
||||
t: number;
|
||||
a: number;
|
||||
}[];
|
||||
}[];
|
||||
layerInstances: LayerInstance[];
|
||||
}
|
||||
): Level {
|
||||
return {
|
||||
const result: Level = {
|
||||
world_x: def.worldX,
|
||||
world_y: def.worldY,
|
||||
width: def.pxWid,
|
||||
height: def.pxHei,
|
||||
layers: def.layerInstances.map((li) => {
|
||||
const tileset = tile_sets.get(li.__tilesetDefUid);
|
||||
if (!tileset) {
|
||||
throw new Error("Unable to find texture!!! " + li.__tilesetDefUid);
|
||||
}
|
||||
|
||||
return {
|
||||
type: "tile",
|
||||
texture: tileset.texture,
|
||||
grid_size: li.__gridSize,
|
||||
offset: [li.__pxTotalOffsetX, li.__pxTotalOffsetY],
|
||||
tiles: li.gridTiles,
|
||||
};
|
||||
}),
|
||||
tile_layers: [],
|
||||
entity_layers: [],
|
||||
};
|
||||
|
||||
for (const li of def.layerInstances) {
|
||||
if (is_tile_layer_instance(li)) {
|
||||
result.tile_layers.push(load_tile_layer_instance(tile_sets, li));
|
||||
} else if (is_entity_layer_instance(li)) {
|
||||
result.entity_layers.push(load_entity_layer_instance(li));
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function load_world(path: string): Promise<World> {
|
||||
|
|
@ -120,7 +186,7 @@ export function draw_level(
|
|||
offset_x: number = 0,
|
||||
offset_y: number = 0
|
||||
) {
|
||||
for (const layer of level.layers) {
|
||||
for (const layer of level.tile_layers) {
|
||||
use_texture(layer.texture);
|
||||
|
||||
let [ofx, ofy] = layer.offset;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue