aboutsummaryrefslogtreecommitdiff
path: root/src/level.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/level.zig')
-rw-r--r--src/level.zig68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/level.zig b/src/level.zig
new file mode 100644
index 0000000..5a63ebb
--- /dev/null
+++ b/src/level.zig
@@ -0,0 +1,68 @@
+// This file is part of ZiRC
+//
+// Copyright (C) 2021, tslil clingman
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+const std = @import("std");
+
+pub const Object = struct {
+ height : f32,
+ width : f32,
+ texture : u8,
+ pos_x : f32,
+ pos_y : f32,
+};
+
+pub const Cell = struct {
+ height: f32,
+ wall_texture: u8 = 0,
+ floor_texture: u8 = 0,
+ ceiling_texture: u8 = 0,
+
+ const floor = Cell{ .height = 0 };
+};
+
+pub const Map = struct {
+ width: u32,
+ height: u32,
+ size: f32 = 64,
+ cells: std.ArrayList(Cell),
+ objects: std.ArrayList(Object),
+
+ pub fn deinit(self: Map) void {
+ self.cells.deinit();
+ self.objects.deinit();
+ }
+
+ pub fn new(width: u32, height: u32, alloc: *std.mem.Allocator) !Map {
+ var cells = std.ArrayList(Cell).init(alloc);
+ try cells.ensureTotalCapacity(width * height);
+ try cells.appendNTimes(Cell.floor, width * height);
+
+ var objects = std.ArrayList(Object).init(alloc);
+
+ return Map{ .width = width, .height = height, .cells = cells, .objects = objects };
+ }
+
+ pub fn inBounds(self: Map, x: i32, y: i32) bool {
+ return (x < self.width and x >= 0 and y < self.height and y >= 0);
+ }
+
+ pub fn lookup(self: Map, x: i32, y: i32) Cell {
+ // live dangerously, no bounds check
+ std.debug.assert(x >= 0 and y >= 0); // compiler hint?
+ return self.cells.items[@intCast(u32, y) * self.width + @intCast(u32, x)];
+ }
+};