Game is compiling
parent
84b5e4cb41
commit
280d73ae59
|
@ -250,7 +250,7 @@ pub fn addSource(this: *@This(), cell: Cell) void {
|
||||||
|
|
||||||
pub fn addDoor(this: *@This(), cell: Cell) !void {
|
pub fn addDoor(this: *@This(), cell: Cell) !void {
|
||||||
if (this.indexOf(cell)) |_| {
|
if (this.indexOf(cell)) |_| {
|
||||||
try this.doors.append(.{ .cell = cell, .enabled = false });
|
this.doors.append(.{ .cell = cell, .enabled = false });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
48
src/game.zig
48
src/game.zig
|
@ -1,3 +1,4 @@
|
||||||
|
const assets = @import("assets");
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const w4 = @import("wasm4.zig");
|
const w4 = @import("wasm4.zig");
|
||||||
const input = @import("input.zig");
|
const input = @import("input.zig");
|
||||||
|
@ -6,10 +7,10 @@ const Circuit = @import("circuit.zig");
|
||||||
const Map = @import("map.zig");
|
const Map = @import("map.zig");
|
||||||
const Music = @import("music.zig");
|
const Music = @import("music.zig");
|
||||||
const State = @import("main.zig").State;
|
const State = @import("main.zig").State;
|
||||||
const Disk = @import("disk.zig");
|
// const Disk = @import("disk.zig");
|
||||||
const extract = @import("extract.zig");
|
const extract = @import("extract.zig");
|
||||||
const world = @import("world.zig");
|
const world = @import("world.zig");
|
||||||
const world_data = @import("world_data");
|
const world_data = @embedFile(@import("world_data").path);
|
||||||
|
|
||||||
const Vec2 = util.Vec2;
|
const Vec2 = util.Vec2;
|
||||||
const Vec2f = util.Vec2f;
|
const Vec2f = util.Vec2f;
|
||||||
|
@ -250,9 +251,6 @@ pub fn start() !void {
|
||||||
|
|
||||||
const spawnArr = level.getSpawn().?;
|
const spawnArr = level.getSpawn().?;
|
||||||
const spawn = Vec2{ spawnArr[0], spawnArr[1] };
|
const spawn = Vec2{ spawnArr[0], spawnArr[1] };
|
||||||
// std.mem.set(u8, &conduitLevels_mutable, 0);
|
|
||||||
// circuit = try Circuit.init(&conduit_mutable, &conduitLevels_mutable, assets.conduit_size);
|
|
||||||
// map = Map.init(&solids_mutable, assets.solid_size);
|
|
||||||
|
|
||||||
camera = @divTrunc(spawn, @splat(2, @as(i32, 20))) * @splat(2, @as(i32, 20));
|
camera = @divTrunc(spawn, @splat(2, @as(i32, 20))) * @splat(2, @as(i32, 20));
|
||||||
|
|
||||||
|
@ -271,43 +269,47 @@ pub fn start() !void {
|
||||||
.kinematic = .{ .col = .{ .pos = .{ -3, -6 }, .size = .{ 5, 5 } } },
|
.kinematic = .{ .col = .{ .pos = .{ -3, -6 }, .size = .{ 5, 5 } } },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
{
|
||||||
_ = try wires.resize(0);
|
_ = try wires.resize(0);
|
||||||
for (assets.wire) |wire| {
|
var a: usize = 0;
|
||||||
|
while (level.getWire(a)) |wire| : (a += 1) {
|
||||||
var w = try wires.addOne();
|
var w = try wires.addOne();
|
||||||
_ = try w.nodes.resize(0);
|
_ = try w.nodes.resize(0);
|
||||||
const divisions = wire.divisions;
|
// const divisions = wire.divisions;
|
||||||
|
const divisions = 10;
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
while (i <= divisions) : (i += 1) {
|
while (i <= divisions) : (i += 1) {
|
||||||
try w.nodes.append(Pos.init(Vec2f{ 0, 0 }));
|
try w.nodes.append(Pos.init(Vec2f{ 0, 0 }));
|
||||||
}
|
}
|
||||||
w.begin().pos = util.vec2ToVec2f(wire.p1);
|
w.begin().pos = util.vec2ToVec2f(Vec2{ wire[0].x, wire[0].y } * tile_size);
|
||||||
w.end().pos = util.vec2ToVec2f(wire.p2);
|
w.end().pos = util.vec2ToVec2f(Vec2{ wire[1].x, wire[1].y } * tile_size);
|
||||||
|
|
||||||
w.begin().pinned = wire.a1;
|
w.begin().pinned = wire[0].kind == world.EntityKind.WireAnchor;
|
||||||
w.end().pinned = wire.a2;
|
w.end().pinned = wire[1].kind == world.EntityKind.WireEndAnchor;
|
||||||
|
|
||||||
w.straighten();
|
w.straighten();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (assets.sources) |source| {
|
|
||||||
try circuit.addSource(source);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (assets.doors) |door| {
|
{
|
||||||
try circuit.addDoor(door);
|
var i: usize = 0;
|
||||||
|
while (level.getDoor(i)) |door| : (i += 1) {
|
||||||
|
try circuit.addDoor(Vec2{ door.x, door.y });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try coins.resize(0);
|
try coins.resize(0);
|
||||||
if (!try Disk.load()) {
|
// if (!try Disk.load()) {
|
||||||
for (assets.coins) |coin| {
|
var i: usize = 0;
|
||||||
|
while (level.getCoin(i)) |coin| : (i += 1) {
|
||||||
try coins.append(.{
|
try coins.append(.{
|
||||||
.pos = Pos.init(util.vec2ToVec2f(coin * tile_size)),
|
.pos = Pos.init(util.vec2ToVec2f(Vec2{ coin.x, coin.y } * tile_size)),
|
||||||
.sprite = .{ .offset = .{ 0, 0 }, .size = .{ 8, 8 }, .index = 4, .flags = .{ .bpp = .b2 } },
|
.sprite = .{ .offset = .{ 0, 0 }, .size = .{ 8, 8 }, .index = 4, .flags = .{ .bpp = .b2 } },
|
||||||
.anim = Anim{ .anim = &anim_store.coin },
|
.anim = Anim{ .anim = &anim_store.coin },
|
||||||
.area = .{ .pos = .{ 0, 0 }, .size = .{ 8, 8 } },
|
.area = .{ .pos = .{ 0, 0 }, .size = .{ 8, 8 } },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
|
|
||||||
try updateCircuit();
|
try updateCircuit();
|
||||||
}
|
}
|
||||||
|
@ -358,12 +360,12 @@ pub fn update(time: usize) !State {
|
||||||
_ = coins.swapRemove(i);
|
_ = coins.swapRemove(i);
|
||||||
}
|
}
|
||||||
// We save here to prevent duplicate coins
|
// We save here to prevent duplicate coins
|
||||||
if (shouldSave) Disk.save();
|
// if (shouldSave) Disk.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
const newCamera = @divTrunc(util.world2cell(player.pos.pos), @splat(2, @as(i32, 20))) * @splat(2, @as(i32, 20));
|
const newCamera = @divTrunc(util.world2cell(player.pos.pos), @splat(2, @as(i32, 20))) * @splat(2, @as(i32, 20));
|
||||||
if (!@reduce(.And, newCamera == camera)) {
|
if (!@reduce(.And, newCamera == camera)) {
|
||||||
Disk.save();
|
// Disk.save();
|
||||||
}
|
}
|
||||||
camera = newCamera;
|
camera = newCamera;
|
||||||
|
|
||||||
|
@ -616,7 +618,7 @@ fn updateCircuit() !void {
|
||||||
if ((circuit.isEnabled(cellBegin) and begin.pinned) or
|
if ((circuit.isEnabled(cellBegin) and begin.pinned) or
|
||||||
(circuit.isEnabled(cellEnd) and end.pinned)) wire.enabled = true;
|
(circuit.isEnabled(cellEnd) and end.pinned)) wire.enabled = true;
|
||||||
}
|
}
|
||||||
map.reset(&assets.solid);
|
// map.reset(&assets.solid);
|
||||||
const enabledDoors = try circuit.enabledDoors(frame_alloc);
|
const enabledDoors = try circuit.enabledDoors(frame_alloc);
|
||||||
for (enabledDoors.items) |door| {
|
for (enabledDoors.items) |door| {
|
||||||
try map.set_cell(door, 0);
|
try map.set_cell(door, 0);
|
||||||
|
|
|
@ -39,9 +39,9 @@ export fn update() void {
|
||||||
switch (newState) {
|
switch (newState) {
|
||||||
.Menu => menu.start(),
|
.Menu => menu.start(),
|
||||||
.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.EndOfStream => showErr(@errorName(e)),
|
error.EndOfStream => showErr(@errorName(e)),
|
||||||
error.OutOfMemory => showErr(@errorName(e)),
|
error.OutOfMemory => showErr(@errorName(e)),
|
||||||
error.NullTiles => showErr(@errorName(e)),
|
error.NullTiles => showErr(@errorName(e)),
|
||||||
},
|
},
|
||||||
|
|
|
@ -92,6 +92,7 @@ pub const Level = struct {
|
||||||
.world_y = try reader.readInt(u8, .Little),
|
.world_y = try reader.readInt(u8, .Little),
|
||||||
.width = try reader.readInt(u16, .Little),
|
.width = try reader.readInt(u16, .Little),
|
||||||
.size = try reader.readInt(u16, .Little),
|
.size = try reader.readInt(u16, .Little),
|
||||||
|
.entity_count = try reader.readInt(u16, .Little),
|
||||||
.tiles = null,
|
.tiles = null,
|
||||||
.entities = null,
|
.entities = null,
|
||||||
};
|
};
|
||||||
|
@ -111,19 +112,60 @@ pub const Level = struct {
|
||||||
level.entities = buf;
|
level.entities = buf;
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
while (i < level.entity_count) : (i += 1) {
|
while (i < level.entity_count) : (i += 1) {
|
||||||
buf[i] = Entity.read(reader);
|
buf[i] = try Entity.read(reader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getSpawn(level: *Level) ?[2]i16 {
|
pub fn getSpawn(level: *Level) ?[2]i16 {
|
||||||
std.debug.assert(level.entities != null);
|
std.debug.assert(level.entities != null);
|
||||||
for (level.entities) |entity| {
|
for (level.entities.?) |entity| {
|
||||||
if (entity.kind == .Player) {
|
if (entity.kind == .Player) {
|
||||||
return [2]i16{ entity.x, entity.y };
|
return [2]i16{ entity.x, entity.y };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn getWire(level: *Level, num: usize) ?[2]Entity {
|
||||||
|
std.debug.assert(level.entities != null);
|
||||||
|
var node_begin: ?Entity = null;
|
||||||
|
var wire_count: usize = 0;
|
||||||
|
for (level.entities.?) |entity| {
|
||||||
|
if (entity.kind == .WireNode or entity.kind == .WireAnchor) {
|
||||||
|
node_begin = entity;
|
||||||
|
} else if (entity.kind == .WireEndNode or entity.kind == .WireEndAnchor) {
|
||||||
|
if (node_begin) |begin| {
|
||||||
|
if (wire_count == num) return [2]Entity{ begin, entity };
|
||||||
|
}
|
||||||
|
wire_count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getDoor(level: *Level, num: usize) ?Entity {
|
||||||
|
std.debug.assert(level.entities != null);
|
||||||
|
var count: usize = 0;
|
||||||
|
for (level.entities.?) |entity| {
|
||||||
|
if (entity.kind == .Door or entity.kind == .Trapdoor) {
|
||||||
|
if (count == num) return entity;
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getCoin(level: *Level, num: usize) ?Entity {
|
||||||
|
std.debug.assert(level.entities != null);
|
||||||
|
var count: usize = 0;
|
||||||
|
for (level.entities.?) |entity| {
|
||||||
|
if (entity.kind == .Coin) {
|
||||||
|
if (count == num) return entity;
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// AutoTile algorithm datatypes
|
// AutoTile algorithm datatypes
|
||||||
|
@ -229,7 +271,9 @@ pub const EntityKind = enum(u8) {
|
||||||
Player,
|
Player,
|
||||||
Coin,
|
Coin,
|
||||||
WireNode,
|
WireNode,
|
||||||
|
WireAnchor,
|
||||||
WireEndNode,
|
WireEndNode,
|
||||||
|
WireEndAnchor,
|
||||||
Door,
|
Door,
|
||||||
Trapdoor,
|
Trapdoor,
|
||||||
};
|
};
|
||||||
|
@ -245,9 +289,11 @@ pub const Entity = struct {
|
||||||
try writer.writeInt(i16, entity.y, .Little);
|
try writer.writeInt(i16, entity.y, .Little);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read(entity: Entity, reader: anytype) !void {
|
pub fn read(reader: anytype) !Entity {
|
||||||
try reader.readInt(u8, @intToEnum(EntityKind, entity.kind), .Little);
|
return Entity{
|
||||||
try reader.readInt(i16, entity.x, .Little);
|
.kind = @intToEnum(EntityKind, try reader.readInt(u8, .Little)),
|
||||||
try reader.readInt(i16, entity.y, .Little);
|
.x = try reader.readInt(i16, .Little),
|
||||||
|
.y = try reader.readInt(i16, .Little),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue