RogueLife/src/game.c

83 lines
1.9 KiB
C
Raw Normal View History

2021-06-04 15:14:12 +02:00
#include "game.h"
#include <stdlib.h>
bool game_load(game_t *g, level_t *level)
{
game_unload(g);
map_t *m = &g->map;
m->width = level->width;
m->height = level->height;
m->tiles = malloc(m->width * m->height * sizeof *m->tiles);
if(!m->tiles) {
game_unload(g);
return false;
}
for(int y = 0; y < m->height; y++)
for(int x = 0; x < m->width; x++) {
struct tile *t = map_tile(m, x, y);
t->base = level->tiles[level->width * y + x].base;
t->decor = level->tiles[level->width * y + x].decor;
t->solid = (t->base == 0) || (t->base >= 16);
}
camera_init(&g->camera, m);
g->entities = NULL;
g->entity_count = 0;
return true;
}
void game_unload(game_t *g)
{
g->map.width = 0;
g->map.height = 0;
free(g->map.tiles);
for(int i = 0; i < g->entity_count; i++)
free(g->entities[i]);
free(g->entities);
}
void game_add_entity(game_t *g, entity_t *entity)
{
size_t new_size = (g->entity_count + 1) * sizeof *g->entities;
entity_t **new_entities = realloc(g->entities, new_size);
if(!new_entities) return;
g->entities = new_entities;
g->entities[g->entity_count] = entity;
g->entity_count++;
}
bool game_shape_collides(game_t *g, entity_t const *e, shape_t const *hitbox)
{
/* Collision against map */
if(map_entity_collides(&g->map, hitbox))
return true;
/* Collision against entities */
for(int i = 0; i < g->entity_count; i++) {
entity_t *other = g->entities[i];
if(other == e) continue;
shape_t other_hitbox = other->hitbox;
shape_translate(&other_hitbox, entity_pos(other));
if(shape_collide(hitbox, &other_hitbox))
return true;
}
return false;
}
2021-06-09 20:47:39 +02:00
void game_update_animations(game_t *g, fixed_t dt)
{
for(int i = 0; i < g->entity_count; i++) {
entity_t *e = g->entities[i];
anim_state_update(&e->anim, dt);
}
}