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; }
void Set::Setup::load(Set *set, int id, TextSplitter &ts) { char buf[256]; ts.scanString(" setup %256s", 1, buf); _name = buf; ts.scanString(" background %256s", 1, buf); _bkgndBm = Bitmap::create(buf); if (!_bkgndBm) { Debug::warning(Debug::Bitmaps | Debug::Sets, "Unable to load scene bitmap: %s\n", buf); } else { Debug::debug(Debug::Bitmaps | Debug::Sets, "Loaded scene bitmap: %s\n", buf); } // ZBuffer is optional _bkgndZBm = NULL; if (ts.checkString("zbuffer")) { ts.scanString(" zbuffer %256s", 1, buf); // Don't even try to load if it's the "none" bitmap if (strcmp(buf, "<none>.lbm") != 0) { _bkgndZBm = Bitmap::create(buf); Debug::debug(Debug::Bitmaps | Debug::Sets, "Loading scene z-buffer bitmap: %s\n", buf); } } ts.scanString(" position %f %f %f", 3, &_pos.x(), &_pos.y(), &_pos.z()); ts.scanString(" interest %f %f %f", 3, &_interest.x(), &_interest.y(), &_interest.z()); ts.scanString(" roll %f", 1, &_roll); ts.scanString(" fov %f", 1, &_fov); ts.scanString(" nclip %f", 1, &_nclip); ts.scanString(" fclip %f", 1, &_fclip); for (;;) { char name[256], zname[256]; char bitmap[256], zbitmap[256]; zbitmap[0] = '\0'; if (ts.checkString("object_art")) ts.scanString(" object_art %256s %256s", 2, name, bitmap); else break; if (ts.checkString("object_z")) ts.scanString(" object_z %256s %256s", 2, zname, zbitmap); if (zbitmap[0] == '\0' || strcmp(name, zname) == 0) { set->addObjectState(id, ObjectState::OBJSTATE_BACKGROUND, bitmap, zbitmap, true); } } }
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 MaterialData::initEMI(Common::SeekableReadStream *data) { Common::Array<Common::String> texFileNames; char readFileName[64]; if (_fname.hasSuffix(".sur")) { // This expects that we want all the materials in the sur-file TextSplitter *ts = new TextSplitter(data); ts->setLineNumber(2); // Skip copyright-line ts->expectString("version\t1.0"); if (ts->checkString("name:")) ts->scanString("name:%s", 1, readFileName); while(!ts->checkString("END_OF_SECTION")) { ts->scanString("tex:%s", 1, readFileName); Common::String mFileName(readFileName); texFileNames.push_back(mFileName); } Common::SeekableReadStream *texData; _textures = new Texture[texFileNames.size()]; for (uint i = 0; i < texFileNames.size(); i++) { warning("SUR-file texture: %s", texFileNames[i].c_str()); texData = g_resourceloader->openNewStreamFile(texFileNames[i].c_str(), true); if (!texData) { warning("Couldn't find tex-file: %s", texFileNames[i].c_str()); _textures[i]._width = 0; _textures[i]._height = 0; _textures[i]._texture = new int(1); // HACK to avoid initializing. continue; } loadTGA(texData, _textures + i); delete texData; } _numImages = texFileNames.size(); delete ts; return; } else if(_fname.hasSuffix(".tga")) { _numImages = 1; _textures = new Texture(); loadTGA(data, _textures); // texFileNames.push_back(filename); return; } else { warning("Unknown material-format: %s", _fname.c_str()); } }
void Set::Setup::load(TextSplitter &ts) { char buf[256]; ts.scanString(" setup %256s", 1, buf); _name = buf; ts.scanString(" background %256s", 1, buf); _bkgndBm = Bitmap::create(buf); if (!_bkgndBm) { Debug::warning(Debug::Bitmaps | Debug::Sets, "Unable to load scene bitmap: %s\n", buf); } else { Debug::debug(Debug::Bitmaps | Debug::Sets, "Loaded scene bitmap: %s\n", buf); } // ZBuffer is optional _bkgndZBm = NULL; if (ts.checkString("zbuffer")) { ts.scanString(" zbuffer %256s", 1, buf); // Don't even try to load if it's the "none" bitmap if (strcmp(buf, "<none>.lbm") != 0) { _bkgndZBm = Bitmap::create(buf); Debug::debug(Debug::Bitmaps | Debug::Sets, "Loading scene z-buffer bitmap: %s\n", buf); } } ts.scanString(" position %f %f %f", 3, &_pos.x(), &_pos.y(), &_pos.z()); ts.scanString(" interest %f %f %f", 3, &_interest.x(), &_interest.y(), &_interest.z()); ts.scanString(" roll %f", 1, &_roll); ts.scanString(" fov %f", 1, &_fov); ts.scanString(" nclip %f", 1, &_nclip); ts.scanString(" fclip %f", 1, &_fclip); for (;;) { if (ts.checkString("object_art")) ts.scanString(" object_art %256s", 1, buf); else break; if (ts.checkString("object_z")) ts.scanString(" object_z %256s", 1, buf); } }
void Set::Setup::load(TextSplitter &ts) { char buf[256]; ts.scanString(" setup %256s", 1, buf); _name = buf; ts.scanString(" background %256s", 1, buf); _bkgndBm = g_resourceloader->loadBitmap(buf); if (!_bkgndBm) { if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_ERROR || gDebugLevel == DEBUG_ALL) warning("Unable to load scene bitmap: %s\n", buf); } else { if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL) warning("Loaded scene bitmap: %s\n", buf); } // ZBuffer is optional _bkgndZBm = NULL; if (ts.checkString("zbuffer")) { ts.scanString(" zbuffer %256s", 1, buf); // Don't even try to load if it's the "none" bitmap if (strcmp(buf, "<none>.lbm") != 0) { _bkgndZBm = g_resourceloader->loadBitmap(buf); if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL) printf("Loading scene z-buffer bitmap: %s\n", buf); } } ts.scanString(" position %f %f %f", 3, &_pos.x(), &_pos.y(), &_pos.z()); ts.scanString(" interest %f %f %f", 3, &_interest.x(), &_interest.y(), &_interest.z()); ts.scanString(" roll %f", 1, &_roll); ts.scanString(" fov %f", 1, &_fov); ts.scanString(" nclip %f", 1, &_nclip); ts.scanString(" fclip %f", 1, &_fclip); for (;;) { if (ts.checkString("object_art")) ts.scanString(" object_art %256s", 1, buf); else break; if (ts.checkString("object_z")) ts.scanString(" object_z %256s", 1, buf); } }
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; } }