Define world data types
parent
2296695c0d
commit
2aa246f1bd
|
@ -0,0 +1,92 @@
|
||||||
|
const std = @import("std");
|
||||||
|
const Map = @import("map.zig");
|
||||||
|
const Circuit = @import("circuit.zig");
|
||||||
|
|
||||||
|
const world = @import("world.zig");
|
||||||
|
const Level = world.Level;
|
||||||
|
const Level = world.AutoTile;
|
||||||
|
|
||||||
|
pub const ExtractOptions = struct {
|
||||||
|
map: *Map,
|
||||||
|
circuit: *Circuit,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Extracts a compressed level into the map and circuit buffers
|
||||||
|
pub fn extractLevel(alloc: std.mem.Allocator, level: Level, opt: ExtractOptions) void {
|
||||||
|
const map = opt.map;
|
||||||
|
const circuit = opt.circuit;
|
||||||
|
const width = level.width;
|
||||||
|
const height = @divExact(@intCast(u16, level.tiles.len), level.width);
|
||||||
|
const size = level.tiles.len;
|
||||||
|
map.map_size = .{ level.width, height };
|
||||||
|
circuit.map_size = .{ level.width, height };
|
||||||
|
|
||||||
|
var solid_map = try alloc.alloc(bool, size);
|
||||||
|
defer alloc.free(solid_map);
|
||||||
|
|
||||||
|
var circuit_map = try alloc.alloc(CircuitType, size);
|
||||||
|
defer alloc.free(circuit_map);
|
||||||
|
|
||||||
|
for (level.tiles) |tile, i| {
|
||||||
|
if (tile.is_tile) {
|
||||||
|
solid_map[i] = is_solid(tile.data.tile);
|
||||||
|
map.map[i] = tile.data.tile;
|
||||||
|
circuit_map[i] = .None;
|
||||||
|
} else {
|
||||||
|
solid_map = tile.data.flags.solid;
|
||||||
|
circuit_map[i] = @intToEnum(CircuitType, tile.data.flags.circuit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var autotiles = try alloc.alloc(AutoTile, size);
|
||||||
|
defer alloc.free(autotiles);
|
||||||
|
|
||||||
|
{
|
||||||
|
var i: usize = 0;
|
||||||
|
while (i < level.tiles.len) : (i += 1) {
|
||||||
|
const x = @mod(i, width);
|
||||||
|
const y = @divTrunc(a, width);
|
||||||
|
|
||||||
|
const out_of_bounds = true;
|
||||||
|
var north = false;
|
||||||
|
var south = false;
|
||||||
|
var west = false;
|
||||||
|
var east = false;
|
||||||
|
|
||||||
|
// Check horizontal neighbors
|
||||||
|
if (x == 0) {
|
||||||
|
west = out_of_bounds;
|
||||||
|
}
|
||||||
|
else if (x == width - 1) {
|
||||||
|
east = out_of_bounds;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
west = solid_map[i - 1];
|
||||||
|
east = solid_map[i + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check vertical neighbours
|
||||||
|
if (y == 0) {
|
||||||
|
north = out_of_bounds;
|
||||||
|
}
|
||||||
|
else if (y == height - 1) {
|
||||||
|
south = out_of_bounds;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
north = solid_map[i - width];
|
||||||
|
south = solid_map[i + width];
|
||||||
|
}
|
||||||
|
|
||||||
|
autotiles[i] = AutoTile{
|
||||||
|
.North = north,
|
||||||
|
.South = south,
|
||||||
|
.West = west,
|
||||||
|
.East = east,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (autotiles) |autotile, i| {
|
||||||
|
map.map[i] = tileset.lookup[autotile.to_u4()];
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@ const assets = @import("assets");
|
||||||
const input = @import("input.zig");
|
const input = @import("input.zig");
|
||||||
const util = @import("util.zig");
|
const util = @import("util.zig");
|
||||||
|
|
||||||
const game = @import("game.zig");
|
const game = @import("rewrite.zig");
|
||||||
const menu = @import("menu.zig");
|
const menu = @import("menu.zig");
|
||||||
|
|
||||||
pub const State = enum {
|
pub const State = enum {
|
||||||
|
@ -30,7 +30,6 @@ export fn update() void {
|
||||||
.Game => game.update(time) catch |e| switch (e) {
|
.Game => game.update(time) catch |e| switch (e) {
|
||||||
error.Overflow => showErr(@errorName(e)),
|
error.Overflow => showErr(@errorName(e)),
|
||||||
error.OutOfBounds => showErr(@errorName(e)),
|
error.OutOfBounds => showErr(@errorName(e)),
|
||||||
// error.IndexOutOfBounds => showErr(@errorName(e)),
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
if (state != newState) {
|
if (state != newState) {
|
||||||
|
@ -40,7 +39,6 @@ export fn update() void {
|
||||||
.Game => game.start() catch |e| switch (e) {
|
.Game => game.start() catch |e| switch (e) {
|
||||||
error.Overflow => showErr(@errorName(e)),
|
error.Overflow => showErr(@errorName(e)),
|
||||||
error.OutOfBounds => showErr(@errorName(e)),
|
error.OutOfBounds => showErr(@errorName(e)),
|
||||||
// error.IndexOutOfBounds => showErr(@errorName(e)),
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,8 +7,6 @@ const Vec2 = util.Vec2;
|
||||||
const Vec2f = util.Vec2f;
|
const Vec2f = util.Vec2f;
|
||||||
const Cell = util.Cell;
|
const Cell = util.Cell;
|
||||||
|
|
||||||
const MAXCELLS = 400;
|
|
||||||
|
|
||||||
const width = 20;
|
const width = 20;
|
||||||
const height = 20;
|
const height = 20;
|
||||||
const tile_width = 8;
|
const tile_width = 8;
|
||||||
|
|
|
@ -36,7 +36,7 @@ pub fn update() State {
|
||||||
switch (@intToEnum(MenuOptions, selected)) {
|
switch (@intToEnum(MenuOptions, selected)) {
|
||||||
.Continue => return .Game,
|
.Continue => return .Game,
|
||||||
.NewGame => {
|
.NewGame => {
|
||||||
_ = w4.diskw("", 0);
|
// _ = w4.diskw("", 0);
|
||||||
return .Game;
|
return .Game;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
const world_data = @import("world_data");
|
||||||
|
const Circuit = @import("map.zig");
|
||||||
|
const input = @import("input.zig");
|
||||||
|
const Map = @import("map.zig");
|
||||||
|
const State = @import("main.zig").State;
|
||||||
|
const std = @import("std");
|
||||||
|
const w4 = @import("wasm4.zig");
|
||||||
|
const world = @import("world.zig");
|
||||||
|
|
||||||
|
const Vec2 = w4.Vec2;
|
||||||
|
|
||||||
|
var frame_fba_buf: [4096]u8 = undefined;
|
||||||
|
var frame_fba = std.heap.FixedBufferAllocator.init(&frame_fba_buf);
|
||||||
|
var frame_alloc = frame_fba.allocator();
|
||||||
|
|
||||||
|
var map_buf: [400]u8 = undefined;
|
||||||
|
var map: Map = undefined;
|
||||||
|
|
||||||
|
var circuit_lvl_buf: [400]u8 = undefined;
|
||||||
|
var circuit_buf : [400]u8 = undefined;
|
||||||
|
var circuit: Circuit = undefined;
|
||||||
|
|
||||||
|
var level_size = Vec2{20, 20};
|
||||||
|
|
||||||
|
pub fn start() void {
|
||||||
|
circuit = try Circuit.init(&circuit_buf, &circuit_lvl_buf, level_size);
|
||||||
|
map = Map.init(&map_buf, level_size);
|
||||||
|
|
||||||
|
const extract_opt = world.ExtractOptions{
|
||||||
|
.map = &map,
|
||||||
|
.circuit = &circuit,
|
||||||
|
};
|
||||||
|
|
||||||
|
const world_reader = std.io.FixedBufferStream([]const u8).reader();
|
||||||
|
const level = world_reader.readStruct(world.Level);
|
||||||
|
|
||||||
|
world.extractLevel(frame_alloc, level, extract_opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update() State {
|
||||||
|
// Reset the frame allocator
|
||||||
|
frame_fba.reset();
|
||||||
|
|
||||||
|
w4.DRAW_COLORS.* = 0x0004;
|
||||||
|
w4.rect(Vec2{ 0, 0 }, Vec2{ 160, 160 });
|
||||||
|
w4.DRAW_COLORS.* = 0x0001;
|
||||||
|
|
||||||
|
const camera = Vec2{0, 0};
|
||||||
|
|
||||||
|
map.draw(camera);
|
||||||
|
circuit.draw(camera);
|
||||||
|
|
||||||
|
return .Game;
|
||||||
|
}
|
120
src/world.zig
120
src/world.zig
|
@ -1,68 +1,62 @@
|
||||||
const TileValue = union(enum) {
|
//! Data types used for storing world info
|
||||||
Tile,
|
|
||||||
Size,
|
// Tile Storage Types
|
||||||
|
pub const CircuitType = enum(u4) {
|
||||||
|
None = 0,
|
||||||
|
Conduit = 1,
|
||||||
|
Plug = 2,
|
||||||
|
Switch_Off = 3,
|
||||||
|
Switch_On = 4,
|
||||||
|
Join = 5,
|
||||||
|
And = 6,
|
||||||
|
Xor = 7,
|
||||||
|
Outlet = 8,
|
||||||
|
Source = 9,
|
||||||
};
|
};
|
||||||
|
|
||||||
// 2 Modes
|
pub const TileData = packed union {
|
||||||
// Tile:
|
tile: u7,
|
||||||
// 0b0TTT_TTTT
|
flags: packed struct {
|
||||||
// 2 layer:
|
solid: bool,
|
||||||
// 0b1XXS_CCCC
|
circuit: u4,
|
||||||
// T = Tile number, 0-127
|
},
|
||||||
// X = Reserved
|
};
|
||||||
// S = Solid
|
|
||||||
// C = Circuit
|
|
||||||
|
|
||||||
/// 0bDCBA
|
pub const TileStore = packed struct {
|
||||||
/// +---+---+
|
is_tile: bool,
|
||||||
/// | A | B |
|
data: TileData,
|
||||||
/// +---+---+
|
};
|
||||||
/// | C | D |
|
|
||||||
/// +---+---+
|
pub const LevelHeader = struct {
|
||||||
/// NE 0b0001
|
world_x: u8,
|
||||||
/// NW 0b0010
|
world_y: u8,
|
||||||
/// SW 0b0100
|
width: u16,
|
||||||
/// SE 0b1000
|
size: u16,
|
||||||
/// 0 -
|
};
|
||||||
const AutoTileRule = struct {
|
|
||||||
A: u8,
|
pub const Level = struct {
|
||||||
B: u8,
|
world_x: u8,
|
||||||
|
world_y: u8,
|
||||||
|
width: u16,
|
||||||
|
tiles: []TileStore,
|
||||||
|
};
|
||||||
|
|
||||||
|
// AutoTile algorithm datatypes
|
||||||
|
pub const AutoTile = packed struct {
|
||||||
|
North: bool,
|
||||||
|
West: bool,
|
||||||
|
South: bool,
|
||||||
|
East: bool,
|
||||||
|
|
||||||
|
pub fn to_u4(autotile: AutoTile) u4 {
|
||||||
|
return @bitCast(u4, autotile);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_u4(int: u4) AutoTile {
|
||||||
|
return @bitCast(AutoTile, int);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const AutoTileset = struct {
|
||||||
lookup: [16]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,
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
//! Uses zig-ldtk to convert a ldtk file into a binary format for wired
|
//! Uses zig-ldtk to convert a ldtk file into a binary format for wired
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const LDtk = @import("../deps/zig-ldtk/src/LDtk.zig");
|
const LDtk = @import("../deps/zig-ldtk/src/LDtk.zig");
|
||||||
|
const world = @import("../src/world.zig");
|
||||||
|
|
||||||
const KB = 1024;
|
const KB = 1024;
|
||||||
const MB = 1024 * KB;
|
const MB = 1024 * KB;
|
||||||
|
|
Loading…
Reference in New Issue