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 iter = ts->child_list;
56 if(strcmp(node->name, "tile") == 0) {
57 if(!(prefix = ts_get_attr_str(node, "prefix", 0))) {
61 if(!(str = ts_get_attr_str(node, "type", 0))) {
62 fprintf(stderr, "load_tileset: missing tile type\n");
65 if((type = tile_type(str)) == -1) {
66 fprintf(stderr, "load_tileset: invalid tile type: %s\n", str);
70 if(!(tile = malloc(sizeof *tile))) {
71 fprintf(stderr, "load_tileset: failed to allocate tile\n");
77 if((vec = ts_get_attr_vec(node, "pos", 0))) {
78 cgm_mtranslation(xform, vec[0], vec[1], vec[2]);
81 init_meshgroup(&tile->mgrp);
83 mesh = tset->scn.meshlist;
85 if(mesh->name && match_prefix(mesh->name, prefix)) {
87 xform_mesh(mesh, xform);
89 add_meshgroup_mesh(&tile->mgrp, mesh);
94 tile->next = tset->tiles;
102 void destroy_tileset(struct tileset *tset)
111 tset->tiles = tile->next;
117 destroy_scenefile(&tset->scn);
120 struct tileset *get_tileset(const char *fname)
122 struct tileset *ts = tset_list;
124 if(strcmp(ts->fname, fname) == 0) {
130 if(!(ts = malloc(sizeof *ts))) {
131 fprintf(stderr, "failed to allocate tileset\n");
134 if(load_tileset(ts, fname) == -1) {
138 ts->next = tset_list;
143 void free_all_tilesets(void)
149 tset_list = ts->next;
155 struct tile *get_tile(struct tileset *tset, int ttype)
157 struct tile *tile = tset->tiles;
159 if(tile->type == ttype) {
167 int tile_type(const char *tstr)
169 static const char *typenames[] = {
170 "open", "straight", "corner", "tee", "cross", "str2open", "stropen", 0
176 for(i=0; typenames[i]; i++) {
177 if(strcmp(tstr, typenames[i]) == 0) {
184 static int match_prefix(const char *str, const char *prefix)
186 while(*str && *prefix) {
187 if(*str++ != *prefix++) {