MusicEntry *initMusicTableDemo(const Common::String &filename) { Common::SeekableReadStream *data = g_resourceloader->openNewStreamFile(filename); if (!data) error("Couldn't open %s", filename.c_str()); // FIXME, for now we use a fixed-size table, as I haven't looked at the retail-data yet. MusicEntry *musicTable = new MusicEntry[15]; for (unsigned int i = 0; i < 15; i++) musicTable[i]._id = -1; TextSplitter *ts = new TextSplitter(filename, data); int id, x, y, sync; char musicfilename[64]; char name[64]; while (!ts->isEof()) { while (!ts->checkString("*/")) { while (!ts->checkString(".cuebutton")) ts->nextLine(); ts->scanString(".cuebutton id %d x %d y %d sync %d \"%[^\"]64s", 5, &id, &x, &y, &sync, name); ts->scanString(".playfile \"%[^\"]64s", 1, musicfilename); musicTable[id]._id = id; musicTable[id]._x = x; musicTable[id]._y = y; musicTable[id]._sync = sync; musicTable[id]._name = name; musicTable[id]._filename = musicfilename; } ts->nextLine(); } delete ts; delete data; return musicTable; }
MusicEntry *initMusicTableRetail(MusicEntry *table, const Common::String &filename) { Common::SeekableReadStream *data = g_resourceloader->openNewStreamFile(filename); // Remember to check, in case we forgot to copy over those files from the CDs. if (!data) { warning("Couldn't open %s", filename.c_str()); delete[] table; return nullptr; } MusicEntry *musicTable = table; if (!table) { musicTable = new MusicEntry[126]; for (unsigned int i = 0; i < 126; i++) { musicTable[i]._id = -1; } } TextSplitter *ts = new TextSplitter(filename, data); int id, x, y, sync, trim; char musicfilename[64]; char type[16]; // Every block is followed by 3 lines of commenting/uncommenting, except the last. while (!ts->isEof()) { while (!ts->checkString("*/")) { while (!ts->checkString(".cuebutton")) ts->nextLine(); ts->scanString(".cuebutton id %d x %d y %d sync %d type %16s", 5, &id, &x, &y, &sync, type); ts->scanString(".playfile trim %d \"%[^\"]64s", 2, &trim, musicfilename); if (musicfilename[1] == '\\') musicfilename[1] = '/'; musicTable[id]._id = id; musicTable[id]._x = x; musicTable[id]._y = y; musicTable[id]._sync = sync; musicTable[id]._type = type; musicTable[id]._name = ""; musicTable[id]._trim = trim; musicTable[id]._filename = musicfilename; } ts->nextLine(); } delete ts; delete data; return musicTable; }
void Set::loadText(TextSplitter &ts){ char tempBuf[256]; ts.expectString("section: colormaps"); ts.scanString(" numcolormaps %d", 1, &_numCmaps); _cmaps = new ObjectPtr<CMap>[_numCmaps]; char cmap_name[256]; for (int i = 0; i < _numCmaps; i++) { ts.scanString(" colormap %256s", 1, cmap_name); _cmaps[i] = g_resourceloader->getColormap(cmap_name); } if (ts.checkString("section: objectstates") || ts.checkString("sections: object_states")) { ts.nextLine(); ts.scanString(" tot_objects %d", 1, &_numObjectStates); char object_name[256]; for (int l = 0; l < _numObjectStates; l++) { ts.scanString(" object %256s", 1, object_name); } } else { _numObjectStates = 0; } ts.expectString("section: setups"); ts.scanString(" numsetups %d", 1, &_numSetups); _setups = new Setup[_numSetups]; for (int i = 0; i < _numSetups; i++) _setups[i].load(ts); _currSetup = _setups; _lightsConfigured = false; _numSectors = -1; _numLights = -1; _lights = NULL; _sectors = NULL; _minVolume = 0; _maxVolume = 0; // Lights are optional if (ts.isEof()) return; ts.expectString("section: lights"); ts.scanString(" numlights %d", 1, &_numLights); _lights = new Light[_numLights]; for (int i = 0; i < _numLights; i++) _lights[i].load(ts); // Calculate the number of sectors ts.expectString("section: sectors"); if (ts.isEof()) // Sectors are optional, but section: doesn't seem to be return; int sectorStart = ts.getLineNumber(); _numSectors = 0; // Find the number of sectors (while the sectors usually // count down from the highest number there are a few // cases where they count up, see hh.set for example) while (!ts.isEof()) { ts.scanString(" %s", 1, tempBuf); if (!scumm_stricmp(tempBuf, "sector")) _numSectors++; } // Allocate and fill an array of sector info _sectors = new Sector*[_numSectors]; ts.setLineNumber(sectorStart); for (int i = 0; i < _numSectors; i++) { // Use the ids as index for the sector in the array. // This way when looping they are checked from the id 0 sto the last, // which seems important for sets with overlapping camera sectors, like ga.set. Sector *s = new Sector(); s->load(ts); _sectors[s->getSectorId()] = s; } }