reorganizing tileset handling
[vrlugburz] / src / level.c
index 6f265c3..e741667 100644 (file)
@@ -10,6 +10,8 @@ static int load_tileset(struct level *lvl, struct ts_node *tsn);
 
 int init_level(struct level *lvl, int xsz, int ysz)
 {
+       memset(lvl, 0, sizeof *lvl);
+
        if(!(lvl->cells = calloc(xsz * ysz, sizeof *lvl->cells))) {
                free(lvl);
                return -1;
@@ -17,6 +19,7 @@ int init_level(struct level *lvl, int xsz, int ysz)
        lvl->width = xsz;
        lvl->height = ysz;
        lvl->cell_size = DEF_CELL_SIZE;
+       lvl->px = lvl->py = -1;
        return 0;
 }
 
@@ -35,11 +38,6 @@ int load_level(struct level *lvl, const char *fname)
        struct cell *cell;
        float *vecptr;
 
-       lvl->fname = strdup(fname);
-       if((lvl->dirname = malloc(strlen(fname) + 1))) {
-               path_dir(lvl->fname, lvl->dirname);
-       }
-
        if(!(ts = ts_load(fname))) {
                fprintf(stderr, "failed to load level: %s\n", fname);
                return -1;
@@ -59,6 +57,14 @@ int load_level(struct level *lvl, const char *fname)
                ts_free_tree(ts);
                return -1;
        }
+
+       lvl->fname = strdup(fname);
+       if((lvl->dirname = malloc(strlen(fname) + 1))) {
+#ifndef LEVEL_EDITOR
+               path_dir(lvl->fname, lvl->dirname);
+#endif
+       }
+
        lvl->cell_size = ts_get_attr_num(ts, "cellsize", DEF_CELL_SIZE);
 
        if((vecptr = ts_get_attr_vec(ts, "player", 0))) {
@@ -103,16 +109,16 @@ int load_level(struct level *lvl, const char *fname)
                        node = (struct ts_node*)cell->next;
                        cell->next = 0;
 
-                       if(j <= 0 || cell[-1].type == CELL_SOLID) {
+                       if(i >= lvl->height - 1 || cell[lvl->width].type == CELL_SOLID) {
                                cell->wall[0] = TILE_STRAIGHT;
                        }
-                       if(i <= 0 || cell[-lvl->width].type == CELL_SOLID) {
+                       if(j >= lvl->width - 1 || cell[1].type == CELL_SOLID) {
                                cell->wall[1] = TILE_STRAIGHT;
                        }
-                       if(j >= lvl->width - 1 || cell[1].type == CELL_SOLID) {
+                       if(i <= 0 || cell[-lvl->width].type == CELL_SOLID) {
                                cell->wall[2] = TILE_STRAIGHT;
                        }
-                       if(i >= lvl->height - 1 || cell[lvl->width].type == CELL_SOLID) {
+                       if(j <= 0 || cell[-1].type == CELL_SOLID) {
                                cell->wall[3] = TILE_STRAIGHT;
                        }
 
@@ -143,6 +149,20 @@ int save_level(struct level *lvl, const char *fname)
        ts_set_valuei(&attr->val, lvl->width);
        ts_add_attr(root, attr);
 
+       if(lvl->cell_size && (attr = ts_alloc_attr())) {
+               ts_set_attr_name(attr, "cellsize");
+               ts_set_valuef(&attr->val, lvl->cell_size);
+               ts_add_attr(root, attr);
+       }
+
+       if(lvl->px >= 0 && lvl->px < lvl->width && lvl->py >= 0 && lvl->py < lvl->height) {
+               if((attr = ts_alloc_attr())) {
+                       ts_set_attr_name(attr, "player");
+                       ts_set_valueiv(&attr->val, 2, lvl->px, lvl->py);
+                       ts_add_attr(root, attr);
+               }
+       }
+
        for(i=0; i<lvl->height; i++) {
                for(j=0; j<lvl->width; j++) {
                        cell = lvl->cells + i * lvl->width + j;
@@ -192,9 +212,13 @@ err:
        return -1;
 }
 
+#ifndef LEVEL_EDITOR
+
 static int load_tileset(struct level *lvl, struct ts_node *tsn)
 {
-       static const char *tile_types[] = {"empty", "straight", "corner", "door", 0};
+       static const char *tile_types[] = {
+               "open", "straight", "corner", "tee", "cross", "str2open", 0
+       };
 
        int i;
        char *path;
@@ -332,3 +356,12 @@ int gen_level_geom(struct level *lvl)
        }
        return 0;
 }
+
+#else
+
+static int load_tileset(struct level *lvl, struct ts_node *tsn)
+{
+       return 0;               /* in the level editor we don't need tileset loading */
+}
+
+#endif /* !LEVEL_EDITOR */