2020-09-21 11:04:53 +02:00
|
|
|
#include <gint/display.h>
|
|
|
|
|
2020-09-21 14:15:58 +02:00
|
|
|
#include "conf.h"
|
2020-09-11 18:07:53 +02:00
|
|
|
#include "level.h"
|
|
|
|
#include "camera.h"
|
|
|
|
|
2020-09-22 13:49:59 +02:00
|
|
|
#define VEC_PRECISE_HALF_DISP (Vec){DWIDTH * VEC_PRECISION / (2 * SCALE), DHEIGHT * VEC_PRECISION / (2 * SCALE)}
|
2020-09-22 13:42:27 +02:00
|
|
|
|
2020-12-21 12:18:55 +01:00
|
|
|
void level_step(const Level *level) {
|
2020-09-21 11:04:53 +02:00
|
|
|
}
|
|
|
|
|
2020-12-21 12:18:55 +01:00
|
|
|
void level_draw(const Level *level, Camera *camera) {
|
2020-12-28 00:31:33 +01:00
|
|
|
for (int i = 0; i < level->layers_count; ++i) {
|
|
|
|
layer_draw(level, camera, i);
|
|
|
|
}
|
2020-09-11 18:07:53 +02:00
|
|
|
}
|
|
|
|
|
2020-12-21 12:18:55 +01:00
|
|
|
void layer_draw(const Level *level, Camera *camera, uint layer_id) {
|
2020-09-21 11:04:53 +02:00
|
|
|
const uint8_t *layer = level->layers[layer_id];
|
2020-09-22 13:42:27 +02:00
|
|
|
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);
|
2020-09-23 12:19:40 +02:00
|
|
|
vec_div(&display_tl, TILE_SIZE);
|
|
|
|
vec_div(&display_br, TILE_SIZE);
|
2021-01-01 02:22:48 +01:00
|
|
|
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);
|
2020-12-21 12:18:55 +01:00
|
|
|
for (int y = start_y; y < end_y; ++y) {
|
|
|
|
for (int x = start_x; x < end_x; ++x) {
|
2020-09-21 11:04:53 +02:00
|
|
|
const uint8_t cell = layer[x + y * level->width];
|
|
|
|
#ifdef FX9860G
|
2020-09-22 13:20:16 +02:00
|
|
|
const int color = C_LIGHT;
|
2020-09-21 11:04:53 +02:00
|
|
|
#endif /* FX9860G */
|
|
|
|
#ifdef FXCG50
|
2020-09-21 14:15:58 +02:00
|
|
|
const int color = C_GREEN;
|
2020-09-21 11:04:53 +02:00
|
|
|
#endif /* FXCG50 */
|
2020-12-21 12:18:55 +01:00
|
|
|
if (cell == 1) {
|
2020-09-21 14:15:58 +02:00
|
|
|
Vec tl = {x, y};
|
|
|
|
Vec br;
|
2020-09-23 12:19:40 +02:00
|
|
|
vec_mul(&tl, TILE_SIZE);
|
2020-09-21 14:15:58 +02:00
|
|
|
vec_div(&tl, VEC_PRECISION);
|
2020-09-21 14:52:28 +02:00
|
|
|
vec_sub(&tl, camera->offset);
|
2020-09-21 19:04:27 +02:00
|
|
|
vec_mul(&tl, SCALE);
|
2020-09-21 14:15:58 +02:00
|
|
|
vec_cpy(&br, tl);
|
2020-09-23 12:19:40 +02:00
|
|
|
vec_add(&br, (Vec){TILE_SIZE / VEC_PRECISION * SCALE - 1,
|
|
|
|
TILE_SIZE / VEC_PRECISION * SCALE - 1});
|
2020-09-21 14:15:58 +02:00
|
|
|
vec_drect(tl, br, color);
|
|
|
|
}
|
2020-09-21 11:04:53 +02:00
|
|
|
}
|
|
|
|
}
|
2020-09-11 18:07:53 +02:00
|
|
|
}
|