nuclear@5: #include nuclear@5: #include "tileset.h" nuclear@5: #include "datapath.h" nuclear@5: nuclear@5: static char *strip_space(char *ptr); nuclear@5: nuclear@5: static TileSet *active_tileset; nuclear@5: nuclear@48: TileSet::TileSet() nuclear@48: : texset(load_texture, destroy_texture), nuclear@48: sampleset(load_audio_sample, destroy_audio_sample) nuclear@48: { nuclear@48: } nuclear@5: nuclear@5: TileSet::~TileSet() nuclear@5: { nuclear@5: for(auto iter : tiles) { nuclear@5: delete iter.second; nuclear@5: } nuclear@5: } nuclear@5: nuclear@5: bool TileSet::load(const char *fname) nuclear@5: { nuclear@5: FILE *fp; nuclear@5: if(!(fp = fopen(fname, "r"))) { nuclear@5: fprintf(stderr, "failed to open tileset: %s\n", fname); nuclear@5: return false; nuclear@5: } nuclear@5: nuclear@5: int linenum = 0; nuclear@5: char buf[512]; nuclear@5: while(fgets(buf, sizeof buf, fp)) { nuclear@5: linenum++; nuclear@5: nuclear@5: char *line = strip_space(buf); nuclear@5: if(!*line || *line == '#') { nuclear@5: continue; nuclear@5: } nuclear@5: nuclear@5: char *tilefile = strchr(line, ':'); nuclear@5: if(!tilefile) { nuclear@5: fprintf(stderr, "error parsing tileset %s, line %d: %s\n", fname, nuclear@5: linenum, line); nuclear@5: fclose(fp); nuclear@5: return false; nuclear@5: } nuclear@5: *tilefile++ = 0; nuclear@5: nuclear@5: printf("Tileset %s, loading tile \"%s\" -> %s\n", fname, line, tilefile); nuclear@11: Tile *tile = new Tile(this); nuclear@5: if(!tile->load(datafile_path(tilefile))) { nuclear@5: fprintf(stderr, "failed to load tile: %s\n", tilefile); nuclear@5: delete tile; nuclear@5: continue; nuclear@5: } nuclear@5: nuclear@5: tiles[line] = tile; nuclear@5: } nuclear@5: nuclear@5: fclose(fp); nuclear@5: return true; nuclear@5: } nuclear@5: nuclear@11: TextureSet *TileSet::get_textures() nuclear@11: { nuclear@11: return &texset; nuclear@11: } nuclear@11: nuclear@11: const TextureSet *TileSet::get_textures() const nuclear@11: { nuclear@11: return &texset; nuclear@11: } nuclear@11: nuclear@48: SampleSet *TileSet::get_samples() nuclear@48: { nuclear@48: return &sampleset; nuclear@48: } nuclear@48: nuclear@48: const SampleSet *TileSet::get_samples() const nuclear@48: { nuclear@48: return &sampleset; nuclear@48: } nuclear@48: nuclear@5: Tile *TileSet::get_tile(const char *name) const nuclear@5: { nuclear@5: auto res = tiles.find(name); nuclear@5: return res != tiles.end() ? res->second : 0; nuclear@5: } nuclear@5: nuclear@46: void TileSet::update_tiles(unsigned long msec) nuclear@46: { nuclear@46: for(auto tilepair : tiles) { nuclear@46: tilepair.second->update(msec, 0.0f); nuclear@46: } nuclear@46: } nuclear@46: nuclear@5: void set_active_tileset(TileSet *set) nuclear@5: { nuclear@5: active_tileset = set; nuclear@5: } nuclear@5: nuclear@5: TileSet *get_active_tileset() nuclear@5: { nuclear@5: return active_tileset; nuclear@5: } nuclear@5: nuclear@5: static char *strip_space(char *ptr) nuclear@5: { nuclear@5: while(isspace(*ptr)) { nuclear@5: ptr++; nuclear@5: } nuclear@5: nuclear@5: char *nl = strrchr(ptr, '\n'); nuclear@5: if(nl) *nl = 0; nuclear@5: char *cr = strrchr(ptr, '\r'); nuclear@5: if(cr) *cr = 0; nuclear@5: nuclear@5: return ptr; nuclear@5: }