summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/xobox.c89
1 files changed, 46 insertions, 43 deletions
diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c
index 2093ab1..2b13216 100644
--- a/apps/plugins/xobox.c
+++ b/apps/plugins/xobox.c
@@ -165,11 +165,7 @@ static struct pos
} stack[STACK_SIZE];
static int stackPointer;
-/* div function (divide two numbers and truncate the answer) */
-static inline int div (int a, int b)
-{
- return (a/b);
-}
+#define div(a,b) (((a)/(b)))
static bool pop (struct pos *p)
{
@@ -353,7 +349,7 @@ static inline int infested_area (int i, int j)
init_testboard ();
if (!push (&p))
return -1;
- while ((pop (&p)) && (!hit)) {
+ while (pop (&p)) {
hit = (boardcopy[p.y][p.x] == QIX);
testboard[p.y][p.x] = CHECKED;
if (hit)
@@ -436,34 +432,39 @@ static inline int fill_area (int i, int j)
/* take care of stuff after xonix has landed on a filled spot */
-static void complete_trail (void)
+static void complete_trail (int fill)
{
int i, j, ret;
for (j = 0; j < BOARD_H; j++)
- for (i = 0; i < BOARD_W; i++)
- if (board[j][i] == TRAIL)
- board[j][i] = FILLED;
-
- for (j = 0; j < BOARD_H; j++)
- for (i = 0; i < BOARD_W; i++)
+ for (i = 0; i < BOARD_W; i++) {
+ if (board[j][i] == TRAIL) {
+ if (fill)
+ board[j][i] = FILLED;
+ else
+ board[j][i] = EMPTIED;
+ }
boardcopy[j][i] = board[j][i];
- for (i = 0; i < player.level + STARTING_QIXES; i++) /* add qixes to board */
- boardcopy[div (qixes[i].y - BOARD_Y, CUBE_SIZE)][div
- (qixes[i].x - BOARD_X,
- CUBE_SIZE)] = QIX;
-
- for (j = 1; j < BOARD_H - 1; j++)
- for (i = 0; i < BOARD_W - 0; i++)
- if (board[j][i] != FILLED) {
- ret = infested_area (i, j);
- if (ret < 0)
- quit = true;
- else if (ret == 0) {
- ret = fill_area (i, j);
+ }
+
+ if (fill) {
+ for (i = 0; i < player.level + STARTING_QIXES; i++) /* add qixes to board */
+ boardcopy[div (qixes[i].y - BOARD_Y, CUBE_SIZE)][div
+ (qixes[i].x - BOARD_X,
+ CUBE_SIZE)] = QIX;
+
+ for (j = 1; j < BOARD_H - 1; j++)
+ for (i = 0; i < BOARD_W - 0; i++)
+ if (board[j][i] != FILLED) {
+ ret = infested_area (i, j);
if (ret < 0)
quit = true;
+ else if (ret == 0) {
+ ret = fill_area (i, j);
+ if (ret < 0)
+ quit = true;
+ }
}
- }
+ }
}
/* returns the color the real pixel(x,y) on the lcd is pointing at */
@@ -525,6 +526,22 @@ static bool line_check (int newx, int newy, int side)
return filled;
}
+static void die (void)
+{
+ player.lives--;
+ if (player.lives == 0)
+ player.gameover = true;
+ else {
+ refresh_board ();
+ rb->splash (HZ, true, "Crash!");
+ complete_trail (false);
+ player.move = MOVE_NO;
+ player.drawing = false;
+ player.i = BOARD_W / 2;
+ player.j = 1;
+ }
+}
+
static void move_qix (struct qix *q)
{
int newx, newy, dir;
@@ -585,18 +602,8 @@ static void move_qix (struct qix *q)
}
q->x = newx;
q->y = newy;
- refresh_board ();
- newx = get_newx (newx, q->velocity, q->angle);
- newy = get_newy (newy, q->velocity, q->angle);
- q->x = newx;
- q->y = newy;
} else if (nexthit == TRAIL) {
- player.lives--;
- if (player.lives == 0)
- player.gameover = true;
- refresh_board ();
- rb->splash (HZ, true, "Crash!");
- init_board ();
+ die();
}
}
@@ -637,7 +644,7 @@ static inline void move_board (void)
else if ((player.drawing) && (board[newj][newi] == FILLED)) { /* finish drawing */
player.move = MOVE_NO; /* stop moving */
player.drawing = false;
- complete_trail ();
+ complete_trail (true);
} else if ((board[player.j][player.i] == FILLED)
&& (board[newj][newi] == EMPTIED)) {
/* start drawing */
@@ -656,8 +663,6 @@ static inline void move_board (void)
init_board ();
refresh_board ();
rb->splash (HZ * 2, true, "READY?");
- rb->lcd_update ();
- refresh_board ();
}
}
@@ -719,8 +724,6 @@ static void init_game (void)
init_board ();
refresh_board ();
rb->splash (HZ * 2, true, "READY?");
- rb->lcd_update ();
- refresh_board ();
}
/* general keypad handler loop */