From 5abd8cbff3462f806315842d2f407c9aac43d7c9 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Wed, 24 Feb 2021 15:48:32 +0100 Subject: [PATCH] Bindings for saving/loading (read/write)! --- README.md | 5 +++++ sample.kble | Bin 13 -> 517 bytes src/actions.zig | 12 ++++++++++++ src/level.zig | 19 +++++++++++++++---- src/main.zig | 12 ++++++++++-- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 70f2dec..78dfd8d 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,11 @@ Verbs: * `-`: decrease scale (dezoom) * `=`: reset scale +File (read/write): +* `e`: load level contained in `sample.kble` +* `w`: write level to `sample.kble` +*See `kbleformat.md` for technical informations.* + Modes: * ``: normal mode, default * `i`: free selection mode diff --git a/sample.kble b/sample.kble index 6bcbf0d42fd3b09e5dd81b2870aeb0da8576caa0..3e6f813bafcbf268b323039abcb1c73c61cd54b5 100644 GIT binary patch literal 517 zcmZQ#5CB3_03!noV(Nm)AZTPYFi{4$35>|nP*H>sL_Lg;%7cg^iy^aNdLT9-)FQ+Y VEL1lj#3^T?yNDKibXSt)8vu{t0Am0E literal 13 RcmZQ#U;;u$1|VQ$1ONb8015yA diff --git a/src/actions.zig b/src/actions.zig index 9121baf..bca6ad7 100644 --- a/src/actions.zig +++ b/src/actions.zig @@ -19,6 +19,7 @@ pub const ActionCat = enum { movement, // move and change selection verb, // do stuff with selection scale, // change draw scaling + file, // load/save, file related stuff mode, // change mode }; @@ -28,6 +29,7 @@ pub const Action = struct { function_move: fn (*Vec2, conf.arg_type) movement.SelectionUpdate = movement.move_left, function_verb: fn (*Level, conf.arg_type) void = verbs.delete, function_scale: fn (scaling.scale_type) scaling.scale_type = scaling.scale_reset, + function_file: fn (*Level, *std.mem.Allocator, []const u8) void = Level.action_write, next_mode: Mode = Mode.normal, }; @@ -110,6 +112,16 @@ pub const ActionsDef = .{ .function_scale = scaling.scale_down, }, + // File + .file_read = Action{ + .category = ActionCat.file, + .function_file = Level.action_read, + }, + .file_write = Action{ + .category = ActionCat.file, + .function_file = Level.action_write, + }, + // Mode change. .mode_normal = Action{ .category = ActionCat.mode, diff --git a/src/level.zig b/src/level.zig index 28d38ea..db4a92d 100644 --- a/src/level.zig +++ b/src/level.zig @@ -58,7 +58,7 @@ pub fn deinit(self: *Self, allocator: *std.mem.Allocator) void { /// Load level content from given absolute or relative path. /// Expect the KBLE file format (see `kbleformat.md` for more details). -pub fn init_load(allocator: *std.mem.Allocator, kble_file_path: []const u8) !Self { +pub fn init_read(allocator: *std.mem.Allocator, kble_file_path: []const u8) !Self { var self: Self = undefined; // Open directory. @@ -140,7 +140,7 @@ pub fn write(self: Self, kble_file_path: []const u8) !void { const height_byte1: u8 = @intCast(u8, self.height / 256); const height_byte2: u8 = @intCast(u8, self.height % 256); - std.log.info("{}·{} ; {}·{}", .{width_byte1, width_byte2, height_byte1, height_byte2}); + std.log.info("{}·{} ; {}·{}", .{ width_byte1, width_byte2, height_byte1, height_byte2 }); try writer.writeByte(width_byte1); try writer.writeByte(width_byte2); @@ -161,6 +161,17 @@ pub fn write(self: Self, kble_file_path: []const u8) !void { } } +/// Wrapper around `init_read`. +pub fn action_read(self: *Self, allocator: *std.mem.Allocator, kble_file_path: []const u8) void { + self.deinit(allocator); + self.* = Self.init_read(allocator, kble_file_path) catch unreachable; +} + +/// Wrapper around `write`. +pub fn action_write(self: *Self, allocator: *std.mem.Allocator, kble_file_path: []const u8) void { + self.write(kble_file_path) catch unreachable; +} + /// Draw level tiles from `offset` to fill the window. pub fn draw(self: Self, scale: u16, offset: Vec2) void { // Pixel position (were we draw). @@ -307,7 +318,7 @@ test "load level from sample file and save it" { defer arena.deinit(); const allocator = &arena.allocator; - var level: Self = try Self.init_load(allocator, "sample.kble"); + var level: Self = try Self.init_read(allocator, "sample.kble"); defer level.deinit(allocator); try level.write("sample_out.kble"); @@ -323,7 +334,7 @@ test "write large level to file and load it back" { try level.write("sample_large.kble"); level.deinit(allocator); - level = try Self.init_load(allocator, "sample_large.kble"); + level = try Self.init_read(allocator, "sample_large.kble"); defer level.deinit(allocator); expect(level.width == 300); diff --git a/src/main.zig b/src/main.zig index ff51198..cc44854 100644 --- a/src/main.zig +++ b/src/main.zig @@ -26,6 +26,9 @@ const Mode = @import("modes.zig").Mode; const char_range = 255; +// TODO: make this a command line parameter. +const level_path = "sample.kble"; + pub fn main() void { // Create allocator var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); @@ -41,8 +44,7 @@ pub fn main() void { ray.SetTargetFPS(60); // Create level. - //var level: Level = Level.init(allocator, 16, 16) catch unreachable; - var level: Level = Level.init_load(allocator, "sample.kble") catch unreachable; + var level: Level = Level.init(allocator, 16, 16) catch unreachable; defer level.deinit(allocator); // Create camera. @@ -84,6 +86,9 @@ pub fn main() void { bindings['='] = &ActionsDef.scale_reset; bindings['+'] = &ActionsDef.scale_up; bindings['-'] = &ActionsDef.scale_down; + // File. + bindings['e'] = &ActionsDef.file_read; + bindings['w'] = &ActionsDef.file_write; // Mode. bindings['\n'] = &ActionsDef.mode_normal; bindings['i'] = &ActionsDef.mode_select; @@ -155,6 +160,9 @@ pub fn main() void { .scale => { scale = action.function_scale(scale); }, + .file => { + action.function_file(&level, allocator, level_path); + }, .mode => { // Rectangle selection! if (mode == Mode.rectangle) {