#include #include "conf.h" #include "level.h" #include "camera.h" #include "tiles.h" #define VEC_PRECISE_HALF_DISP (Vec){DWIDTH * VEC_PRECISION / (2 * SCALE), DHEIGHT * VEC_PRECISION / (2 * SCALE)} void level_step(const Level *level) { } void level_draw(const Level *level, Camera *camera) { for (int i = 0; i < level->layers_count; ++i) { layer_draw(level, camera, i); } } void layer_draw(const Level *level, Camera *camera, uint layer_id) { /* Include tileset. */ extern bopti_image_t img_tileset; const Tile *layer = level->layers[layer_id]; #ifdef FX9860G const int color = C_LIGHT; #endif /* FX9860G */ #ifdef FXCG50 const int color = C_GREEN; #endif /* FXCG50 */ Vec display_tl, display_br; vec_cpy(&display_tl, camera->pos); vec_cpy(&display_br, display_tl); vec_sub(&display_tl, VEC_PRECISE_HALF_DISP); vec_add(&display_br, VEC_PRECISE_HALF_DISP); vec_div(&display_tl, TILE_SIZE); vec_div(&display_br, TILE_SIZE); int start_x = (display_tl.x > 0) ? (display_tl.x) : (0); int start_y = (display_tl.y > 0) ? (display_tl.y) : (0); int end_x = (display_br.x < level->width) ? (display_br.x + 1) : (level->width); int end_y = (display_br.y < level->height) ? (display_br.y + 1) : (level->height); for (int y = start_y; y < end_y; ++y) { for (int x = start_x; x < end_x; ++x) { const Tile tile = layer[x + y * level->width]; if (tile) { const Vec tl = { (x * TILE_SIZE / VEC_PRECISION - camera->offset.x) * SCALE, (y * TILE_SIZE / VEC_PRECISION - camera->offset.y) * SCALE }; dsubimage(tl.x, tl.y, &img_tileset, tile % TILESET_WIDTH * TILE_PX_SIZE, tile / TILESET_WIDTH * TILE_PX_SIZE, TILE_PX_SIZE, TILE_PX_SIZE, 0); } } } }