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 memset(tset, 0, sizeof *tset);
26 if(!(ts = ts_load(fname))) {
27 fprintf(stderr, "failed to load tileset: %s\n", fname);
30 if(strcmp(ts->name, "tileset") != 0) {
31 fprintf(stderr, "invalid or corrupted tileset file: %s\n", fname);
36 if(!(str = ts_get_attr_str(ts, "file", 0))) {
37 fprintf(stderr, "tileset %s is missing the file attribute\n", fname);
41 path = alloca(strlen(fname) + strlen(str) + 2);
42 path_dir(fname, path);
43 combine_path(path, str, path);
45 if(load_scenefile(&tset->scn, path) == -1) {
46 fprintf(stderr, "tileset %s: failed to load scene file: %s\n", fname, path);
51 tset->fname = strdup(fname);
52 tset->name = strdup(ts_get_attr_str(ts, "name", fname));
54 tset->tile_size = ts_get_attr_num(ts, "tilesize", DEF_TILE_SIZE);
56 iter = ts->child_list;
60 if(strcmp(node->name, "tile") == 0) {
61 if(!(prefix = ts_get_attr_str(node, "prefix", 0))) {
65 if(!(str = ts_get_attr_str(node, "type", 0))) {
66 fprintf(stderr, "load_tileset: missing tile type\n");
69 if((type = tile_type(str)) == -1) {
70 fprintf(stderr, "load_tileset: invalid tile type: %s\n", str);
74 if(!(tile = malloc(sizeof *tile))) {
75 fprintf(stderr, "load_tileset: failed to allocate tile\n");
81 if((vec = ts_get_attr_vec(node, "pos", 0))) {
82 cgm_mtranslation(xform, -vec[0], -vec[1], -vec[2]);
85 init_meshgroup(&tile->mgrp);
87 mesh = tset->scn.meshlist;
89 if(mesh->name && match_prefix(mesh->name, prefix)) {
91 xform_mesh(mesh, xform);
93 add_meshgroup_mesh(&tile->mgrp, mesh);
98 tile->next = tset->tiles;
106 void destroy_tileset(struct tileset *tset)
115 tset->tiles = tile->next;
121 destroy_scenefile(&tset->scn);
124 struct tileset *get_tileset(const char *fname)
126 struct tileset *ts = tset_list;
128 if(strcmp(ts->fname, fname) == 0) {
134 if(!(ts = malloc(sizeof *ts))) {
135 fprintf(stderr, "failed to allocate tileset\n");
138 if(load_tileset(ts, fname) == -1) {
142 ts->next = tset_list;
147 void free_all_tilesets(void)
153 tset_list = ts->next;
159 struct tile *get_tile(struct tileset *tset, int ttype)
161 struct tile *tile = tset->tiles;
163 if(tile->type == ttype) {
171 int tile_type(const char *tstr)
173 static const char *typenames[] = {
174 "open", "straight", "corner", "opencorner", "tee", "cross", "str2open", "stropen", 0
180 for(i=0; typenames[i]; i++) {
181 if(strcmp(tstr, typenames[i]) == 0) {
188 static int match_prefix(const char *str, const char *prefix)
190 while(*str && *prefix) {
191 if(*str++ != *prefix++) {