10 static int match_prefix(const char *str, const char *prefix);
12 static struct tileset *tset_list;
14 int load_tileset(struct tileset *tset, const char *fname)
16 struct ts_node *ts, *node, *iter;
17 const char *str, *prefix;
22 float xform[16], *vec;
24 if(!(ts = ts_load(fname))) {
25 fprintf(stderr, "failed to load tileset: %s\n", fname);
28 if(strcmp(ts->name, "tileset") != 0) {
29 fprintf(stderr, "invalid or corrupted tileset file: %s\n", fname);
34 if(!(str = ts_get_attr_str(ts, "file", 0))) {
35 fprintf(stderr, "tileset %s is missing the file attribute\n", fname);
39 path = alloca(strlen(fname) + strlen(str) + 2);
40 path_dir(fname, path);
41 combine_path(path, str, path);
43 if(load_scenefile(&tset->scn, path) == -1) {
44 fprintf(stderr, "tileset %s: failed to load scene file: %s\n", fname, path);
49 tset->fname = strdup(fname);
50 tset->name = strdup(ts_get_attr_str(ts, "name", fname));
52 tset->tile_size = ts_get_attr_num(ts, "tilesize", DEF_TILE_SIZE);
54 iter = ts->child_list;
58 if(strcmp(node->name, "tile") == 0) {
59 if(!(prefix = ts_get_attr_str(node, "prefix", 0))) {
63 if(!(str = ts_get_attr_str(node, "type", 0))) {
64 fprintf(stderr, "load_tileset: missing tile type\n");
67 if((type = tile_type(str)) == -1) {
68 fprintf(stderr, "load_tileset: invalid tile type: %s\n", str);
72 if(!(tile = malloc(sizeof *tile))) {
73 fprintf(stderr, "load_tileset: failed to allocate tile\n");
79 if((vec = ts_get_attr_vec(node, "pos", 0))) {
80 cgm_mtranslation(xform, -vec[0], -vec[1], -vec[2]);
83 init_meshgroup(&tile->mgrp);
85 mesh = tset->scn.meshlist;
87 if(mesh->name && match_prefix(mesh->name, prefix)) {
89 xform_mesh(mesh, xform);
91 add_meshgroup_mesh(&tile->mgrp, mesh);
96 tile->next = tset->tiles;
104 void destroy_tileset(struct tileset *tset)
113 tset->tiles = tile->next;
119 destroy_scenefile(&tset->scn);
122 struct tileset *get_tileset(const char *fname)
124 struct tileset *ts = tset_list;
126 if(strcmp(ts->fname, fname) == 0) {
132 if(!(ts = malloc(sizeof *ts))) {
133 fprintf(stderr, "failed to allocate tileset\n");
136 if(load_tileset(ts, fname) == -1) {
140 ts->next = tset_list;
145 void free_all_tilesets(void)
151 tset_list = ts->next;
157 struct tile *get_tile(struct tileset *tset, int ttype)
159 struct tile *tile = tset->tiles;
161 if(tile->type == ttype) {
169 int tile_type(const char *tstr)
171 static const char *typenames[] = {
172 "open", "straight", "corner", "tee", "cross", "str2open", "stropen", 0
178 for(i=0; typenames[i]; i++) {
179 if(strcmp(tstr, typenames[i]) == 0) {
186 static int match_prefix(const char *str, const char *prefix)
188 while(*str && *prefix) {
189 if(*str++ != *prefix++) {