add box pushing
This commit is contained in:
parent
0ac0cd0c37
commit
f7e6c25a82
36
src/app.zig
36
src/app.zig
@ -136,12 +136,17 @@ const World = struct {
|
||||
return null;
|
||||
}
|
||||
|
||||
fn moveEntity(self: *World, id: Entity.Id, x: i32, y: i32) bool {
|
||||
fn getEntityAt(self: *World, x: i32, y: i32) Entity.Id {
|
||||
const tile = self.getTile(x, y) orelse return .nil;
|
||||
return tile.entity;
|
||||
}
|
||||
|
||||
fn setEntityPosition(self: *World, id: Entity.Id, x: i32, y: i32) bool {
|
||||
const e = self.entities.get(id) orelse return false;
|
||||
const destination_tile = self.getTile(x, y) orelse return false;
|
||||
|
||||
if (self.entities.exists(destination_tile.entity)) {
|
||||
// Cna't overwrite entity
|
||||
// Cant't overwrite entity
|
||||
return false;
|
||||
}
|
||||
destination_tile.entity = id;
|
||||
@ -156,16 +161,25 @@ const World = struct {
|
||||
return true;
|
||||
}
|
||||
|
||||
fn movePlayer(self: *World, id: Entity.Id, dir_x: i32, dir_y: i32) bool {
|
||||
fn moveEntity(self: *World, id: Entity.Id, dx: i32, dy: i32) bool {
|
||||
const e = self.entities.get(id) orelse return false;
|
||||
|
||||
const next_x = e.pos_x+dir_x;
|
||||
const next_y = e.pos_y+dir_y;
|
||||
if (!self.moveEntity(id, next_x, next_y)) {
|
||||
const next_x = e.pos_x+dx;
|
||||
const next_y = e.pos_y+dy;
|
||||
|
||||
const destination_tile = self.getTile(next_x, next_y) orelse return false;
|
||||
|
||||
if (e.type == .player or e.type == .box) {
|
||||
if (self.entities.get(destination_tile.entity)) |destination_entity| {
|
||||
if (destination_entity.type == .box) {
|
||||
if (!self.moveEntity(destination_tile.entity, dx, dy)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
return self.setEntityPosition(id, next_x, next_y);
|
||||
}
|
||||
};
|
||||
|
||||
@ -289,7 +303,7 @@ pub fn init(self: *App, plt: Platform.Init) !?u8 {
|
||||
if (tilemap.getTile(walls, tilesets, x, y)) |tiled_tile| {
|
||||
const pos = tiled_tile.getPosition();
|
||||
const wall_id = try self.world.spawnWall(tilesheet.get(pos.x, pos.y));
|
||||
_ = self.world.moveEntity(wall_id, @intCast(ox), @intCast(oy));
|
||||
_ = self.world.setEntityPosition(wall_id, @intCast(ox), @intCast(oy));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -310,14 +324,14 @@ pub fn init(self: *App, plt: Platform.Init) !?u8 {
|
||||
if (tilemap.getTile(boxes, tilesets, x, y)) |tiled_tile| {
|
||||
const pos = tiled_tile.getPosition();
|
||||
const box_id = try self.world.spawnBox(tilesheet.get(pos.x, pos.y));
|
||||
_ = self.world.moveEntity(box_id, @intCast(ox), @intCast(oy));
|
||||
_ = self.world.setEntityPosition(box_id, @intCast(ox), @intCast(oy));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const player_id = try self.world.spawnPlayer();
|
||||
_ = self.world.moveEntity(player_id, @intFromFloat(player_pos.x), @intFromFloat(player_pos.y));
|
||||
_ = self.world.setEntityPosition(player_id, @intFromFloat(player_pos.x), @intFromFloat(player_pos.y));
|
||||
|
||||
return null;
|
||||
}
|
||||
@ -368,7 +382,7 @@ pub fn frame(self: *App, plt: Platform.Frame) !void {
|
||||
while (entity_iter.next()) |entity_id| {
|
||||
const entity = self.world.entities.getAssumeExists(entity_id);
|
||||
if (entity.type == .player) {
|
||||
if ((dir_x != 0 or dir_y != 0) and self.world.movePlayer(entity_id, dir_x, dir_y)) {
|
||||
if ((dir_x != 0 or dir_y != 0) and self.world.moveEntity(entity_id, dir_x, dir_y)) {
|
||||
var new_direction = entity.player_direction;
|
||||
if (dir_x < 0) {
|
||||
new_direction = .left;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user