RogueLife/src/map.c

55 lines
1.4 KiB
C
Raw Normal View History

#include "map.h"
#include <stdlib.h>
2022-02-11 20:42:20 +01:00
rect tile_shape(tileset_t const *tileset, int id)
{
2022-02-11 20:42:20 +01:00
if(!tileset->tiles[id].solid)
return (rect){ 0 };
return (rect){
2021-07-16 18:49:58 +02:00
.l = -fix(0.5),
.r = fix(0.5),
.t = -fix(0.5),
.b = fix(0.5),
};
}
2022-02-11 20:42:20 +01:00
map_cell_t *map_cell(map_t const *m, int x, int y)
{
if((unsigned)x >= m->width || (unsigned)y >= m->height)
return NULL;
2022-02-11 20:42:20 +01:00
return &m->cells[y * m->width + x];
}
bool map_collides(map_t const *m, rect hitbox)
{
2021-06-15 17:27:30 +02:00
int y_min = ffloor(hitbox.t);
int y_max = fceil(hitbox.b);
int x_min = ffloor(hitbox.l);
int x_max = fceil(hitbox.r);
/* Collisions against walls and static objects */
2021-06-15 17:27:30 +02:00
for(int y = y_min; y < y_max; y++)
for(int x = x_min; x < x_max; x++) {
2022-02-11 20:42:20 +01:00
map_cell_t *t = map_cell(m, x, y);
if(!t) continue;
vec2 c = { fix(x) + fix(0.5), fix(y) + fix(0.5) };
rect tile_hitbox;
if(m->tileset->tiles[t->base].solid) {
tile_hitbox = rect_translate(tile_shape(m->tileset, t->base), c);
if(rect_collide(hitbox, tile_hitbox))
return true;
}
if(m->tileset->tiles[t->decor].solid) {
tile_hitbox = rect_translate(tile_shape(m->tileset, t->decor), c);
if(rect_collide(hitbox, tile_hitbox))
return true;
}
}
return false;
}