X-Git-Url: http://git.rohieb.name/hackover2013-badge-firmware.git/blobdiff_plain/8a947d16e5132fd133d67c76468c6323881de221..5337261a68ea89b88624ca6fd7319cadd662e057:/badge/jumpnrun/level_load.c diff --git a/badge/jumpnrun/level_load.c b/badge/jumpnrun/level_load.c index 3ae31d7..a386ecf 100644 --- a/badge/jumpnrun/level_load.c +++ b/badge/jumpnrun/level_load.c @@ -2,12 +2,17 @@ #include "tiles.h" #include "items.h" #include "enemies.h" +#include "jumpnrun.h" + +#ifndef __linux__ +#include +#endif #include typedef struct { - uint8_t x; - uint16_t y; + uint16_t x; + uint8_t y; uint8_t type; } level_thing; @@ -15,41 +20,55 @@ static level_thing jumpnrun_level_parse_blob(unsigned char blob[3]) { level_thing result; result.y = blob[0] >> 4; - result.x = ((blob[0] & 0xf) << 8) | blob[1]; + result.x = ((blob[0] & 0x0f) << 8) | blob[1]; result.type = blob[2]; return result; } static void jumpnrun_level_make_tile(jumpnrun_tile *dest, level_thing thing) { + memset(dest, 0, sizeof(*dest)); + dest->type = thing.type; dest->pos.x = thing.x; dest->pos.y = thing.y; } static void jumpnrun_level_make_item(jumpnrun_item *dest, level_thing thing) { + memset(dest, 0, sizeof(*dest)); + dest->type = &jumpnrun_item_type_data[thing.type]; - dest->pos.x = FIXED_POINT(thing.x * JUMPNRUN_TILE_PIXEL_WIDTH , 0); - dest->pos.y = FIXED_POINT(thing.y * JUMPNRUN_TILE_PIXEL_WIDTH , 0); + + uint8_t xoff = (JUMPNRUN_TILE_PIXEL_WIDTH - (dest->type->sprite.width % JUMPNRUN_TILE_PIXEL_WIDTH)) / 2; + uint8_t yoff = thing.type != JUMPNRUN_ITEM_TYPE_CHECKPOINT ? 1 : 0; // HACK: spezielle Ausnahme + + dest->pos.x = FIXED_POINT( thing.x * JUMPNRUN_TILE_PIXEL_WIDTH + xoff, 0); + dest->pos.y = FIXED_POINT((thing.y + 1) * JUMPNRUN_TILE_PIXEL_WIDTH - dest->type->sprite.height - yoff, 0); } static void jumpnrun_level_make_enemy(jumpnrun_enemy *dest, level_thing thing) { + memset(dest, 0, sizeof(*dest)); + dest->type = &jumpnrun_enemy_type_data[thing.type]; - dest->spawn_pos.x = FIXED_POINT(thing.x * JUMPNRUN_TILE_PIXEL_WIDTH , 0); - dest->spawn_pos.y = FIXED_POINT(thing.y * JUMPNRUN_TILE_PIXEL_HEIGHT, 0); - dest->current_pos = dest->spawn_pos; - dest->inertia = dest->type->spawn_inertia; - dest->flags = 0; - dest->tick_counter = 0; - dest->current_frame = 0; + dest->spawn_pos.x = FIXED_INT( thing.x * JUMPNRUN_TILE_PIXEL_WIDTH + fixed_point_cast_int(dest->type->hitbox.pos.x)); + dest->spawn_pos.y = FIXED_INT((thing.y + 1) * JUMPNRUN_TILE_PIXEL_HEIGHT - fixed_point_cast_int(dest->type->hitbox.extent.y)); + jumpnrun_enemy_despawn(dest); } +#ifdef __linux__ +int jumpnrun_load_level_header_from_file(jumpnrun_level *dest, FILE *fd) { +#else int jumpnrun_load_level_header_from_file(jumpnrun_level *dest, FIL *fd) { - uint16_t head[3]; UINT count; +#endif + uint16_t head[3]; +#ifdef __linux__ + if(1 != fread(&head, sizeof(head), 1, fd)) { +#else if(FR_OK != f_read(fd, head, sizeof(head), &count) || count != sizeof(head)) { +#endif return JUMPNRUN_LEVEL_LOAD_ERROR; } @@ -60,21 +79,41 @@ int jumpnrun_load_level_header_from_file(jumpnrun_level *dest, FIL *fd) { return JUMPNRUN_LEVEL_LOAD_OK; } +#ifdef __linux__ +int jumpnrun_load_level_from_file(jumpnrun_level *dest, FILE *fd) { +#else int jumpnrun_load_level_from_file(jumpnrun_level *dest, FIL *fd) { + UINT count; +#endif size_t i; unsigned char buf[3]; uint16_t spos[2]; - UINT count; +#ifdef __linux__ + if(1 != fread(spos, sizeof(spos), 1, fd)) { +#else if(FR_OK != f_read(fd, spos, sizeof(spos), &count) || count != sizeof(spos)) { +#endif return JUMPNRUN_LEVEL_LOAD_ERROR; } else { - dest->start_pos.x = FIXED_POINT(spos[0] * JUMPNRUN_TILE_PIXEL_WIDTH , 0); - dest->start_pos.y = FIXED_POINT(spos[1] * JUMPNRUN_TILE_PIXEL_HEIGHT, 0); + dest->start_pos.x = fixed_point_sub(FIXED_INT((spos[0] + 1) * JUMPNRUN_TILE_PIXEL_WIDTH ), jumpnrun_player_extents().x); + dest->start_pos.y = FIXED_INT( spos[1] * JUMPNRUN_TILE_PIXEL_HEIGHT); + } + +#ifdef __linux__ + if(1 != fread(&dest->start_lives, 1, 1, fd)) { +#else + if(FR_OK != f_read(fd, &dest->start_lives, sizeof(dest->start_lives), &count) || count != sizeof(dest->start_lives)) { +#endif + return JUMPNRUN_LEVEL_LOAD_ERROR; } for(i = 0; i < dest->header.tile_count; ++i) { +#ifdef __linux__ + if(1 != fread(buf, 3, 1, fd)) { +#else if(FR_OK != f_read(fd, buf, sizeof(buf), &count) || count != sizeof(buf)) { +#endif return JUMPNRUN_LEVEL_LOAD_ERROR; } @@ -87,7 +126,11 @@ int jumpnrun_load_level_from_file(jumpnrun_level *dest, FIL *fd) { } for(i = 0; i < dest->header.item_count; ++i) { +#ifdef __linux__ + if(1 != fread(buf, 3, 1, fd)) { +#else if(FR_OK != f_read(fd, buf, sizeof(buf), &count) || count != sizeof(buf)) { +#endif return JUMPNRUN_LEVEL_LOAD_ERROR; } @@ -100,7 +143,11 @@ int jumpnrun_load_level_from_file(jumpnrun_level *dest, FIL *fd) { } for(i = 0; i < dest->header.enemy_count; ++i) { +#ifdef __linux__ + if(1 != fread(buf, 3, 1, fd)) { +#else if(FR_OK != f_read(fd, buf, sizeof(buf), &count) || count != sizeof(buf)) { +#endif return JUMPNRUN_LEVEL_LOAD_ERROR; }