Bugfix: Möglicher segfault beim Sterben.
[hackover2013-badge-firmware.git] / badge / jumpnrun / level_load.c
index 3ae31d7..ae1a91f 100644 (file)
@@ -2,12 +2,17 @@
 #include "tiles.h"
 #include "items.h"
 #include "enemies.h"
+#include "jumpnrun.h"
+
+#ifndef __linux__
+#include <drivers/fatfs/ff.h>
+#endif
 
 #include <stdio.h>
 
 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,33 @@ 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);
   }
 
   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 +118,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 +135,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;
     }
 
This page took 0.032633 seconds and 4 git commands to generate.