Begin implementing LDtk import

master
Louis Pearson 2022-08-03 18:31:44 -06:00
parent d2e663c09e
commit aa7a1988ba
3 changed files with 171 additions and 57 deletions

View File

@ -10,7 +10,7 @@
},
"jsonVersion": "1.1.3",
"appBuildId": 458364,
"nextUid": 99,
"nextUid": 100,
"identifierStyle": "Capitalize",
"worldLayout": "GridVania",
"worldGridWidth": 160,
@ -39,7 +39,7 @@
"identifier": "Entities",
"type": "Entities",
"uid": 32,
"gridSize": 4,
"gridSize": 8,
"guideGridWid": 8,
"guideGridHei": 8,
"displayOpacity": 1,
@ -2090,9 +2090,9 @@
{
"__identifier": "Entities",
"__type": "Entities",
"__cWid": 40,
"__cHei": 40,
"__gridSize": 4,
"__cWid": 20,
"__cHei": 20,
"__gridSize": 8,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
@ -2113,7 +2113,7 @@
"entityInstances": [
{
"__identifier": "Player",
"__grid": [2,36],
"__grid": [1,18],
"__pivot": [0,0],
"__tags": [],
"__tile": null,
@ -2127,7 +2127,7 @@
},
{
"__identifier": "Door",
"__grid": [0,36],
"__grid": [0,18],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 16, "y": 0, "w": 8, "h": 8 },
@ -2141,7 +2141,7 @@
},
{
"__identifier": "Door",
"__grid": [22,36],
"__grid": [10,18],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 16, "y": 0, "w": 8, "h": 8 },
@ -2150,12 +2150,12 @@
"width": 8,
"height": 8,
"defUid": 60,
"px": [88,144],
"px": [80,144],
"fieldInstances": []
},
{
"__identifier": "Door",
"__grid": [10,22],
"__grid": [5,11],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 16, "y": 0, "w": 8, "h": 8 },
@ -2169,7 +2169,7 @@
},
{
"__identifier": "Coin",
"__grid": [30,36],
"__grid": [15,18],
"__pivot": [0,0],
"__tags": [],
"__tile": { "tilesetUid": 1, "x": 32, "y": 0, "w": 8, "h": 8 },
@ -2183,7 +2183,7 @@
},
{
"__identifier": "Coin",
"__grid": [4,22],
"__grid": [2,11],
"__pivot": [0,0],
"__tags": [],
"__tile": { "tilesetUid": 1, "x": 32, "y": 0, "w": 8, "h": 8 },
@ -2197,7 +2197,7 @@
},
{
"__identifier": "Wire",
"__grid": [5,29],
"__grid": [2,14],
"__pivot": [0.5,0.5],
"__tags": [],
"__tile": null,
@ -2208,13 +2208,10 @@
"defUid": 93,
"px": [20,116],
"fieldInstances": [
{ "__identifier": "Point", "__value": [ { "cx": 7, "cy": 31 }, { "cx": 9, "cy": 29 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
{ "__identifier": "Point", "__value": [{ "cx": 4, "cy": 14 }], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [{
"id": "V_String",
"params": ["7,31"]
}, {
"id": "V_String",
"params": ["9,29"]
} ] },
"params": ["4,14"]
}] },
{ "__identifier": "Anchor", "__value": [ true, true ], "__type": "Array<Bool>", "__tile": null, "defUid": 98, "realEditorValues": [ {
"id": "V_Bool",
"params": [ true ]
@ -2226,7 +2223,7 @@
},
{
"__identifier": "Wire",
"__grid": [21,19],
"__grid": [10,9],
"__pivot": [0.5,0.5],
"__tags": [],
"__tile": null,
@ -2237,12 +2234,12 @@
"defUid": 93,
"px": [84,76],
"fieldInstances": [
{ "__identifier": "Point", "__value": [ { "cx": 20, "cy": 23 }, { "cx": 14, "cy": 23 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
{ "__identifier": "Point", "__value": [ { "cx": 9, "cy": 11 }, { "cx": 7, "cy": 11 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
"id": "V_String",
"params": ["20,23"]
"params": ["9,11"]
}, {
"id": "V_String",
"params": ["14,23"]
"params": ["7,11"]
} ] },
{ "__identifier": "Anchor", "__value": [ true, false ], "__type": "Array<Bool>", "__tile": null, "defUid": 98, "realEditorValues": [ {
"id": "V_Bool",
@ -2559,9 +2556,9 @@
{
"__identifier": "Entities",
"__type": "Entities",
"__cWid": 40,
"__cHei": 40,
"__gridSize": 4,
"__cWid": 20,
"__cHei": 20,
"__gridSize": 8,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
@ -2582,7 +2579,7 @@
"entityInstances": [
{
"__identifier": "Trapdoor",
"__grid": [8,20],
"__grid": [4,10],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 24, "y": 0, "w": 8, "h": 8 },
@ -2596,7 +2593,7 @@
},
{
"__identifier": "Trapdoor",
"__grid": [24,20],
"__grid": [12,10],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 24, "y": 0, "w": 8, "h": 8 },
@ -2610,7 +2607,7 @@
},
{
"__identifier": "Coin",
"__grid": [14,24],
"__grid": [7,12],
"__pivot": [0,0],
"__tags": [],
"__tile": { "tilesetUid": 1, "x": 32, "y": 0, "w": 8, "h": 8 },
@ -2624,7 +2621,7 @@
},
{
"__identifier": "Coin",
"__grid": [20,36],
"__grid": [10,18],
"__pivot": [0,0],
"__tags": [],
"__tile": { "tilesetUid": 1, "x": 32, "y": 0, "w": 8, "h": 8 },
@ -2638,7 +2635,7 @@
},
{
"__identifier": "Door",
"__grid": [28,4],
"__grid": [14,2],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 16, "y": 0, "w": 8, "h": 8 },
@ -2652,7 +2649,7 @@
},
{
"__identifier": "Wire",
"__grid": [17,15],
"__grid": [8,7],
"__pivot": [0.5,0.5],
"__tags": [],
"__tile": null,
@ -2663,12 +2660,12 @@
"defUid": 93,
"px": [68,60],
"fieldInstances": [
{ "__identifier": "Point", "__value": [ { "cx": 18, "cy": 18 }, { "cx": 22, "cy": 19 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
{ "__identifier": "Point", "__value": [ { "cx": 9, "cy": 9 }, { "cx": 11, "cy": 9 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
"id": "V_String",
"params": ["18,18"]
"params": ["9,9"]
}, {
"id": "V_String",
"params": ["22,19"]
"params": ["11,9"]
} ] },
{ "__identifier": "Anchor", "__value": [ true, false ], "__type": "Array<Bool>", "__tile": null, "defUid": 98, "realEditorValues": [ {
"id": "V_Bool",
@ -2971,9 +2968,9 @@
{
"__identifier": "Entities",
"__type": "Entities",
"__cWid": 40,
"__cHei": 40,
"__gridSize": 4,
"__cWid": 20,
"__cHei": 20,
"__gridSize": 8,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,
@ -2994,7 +2991,7 @@
"entityInstances": [
{
"__identifier": "Door",
"__grid": [14,10],
"__grid": [7,5],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 16, "y": 0, "w": 8, "h": 8 },
@ -3008,7 +3005,7 @@
},
{
"__identifier": "Door",
"__grid": [22,32],
"__grid": [11,16],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 16, "y": 0, "w": 8, "h": 8 },
@ -3022,7 +3019,7 @@
},
{
"__identifier": "Trapdoor",
"__grid": [4,34],
"__grid": [2,17],
"__pivot": [0,0],
"__tags": ["Door"],
"__tile": { "tilesetUid": 1, "x": 24, "y": 0, "w": 8, "h": 8 },
@ -3036,7 +3033,7 @@
},
{
"__identifier": "Wire",
"__grid": [15,17],
"__grid": [7,8],
"__pivot": [0.5,0.5],
"__tags": [],
"__tile": null,
@ -3047,12 +3044,12 @@
"defUid": 93,
"px": [60,68],
"fieldInstances": [
{ "__identifier": "Point", "__value": [ { "cx": 17, "cy": 19 }, { "cx": 23, "cy": 19 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
{ "__identifier": "Point", "__value": [ { "cx": 8, "cy": 9 }, { "cx": 12, "cy": 9 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
"id": "V_String",
"params": ["17,19"]
"params": ["8,9"]
}, {
"id": "V_String",
"params": ["23,19"]
"params": ["12,9"]
} ] },
{ "__identifier": "Anchor", "__value": [ true, false ], "__type": "Array<Bool>", "__tile": null, "defUid": 98, "realEditorValues": [ {
"id": "V_Bool",
@ -3062,7 +3059,7 @@
},
{
"__identifier": "Wire",
"__grid": [37,17],
"__grid": [18,8],
"__pivot": [0.5,0.5],
"__tags": [],
"__tile": null,
@ -3073,12 +3070,12 @@
"defUid": 93,
"px": [148,68],
"fieldInstances": [
{ "__identifier": "Point", "__value": [ { "cx": 34, "cy": 19 }, { "cx": 26, "cy": 19 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
{ "__identifier": "Point", "__value": [ { "cx": 17, "cy": 9 }, { "cx": 12, "cy": 9 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
"id": "V_String",
"params": ["34,19"]
"params": ["17,9"]
}, {
"id": "V_String",
"params": ["26,19"]
"params": ["12,9"]
} ] },
{ "__identifier": "Anchor", "__value": [ true, false ], "__type": "Array<Bool>", "__tile": null, "defUid": 98, "realEditorValues": [ {
"id": "V_Bool",
@ -3088,7 +3085,7 @@
},
{
"__identifier": "Wire",
"__grid": [37,3],
"__grid": [18,1],
"__pivot": [0.5,0.5],
"__tags": [],
"__tile": null,
@ -3099,12 +3096,12 @@
"defUid": 93,
"px": [148,12],
"fieldInstances": [
{ "__identifier": "Point", "__value": [ { "cx": 35, "cy": 5 }, { "cx": 27, "cy": 5 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
{ "__identifier": "Point", "__value": [ { "cx": 17, "cy": 2 }, { "cx": 13, "cy": 2 } ], "__type": "Array<Point>", "__tile": null, "defUid": 94, "realEditorValues": [ {
"id": "V_String",
"params": ["35,5"]
"params": ["17,2"]
}, {
"id": "V_String",
"params": ["27,5"]
"params": ["13,2"]
} ] },
{ "__identifier": "Anchor", "__value": [ true, false ], "__type": "Array<Bool>", "__tile": null, "defUid": 98, "realEditorValues": [ {
"id": "V_Bool",
@ -3438,9 +3435,9 @@
{
"__identifier": "Entities",
"__type": "Entities",
"__cWid": 40,
"__cHei": 40,
"__gridSize": 4,
"__cWid": 20,
"__cHei": 20,
"__gridSize": 8,
"__opacity": 1,
"__pxTotalOffsetX": 0,
"__pxTotalOffsetY": 0,

68
src/world.zig Normal file
View File

@ -0,0 +1,68 @@
const TileValue = union(enum) {
Tile,
Size,
};
// 2 Modes
// Tile:
// 0b0TTT_TTTT
// 2 layer:
// 0b1XXS_CCCC
// T = Tile number, 0-127
// X = Reserved
// S = Solid
// C = Circuit
/// 0bDCBA
/// +---+---+
/// | A | B |
/// +---+---+
/// | C | D |
/// +---+---+
/// NE 0b0001
/// NW 0b0010
/// SW 0b0100
/// SE 0b1000
/// 0 -
const AutoTileRule = struct {
A: u8,
B: u8,
lookup: [16]u8,
};
/// Reference enum mapping numbers to names
/// X = Exclude (only one side present)
/// N = North
/// W = West
/// E = East
/// S = South
/// H = Horizontal
/// V = Vertical
pub const Side = enum(u4) {
X_ALL = 0,
N = 1,
W = 2,
NW = 3,
E = 4,
NE = 5,
H_BEAM = 6,
X_S = 7,
S = 8,
V_BEAM = 9,
SW = 10,
X_E = 11,
SE = 12,
X_W = 13,
X_N = 14,
ALL = 15,
};
const AutoTiling = struct {
/// Bitmask to tile mapping
const AutoTileLookup = [16]u8;
tables: []AutoTileLookup,
/// Use value A for out of bounds
outOfBounds: u8,
values: []u8,
};

View File

@ -55,10 +55,59 @@ fn make(step: *std.build.Step) !void {
if (ldtk.levels.len > 0) {
const level0 = ldtk.levels[0];
if (level0.layerInstances) |layers| {
var circuit: []const u8 = "null";
var collision: []const u8 = "null";
for (layers) |layer| {
if (std.mem.eql(u8, layer.__identifier, "Entities")) {
std.debug.assert(layer.__type == .Entities);
for (layer.entityInstances) |entity| {
std.log.warn("{s}", .{entity.__identifier});
}
}
else if (std.mem.eql(u8, layer.__identifier, "Circuit")) {
std.debug.assert(layer.__type == .IntGrid);
var grid_str = try allocator.alloc(u8, @intCast(usize, layer.__cWid * layer.__cHei + layer.__cHei));
defer allocator.free(grid_str);
var i: usize = 0;
var o: usize = 0;
for (layer.intGridCsv) |int| {
grid_str[i + o] = std.fmt.digitToChar(@intCast(u8, int), .lower);
if (grid_str[i] == '0') grid_str[i] = ' ';
i += 1;
if (@mod(i, @intCast(usize, layer.__cWid)) == 0) {
grid_str[i + o] = '\n';
o += 1;
}
}
circuit = grid_str;
}
else if (std.mem.eql(u8, layer.__identifier, "Collision")) {
std.debug.assert(layer.__type == .IntGrid);
var grid_str = try allocator.alloc(u8, @intCast(usize, layer.__cWid * layer.__cHei + layer.__cHei));
var i: usize = 0;
var o: usize = 0;
for (layer.intGridCsv) |int| {
grid_str[i + o] = std.fmt.digitToChar(@intCast(u8, int), .lower);
if (grid_str[i] == '0') grid_str[i] = ' ';
i += 1;
if (@mod(i, @intCast(usize, layer.__cWid)) == 0) {
grid_str[i + o] = '\n';
o += 1;
}
}
collision = grid_str;
} else {
std.log.warn("{s}: {}", .{ layer.__identifier, layer.__type });
}
}
std.log.warn("Circuit IntGrid:\n{s}\nCollision IntGrid:\n{s}", .{ circuit, collision});
allocator.free(circuit);
allocator.free(collision);
}
}
// Open output file and write data