diff --git a/inc/level.h b/inc/level.h index 1777a64..24662b7 100644 --- a/inc/level.h +++ b/inc/level.h @@ -37,5 +37,6 @@ void level_draw_name(void); int level_get(int x, int y); int level_get_px(int x, int y); void level_set(int x, int y, int v); +void level_set_px(int x, int y, int v); struct Vec level_find(enum Tile); struct Vec level_dim(void); diff --git a/src/level.c b/src/level.c index a65a977..c7ece4c 100644 --- a/src/level.c +++ b/src/level.c @@ -160,6 +160,12 @@ level_set(int x, int y, int v) level.data[x + y * level.width] = v; } +void +level_set_px(int x, int y, int v) +{ + level_set(x / TILE_SIZE, y / TILE_SIZE, v); +} + struct Vec level_find(enum Tile t) { diff --git a/src/player.c b/src/player.c index 426d170..511638f 100644 --- a/src/player.c +++ b/src/player.c @@ -9,10 +9,13 @@ static void reset_speed(struct Player *, int x, int y); static struct Vec update_rem(struct Player *); +static int collide_opt(int x, int y, int tile, int margin, int collect); +static int collide_point(int x, int y, int tile, int collect); static int collide_margin(int x, int y, int tile, int margin); static int collide(int x, int y, int tile); static int collide_solid(int x, int y); static int collide_burn(int x, int y); +static int collide_collect(int x, int y, int tile, int margin); void player_spawn(struct Player *p) @@ -220,14 +223,30 @@ update_rem(struct Player *p) } static int -collide_margin(int x, int y, int tile, int margin) +collide_opt(int x, int y, int tile, int margin, int collect) { const int x1 = x + margin; const int x2 = x + PLAYER_WIDTH - 1 - margin; const int y1 = y + margin; const int y2 = y + PLAYER_HEIGHT - 1 - margin; - return level_get_px(x1, y1) == tile || level_get_px(x2, y1) == tile || - level_get_px(x1, y2) == tile || level_get_px(x2, y2) == tile; + return collide_point(x1, y1, tile, collect) + + collide_point(x2, y1, tile, collect) + + collide_point(x1, y2, tile, collect) + + collide_point(x2, y2, tile, collect); +} + +static int +collide_point(int x, int y, int tile, int collect) +{ + const int collide = level_get_px(x, y) == tile; + if (collide && collect) level_set_px(x, y, TILE_AIR); + return collide; +} + +static int +collide_margin(int x, int y, int tile, int margin) +{ + return collide_opt(x, y, tile, margin, 0); } static int @@ -251,3 +270,9 @@ collide_burn(int x, int y) (!polarity() && collide(x, y, TILE_BURN_RED)) || (polarity() && collide(x, y, TILE_BURN_BLUE)); } + +static int +collide_collect(int x, int y, int tile, int margin) +{ + return collide_opt(x, y, tile, margin, 1); +}