From b91bce88408039fb08452401067baa4ee62cb121 Mon Sep 17 00:00:00 2001 From: Vicente Ferrari Smith Date: Mon, 2 Feb 2026 01:25:01 +0100 Subject: [PATCH] enough fonting, more servering? --- .vscode/launch.json | 13 +++- src/client/main.zig | 144 +--------------------------------------- src/server/c.zig | 4 +- src/server/main.zig | 70 +++++++++++-------- src/shared/entity.zig | 30 +++++---- src/shared/protocol.zig | 40 +++++------ 6 files changed, 95 insertions(+), 206 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index dbeb53e..459c78b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ "version": "0.2.0", "configurations": [ { - "name": "(lldb) Launch", + "name": "Client", "type": "lldb", "request": "launch", "program": "${workspaceFolder}/zig-out/bin/client", @@ -14,6 +14,17 @@ "internalConsoleOptions": "openOnSessionStart", "preLaunchTask": "build", "sourceLanguages": ["zig"] + }, + { + "name": "Server", + "type": "lldb", + "request": "launch", + "program": "${workspaceFolder}/zig-out/bin/server", + "args": [], + "cwd": "${workspaceFolder}", + "internalConsoleOptions": "openOnSessionStart", + "preLaunchTask": "build", + "sourceLanguages": ["zig"] } ] } diff --git a/src/client/main.zig b/src/client/main.zig index bd936aa..8b8a0af 100644 --- a/src/client/main.zig +++ b/src/client/main.zig @@ -65,9 +65,6 @@ pub fn main() !void { }; var vollkorn: [sizes.len]font.Font = undefined; - // var inconsolata: [sizes.len]font.Font = undefined; - // var arabic: [sizes.len]font.Font = undefined; - // // var japanese: [sizes.len]font.Font = undefined; for (sizes, 0..) |pt, i| { vollkorn[i] = try font.Font.init( @@ -75,28 +72,10 @@ pub fn main() !void { pt, allocator ); - // inconsolata[i] = try font.Font.init( - // "assets/fonts/Inconsolata/static/Inconsolata-Regular.ttf", - // @intCast(pt), - // allocator - // ); - // arabic[i] = try font.Font.init( - // "assets/fonts/Amiri/Amiri-Regular.ttf", - // @intCast(pt), - // allocator - // ); - // japanese[i] = try font.Font.init( - // "assets/fonts/Noto_Sans_JP/static/NotoSansJP-Regular.ttf", - // @intCast(pt), - // allocator - // ); } defer { for (&vollkorn) |*f| f.deinit(allocator); - // for (&inconsolata) |*f| f.deinit(allocator); - // for (&arabic) |*f| f.deinit(allocator); - // for (&japanese) |*f| f.deinit(allocator); } font.shader = rl.LoadShader(null, "assets/text.frag"); @@ -141,12 +120,8 @@ pub fn main() !void { // try stdout.flush(); - // var the_chunk = try shared.chunk.initChunk(allocator); - // defer shared.chunk.deinitChunk(&the_chunk, allocator); - - // shared.chunk.updateChunk(&the_chunk); - - //var elf = entity.Elf.init(); + var the_chunk = try shared.chunk.initChunk(allocator); + defer shared.chunk.deinitChunk(&the_chunk, allocator); // var send_buf: [1024]u8 = undefined; // var writer = if (connection) |*conn| conn.writer(&send_buf) else return; @@ -179,14 +154,12 @@ pub fn main() !void { // rl.playMusicStream(music); // std.log.info("is music playing? {}", .{rl.isMusicStreamPlaying(music)}); - // var old_time : f32 = @floatCast(rl.getTime()); var old_time : f32 = @floatCast(rl.GetTime()); while (!rl.WindowShouldClose()) { const tracy_main_zone = tracy.ZoneNC(@src(), "loop", 0x00_ff_00_00); defer tracy_main_zone.End(); - // const new_time : f32 = @floatCast(rl.getTime()); const new_time : f32 = @floatCast(rl.GetTime()); var frame_time = new_time - old_time; old_time = new_time; @@ -197,7 +170,6 @@ pub fn main() !void { t += frame_time; accumulator += frame_time * k; - // std.log.info("t: {}", .{t}); // while (try host.service(0)) |event| switch (event) { // .connect => |data| { @@ -232,7 +204,6 @@ pub fn main() !void { // rl.updateMusicStream(music); while (accumulator > dt * k) { - // update(dt * cast(float) k); accumulator -= dt * k; gt += dt * k; } @@ -254,117 +225,6 @@ pub fn main() !void { true ); - // arabic[0].render_text( - // "الليل طويل وبارد في الخارج", - // rl.Vector2{ .x = 0, .y = 100}, - // true, - // .white, - // .blank, - // false, - // true - // ); - - // var y : f32 = 0; - // var it = std.mem.splitScalar(u8, lorem, '\n'); - // while (it.next()) |line| { - // vollkorn[0].render_text( - // line, - // rl.Vector2{ .x = 0, .y = y}, - // true, - // .white, - // .blank, - // false, - // true - // ); - - // const font_linegap : f32 = @floatFromInt(vollkorn[0].face.size().metrics().height >> 6); - // const dpi_font_linegap = font_linegap / rl.getWindowScaleDPI().y; - - // y += dpi_font_linegap; - // } - - - // for (&vollkorn) |*f| { - // f.render_text( - // "Whereas, disregard and contempt for human rights have resulted!", - // rl.Vector2{ .x = 0, .y = y}, - // true, - // .white, - // .blank, - // false, - // true - // ); - - // // const font_ascent : f32 = @floatFromInt(f.face.size().metrics().ascender >> 6); - // // const dpi_font_ascent = font_ascent / rl.getWindowScaleDPI().y; - - // // const font_descent : f32 = @floatFromInt(f.face.size().metrics().descender >> 6); - // // const dpi_font_descent = font_descent / rl.getWindowScaleDPI().y; - - // const font_linegap : f32 = @floatFromInt(f.face.size().metrics().height >> 6); - // const dpi_font_linegap = font_linegap / rl.getWindowScaleDPI().y; - - // y += dpi_font_linegap; - // } - - // for (&inconsolata) |*f| { - // f.render_text( - // "Whereas, disregard and contempt for human rights have resulted!", - // rl.Vector2{ .x = 0, .y = y}, - // true, - // .white, - // .blank, - // false, - // true - // ); - - // // const font_ascent : f32 = @floatFromInt(f.face.size().metrics().ascender >> 6); - // // const dpi_font_ascent = font_ascent / rl.getWindowScaleDPI().y; - - // // const font_descent : f32 = @floatFromInt(f.face.size().metrics().descender >> 6); - // // const dpi_font_descent = font_descent / rl.getWindowScaleDPI().y; - - // const font_linegap : f32 = @floatFromInt(f.face.size().metrics().height >> 6); - // const dpi_font_linegap = font_linegap / rl.getWindowScaleDPI().y; - - // y += dpi_font_linegap; - // } - - // for (&japanese) |*f| { - // f.render_text( - // "外は夜が長くて寒い", - // c.Vector2{ .x = 0, .y = y}, - // true, - // c.WHITE, - // c.BLANK, - // false, - // true - // ); - - // const font_ascent : f32 = @floatFromInt(f.face.size().metrics().ascender >> 6); - // const dpi_font_ascent = font_ascent / c.GetWindowScaleDPI().y; - - // y += dpi_font_ascent; - // } - - // for (&arabic) |*f| { - - - // const font_ascent : f32 = @floatFromInt(f.face.size().metrics().ascender >> 6); - // const dpi_font_ascent = font_ascent / rl.getWindowScaleDPI().y; - - // y += dpi_font_ascent; - // } - // f.render_text( - // "Whereas, disregard and contempt for human rights have resulted!", - // rl.Vector2.init(0, 0), - // true, - // rl.Color.white, - // rl.Color.blank, - // false, - // true - // ); - // rl.beginShaderMode(test_shader1); // rl.gl.rlBegin(rl.gl.rl_quads); diff --git a/src/server/c.zig b/src/server/c.zig index bde1670..808aaf0 100644 --- a/src/server/c.zig +++ b/src/server/c.zig @@ -1,3 +1,3 @@ -pub const c = @cImport({ - // @cInclude("enet/enet.h"); +pub const enet = @cImport({ + @cInclude("enet/enet.h"); }); diff --git a/src/server/main.zig b/src/server/main.zig index acbf0be..5ca8e76 100644 --- a/src/server/main.zig +++ b/src/server/main.zig @@ -1,9 +1,10 @@ -const std = @import("std"); -const zm = @import("zmath"); +const std = @import("std"); +const zm = @import("zmath"); +const enet = @import("c.zig").enet; const shared = @import("shared"); -const chunk = @import("chunk.zig"); +const chunk = @import("chunk.zig"); const server = @import("server.zig"); const dt : f32 = 1.0 / 200.0; @@ -13,38 +14,33 @@ var accumulator : f32 = 0; var k : f32 = 1.0; var frame : i32 = 0; -var stdout: *std.io.Writer = undefined; +var dbg_allocator = std.heap.DebugAllocator(.{}){}; pub fn main() !void { - std.log.info("Hello Server!", .{}); - var dbg_allocator = std.heap.DebugAllocator(.{}).init; - defer _ = dbg_allocator.deinit(); + const allocator = dbg_allocator.allocator(); + defer { + const deinit_status = dbg_allocator.deinit(); + if (deinit_status == .leak) { + @panic("LEAKED!"); + } + } - var stdout_buffer: [1024]u8 = undefined; - var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer); - stdout = &stdout_writer.interface; + var stdout = std.fs.File.stdout(); + _ = try stdout.write("Hello, Server!\n"); - try stdout.flush(); + if (enet.enet_initialize() != 0) { + std.log.info("Failed to load ENet", .{}); + return; + } - // try znet.init(); - // defer znet.deinit(); + defer enet.enet_deinitialize(); - // server.host = try znet.Host.init(.{ - // .addr = try .init(.{ - // .ip = .any, - // .port = .{ .uint = 5000 }, - // }), - // .peer_limit = 32, - // .channel_limit = .max, - // .incoming_bandwidth = .unlimited, - // .outgoing_bandwidth = .unlimited, - // }); + const address = enet.ENetAddress{ .host = enet.ENET_HOST_ANY, .port = shared.protocol.SERVER_PORT }; + var host : ?*enet.ENetHost = null; - // const address = try std.net.Address.parseIp4("127.0.0.1", shared.protocol.SERVER_PORT); - // var tcp_server = try address.listen(.{}); - - // defer tcp_server.deinit(); + host = enet.enet_host_create(&address, 32, 2, 0, 0); + defer enet.enet_host_destroy(host); var the_chunk = try shared.chunk.initChunk(allocator); defer shared.chunk.deinitChunk(&the_chunk, allocator); @@ -62,7 +58,21 @@ pub fn main() !void { t += frame_time; accumulator += frame_time * k; - // std.log.info("t: {}", .{t}); + var event = enet.ENetEvent{}; + while (enet.enet_host_service(host, &event, 0) > 0) { + switch (event.type) { + enet.ENET_EVENT_TYPE_CONNECT => { + std.log.info("hello", .{}); + }, + enet.ENET_EVENT_TYPE_RECEIVE => { + std.log.info("hello", .{}); + }, + enet.ENET_EVENT_TYPE_DISCONNECT => { + std.log.info("hello", .{}); + }, + else => {} + } + } // while (try server.host.service(0)) |event| switch (event) { // .connect => |data| { @@ -94,8 +104,10 @@ pub fn main() !void { // try shared.protocol.sendHello(w, .{ .msg = "Hello from server!" }); try chunk.spawn(&the_chunk, shared.entity.Elf, allocator, .{ - .pos = zm.f32x4(1, 1, 0, 0), + .pos = zm.f32x4(1, 0, 0, 0), + .vel = zm.f32x4(0, 0, 0, 0), .hp = 10, + }); // try chunk.spawn(&the_chunk, shared.entity.Monster, allocator, .{ diff --git a/src/shared/entity.zig b/src/shared/entity.zig index 081d689..7d1f77a 100644 --- a/src/shared/entity.zig +++ b/src/shared/entity.zig @@ -7,17 +7,18 @@ pub const INVALID_ID: id = 0; pub const EntityKinds = .{ Elf, - Monster, - Projectile, + Cow, + Pig, }; pub const Elf = struct { id: id = INVALID_ID, pos: zm.Vec, + vel: zm.Vec, hp: i32, pub fn update(self: *Elf) void { - self.pos += zm.f32x4(1, 1, 0, 0); + self.pos += self.pos + self.vel; } pub fn to_message(self: *Elf) protocol.Elf_v1 { @@ -25,19 +26,24 @@ pub const Elf = struct { } }; -pub const Monster = struct { - id: id = INVALID_ID, - pos: zm.Vec, - hp: i32, -}; - -pub const Projectile = struct { +pub const Cow = struct { id: id = INVALID_ID, pos: zm.Vec, vel: zm.Vec, + hp: i32, - pub fn update(self: *Projectile) void { + pub fn update(self: *Cow) void { + self.pos = self.pos + self.vel; + } +}; + +pub const Pig = struct { + id: id = INVALID_ID, + pos: zm.Vec, + vel: zm.Vec, + hp: i32, + + pub fn update(self: *Pig) void { self.pos = self.pos + self.vel; - std.log.info("pos=({})", .{self.pos}); } }; diff --git a/src/shared/protocol.zig b/src/shared/protocol.zig index b324405..810da48 100644 --- a/src/shared/protocol.zig +++ b/src/shared/protocol.zig @@ -13,17 +13,17 @@ pub const Message = union(enum) { pub const SpawnEntity = union(enum) { elf_v1: Elf_v1, - monster_v1: Monster_v1, - projectile_v1: Projectile_v1, + cow_v1: Cow_v1, + pig_v1: Pig_v1, }; pub fn makeSpawnMessage(comptime T: type, e: T) Message { if (T == entity.Elf) { return .{ .spawn_entity = .{ .elf_v1 = Elf_v1.init(e) } }; - } else if (T == entity.Monster) { - return .{ .spawn_entity = .{ .monster_v1 = Monster_v1.init(e) } }; - } else if (T == entity.Projectile) { - return .{ .spawn_entity = .{ .projectile_v1 = Projectile_v1.init(e) } }; + } else if (T == entity.Cow) { + return .{ .spawn_entity = .{ .cow_v1 = Cow_v1.init(e) } }; + } else if (T == entity.Pig) { + return .{ .spawn_entity = .{ .pig_v1 = Pig_v1.init(e) } }; } } @@ -74,26 +74,26 @@ pub const Elf_v1 = struct { } }; -pub const Monster_v1 = struct { +pub const Cow_v1 = struct { id: entity.id = entity.INVALID_ID, pos: zm.Vec, hp: i32, - pub fn init(monster: entity.Monster) Monster_v1 { + pub fn init(cow: entity.Cow) Cow_v1 { return .{ - .id = monster.id, - .pos = monster.pos, - .hp = monster.hp, + .id = cow.id, + .pos = cow.pos, + .hp = cow.hp, }; } - // pub fn encode(self: Monster_v1, w: *std.Io.Writer) !void { + // pub fn encode(self: Cow_v1, w: *std.Io.Writer) !void { // try w.writeInt(u64, self.id, .little); // try writeVec4(w, self.pos); // try writeVec4(w, self.vel); // } - pub fn decode(r: *std.Io.Reader) !Monster_v1 { + pub fn decode(r: *std.Io.Reader) !Cow_v1 { return .{ .id = try r.readInt(u64, .little), .pos = try readVec4(r), @@ -102,26 +102,26 @@ pub const Monster_v1 = struct { } }; -pub const Projectile_v1 = struct { +pub const Pig_v1 = struct { id: entity.id = entity.INVALID_ID, pos: zm.Vec, vel: zm.Vec, - pub fn init(projectile: entity.Projectile) Projectile_v1 { + pub fn init(pig: entity.Pig) Pig_v1 { return .{ - .id = projectile.id, - .pos = projectile.pos, - .vel = projectile.vel, + .id = pig.id, + .pos = pig.pos, + .vel = pig.vel, }; } - // pub fn encode(self: Projectile_v1, w: *std.Io.Writer) !void { + // pub fn encode(self: Pig_v1, w: *std.Io.Writer) !void { // try w.writeInt(u64, self.id, .little); // try writeVec4(w, self.pos); // try writeVec4(w, self.vel); // } - pub fn decode(r: *std.Io.Reader) !Projectile_v1 { + pub fn decode(r: *std.Io.Reader) !Pig_v1 { return .{ .id = try r.readInt(u64, .little), .pos = try readVec4(r),