v
This commit is contained in:
parent
5a79ae71c0
commit
35bbc5cbfd
73
src/client/chunk.zig
Normal file
73
src/client/chunk.zig
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
const shared = @import("shared");
|
||||||
|
const enet = @import("c.zig").enet;
|
||||||
|
|
||||||
|
pub fn spawn(self: *shared.chunk.Chunk, allocator: std.mem.Allocator, comptime T: type, value: T) !shared.entity.id {
|
||||||
|
std.debug.assert(value.id != shared.entity.INVALID_ID);
|
||||||
|
|
||||||
|
const ptr = try allocator.create(T);
|
||||||
|
errdefer allocator.destroy(ptr);
|
||||||
|
|
||||||
|
ptr.* = value;
|
||||||
|
|
||||||
|
const ref = shared.entity.makeRef(T, ptr);
|
||||||
|
|
||||||
|
try self.entities.append(allocator, ref);
|
||||||
|
|
||||||
|
return ptr.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find(self: *shared.chunk.Chunk, id: shared.entity.id) ?shared.entity.Ref {
|
||||||
|
for (self.entities.items) |ref| {
|
||||||
|
switch (ref) {
|
||||||
|
inline else => |ptr| {
|
||||||
|
if (ptr.id == id) {
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn findT(self: *shared.chunk.Chunk, comptime T: type, id: shared.entity.id) ?*T {
|
||||||
|
for (self.entities.items) |ref| {
|
||||||
|
switch (ref) {
|
||||||
|
inline else => |ptr| {
|
||||||
|
if (ptr.id == id and @TypeOf(ptr) == *T) {
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn despawn(self: *shared.chunk.Chunk, allocator: std.mem.Allocator, id: shared.entity.id) bool {
|
||||||
|
var i: usize = 0;
|
||||||
|
while (i < self.entities.items.len) {
|
||||||
|
const ref = self.entities.items[i];
|
||||||
|
|
||||||
|
var found = false;
|
||||||
|
|
||||||
|
switch (ref) {
|
||||||
|
inline else => |ptr| {
|
||||||
|
if (ptr.id == id) {
|
||||||
|
allocator.destroy(ptr);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found) {
|
||||||
|
_ = self.entities.swapRemove(i);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
158
src/shared/protocol_v1.zig
Normal file
158
src/shared/protocol_v1.zig
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
const zm = @import("zmath");
|
||||||
|
// const bufzilla = @import("bufzilla");
|
||||||
|
|
||||||
|
const entity = @import("entity.zig");
|
||||||
|
const bits = @import("bits.zig");
|
||||||
|
|
||||||
|
pub const SERVER_PORT: u16 = 1337;
|
||||||
|
|
||||||
|
const MessageKind = enum(c_char) {
|
||||||
|
spawn_entity,
|
||||||
|
update_entity,
|
||||||
|
despawn_entity,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Message = union(MessageKind) {
|
||||||
|
spawn_entity: SpawnEntity,
|
||||||
|
update_entity: UpdateEntity,
|
||||||
|
despawn_entity: DespawnEntity,
|
||||||
|
};
|
||||||
|
|
||||||
|
const EntityKind = enum(c_char) {
|
||||||
|
soldier,
|
||||||
|
alien,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const SpawnEntity = union(EntityKind) {
|
||||||
|
soldier: Soldier,
|
||||||
|
alien: Alien,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const UpdateEntity = union(EntityKind) {
|
||||||
|
soldier: Soldier,
|
||||||
|
alien: Alien,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const DespawnEntity = union(EntityKind) {
|
||||||
|
soldier: Soldier,
|
||||||
|
alien: Alien,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn makeSpawnMessage(e: entity.Ref) Message {
|
||||||
|
switch (e) {
|
||||||
|
.Soldier => |s| { return Soldier.makeSpawn(s.*); },
|
||||||
|
.Alien => |a| { return Alien.makeSpawn(a.*); },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn makeUpdateMessage(e: entity.Ref) Message {
|
||||||
|
switch (e) {
|
||||||
|
.Soldier => |s| { return Soldier.makeUpdate(s.*); },
|
||||||
|
.Alien => |a| { return Alien.makeUpdate(a.*); },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn makeDespawnMessage(e: entity.Ref) Message {
|
||||||
|
switch (e) {
|
||||||
|
.Soldier => |s| { return Soldier.makeDespawn(s.*); },
|
||||||
|
.Alien => |a| { return Alien.makeDespawn(a.*); },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const Soldier = struct {
|
||||||
|
id: entity.id = entity.INVALID_ID,
|
||||||
|
hp: i32,
|
||||||
|
pos: zm.Vec,
|
||||||
|
vel: zm.Vec,
|
||||||
|
|
||||||
|
pub fn init(soldier: entity.Soldier) Soldier {
|
||||||
|
return .{
|
||||||
|
.id = soldier.id,
|
||||||
|
.hp = soldier.hp,
|
||||||
|
.pos = soldier.pos,
|
||||||
|
.vel = soldier.vel,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn makeSpawn(soldier: entity.Soldier) Message {
|
||||||
|
return .{
|
||||||
|
.spawn_entity = .{ .soldier = init(soldier) }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn makeUpdate(soldier: entity.Soldier) Message {
|
||||||
|
return .{
|
||||||
|
.update_entity = .{ .soldier = init(soldier) }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn makeDespawn(soldier: entity.Soldier) Message {
|
||||||
|
return .{
|
||||||
|
.despawn_entity = .{ .soldier = init(soldier) }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Alien = struct {
|
||||||
|
id: entity.id = entity.INVALID_ID,
|
||||||
|
hp: i32,
|
||||||
|
pos: zm.Vec,
|
||||||
|
|
||||||
|
pub fn init(alien: entity.Alien) Alien {
|
||||||
|
return .{
|
||||||
|
.id = alien.id,
|
||||||
|
.pos = alien.pos,
|
||||||
|
.hp = alien.hp,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn makeSpawn(alien: entity.Alien) Message {
|
||||||
|
return .{
|
||||||
|
.spawn_entity = .{ .alien = init(alien) }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn makeUpdate(alien: entity.Alien) Message {
|
||||||
|
return .{
|
||||||
|
.update_entity = .{ .alien = init(alien) }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn makeDespawn(alien: entity.Alien) Message {
|
||||||
|
return .{
|
||||||
|
.despawn_entity = .{ .alien = init(alien) }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
test "Protocol" {
|
||||||
|
std.debug.print("Protocol\n", .{});
|
||||||
|
|
||||||
|
const s = entity.Soldier{
|
||||||
|
.hp = 66,
|
||||||
|
.pos = .{1, 2, 3, 4},
|
||||||
|
.vel = .{5, 6, 7, 8},
|
||||||
|
};
|
||||||
|
|
||||||
|
const msg = makeSpawnMessage(s);
|
||||||
|
|
||||||
|
const allocator = std.testing.allocator;
|
||||||
|
|
||||||
|
var aw = try std.ArrayList(u8).initCapacity(allocator, 128);
|
||||||
|
defer aw.deinit(allocator);
|
||||||
|
|
||||||
|
var writer = bits.BitWriter.init(&aw);
|
||||||
|
|
||||||
|
try writer.serialize(allocator, msg);
|
||||||
|
|
||||||
|
var reader = bits.BitReader.init(writer.written());
|
||||||
|
|
||||||
|
const recv = try reader.deserialize(allocator, Message);
|
||||||
|
|
||||||
|
std.debug.print("msg: {}\n", .{msg});
|
||||||
|
|
||||||
|
std.debug.print("recv: {}\n", .{recv});
|
||||||
|
|
||||||
|
try std.testing.expectEqual(msg, recv);
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user