- int cidx, row, col;
- float x, y, xsz, ysz, sz;
- static const float colors[][3] = {{0, 0, 0}, {0.6, 0.6, 0.6}, {0.4, 0.2, 0.1}};
-
- xsz = view_zoom * view_width / lvl->width;
- ysz = view_zoom * view_height / lvl->height;
- sz = xsz > ysz ? ysz : xsz;
-
- cidx = cell - lvl->cells;
- row = cidx / lvl->width;
- col = cidx % lvl->width;
-
- x = col * sz - view_panx;
- y = row * sz - view_pany;
-
- glColor3f(1, 1, 1);
- glVertex2f(x, y);
- glVertex2f(x + sz, y);
- glVertex2f(x + sz, y + sz);
- glVertex2f(x, y + sz);
-
- x += LTHICK;
- y += LTHICK;
- sz -= LTHICK * 2.0f;
-
- glColor3fv(colors[cell->type]);
- glVertex2f(x, y);
- glVertex2f(x + sz, y);
- glVertex2f(x + sz, y + sz);
- glVertex2f(x, y + sz);
+ FILE *fp;
+ struct ts_node *ts, *node, *iter;
+ int sz, cx, cy;
+ struct cell *cell;
+
+ if(!(fp = fopen(fname, "rb"))) {
+ return -1;
+ }
+
+ if(!(ts = ts_load(fname))) {
+ fprintf(stderr, "failed to load level: %s\n", fname);
+ return -1;
+ }
+ if(strcmp(ts->name, "dunged_level") != 0) {
+ fprintf(stderr, "invalid or corrupted level file: %s\n", fname);
+ ts_free_tree(ts);
+ return -1;
+ }
+
+ if((sz = ts_get_attr_int(ts, "size", 0)) <= 0) {
+ sz = 32;
+ }
+
+ if(init_level(lvl, sz, sz) == -1) {
+ fprintf(stderr, "failed to initialize a %dx%d level\n", sz, sz);
+ ts_free_tree(ts);
+ return -1;
+ }
+
+ iter = ts->child_list;
+ while(iter) {
+ node = iter;
+ iter = iter->next;
+
+ if(strcmp(node->name, "cell") == 0) {
+ cx = ts_get_attr_int(node, "x", -1);
+ cy = ts_get_attr_int(node, "y", -1);
+ if(cx < 0 || cy < 0 || cx >= sz || cy >= sz) {
+ fprintf(stderr, "ignoring cell with invalid or missing coordinates\n");
+ continue;
+ }
+ cell = lvl->cells + cy * sz + cx;
+ cell->type = ts_get_attr_int(node, "blocked", 0) ? CELL_BLOCKED : CELL_WALK;
+ /* TODO wall tiles and detail objects */
+ }
+ }
+
+ ts_free_tree(ts);
+ return 0;