summaryrefslogtreecommitdiffstats
path: root/friendfinder/map/map_reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'friendfinder/map/map_reader.c')
-rw-r--r--friendfinder/map/map_reader.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/friendfinder/map/map_reader.c b/friendfinder/map/map_reader.c
new file mode 100644
index 0000000..fb475fc
--- /dev/null
+++ b/friendfinder/map/map_reader.c
@@ -0,0 +1,141 @@
+#include <string.h>
+#include <Eet.h>
+
+#include "smart_map_priv.h"
+
+#define READ_KEY_INIT char key[512]
+#define LKEY(_le, _mk) snprintf(key, 512, "%i/%s", _le, _mk);
+
+static inline int _read_int_val(Eet_File *eet, char *key, int *intval)
+{
+ int size;
+ char *val;
+ val = eet_read(eet, key, &size);
+ if(val == NULL)
+ {
+ // _warn("reading %s failed\n", key);
+ return -1;
+ }
+ *intval = atoi(val);
+ free(val);
+ return 0;
+}
+
+static inline int _read_double_val(Eet_File *eet, char *key, double *dval)
+{
+ int size;
+ char *val;
+ val = eet_read(eet, key, &size);
+ if(val == NULL)
+ {
+ // _warn("reading %s failed\n", key);
+ return -1;
+ }
+
+ *dval = atof(val);
+ free(val);
+ return 0;
+}
+
+
+struct map_info *map_info_read(const char *path)
+{
+ Eet_File *eet;
+ int size, i;
+ char *val;
+ struct map_info *mi;
+
+ mi = (struct map_info *)calloc(1, sizeof(struct map_info));
+ if(mi == NULL)
+ return NULL;
+
+ eet = eet_open(path, EET_FILE_MODE_READ);
+ if(eet == NULL)
+ return NULL;
+
+ val = eet_read(eet, "min_level", &size);
+ if(val == NULL)
+ return NULL;
+ mi->min_level = atoi(val);
+ free(val);
+
+ val = eet_read(eet, "max_level", &size);
+ if(val == NULL)
+ return NULL;
+ mi->max_level = atoi(val);
+ free(val);
+ mi->level = (struct map_level_info *)
+ calloc(mi->max_level - mi->min_level + 1,
+ sizeof(struct map_level_info));
+ if(mi->level == NULL)
+ {
+ free(mi);
+ return NULL;
+ }
+ mi->tile_size = 256;
+ for(i = mi->min_level; i < mi->max_level + 1; i++)
+ {
+ READ_KEY_INIT;
+ struct map_level_info *li;
+
+ li = &mi->level[i - mi->min_level];
+
+ LKEY(i, "min_x");
+ if(_read_int_val(eet, key, &(li->min_x)))
+ goto failure;
+
+ LKEY(i, "max_x");
+ if(_read_int_val(eet, key, &(li->max_x)))
+ goto failure;
+
+ LKEY(i, "min_y");
+ if(_read_int_val(eet, key, &(li->min_y)))
+ goto failure;
+
+ LKEY(i, "max_y");
+ if(_read_int_val(eet, key, &(li->max_y)))
+ goto failure;
+
+ LKEY(i, "north");
+ if(_read_double_val(eet, key, &(li->north)))
+ goto failure;
+
+ LKEY(i, "west");
+ if(_read_double_val(eet, key, &(li->west)))
+ goto failure;
+
+ LKEY(i, "south");
+ if(_read_double_val(eet, key, &(li->south)))
+ goto failure;
+
+ LKEY(i, "east");
+ if(_read_double_val(eet, key, &(li->east)))
+ goto failure;
+
+ LKEY(i, "dx");
+ if(_read_double_val(eet, key, &(li->dx)))
+ goto failure;
+
+ LKEY(i, "dy");
+ if(_read_double_val(eet, key, &(li->dy)))
+ goto failure;
+
+ LKEY(i, "e0");
+ if(_read_double_val(eet, key, &(li->e0)))
+ goto failure;
+
+ LKEY(i, "n0");
+ if(_read_double_val(eet, key, &(li->n0)))
+ goto failure;
+ }
+ mi->path = strdup(path);
+ eet_close(eet);
+ return mi;
+failure:
+ free(mi->level);
+ free(mi);
+ return NULL;
+}
+
+
+