back to scratko.xyz
aboutsummaryrefslogtreecommitdiff
path: root/field.c
diff options
context:
space:
mode:
Diffstat (limited to 'field.c')
-rw-r--r--field.c85
1 files changed, 66 insertions, 19 deletions
diff --git a/field.c b/field.c
index 560cae9..06179c9 100644
--- a/field.c
+++ b/field.c
@@ -27,13 +27,14 @@ static const char field_sample[field_height][field_width] = {
{"/1....3..2..1//1..2..3....1/"},
{"/.////./////.//./////.////./"},
{"/*////./////.//./////.////*/"},
- {"/1.1//2..2..y..y..2..2//1.1/"},
+ {"/1.1//2..2..y. y..2..2//1.1/"},
{"///.//.//.////////.//.//.///"},
{"///.//.//.////////.//.//.///"},
{"/1.2..1//1..1//1..1//1..2.1/"},
{"/.//////////.//.//////////./"},
{"/1..........2..2..........1/"},
{"////////////////////////////"},
+ {" C C C Score: "}
};
static void copy_field(game_space field)
@@ -59,7 +60,7 @@ void clear_field(game_space field)
field = NULL;
}
-int field_has_coin(int x, int y)
+static int field_has_coin(int x, int y)
{
return !((x == 9 && y == 12)|| (x == 18 && y == 12) ||
(x == 18 && y == 14) || (x == 9 && y == 15) ||
@@ -67,14 +68,33 @@ int field_has_coin(int x, int y)
(x == 13 && y == 12) || (x == 14 && y == 12));
}
-int field_has_energizer(const game_space field, int x, int y)
+static int yellow_block_contains_coin(int x, int y)
{
- return field[y][x] = energizer;
+ return (x == 12 && y == 22) || (x == 15 && y == 22);
}
-static int yellow_block_contains_coin(int x, int y)
+static int is_coin_symbol(int symbol, int x, int y)
{
- return (x == 12 && y == 22) || (x == 15 && y == 22);
+ return
+ symbol == coin || symbol == energizer || symbol == one_path ||
+ symbol == two_paths || symbol == three_paths ||
+ (symbol == yellow_block && yellow_block_contains_coin(x, y));
+}
+
+int check_coin_for_pac(game_space field, struct coordinates position,
+ struct queue *eaten_coins)
+{
+ int x, y;
+ x = position.x;
+ y = position.y;
+ return
+ is_coin_symbol(field[y][x], x, y) && field_has_coin(x, y) &&
+ !queue_consists_point(eaten_coins, position);
+}
+
+int field_has_energizer(const game_space field, int x, int y)
+{
+ return field[y][x] == energizer;
}
void print_field(game_space field)
@@ -86,27 +106,19 @@ void print_field(game_space field)
for(j = 0; j < field_width; ++j) {
symbol = field[i][j];
move(i, j);
+ if(is_coin_symbol(symbol, j, i) && field_has_coin(j, i)) {
+ symbol == energizer ? addch('*') : addch('.');
+ continue;
+ }
switch(symbol) {
case one_path:
case two_paths:
- case three_paths:
- if(field_has_coin(j, i))
- addch('.');
- else
- addch(' ');
- break;
case yellow_block:
- if(yellow_block_contains_coin(j, i))
- addch('.');
- else
- addch(' ');
+ addch(' ');
break;
case block:
addch('/');
break;
- case coin:
- addch('.');
- break;
case energizer:
addch('*');
break;
@@ -117,6 +129,8 @@ void print_field(game_space field)
addch(' ');
break;
}
+ if(i == field_height-1)
+ addch(symbol);
refresh();
}
}
@@ -143,6 +157,13 @@ void display_ghosts_on_field(struct ghost_type *red_ghost,
ghost_char);
}
+void display_score(int value)
+{
+ move(field_height-1, 25);
+ printw("%d", value);
+ refresh();
+}
+
void clear_or_revert_symbol(const game_space field, struct coordinates position,
enum select_character character,
struct queue *eaten_coins)
@@ -263,3 +284,29 @@ int is_equal_points(struct coordinates first_point, struct coordinates
y2 = second_point.y;
return x1 == x2 && y1 == y2;
}
+
+void erase_life(int value)
+{
+ enum {
+ two_lives_left = 2,
+ one_life_left = 1,
+ no_lives_left = 0,
+ gap = 2,
+ three_lives_x = 5
+ };
+ int x, y;
+ y = field_height - 1;
+ switch(value) {
+ case two_lives_left:
+ x = three_lives_x;
+ break;
+ case one_life_left:
+ x = three_lives_x - gap;
+ break;
+ case no_lives_left:
+ x = three_lives_x - gap * 2;
+ }
+ move(y, x);
+ addch(' ');
+ refresh();
+}