diff --git a/src/assets/tiled/first.tmx b/src/assets/tiled/first.tmx index db04b68..ff64a00 100644 --- a/src/assets/tiled/first.tmx +++ b/src/assets/tiled/first.tmx @@ -1,5 +1,5 @@ - + @@ -7,15 +7,15 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,5,0,0,0,41,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,53,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -35,10 +35,10 @@ 0,0,0,0,17,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0, 0,0,0,0,17,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0, 0,0,0,0,17,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0, -0,0,0,0,83,2,2,68,2,2,2,37,67,36,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,83,2,2,68,0,2,2,2,67,36,0,0,0,0,0,0, +0,0,0,0,0,0,17,0,0,0,20,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,17,0,0,0,20,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,33,2,2,2,36,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/src/assets/tiled/tileset.tsx b/src/assets/tiled/tileset.tsx index 2522770..2db6d48 100644 --- a/src/assets/tiled/tileset.tsx +++ b/src/assets/tiled/tileset.tsx @@ -6,9 +6,19 @@ + + + + + + + + + + diff --git a/src/entity.zig b/src/entity.zig index b3ebe1d..40392cb 100644 --- a/src/entity.zig +++ b/src/entity.zig @@ -15,11 +15,15 @@ pub const Type = enum { player, solid, pot, + door, + key, }; type: Type, position: Vec2, +locked: bool = false, + render_tile: ?union(enum) { position: Vec2, id: Gfx.TileId diff --git a/src/game.zig b/src/game.zig index be19d79..ebe5713 100644 --- a/src/game.zig +++ b/src/game.zig @@ -132,6 +132,11 @@ fn loadLevelFromTiled(gpa: Allocator, map: tiled.Map) !Level { }; if (std.mem.eql(u8, tile_type, "player")) { entity.type = .player; + } else if (std.mem.eql(u8, tile_type, "key")) { + entity.type = .key; + } else if (std.mem.eql(u8, tile_type, "locked_door")) { + entity.type = .door; + entity.locked = true; } else if (std.mem.eql(u8, tile_type, "pot")) { entity.type = .pot; } else if (is_layer_solid) { @@ -214,7 +219,9 @@ fn canMove(self: *Game, entity: *Entity, dir: Vec2) bool { return true; } -fn moveEntity(self: *Game, entity: *Entity, dir: Vec2) bool { +fn moveEntity(self: *Game, entity_id: Entity.Id, dir: Vec2) bool { + const entity = self.level.entities.get(entity_id) orelse return true; + if (entity.type == .solid) { return false; } @@ -226,7 +233,21 @@ fn moveEntity(self: *Game, entity: *Entity, dir: Vec2) bool { const next_pos = entity.position.add(dir); if (self.getEntityAt(next_pos)) |next_entity_id| { const next_entity = self.level.entities.getAssumeExists(next_entity_id); - if (!self.moveEntity(next_entity, dir)) { + if (next_entity.type == .door and next_entity.locked and entity.type == .key) { + _ = self.level.entities.removeAssumeExists(entity_id); + next_entity.locked = false; + return true; + } + + if (next_entity.type == .pot or next_entity.type == .key) { + if (!self.moveEntity(next_entity_id, dir)) { + return false; + } + } else if (next_entity.type == .door) { + if (next_entity.locked) { + return false; + } + } else if (next_entity.type == .nil) { return false; } } @@ -251,6 +272,26 @@ pub fn getInput(self: *Game, window: *Window) Input { }; } +fn drawEntity(self: *Game, entity: *Entity) void { + _ = self; // autofix + if (entity.render_tile) |render_tile| { + var tile_coord = switch (render_tile) { + .id => |tile_id| Gfx.getTileCoords(tile_id), + .position => |position| position + }; + + if (entity.type == .door) { + if (entity.locked) { + tile_coord = Gfx.getTileCoords(.locked_door); + } else { + tile_coord = Gfx.getTileCoords(.open_door); + } + } + + Gfx.drawTile(tile_coord, entity.position, .init(1,1), rgb(255, 255, 255)); + } +} + pub fn tick(self: *Game, input: Input) !void { Gfx.drawRectangle(.init(0, 0), .init(self.canvas_size.x, self.canvas_size.y), rgb_hex("#222323").?); if (self.show_grid) { @@ -284,16 +325,25 @@ pub fn tick(self: *Game, input: Input) !void { } var iter = self.level.entities.iterator(); + while (iter.next()) |tuple| { + const entity = tuple.item; + const entity_id = tuple.id; + if (entity.type == .player) { + _ = self.moveEntity(entity_id, move); + } + } + + iter = self.level.entities.iterator(); + while (iter.nextItem()) |entity| { + if (entity.type != .player) { + self.drawEntity(entity); + } + } + + iter = self.level.entities.iterator(); while (iter.nextItem()) |entity| { if (entity.type == .player) { - _ = self.moveEntity(entity, move); - } - - if (entity.render_tile) |render_tile| { - switch (render_tile) { - .id => |tile_id| Gfx.drawTileById(tile_id, entity.position, .init(1,1), rgb(255, 255, 255)), - .position => |position| Gfx.drawTile(position, entity.position, .init(1,1), rgb(255, 255, 255)), - } + self.drawEntity(entity); } } } diff --git a/src/graphics.zig b/src/graphics.zig index 629c667..2eea637 100644 --- a/src/graphics.zig +++ b/src/graphics.zig @@ -455,7 +455,9 @@ pub const ImageId = enum { }; pub const TileId = enum { - player + player, + open_door, + locked_door }; pub const Borders = struct { @@ -843,7 +845,9 @@ pub fn init(options: Options) !void { tilemap_size = Vec2.init(@floatFromInt(tilemap.width), @floatFromInt(tilemap.height)); tile_coords = .init(.{ - .player = .init(4, 0) + .player = .init(4, 0), + .locked_door = .init(7, 2), + .open_door = .init(5, 2) }); var image_iter = image_map.iterator(); @@ -983,6 +987,10 @@ pub fn drawTileById(tile_id: TileId, pos: Vec2, size: Vec2, tint: Vec4) void { drawTile(tile_coord, pos, size, tint); } +pub fn getTileCoords(tile_id: TileId) Vec2 { + return tile_coords.get(tile_id); +} + pub fn drawRectanglOutline(pos: Vec2, size: Vec2, color: Vec4, width: f32) void { // TODO: Don't use line segments drawLine(pos, pos.add(.{ .x = size.x, .y = 0 }), color, width);