borgware-2d/games/breakout/playfield.c

99 lines
1.5 KiB
C
Raw Normal View History

#include "common.h"
2010-01-15 16:02:31 +00:00
static enum game_field_t playfield[NUM_COLS][NUM_ROWS];
2010-01-15 16:02:31 +00:00
void playfield_set (uint8_t in_x, uint8_t in_y, enum game_field_t in_field)
{
2010-01-15 16:02:31 +00:00
playfield[in_x][in_y] = in_field;
}
void brick_damage (uint8_t in_x, uint8_t in_y)
{
enum game_field_t newtype;
2010-01-15 12:31:58 +00:00
if (playfield[in_x][in_y] > bs || playfield[in_x][in_y] == 0)
return;
2010-01-19 09:55:28 +00:00
playfield[in_x][in_y] -= 1;
score_add (1);
}
2010-01-19 09:55:28 +00:00
uint8_t check_bounce (int8_t in_x, int8_t in_y)
{
2010-01-19 09:55:28 +00:00
uint8_t ov = 0;
/* overflow check */
2010-01-19 09:55:28 +00:00
if (in_x >= NUM_ROWS || in_x < 0)
ov |= BOUNCE_X;
2010-01-19 09:55:28 +00:00
if (in_y >= NUM_COLS || in_y < 0)
ov |= BOUNCE_Y;
2010-01-19 09:55:28 +00:00
if (ov) return ov;
/* collisions with real objects */
2010-01-19 09:55:28 +00:00
switch (playfield[abs(in_x)][abs(in_y)])
{
2010-01-15 12:31:58 +00:00
case b2:
case b3:
case b1:
brick_damage (in_x, in_y);
/* intentional fallthrough */
2010-01-15 12:31:58 +00:00
case bs:
2010-01-19 09:55:28 +00:00
return BOUNCE_UNDEF | ov;
2010-01-15 12:31:58 +00:00
/* bouncing on the rebound needs special care */
case rb:
2010-01-19 09:55:28 +00:00
return BOUNCE_Y;
case sp:
case bl:
default:
return ov;
}
}
/* this is the actual draw function for a single field
*/
2010-01-15 16:02:31 +00:00
static inline void draw_single_field (uint8_t in_x, uint8_t in_y, enum game_field_t in_f)
{
2010-01-15 16:02:31 +00:00
pixel tmp;
uint8_t b;
switch (in_f)
{
case b1:
2010-01-15 16:02:31 +00:00
b = 1;
break;
case rb:
case b2:
2010-01-15 16:02:31 +00:00
b = 2;
break;
case b3:
case bl:
case bs:
2010-01-15 16:02:31 +00:00
b = 3;
break;
default: /* this includes freespace */
2010-01-15 16:02:31 +00:00
b = 0;
break;
}
2010-01-15 16:02:31 +00:00
tmp.x = in_x;
tmp.y = in_y;
setpixel (tmp, b);
}
void playfield_draw ()
{
uint8_t x,y;
for (x=0;x<NUM_ROWS;x++)
{
for (y=0;y<NUM_COLS;y++)
{
2010-01-15 14:42:46 +00:00
draw_single_field (x,y, playfield[x][y]);
}
}
}