Textdateiankuckdingviech.
[hackover2013-badge-firmware.git] / badge / jumpnrun / levels.h
index fa7b1a3..c02ab97 100644 (file)
@@ -5,23 +5,24 @@
 #include "items.h"
 #include "tiles.h"
 
-#include <badge/util/rectangle.h>
-
-#include <drivers/fatfs/ff.h>
+#include "../util/rectangle.h"
 
 #include <stddef.h>
 #include <stdio.h>
 
+#define JUMPNRUN_PATH "/hackio"
+
 typedef struct jumpnrun_level_header {
-  size_t                tile_count;
-  size_t                item_count;
-  size_t                enemy_count;
+  uint16_t tile_count;
+  uint16_t item_count;
+  uint16_t enemy_count;
 } jumpnrun_level_header;
 
 typedef struct jumpnrun_level {
   jumpnrun_level_header header;
 
   vec2d                 start_pos;
+  uint8_t               start_lives;
 
   jumpnrun_tile        *tiles;
   jumpnrun_item        *items;
@@ -36,9 +37,6 @@ enum {
 size_t jumpnrun_level_count(void);
 void jumpnrun_levels_dump(void);
 
-int jumpnrun_load_level_header_from_file(jumpnrun_level *dest, FIL *fd);
-int jumpnrun_load_level_from_file       (jumpnrun_level *dest, FIL *fd);
-
 // Use stack-local VLAs to store dynamic content.
 #define JUMPNRUN_LEVEL_MAKE_SPACE(var)                    \
   jumpnrun_tile  var ## _tiles  [var.header.tile_count];  \
@@ -48,5 +46,49 @@ int jumpnrun_load_level_from_file       (jumpnrun_level *dest, FIL *fd);
   var.tiles   = var ## _tiles;                            \
   var.items   = var ## _items;                            \
   var.enemies = var ## _enemies;
+#else
+
+#ifdef __linux__
+
+int jumpnrun_load_level_header_from_file(jumpnrun_level *dest, FILE *fd);
+int jumpnrun_load_level_from_file       (jumpnrun_level *dest, FILE *fd);
+
+#define JUMPNRUN_LEVEL_LOAD(lv, lvname)                         \
+  memset(&(lv), 0, sizeof(lv));                                 \
+  FILE *fd = fopen((lvname), "r");                              \
+  if(fd == NULL) return JUMPNRUN_ERROR;                         \
+  int err = jumpnrun_load_level_header_from_file(&(lv), fd);    \
+  if(err != 0) {                                                \
+    fclose(fd);                                                 \
+    return JUMPNRUN_ERROR;                                      \
+  }                                                             \
+  JUMPNRUN_LEVEL_MAKE_SPACE(lv);                                \
+  err = jumpnrun_load_level_from_file(&(lv), fd);               \
+  fclose(fd);                                                   \
+  if(err != 0) return JUMPNRUN_ERROR;
+#else
+#include <drivers/fatfs/ff.h>
+
+int jumpnrun_load_level_header_from_file(jumpnrun_level *dest, FIL *fd);
+int jumpnrun_load_level_from_file       (jumpnrun_level *dest, FIL *fd);
+
+#define JUMPNRUN_LEVEL_LOAD(lv, lvname)                                 \
+  memset(&(lv), 0, sizeof(lv));                                         \
+  FIL fd;                                                               \
+  if(FR_OK != f_chdir(JUMPNRUN_PATH) ||                                 \
+     FR_OK != f_open(&fd, (lvname), FA_OPEN_EXISTING | FA_READ)) {      \
+    return JUMPNRUN_ERROR;                                              \
+  }                                                                     \
+  if(0 != jumpnrun_load_level_header_from_file(&(lv), &fd)) {           \
+    f_close(&fd);                                                       \
+    return JUMPNRUN_ERROR;                                              \
+  }                                                                     \
+  JUMPNRUN_LEVEL_MAKE_SPACE(lv);                                        \
+  int err = jumpnrun_load_level_from_file(&(lv), &fd);                  \
+  f_close(&fd);                                                         \
+  if(err != 0) {                                                        \
+    return JUMPNRUN_ERROR;                                              \
+  }
+#endif
 
 #endif
This page took 0.027691 seconds and 4 git commands to generate.