summaryrefslogtreecommitdiffstats
path: root/apps/plugins/wormlet.c
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2009-09-17 21:05:35 +0000
committerThomas Martitz <kugel@rockbox.org>2009-09-17 21:05:35 +0000
commitee28c8d71197fb705fba9b1301aa0bd03f3a7f86 (patch)
tree31ef5f6c6bb6a215a0017a6ed658d5082612619e /apps/plugins/wormlet.c
parentd2704524022c3c730463c1f566bb7b4039b866c4 (diff)
downloadrockbox-ee28c8d71197fb705fba9b1301aa0bd03f3a7f86.tar.gz
rockbox-ee28c8d71197fb705fba9b1301aa0bd03f3a7f86.tar.bz2
rockbox-ee28c8d71197fb705fba9b1301aa0bd03f3a7f86.zip
Wormlet: Fix food and argh possibly overlapping each other.
Flyspray: FS#10589 Author: Asael Reiter git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22724 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/wormlet.c')
-rw-r--r--apps/plugins/wormlet.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c
index 4d86453178..3f67e61857 100644
--- a/apps/plugins/wormlet.c
+++ b/apps/plugins/wormlet.c
@@ -348,6 +348,8 @@ CONFIG_KEYPAD == MROBE500_PAD
#define COLOR_BG LCD_RGBPACK(181, 199, 231)
#endif
+#define CHECK_SQUARE_COLLISION(x1,y1,s1,x2,y2,s2) (x1+s1>x2)&&(x2+s2>x1)&&(y1+s1>y2)&&(y2+s2>y1)
+
/**
* All the properties that a worm has.
*/
@@ -830,21 +832,19 @@ static void make_food(int index)
the entire food lies within the FIELD */
x = rb->rand() % (FIELD_RECT_WIDTH - food_size);
y = rb->rand() % (FIELD_RECT_HEIGHT - food_size);
-
+ collisionDetected = false;
/* Ensure that the new food doesn't collide with any
existing foods or arghs.
- If one or more corners of the new food hit any existing
+ If the new food hit any existing
argh or food a collision is detected.
*/
- collisionDetected =
- food_collision(x , y ) >= 0 ||
- food_collision(x , y + food_size - 1) >= 0 ||
- food_collision(x + food_size - 1, y ) >= 0 ||
- food_collision(x + food_size - 1, y + food_size - 1) >= 0 ||
- argh_collision(x , y ) >= 0 ||
- argh_collision(x , y + food_size - 1) >= 0 ||
- argh_collision(x + food_size - 1, y ) >= 0 ||
- argh_collision(x + food_size - 1, y + food_size - 1) >= 0;
+
+ for (i=0; i<MAX_FOOD && !collisionDetected; i++) {
+ collisionDetected = CHECK_SQUARE_COLLISION(x,y,food_size,foodx[i],foody[i],food_size);
+ }
+ for (i=0; i<argh_count && !collisionDetected; i++) {
+ collisionDetected = CHECK_SQUARE_COLLISION(x,y,food_size,arghx[i],arghy[i],argh_size);
+ }
/* use coordinates for further testing */
foodx[index] = x;
@@ -853,7 +853,9 @@ static void make_food(int index)
/* now test wether we accidently hit the worm with food ;) */
i = 0;
for (i = 0; i < worm_count && !collisionDetected; i++) {
- collisionDetected |= worm_food_collision(&worms[i], index);
+
+ collisionDetected = worm_food_collision(&worms[i], index);
+
}
}
while (collisionDetected);
@@ -919,21 +921,19 @@ static void make_argh(int index)
the entire food lies within the FIELD */
x = rb->rand() % (FIELD_RECT_WIDTH - argh_size);
y = rb->rand() % (FIELD_RECT_HEIGHT - argh_size);
-
+ collisionDetected = false;
/* Ensure that the new argh doesn't intersect with any
existing foods or arghs.
- If one or more corners of the new argh hit any existing
+ If the new argh hit any existing
argh or food an intersection is detected.
*/
- collisionDetected =
- food_collision(x , y ) >= 0 ||
- food_collision(x , y + argh_size - 1) >= 0 ||
- food_collision(x + argh_size - 1, y ) >= 0 ||
- food_collision(x + argh_size - 1, y + argh_size - 1) >= 0 ||
- argh_collision(x , y ) >= 0 ||
- argh_collision(x , y + argh_size - 1) >= 0 ||
- argh_collision(x + argh_size - 1, y ) >= 0 ||
- argh_collision(x + argh_size - 1, y + argh_size - 1) >= 0;
+
+ for (i=0; i<MAX_FOOD && !collisionDetected; i++) {
+ collisionDetected = CHECK_SQUARE_COLLISION(x,y,argh_size,foodx[i],foody[i],food_size);
+ }
+ for (i=0; i<argh_count && !collisionDetected; i++) {
+ collisionDetected = CHECK_SQUARE_COLLISION(x,y,argh_size,arghx[i],arghy[i],argh_size);
+ }
/* use the candidate coordinates to make a real argh */
arghx[index] = x;