/* SPDX-License-Identifier: GPL-3.0-or-later */ /* Copyright (C) 2021 KikooDX */ #include "conf.h" #include "level.h" #include "player.h" #include "tiles.h" extern struct Level level; static Tile collide_single(int x, int y); static int collide_sub_single(int x, int y, Tile sub, Tile rep); void player_collide(Tile collisions[COLLIDE_POINTS], int x, int y) { const int rx = x + PLAYER_WIDTH - 1; const int dy = y + PLAYER_HEIGHT - 1; collisions[UP_LEFT] = collide_single(x, y); collisions[UP_RIGHT] = collide_single(rx, y); collisions[DOWN_LEFT] = collide_single(x, dy); collisions[DOWN_RIGHT] = collide_single(rx, dy); } int player_collide_tile(Tile collisions[COLLIDE_POINTS], int x, int y, Tile tile, int update) { int i; if (update) player_collide(collisions, x, y); for (i = 0; i < COLLIDE_POINTS; i += 1) if (collisions[i] == tile) return 1; return 0; } /* collide and replace tiles, return the number of tiles affecter */ int player_collide_sub(int x, int y, Tile sub, Tile rep) { const int rx = x + PLAYER_WIDTH - 1; const int dy = y + PLAYER_HEIGHT - 1; return collide_sub_single(x, y, sub, rep) + collide_sub_single(rx, y, sub, rep) + collide_sub_single(x, dy, sub, rep) + collide_sub_single(rx, dy, sub, rep); } int player_collide_solid(int x, int y) { Tile collisions[COLLIDE_POINTS]; return player_collide_tile(collisions, x, y, TILE_SOLID, 1); } static Tile collide_single(int x, int y) { const int tx = x / TILE_WIDTH; const int ty = y / TILE_WIDTH; /* out of bounds handling */ if (x < 0 || y < 0 || tx >= level.width || ty >= level.height) return TILE_OOB; return level.data[tx + ty * level.width]; } /* try collide and replace tile at pixel position, return 1 if tile * replaced */ static int collide_sub_single(int x, int y, Tile sub, Tile rep) { if (collide_single(x, y) == sub) { const int tile_index = (int)(x / TILE_WIDTH) + (int)(y / TILE_WIDTH) * level.width; level.data[tile_index] = rep; return 1; } return 0; }