Scene::Scene(Common::String name, Common::SeekableReadStream *data) { debug(9, "Creating scene: %s", name.c_str()); _name = name; _classType = SCENE; _design = new Design(data); _resourceId = 0; _script = NULL; _textBounds = NULL; _fontSize = 0; _fontType = 0; setDesignBounds(readRect(data)); _worldY = data->readSint16BE(); _worldX = data->readSint16BE(); _blocked[NORTH] = (data->readByte() != 0); _blocked[SOUTH] = (data->readByte() != 0); _blocked[EAST] = (data->readByte() != 0); _blocked[WEST] = (data->readByte() != 0); _soundFrequency = data->readSint16BE(); _soundType = data->readByte(); data->readByte(); // unknown _messages[NORTH] = readPascalString(data); _messages[SOUTH] = readPascalString(data); _messages[EAST] = readPascalString(data); _messages[WEST] = readPascalString(data); _soundName = readPascalString(data); _visited = false; delete data; }
void ConvertGtp::readSignature() { currentStage = string("readSignature"); string s = readPascalString(30); // Format string //osg::notify(osg::INFO) << "GTP format: \"" << s << "\"\n"; // Parse version string if (s == "FICHIER GUITARE PRO v1") { versionMajor = 1; versionMinor = 0; } else if (s == "FICHIER GUITARE PRO v1.01") { versionMajor = 1; versionMinor = 1; } else if (s == "FICHIER GUITARE PRO v1.02") { versionMajor = 1; versionMinor = 2; } else if (s == "FICHIER GUITARE PRO v1.03") { versionMajor = 1; versionMinor = 3; } else if (s == "FICHIER GUITARE PRO v1.04") { versionMajor = 1; versionMinor = 4; } else if (s == "FICHIER GUITAR PRO v2.20") { versionMajor = 2; versionMinor = 20; } else if (s == "FICHIER GUITAR PRO v2.21") { versionMajor = 2; versionMinor = 21; } else if (s == "FICHIER GUITAR PRO v3.00") { versionMajor = 3; versionMinor = 0; } else if (s == "FICHIER GUITAR PRO v4.00") { versionMajor = 4; versionMinor = 0; } else if (s == "FICHIER GUITAR PRO v4.06") { versionMajor = 4; versionMinor = 6; } else if (s == "FICHIER GUITAR PRO L4.06") { versionMajor = 4; versionMinor = 6; } else { throw string("Invalid file format\n"); } }
Common::StringArray *World::readMenu(Common::SeekableReadStream *res) { res->skip(10); int enableFlags = res->readUint32BE(); Common::String menuName = readPascalString(res); Common::String menuItem = readPascalString(res); int menuItemNumber = 1; Common::String menu; byte itemData[4]; while (!menuItem.empty()) { if (!menu.empty()) { menu += ';'; } if ((enableFlags & (1 << menuItemNumber)) == 0) { menu += '('; } menu += menuItem; res->read(itemData, 4); static const char styles[] = {'B', 'I', 'U', 'O', 'S', 'C', 'E', 0}; for (int i = 0; styles[i] != 0; i++) { if ((itemData[3] & (1 << i)) != 0) { menu += '<'; menu += styles[i]; } } if (itemData[1] != 0) { menu += '/'; menu += (char)itemData[1]; } menuItem = readPascalString(res); menuItemNumber++; } Common::StringArray *result = new Common::StringArray; result->push_back(menuName); result->push_back(menu); debug(4, "menuName: %s", menuName.c_str()); debug(4, "menu: %s", menu.c_str()); return result; }
void DirectorEngine::loadEXEv3(Common::SeekableReadStream *stream) { uint16 entryCount = stream->readUint16LE(); if (entryCount != 1) error("Unhandled multiple entry v3 EXE"); stream->skip(5); // unknown stream->readUint32LE(); // Main MMM size Common::String mmmFileName = readPascalString(*stream); Common::String directoryName = readPascalString(*stream); debugC(1, kDebugLoading, "Main MMM: '%s'", mmmFileName.c_str()); debugC(1, kDebugLoading, "Directory Name: '%s'", directoryName.c_str()); _mainArchive = new RIFFArchive(); if (!_mainArchive->openFile(mmmFileName)) error("Could not open '%s'", mmmFileName.c_str()); delete stream; }
Obj::Obj(Common::String name, Common::SeekableReadStream *data, int resourceId) { _resourceId = resourceId; _name = name; _classType = OBJ; _currentOwner = NULL; _currentScene = NULL; _index = 0; _design = new Design(data); setDesignBounds(readRect(data)); int16 namePlural = data->readSint16BE(); if (namePlural == 256) _namePlural = true; // TODO: other flags? else if (namePlural == 0) _namePlural = false; else error("Obj <%s> had weird namePlural set (%d)", name.c_str(), namePlural); if (data->readSint16BE() != 0) error("Obj <%s> had short set", name.c_str()); if (data->readByte() != 0) error("Obj <%s> had byte set", name.c_str()); _accuracy = data->readByte(); _value = data->readByte(); _type = data->readSByte(); _damage = data->readByte(); _attackType = data->readSByte(); _numberOfUses = data->readSint16BE(); int16 returnTo = data->readSint16BE(); if (returnTo == 256) // TODO any other possibilities? _returnToRandomScene = true; else if (returnTo == 0) _returnToRandomScene = false; else error("Obj <%s> had weird returnTo set", name.c_str()); _sceneOrOwner = readPascalString(data); _clickMessage = readPascalString(data); _operativeVerb = readPascalString(data); _failureMessage = readPascalString(data); _useMessage = readPascalString(data); _sound = readPascalString(data); delete data; }
Common::String *World::loadStringFromDITL(Common::MacResManager *resMan, int resourceId, int itemIndex) { Common::SeekableReadStream *res = resMan->getResource(MKTAG('D','I','T','L'), resourceId); if (res) { int itemCount = res->readSint16BE(); for (int i = 0; i <= itemCount; i++) { // int placeholder; short rect[4]; byte flags; pstring str; res->skip(13); Common::String message = readPascalString(res); if (i == itemIndex) { Common::String *msg = new Common::String(message); delete res; return msg; } } delete res; } return NULL; }
void ConvertGtp::readChord(vector<TabTrack>::iterator &trk, int x) { int x1, x2, x3, x4; char num; string text; char garbage[50]; // GREYFIX: currently just skips over chord diagram // GREYFIX: chord diagram x1 = readDelphiInteger(); if (x1 != 257) ;//osg::notify(osg::INFO) << "Chord INT1=" << x1 << ", not 257\n"; x2 = readDelphiInteger(); if (x2 != 0) ;//osg::notify(osg::INFO) << "Chord INT2=" << x2 << ", not 0\n"; x3 = readDelphiInteger(); //osg::notify(osg::INFO) << "Chord INT3: " << x3 << "\n"; // FF FF FF FF if there is diagram x4 = readDelphiInteger(); if (x4 != 0) ;//osg::notify(osg::INFO) << "Chord INT4=" << x4 << ", not 0\n"; num = readChar(); if (num != 0) ;//osg::notify(osg::INFO) << "Chord BYTE5=" << (int) num << ", not 0\n"; text = readPascalString(25); //osg::notify(osg::INFO) << "Chord diagram: " << text << "\n"; // Chord diagram parameters - for every string for (int i = 0; i < STRING_MAX_NUMBER; i++) { x1 = readDelphiInteger(); trk->c[x].a[i] = x1; //osg::notify(osg::INFO) << x1 << "\n"; } // Unknown bytes stream.read(garbage, 36); //osg::notify(osg::INFO) << "after chord, position: " << stream.tellg() << "\n"; }
void ConvertGtp::readSignature() { currentStage = QString("readSignature"); QString s = readPascalString(30); // Format string kdDebug() << "GTP format: \"" << s << "\"\n"; // Parse version string if (s == "FICHIER GUITARE PRO v1") { versionMajor = 1; versionMinor = 0; } else if (s == "FICHIER GUITARE PRO v1.01") { versionMajor = 1; versionMinor = 1; } else if (s == "FICHIER GUITARE PRO v1.02") { versionMajor = 1; versionMinor = 2; } else if (s == "FICHIER GUITARE PRO v1.03") { versionMajor = 1; versionMinor = 3; } else if (s == "FICHIER GUITARE PRO v1.04") { versionMajor = 1; versionMinor = 4; } else if (s == "FICHIER GUITAR PRO v2.20") { versionMajor = 2; versionMinor = 20; } else if (s == "FICHIER GUITAR PRO v2.21") { versionMajor = 2; versionMinor = 21; } else if (s == "FICHIER GUITAR PRO v3.00") { versionMajor = 3; versionMinor = 0; } else if (s == "FICHIER GUITAR PRO v4.00") { versionMajor = 4; versionMinor = 0; } else if (s == "FICHIER GUITAR PRO v4.06") { versionMajor = 4; versionMinor = 6; } else if (s == "FICHIER GUITAR PRO L4.06") { versionMajor = 4; versionMinor = 6; } else if (s == "FICHIER GUITAR PRO v5.00") { versionMajor = 5; versionMinor = 0; } else if (s == "FICHIER GUITAR PRO v5.10") { versionMajor = 5; versionMinor = 10; } else { throw i18n("Invalid file format: \"%1\"").arg(s); } }
void ConvertGtp::readChord() { int x1, x2, x3, x4; Q_UINT8 num; QString text; char garbage[50]; // GREYFIX: currently just skips over chord diagram // GREYFIX: chord diagram x1 = readDelphiInteger(); if (x1 != 257) kdWarning() << "Chord INT1=" << x1 << ", not 257\n"; x2 = readDelphiInteger(); if (x2 != 0) kdWarning() << "Chord INT2=" << x2 << ", not 0\n"; x3 = readDelphiInteger(); kdDebug() << "Chord INT3: " << x3 << "\n"; // FF FF FF FF if there is diagram x4 = readDelphiInteger(); if (x4 != 0) kdWarning() << "Chord INT4=" << x4 << ", not 0\n"; (*stream) >> num; if (num != 0) kdWarning() << "Chord BYTE5=" << (int) num << ", not 0\n"; text = readPascalString(25); kdDebug() << "Chord diagram: " << text << "\n"; // Chord diagram parameters - for every string for (int i = 0; i < STRING_MAX_NUMBER; i++) { x1 = readDelphiInteger(); kdDebug() << x1 << "\n"; } // Unknown bytes stream->readRawBytes(garbage, 36); kdDebug() << "after chord, position: " << stream->device()->pos() << "\n"; }
void ConvertGtp::readTrackProperties() { char num = readChar(); int i; int strings, midiChannel2, capo, color; i=0; while(stream.peek() == 0) { i++; readChar(); } char tmp[256]; //stream.read(tmp, 256); currentStage = string("readTrackProperties"); //osg::notify(osg::INFO) << "readTrackProperties(): start\n"; for (int i = 0; i < numTracks; i++) { if(i>0) num = readChar(); // GREYFIX: simulations bitmask //osg::notify(osg::INFO) << "Simulations: " << num << "\n"; TabTrack *trk = new TabTrack(TabTrack::FretTab, "", 0, 0, 0, 6, 24); trk->name = readPascalString(40); // Track name //osg::notify(osg::INFO) << "Track: " << trk->name << "\n"; // Tuning information //osg::notify(osg::INFO) << "pos: " << stream.tellg() << "\n"; strings = readDelphiInteger(); if (strings <= 0 || strings > STRING_MAX_NUMBER) throw string("Track %1: insane # of strings (%2)\n"); trk->strings = strings; // Parse [0..string-1] with real string tune data in reverse order for (int j = trk->strings - 1; j >= 0; j--) { trk->tune[j] = readDelphiInteger(); if (trk->tune[j] > 127) throw string("Track %1: insane tuning on string %2 = %3\n"); } // Throw out the other useless garbage in [string..MAX-1] range for (int j = trk->strings; j < STRING_MAX_NUMBER; j++) readDelphiInteger(); // GREYFIX: auto flag here? readDelphiInteger(); // GREYFIX: MIDI port trk->channel = readDelphiInteger(); // MIDI channel 1 midiChannel2 = readDelphiInteger(); // GREYFIX: MIDI channel 2 trk->frets = readDelphiInteger(); // Frets capo = readDelphiInteger(); // GREYFIX: Capo color = readDelphiInteger(); // GREYFIX: Color /*osg::notify(osg::INFO) << "MIDI #" << trk->channel << "/" << (int) midiChannel2 << ", " << (int) trk->strings << " strings, " << (int) trk->frets << " frets, capo " << capo << "\n"; */ if (trk->frets <= 0 || (strongChecks && trk->frets > 100)) throw string("Track %1: insane number of frets (%2)\n"); if (trk->channel > 16) throw string("Track %1: insane MIDI channel 1 (%2)\n"); if (midiChannel2 < 0 || midiChannel2 > 16) throw string("Track %1: insane MIDI channel 2 (%2)\n"); // Fill remembered values from defaults trk->patch = trackPatch[i]; song->t.push_back(*trk); } //osg::notify(osg::INFO) << "readTrackProperties(): end\n"; }
inline std::string readPascalStringAt(ReaderFile& f, size_t location) { f.seekg(location); return readPascalString(f); }
void GuitarPro5::readTracks() { for (int i = 0; i < staves; ++i) { int tuning[GP_MAX_STRING_NUMBER]; Staff* staff = score->staff(i); Part* part = staff->part(); uchar c = readUChar(); // simulations bitmask if (c & 0x2) { // 12 stringed guitar } if (c & 0x4) { // banjo track } if (i == 0 || version == 500) skip(1); QString name = readPascalString(40); int strings = readInt(); if (strings <= 0 || strings > GP_MAX_STRING_NUMBER) throw GuitarProError::GP_BAD_NUMBER_OF_STRINGS ; for (int j = 0; j < strings; ++j) { tuning[j] = readInt(); } for (int j = strings; j < GP_MAX_STRING_NUMBER; ++j) readInt(); /*int midiPort =*/ readInt(); // -1 int midiChannel = readInt() - 1; /*int midiChannel2 =*/ readInt(); // -1 int frets = readInt(); int capo = readInt(); /*int color =*/ readInt(); skip(version > 500 ? 49 : 44); if (version > 500) { // british stack clean / amp tone readDelphiString(); readDelphiString(); } int tuning2[strings]; for (int k = 0; k < strings; ++k) tuning2[strings-k-1] = tuning[k]; StringData stringData(frets, strings, tuning2); Instrument* instr = part->instr(); instr->setStringData(stringData); part->setPartName(name); part->setLongName(name); instr->setTranspose(Interval(capo)); // // determine clef // int patch = channelDefaults[midiChannel].patch; ClefType clefId = ClefType::G; if (midiChannel == GP_DEFAULT_PERCUSSION_CHANNEL) { clefId = ClefType::PERC; // instr->setUseDrumset(DrumsetKind::GUITAR_PRO); instr->setDrumset(gpDrumset); staff->setStaffType(StaffType::preset(StaffTypes::PERC_DEFAULT)); } else if (patch >= 24 && patch < 32) clefId = ClefType::G3; else if (patch >= 32 && patch < 40) clefId = ClefType::F8; Measure* measure = score->firstMeasure(); Clef* clef = new Clef(score); clef->setClefType(clefId); clef->setTrack(i * VOICES); Segment* segment = measure->getSegment(Segment::Type::Clef, 0); segment->add(clef); Channel& ch = instr->channel(0); if (midiChannel == GP_DEFAULT_PERCUSSION_CHANNEL) { ch.program = 0; ch.bank = 128; } else { ch.program = patch; ch.bank = 0; } ch.volume = channelDefaults[midiChannel].volume; ch.pan = channelDefaults[midiChannel].pan; ch.chorus = channelDefaults[midiChannel].chorus; ch.reverb = channelDefaults[midiChannel].reverb; //qDebug("default2: %d", channelDefaults[i].reverb); // missing: phase, tremolo ch.updateInitList(); } skip(version == 500 ? 2 : 1); }
CObject *MfcArchive::parseClass(bool *isCopyReturned) { Common::String name; int objectId = 0; CObject *res = 0; uint obTag = readUint16LE(); debugC(7, kDebugLoading, "parseClass::obTag = %d (%04x) at 0x%08x", obTag, obTag, pos() - 2); if (obTag == 0x0000) { return NULL; } else if (obTag == 0xffff) { int schema = readUint16LE(); debugC(7, kDebugLoading, "parseClass::schema = %d", schema); name = readPascalString(true); debugC(7, kDebugLoading, "parseClass::class <%s>", name.c_str()); if (!_classMap.contains(name.c_str())) { error("Unknown class in MfcArchive: <%s>", name.c_str()); } objectId = _classMap[name.c_str()]; debugC(7, kDebugLoading, "tag: %d 0x%x (%x)", _objectMap.size() - 1, _objectMap.size() - 1, objectId); res = createObject(objectId); _objectMap.push_back(res); _objectIdMap.push_back(objectId); _objectMap.push_back(res); // Basically a hack, but behavior is all correct _objectIdMap.push_back(objectId); *isCopyReturned = false; } else if ((obTag & 0x8000) == 0) { if (_objectMap.size() < obTag) { error("Object index too big: %d at 0x%08x", obTag, pos() - 2); } debugC(7, kDebugLoading, "parseClass::obTag <%s>", lookupObjectId(_objectIdMap[obTag])); res = _objectMap[obTag]; *isCopyReturned = true; } else { obTag &= ~0x8000; if (_objectMap.size() < obTag) { error("Object index too big: %d at 0x%08x", obTag, pos() - 2); } debugC(7, kDebugLoading, "parseClass::obTag <%s>", lookupObjectId(_objectIdMap[obTag])); objectId = _objectIdMap[obTag]; res = createObject(objectId); _objectMap.push_back(res); _objectIdMap.push_back(objectId); *isCopyReturned = false; } return res; }
Chr::Chr(Common::String name, Common::SeekableReadStream *data) { _name = name; _classType = CHR; _design = new Design(data); _index = 0; _resourceId = 0; _currentScene = NULL; setDesignBounds(readRect(data)); _physicalStrength = data->readByte(); _physicalHp = data->readByte(); _naturalArmor = data->readByte(); _physicalAccuracy = data->readByte(); _spiritualStength = data->readByte(); _spiritialHp = data->readByte(); _resistanceToMagic = data->readByte(); _spiritualAccuracy = data->readByte(); _runningSpeed = data->readByte(); _rejectsOffers = data->readByte(); _followsOpponent = data->readByte(); data->readSByte(); // TODO: ??? data->readSint32BE(); // TODO: ??? _weaponDamage1 = data->readByte(); _weaponDamage2 = data->readByte(); data->readSByte(); // TODO: ??? if (data->readSByte() == 1) _playerCharacter = true; else _playerCharacter = false; _maximumCarriedObjects = data->readByte(); _returnTo = data->readSByte(); _winningWeapons = data->readByte(); _winningMagic = data->readByte(); _winningRun = data->readByte(); _winningOffer = data->readByte(); _losingWeapons = data->readByte(); _losingMagic = data->readByte(); _losingRun = data->readByte(); _losingOffer = data->readByte(); _gender = data->readSByte(); if (data->readSByte() == 1) _nameProperNoun = true; else _nameProperNoun = false; _initialScene = readPascalString(data); _nativeWeapon1 = readPascalString(data); _operativeVerb1 = readPascalString(data); _nativeWeapon2 = readPascalString(data); _operativeVerb2 = readPascalString(data); _initialComment = readPascalString(data); _scoresHitComment = readPascalString(data); _receivesHitComment = readPascalString(data); _makesOfferComment = readPascalString(data); _rejectsOfferComment = readPascalString(data); _acceptsOfferComment = readPascalString(data); _dyingWords = readPascalString(data); _initialSound = readPascalString(data); _scoresHitSound = readPascalString(data); _receivesHitSound = readPascalString(data); _dyingSound = readPascalString(data); _weaponSound1 = readPascalString(data); _weaponSound2 = readPascalString(data); for (int i = 0; i < NUMBER_OF_ARMOR_TYPES; i++) _armor[i] = NULL; _weapon1 = NULL; _weapon2 = NULL; // Create native weapons if (!_nativeWeapon1.empty() && !_operativeVerb1.empty()) { _weapon1 = new Obj; _weapon1->_name = _nativeWeapon1; _weapon1->_operativeVerb = _operativeVerb1; _weapon1->_type = Obj::REGULAR_WEAPON; _weapon1->_accuracy = 0; _weapon1->_damage = _weaponDamage1; _weapon1->_sound = _weaponSound1; } if (!_nativeWeapon2.empty() && !_operativeVerb2.empty()) { _weapon2 = new Obj; _weapon2->_name = _nativeWeapon2; _weapon2->_operativeVerb = _operativeVerb2; _weapon2->_type = Obj::REGULAR_WEAPON; _weapon2->_accuracy = 0; _weapon2->_damage = _weaponDamage2; _weapon2->_sound = _weaponSound2; } delete data; }
bool World::loadWorld(Common::MacResManager *resMan) { Common::MacResIDArray resArray; Common::SeekableReadStream *res; Common::MacResIDArray::const_iterator iter; // Dumping interpreter code #if 1 res = resMan->getResource(MKTAG('C','O','D','E'), 1); warning("code size: %d", res->size()); byte *buf = (byte *)malloc(res->size()); res->read(buf, res->size()); Common::DumpFile out; out.open("code.bin"); out.write(buf, res->size()); out.close(); free(buf); delete res; #endif if ((resArray = resMan->getResIDArray(MKTAG('G','C','O','D'))).size() == 0) return false; // Load global script res = resMan->getResource(MKTAG('G','C','O','D'), resArray[0]); _globalScript = new Script(res); // TODO: read creator // Load main configuration if ((resArray = resMan->getResIDArray(MKTAG('V','E','R','S'))).size() == 0) return false; _name = resMan->getBaseFileName(); if (resArray.size() > 1) warning("Too many VERS resources"); if (!resArray.empty()) { debug(3, "Loading version info"); res = resMan->getResource(MKTAG('V','E','R','S'), resArray[0]); res->skip(10); byte b = res->readByte(); _weaponMenuDisabled = (b != 0); if (b != 0 && b != 1) error("Unexpected value for weapons menu"); res->skip(3); _aboutMessage = readPascalString(res); if (!scumm_stricmp(resMan->getBaseFileName().c_str(), "Scepters")) res->skip(1); // ???? _soundLibrary1 = readPascalString(res); _soundLibrary2 = readPascalString(res); delete res; } Common::String *message; if ((message = loadStringFromDITL(resMan, 2910, 1)) != NULL) { message->trim(); debug(2, "_gameOverMessage: %s", message->c_str()); _gameOverMessage = message; } if ((message = loadStringFromDITL(resMan, 2480, 3)) != NULL) { message->trim(); debug(2, "_saveBeforeQuitMessage: %s", message->c_str()); _saveBeforeQuitMessage = message; } if ((message = loadStringFromDITL(resMan, 2490, 3)) != NULL) { message->trim(); debug(2, "_saveBeforeCloseMessage: %s", message->c_str()); _saveBeforeCloseMessage = message; } if ((message = loadStringFromDITL(resMan, 2940, 2)) != NULL) { message->trim(); debug(2, "_revertMessage: %s", message->c_str()); _revertMessage = message; } // Load scenes resArray = resMan->getResIDArray(MKTAG('A','S','C','N')); debug(3, "Loading %d scenes", resArray.size()); for (iter = resArray.begin(); iter != resArray.end(); ++iter) { res = resMan->getResource(MKTAG('A','S','C','N'), *iter); Scene *scene = new Scene(resMan->getResName(MKTAG('A','S','C','N'), *iter), res); res = resMan->getResource(MKTAG('A','C','O','D'), *iter); if (res != NULL) scene->_script = new Script(res); res = resMan->getResource(MKTAG('A','T','X','T'), *iter); if (res != NULL) { scene->_textBounds = readRect(res); scene->_fontType = res->readUint16BE(); scene->_fontSize = res->readUint16BE(); Common::String text; while (res->pos() < res->size()) { char c = res->readByte(); if (c == 0x0d) c = '\n'; text += c; } scene->_text = text; delete res; } addScene(scene); } // Load Objects resArray = resMan->getResIDArray(MKTAG('A','O','B','J')); debug(3, "Loading %d objects", resArray.size()); for (iter = resArray.begin(); iter != resArray.end(); ++iter) { res = resMan->getResource(MKTAG('A','O','B','J'), *iter); addObj(new Obj(resMan->getResName(MKTAG('A','O','B','J'), *iter), res)); } // Load Characters resArray = resMan->getResIDArray(MKTAG('A','C','H','R')); debug(3, "Loading %d characters", resArray.size()); for (iter = resArray.begin(); iter != resArray.end(); ++iter) { res = resMan->getResource(MKTAG('A','C','H','R'), *iter); Chr *chr = new Chr(resMan->getResName(MKTAG('A','C','H','R'), *iter), res); addChr(chr); // TODO: What if there's more than one player character? if (chr->_playerCharacter) _player = chr; } // Load Sounds resArray = resMan->getResIDArray(MKTAG('A','S','N','D')); debug(3, "Loading %d sounds", resArray.size()); for (iter = resArray.begin(); iter != resArray.end(); ++iter) { res = resMan->getResource(MKTAG('A','S','N','D'), *iter); addSound(new Sound(resMan->getResName(MKTAG('A','S','N','D'), *iter), res)); } if (!_soundLibrary1.empty()) { loadExternalSounds(_soundLibrary1); } if (!_soundLibrary2.empty()) { loadExternalSounds(_soundLibrary2); } // Load Patterns res = resMan->getResource(MKTAG('P','A','T','#'), 900); if (res != NULL) { int count = res->readUint16BE(); debug(3, "Loading %d patterns", count); for (int i = 0; i < count; i++) { byte *pattern = (byte *)malloc(8); res->read(pattern, 8); _patterns->push_back(pattern); } delete res; } else { /* Enchanted Scepters did not use the PAT# resource for the textures. */ res = resMan->getResource(MKTAG('C','O','D','E'), 1); if (res != NULL) { res->skip(0x55ac); for (int i = 0; i < 29; i++) { byte *pattern = (byte *)malloc(8); res->read(pattern, 8); _patterns->push_back(pattern); } } delete res; } res = resMan->getResource(MKTAG('M','E','N','U'), 2001); if (res != NULL) { Common::StringArray *menu = readMenu(res); _aboutMenuItemName.clear(); Common::String string = menu->operator[](1); for (uint i = 0; i < string.size() && string[i] != ';'; i++) // Read token _aboutMenuItemName += string[i]; delete menu; delete res; } res = resMan->getResource(MKTAG('M','E','N','U'), 2004); if (res != NULL) { Common::StringArray *menu = readMenu(res); _commandsMenuName = menu->operator[](0); _commandsMenu = menu->operator[](1); delete menu; delete res; } res = resMan->getResource(MKTAG('M','E','N','U'), 2005); if (res != NULL) { Common::StringArray *menu = readMenu(res); _weaponsMenuName = menu->operator[](0); delete menu; delete res; } // TODO: Read Apple menu and get the name of that menu item.. // store global info in state object for use with save/load actions //world.setCurrentState(initialState); // pass off the state object to the world return true; }
int GuitarPro5::readBeat(int tick, int voice, Measure* measure, int staffIdx, Tuplet** tuplets, bool /*mixChange*/) { uchar beatBits = readUChar(); bool dotted = beatBits & BEAT_DOTTED; slide = -1; int track = staffIdx * VOICES + voice; if (slides.contains(track)) slide = slides.take(track); int pause = -1; if (beatBits & BEAT_PAUSE) pause = readUChar(); // readDuration int len = readChar(); int tuple = 0; if (beatBits & BEAT_TUPLET) tuple = readInt(); Segment* segment = measure->getSegment(Segment::Type::ChordRest, tick); if (beatBits & BEAT_CHORD) { int numStrings = score->staff(staffIdx)->part()->instr()->stringData()->strings(); skip(17); QString name = readPascalString(21); skip(4); // no header to be read in the GP5 format - default to true. readChord(segment, staffIdx * VOICES, numStrings, name, true); skip(32); } Lyrics* lyrics = 0; if (beatBits & BEAT_LYRICS) { QString txt = readDelphiString(); lyrics = new Lyrics(score); lyrics->setText(txt); } gpLyrics.beatCounter++; if (gpLyrics.beatCounter >= gpLyrics.fromBeat && gpLyrics.lyricTrack == staffIdx+1) { int index = gpLyrics.beatCounter - gpLyrics.fromBeat; if (index < gpLyrics.lyrics.size()) { lyrics = new Lyrics(score); lyrics->setText(gpLyrics.lyrics[index]); } } int beatEffects = 0; if (beatBits & BEAT_EFFECTS) beatEffects = readBeatEffects(track, segment); if (beatBits & BEAT_MIX_CHANGE) readMixChange(measure); int strings = readUChar(); // used strings mask Fraction l = len2fraction(len); // Some beat effects could add a Chord before this ChordRest* cr = segment->cr(track); if (voice != 0 && pause == 0 && strings == 0) cr = 0; else { if (strings == 0) { if (cr) { segment->remove(cr); delete cr; cr = 0; } cr = new Rest(score); } else { if (!cr) cr = new Chord(score); } cr->setTrack(track); TDuration d(l); d.setDots(dotted ? 1 : 0); if (dotted) l = l + (l/2); if (tuple) { Tuplet* tuplet = tuplets[staffIdx * 2 + voice]; if ((tuplet == 0) || (tuplet->elementsDuration() == tuplet->baseLen().fraction() * tuplet->ratio().numerator())) { tuplet = new Tuplet(score); // int track = staffIdx * 2 + voice; tuplets[staffIdx * 2 + voice] = tuplet; tuplet->setTrack(cr->track()); setTuplet(tuplet, tuple); tuplet->setParent(measure); } tuplet->setTrack(cr->track()); tuplet->setBaseLen(l); tuplet->setDuration(l * tuplet->ratio().denominator()); cr->setTuplet(tuplet); tuplet->add(cr); } cr->setDuration(l); if (cr->type() == Element::Type::REST && (pause == 0 || l == measure->len())) cr->setDurationType(TDuration::DurationType::V_MEASURE); else cr->setDurationType(d); if(!segment->cr(track)) segment->add(cr); Staff* staff = cr->staff(); int numStrings = staff->part()->instr()->stringData()->strings(); bool hasSlur = false; for (int i = 6; i >= 0; --i) { if (strings & (1 << i) && ((6-i) < numStrings)) { Note* note = new Note(score); if (dotted) { // there is at most one dotted note in this guitar pro version NoteDot* dot = new NoteDot(score); dot->setIdx(0); dot->setParent(note); dot->setTrack(track); // needed to know the staff it belongs to (and detect tablature) dot->setVisible(true); note->add(dot); } static_cast<Chord*>(cr)->add(note); hasSlur = readNote(6-i, note); note->setTpcFromPitch(); } } createSlur(hasSlur, staffIdx, cr); if (lyrics) cr->add(lyrics); } int rr = readChar(); if (cr && (cr->type() == Element::Type::CHORD)) { Chord* chord = static_cast<Chord*>(cr); applyBeatEffects(chord, beatEffects); if (rr == ARPEGGIO_DOWN) chord->setStemDirection(MScore::Direction::DOWN); else if (rr == ARPEGGIO_UP) chord->setStemDirection(MScore::Direction::UP); } int r = readChar(); if (r & 0x8) { int rrr = readChar(); qDebug(" 3beat read 0x%02x", rrr); } if (cr && (cr->type() == Element::Type::CHORD) && slide > 0) createSlide(slide, cr, staffIdx); restsForEmptyBeats(segment, measure, cr, l, track, tick); return cr ? cr->actualTicks() : measure->ticks(); }
bool Settings::load(std::string const& path) { FILE* opt = tolerantFOpen(path.c_str(), "rb"); if(!opt) return false; std::size_t size = fileLength(opt); if(size < 155) return false; // .dat is too short maxBonuses = readUint8(opt); loadingTime = readUint16(opt); lives = readUint16(opt); timeToLose = readUint16(opt); flagsToWin = readUint16(opt); screenSync = readUint8(opt) != 0; map = readUint8(opt) != 0; wormSettings[0].controller = readUint8(opt) & 0x1; wormSettings[1].controller = readUint8(opt) & 0x1; randomLevel = readUint8(opt) != 0; blood = readUint16(opt); gameMode = readUint8(opt); namesOnBonuses = readUint8(opt) != 0; regenerateLevel = readUint8(opt) != 0; shadow = readUint8(opt) != 0; //fread(weapTable, 1, 40, opt); for(int i = 0; i < 40; ++i) { weapTable[i] = limit<0, 3>(fgetc(opt)); } for(int i = 0; i < 2; ++i) for(int j = 0; j < 3; ++j) wormSettings[i].rgb[j] = readUint8(opt) & 63; for(int i = 0; i < 2; ++i) { for(int j = 0; j < 5; ++j) { wormSettings[i].weapons[j] = readUint8(opt); } } wormSettings[0].health = readUint16(opt); wormSettings[1].health = readUint16(opt); for(int i = 0; i < 2; ++i) { wormSettings[i].name = readPascalString(opt, 21); } //fgetc(opt); // What's this? loadChange = readUint8(opt) != 0; // 0x7B-83 is the string LIERO fseek(opt, 0x84, SEEK_SET); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 7; ++j) { wormSettings[i].controls[j] = limit<0, 177>(readUint8(opt)); } } levelFile = readPascalString(opt, 9); for(int i = 0; i < 2; ++i) { if(wormSettings[i].name.empty()) generateName(wormSettings[i]); else wormSettings[i].randomName = false; } fclose(opt); return true; }