[gnome-robots] unify move of player
- From: Andrey Kutejko <akutejko src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-robots] unify move of player
- Date: Tue, 6 Oct 2020 19:31:42 +0000 (UTC)
commit 57bbeb24c24926e4b706af16ab102a6f6a69bc29
Author: Andrey Kutejko <andy128k gmail com>
Date: Sun Sep 20 21:59:51 2020 +0200
unify move of player
src/arena.vala | 14 +++++++++
src/game.vala | 94 ++++++++++++++++++++++++----------------------------------
2 files changed, 53 insertions(+), 55 deletions(-)
---
diff --git a/src/arena.vala b/src/arena.vala
index e04526a..b84bb13 100644
--- a/src/arena.vala
+++ b/src/arena.vala
@@ -32,6 +32,13 @@ public class Arena {
public struct Coords {
public int x;
public int y;
+
+ public Coords move (int dx, int dy) {
+ return Coords () {
+ x = x + dx,
+ y = y + dy
+ };
+ }
}
private int _width;
@@ -61,6 +68,13 @@ public class Arena {
}
}
+ public bool are_coords_valid (Coords coords) {
+ return coords.x >= 0
+ && coords.y >= 0
+ && coords.x < _width
+ && coords.y < _height;
+ }
+
public ObjectType @get (int x, int y) {
if (x < 0 || y < 0 || x >= _width || y >= _height) {
return ObjectType.NONE;
diff --git a/src/game.vala b/src/game.vala
index e9e22cb..f7ec535 100644
--- a/src/game.vala
+++ b/src/game.vala
@@ -542,73 +542,55 @@ public class Game {
return true;
}
- private bool can_push_heap (Arena arena, int x, int y, int dx, int dy) {
- if (arena[x, y] != ObjectType.HEAP) {
- return false;
+ private ArenaChange? try_push_heap (int dx, int dy) {
+ if (!config.moveable_heaps) {
+ return null;
}
- int nx = x + dx;
- int ny = y + dy;
+ var coords = player.move (dx, dy);
+ if (!arena.are_coords_valid(coords)
+ || arena[coords.x, coords.y] != ObjectType.HEAP
+ ) {
+ return null;
+ }
- if (nx < 0 || nx >= arena.width || ny < 0 || ny >= arena.height) {
- return false;
+ var push_to = coords.move (dx, dy);
+ if (!arena.are_coords_valid(push_to)
+ || arena[push_to.x, push_to.y] == ObjectType.HEAP
+ ) {
+ return null;
}
- return arena[nx, ny] != ObjectType.HEAP;
+ var new_arena = arena.map ((obj) => {
+ if (obj != ObjectType.PLAYER) {
+ return obj;
+ } else {
+ return ObjectType.NONE;
+ }
+ });
+ new_arena[coords.x, coords.y] = ObjectType.PLAYER;
+ new_arena[push_to.x, push_to.y] = ObjectType.HEAP;
+ return ArenaChange () {
+ arena = new_arena,
+ player = coords,
+ push = push_to
+ };
}
/**
* tries to move the player in a given direction
**/
private ArenaChange? try_player_move (int dx, int dy) {
- int nx = player.x + dx;
- int ny = player.y + dy;
+ var coords = player.move (dx, dy);
- if (nx < 0 || nx >= arena.width || ny < 0 || ny >= arena.height) {
+ if (!arena.are_coords_valid(coords)) {
return null;
}
- if (arena[nx, ny] == ObjectType.HEAP) {
- // try to push a heap
- if (!config.moveable_heaps) {
- return null;
- }
- if (!can_push_heap (arena, nx, ny, dx, dy)) {
- return null;
- }
-
- var push = Arena.Coords () { x = nx + dx, y = ny + dy };
- var new_arena = arena.map ((obj) => {
- if (obj != ObjectType.PLAYER) {
- return obj;
- } else {
- return ObjectType.NONE;
- }
- });
- new_arena[push.x, push.y] = ObjectType.HEAP;
- new_arena[nx, ny] = ObjectType.PLAYER;
-
- return ArenaChange () {
- arena = new_arena,
- player = Arena.Coords () { x = nx, y = ny },
- push = push
- };
+ if (arena[coords.x, coords.y] == ObjectType.HEAP) {
+ return try_push_heap (dx, dy);
} else {
- var new_arena = arena.map ((obj) => {
- if (obj != ObjectType.PLAYER) {
- return obj;
- } else {
- return ObjectType.NONE;
- }
- });
- if (new_arena[nx, ny] == ObjectType.NONE) {
- new_arena[nx, ny] = ObjectType.PLAYER;
- }
- return ArenaChange () {
- arena = new_arena,
- player = Arena.Coords () { x = nx, y = ny },
- push = null
- };
+ return move_player_to (coords);
}
}
@@ -635,7 +617,7 @@ public class Game {
return false;
}
- private ArenaChange teleport_to (Arena.Coords coords) {
+ private ArenaChange move_player_to (Arena.Coords coords) {
var new_arena = arena.map ((obj) => {
if (obj != ObjectType.PLAYER) {
return obj;
@@ -643,7 +625,9 @@ public class Game {
return ObjectType.NONE;
}
});
- new_arena[coords.x, coords.y] = ObjectType.PLAYER;
+ if (new_arena[coords.x, coords.y] == ObjectType.NONE) {
+ new_arena[coords.x, coords.y] = ObjectType.PLAYER;
+ }
return ArenaChange () {
arena = new_arena,
player = coords,
@@ -703,7 +687,7 @@ public class Game {
continue;
}
- var change = teleport_to (p);
+ var change = move_player_to (p);
update_arena (change);
splat = null;
@@ -739,7 +723,7 @@ public class Game {
continue;
}
- var change = teleport_to (p);
+ var change = move_player_to (p);
if (!check_safe (change)) {
continue;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]